Faits:
A. P._, née en 1968, a travaillé en qualité d'ouvrière non qualifiée dans l'horlogerie. Le 27 janvier 2003, lors d'un accident de la circulation routière, elle a subi un traumatisme de type "coup du lapin" dont la Caisse nationale suisse d'assurance en cas d'accidents (CNA) a pris les suites en charge.
Le 23 avril 2004, l'assurée a déposé une demande de prestations de l'assurance-invalidité. L'Office cantonal de l'assurance-invalidité pour le canton de Vaud (l'office AI) a recueilli les avis de deux médecins mandatés par X._, assureur pour perte de gain en cas de maladie (qui avait pris le relais de la CNA), savoir les docteurs S._, spécialiste en rhumatologie et en médecine interne (rapport du 4 novembre 2003), et C._, spécialiste en psychiatrie et psychothérapie (rapport du 27 février 2004). A la lumière de ces deux rapports médicaux, qui mettaient en évidence notamment des cervicalgies d'évolution chronique secondaires à un traumatisme par accélération, une minime uncarthrose C6-C7, un syndrome somatoforme persistant, un état dépressif majeur léger, ainsi que des traits de personnalité histrionique, l'office AI a retenu une capacité de travail entière dans l'activité habituelle (rapport final du 2 décembre 2005).
Par décision du 12 mai 2006, l'office AI a fixé le degré d'invalidité à 20 % (résultant de la comparaison d'un revenu sans invalidité de 57'551 fr. avec un gain d'invalide de 46'155 fr.) et rejeté la demande de prestations.
L'assurée s'est opposée à cette décision en invoquant les avis de ses médecins traitants, le docteur M._, spécialiste en médecine générale, et la doctoresse D._, spécialiste en neurologie à l'Hôpital Y._. Elle a allégué que sa capacité de travail ne dépassait pas 30 % (cf. certificat du docteur M._ du 6 juillet 2006) et a conclu à l'octroi d'une rente entière d'invalidité.
L'office AI a interpellé la doctoresse D._. Dans ses rapports (des 25 mars et 24 juin 2008), elle a posé le diagnostic de status post contusion cervicale après accident de la circulation avec mécanisme de flexion extension, et attesté que la capacité de travail de sa patiente était de 50 % dans son activité habituelle depuis 2006. Quant aux docteurs F._ et T._, médecins du Service médical régional (SMR), ils ont estimé (avis médical du 18 juin 2008) que les éléments versés au dossier au-delà de la date de l'opposition n'apportaient pas la preuve d'une aggravation, et qu'en l'absence d'un changement objectivable de l'état de santé, il y avait lieu de s'en tenir à l'exigibilité fixée sur la base du dossier de X._ (c'est-à-dire des rapports des docteurs S._ et C._).
Par décision du 21 juillet 2008, l'office AI a rejeté l'opposition en se fondant principalement sur l'avis du SMR.
B. Par l'intermédiaire de son employeur, P._ a déféré cette décision à la Cour des assurances sociales du Tribunal cantonal du canton de Vaud. Contestant le degré de l'incapacité de travail retenue, elle a demandé à être examinée par un médecin de l'office AI (ce qui n'avait pas encore eu lieu), voire par un expert indépendant. Plus particulièrement, elle a reproché aux experts de l'AI de n'avoir pas tenu compte des derniers examens de la doctoresse D._.
Par jugement du 2 octobre 2009, la juridiction cantonale a rejeté le recours.
C. P._ interjette un recours en matière de droit public ainsi qu'un recours constitutionnel subsidiaire contre ce jugement dont elle demande l'annulation, avec suite de frais et dépens, en concluant principalement à l'octroi d'une demi-rente d'invalidité depuis le 1er janvier 2004, subsidiairement au renvoi de la cause à l'instance inférieure pour instruction complémentaire.
L'intimé conclut implicitement au rejet du recours, tandis que l'Office fédéral des assurances sociales a renoncé à se déterminer.

Considérant en droit:
1. Le litige porte sur le taux d'invalidité de la recourante, singulièrement sur son droit à une rente.
Les premiers juges ont exposé correctement les règles applicables à la solution du litige. Il suffit ainsi de renvoyer au jugement attaqué, en particulier à son consid. 5 relatif au principe inquisitoire et à l'administration des preuves.
2. La recourante soulève deux griefs à l'encontre du jugement attaqué. Elle soutient que les rapports des docteurs S._ et C._, établis en 2003 et 2004, étaient dépassés lorsque le tribunal cantonal a statué, tandis que les avis des docteurs M._ et D._, rédigés en 2008, reflétaient son état de santé actuel. Par ailleurs, elle se prévaut d'une violation de son droit d'être entendue, car sa requête d'expertise médicale n'a pas été suivie.
3. 3.1 La recourante invoque une violation du droit fédéral au sens de l'<ref-law>, résultant tant d'une mauvaise appréciation des preuves que d'une application erronée du principe inquisitoire (art. 61 let. c LGPA). Le point de savoir si la juridiction cantonale de recours a correctement administré et apprécié les preuves relève d'une question de droit; le Tribunal fédéral peut ainsi examiner librement les griefs soulevés.
En l'espèce, il s'agit de déterminer si la juridiction cantonale de recours pouvait statuer sur la légalité de la décision du 21 juillet 2008 à la lumière des avis médicaux versés au dossier, sans procéder à un complément d'instruction, d'office ou à la demande de la recourante.
3.2 Les premiers juges ont retenu que la recourante avait disposé à nouveau d'une capacité de travail entière dans son ancienne activité dès la fin de l'année 2003, aussi bien d'un point de vue somatique que psychiatrique. Ce constat de fait procède d'une appréciation du dossier médical complet, en particulier des rapports des docteurs S._ et C._. A propos de l'avis de la doctoresse D._, les juges cantonaux ont considéré que la prénommée n'avait pas explicité les motifs de son évaluation, tandis que les docteurs S._ et C._ avaient tous deux discuté leurs conclusions de façon détaillée et dûment motivée, à l'issue d'une analyse que le tribunal cantonal a qualifiée de "complète, cohérente, fouillée, nuancée, éclairante et pertinente". Quant au point de vue du docteur M._, médecin traitant, il a été jugé peu circonstancié.
3.3 Même en tenant compte de la jurisprudence récente de la Cour européenne des droits de l'homme, il n'existe pas, dans la procédure d'octroi ou de refus de prestations d'assurances sociales, de droit formel à une expertise menée par un médecin externe à l'assurance. Il convient toutefois d'ordonner une telle expertise si des doutes, même faibles, subsistent quant à la fiabilité et à la pertinence des constatations médicales effectuées à l'interne (<ref-ruling>).
A la lumière de ces principes, la voie suivie par la juridiction cantonale ainsi que le résultat auquel elle est parvenue ne prêtent pas le flanc à la critique. D'une part, cette autorité a exposé clairement les motifs qui l'ont conduite à s'en tenir aux rapports des docteurs S._ et C._. D'autre part, elle a relevé que la doctoresse D._ n'avait pas justifié son évaluation de la capacité de travail de la recourante dans une activité adaptée; on ajoutera que cette spécialiste en neurologie n'avait pas non plus indiqué les raisons pour lesquelles elle s'était distancée de l'avis de ses confrères S._ et C._ sur cette question.
Certes, plusieurs années s'étaient écoulées entre le moment où les docteurs S._ et C._ s'étaient exprimés et le jour où la décision sur opposition avait été rendue (le juge des assurances sociales apprécie la légalité des décisions administratives au jour où elles sont rendues : <ref-ruling> consid. 2.1.2.1 p. 412 et les références), mais cela n'altère pas pour autant la valeur probante de leurs expertises (cf. <ref-ruling> consid. 3a p. 352). Seul est décisif le fait que les conclusions des deux médecins prénommés n'avaient pas été remises en cause par un avis médical pertinent, au jour où l'intimé a statué, de façon à justifier la mise en oeuvre d'un complément d'instruction. La juridiction cantonale a donc appliqué correctement le droit fédéral en admettant que la cause se trouvait en l'état d'être jugée, après avoir rejeté la requête d'expertise complémentaire de la recourante.
3.4 Quant à l'évaluation de l'invalidité proprement dite, elle n'est pas sujette à discussion. Au demeurant, la recourante n'indique pas en quoi elle serait erronée.
4. Le recours constitutionnel subsidiaire (<ref-law>) est irrecevable. En effet, à supposer qu'il porte sur le droit de faire administrer des preuves complémentaires, le grief a pu être examiné (et écarté) dans le cadre du recours en matière de droit public (<ref-law>).
5. La recourante, qui succombe, supportera les frais de la procédure (<ref-law>).

Par ces motifs, le Tribunal fédéral prononce:
1. Le recours est rejeté.
2. Le recours constitutionnel subsidiaire est irrecevable.
3. Les frais judiciaires, arrêtés à 500 fr., sont mis à la charge de la recourante.
4. Le présent arrêt est communiqué aux parties, à la Cour des assurances sociales du Tribunal cantonal du canton de Vaud et à l'Office fédéral des assurances sociales.
Lucerne, le 21 octobre 2010
Au nom de la IIe Cour de droit social
du Tribunal fédéral suisse
Le Président: Le Greffier:
Meyer Berthoud