DirectX et PIX

Hello,

Je fouille dans les examples fournis avec le SDK directx 9.0c, et un truc me perturbe, la façon dont ils appellent les méthodes de PIX. Pour ceux qui ne savent pas, PIX est un logiciel (dévelopé à l’origine pour XBox) fourni avec le SDK DirectX, qui permet de faire des logs d’exécutions d’applications Direct3D et d’ensuite les analyser pour voir ce qui se passe en détails.

Un programme ne doit pas spécialement tenir compte de la présence de PIX, mais on a la possibilité de fournir certaines informations (en gros, des flags) qui se retrouveront au final dans le log. Pour ce faire, on a une série de fonctions, du genre D3DPERF_BeginEvent.

La façon dont ces méthodes sont appelées dans les examples est la suivante:

WCHAR wszPath[MAX_PATH+1]; if( !::GetSystemDirectory( wszPath, MAX_PATH+1 ) ) return false; lstrcatW( wszPath, L"\\d3d9.dll" ); s_hModD3D9 = LoadLibrary( wszPath ); if( s_hModD3D9 == NULL ) return false; s_DynamicD3DPERF_BeginEvent = (LPD3DPERF_BEGINEVENT)GetProcAddress( s_hModD3D9, "D3DPERF_BeginEvent" );

Et après ils utilisent le pointeur ainsi obtenu pour faire les appels. Ca me semble drôlement compliqué étant donné que D3DPERF_BeginEvent existe dans la lib Direct3D, pourquoi ne pas l’appeler directement ? Quelqu’un a une idée ? Glop ? :stuck_out_tongue:

Heu la tout de suite je sais pas te repondre. Attends le 11 juillet :stuck_out_tongue: Sinon d’apres ce que j’ai suivit, t’as pas a faire grand chose du tout pour analyzer ton code avec PIX, voire quasi rien. Donc a suivre… mattes la doc ou quoi et encore desole de pas pouvoir t’aider plus pour l’instant…

[quote name=‹ GloP › date=’ 30 Jun 2005, 12:26’]Heu la tout de suite je sais pas te repondre. Attends le 11 juillet :stuck_out_tongue: Sinon d’apres ce que j’ai suivit, t’as pas a faire grand chose du tout pour analyzer ton code avec PIX, voire quasi rien. Donc a suivre… mattes la doc ou quoi et encore desole de pas pouvoir t’aider plus pour l’instant…
[right][post=« 373202 »]<{POST_SNAPBACK}>[/post][/right][/quote]

Non c’est clair, faut rien toucher au code pour pouvoir analyser un programme avec PIX. Par contre on a la possibilité, si on le souhaite, d’envoyer quelques infos à PIX pour qu’il puisse structurer le log. Quand t’as 1000 calls par frame, c’est pratique de les visionner sous forme de hiérarchie « ici c’est le gui, ici c’est le terrain, là c’est le perso, etc. »

J’ai découvert ça au workshop PIX de la GDC, c’est bien cool comme fonctionnalité mais l’ennui c’est que la documentation se résume à cinq lignes dans la doc de PIX et que nulle part il n’est expliqué pourquoi aller chercher la DLL à la main, ni même les effets exacts de chaque fonction.

Et sinon y’a vraiment pas à t’excuser ! Je réalise pleinement que tu n’es pas encore dans le projet XNA et qu’il te faudra de toutes façons un petit temps d’adaptation, et je réalise surtout que tu réponds aux questions sur Cafzone pour le fun, ça ne fait pas partie de ton boulot et tu n’as aucune obligation à ce niveau… Donc le « Glop? » à la fin de mon post précédent était un clin d’oeil, pas une requête « alors, ça vient la réponse ? » :stuck_out_tongue: Et quoi qu’il en soit, merci :stuck_out_tongue:

Hehe non mais j’aime bien pouvoir repondre et aider :stuck_out_tongue: Sinon j’etais a GameFest 05 cet aprem et c’est pour ca que c’est « ralant » parceque y avait justement une session sur « commencer avec PIX » et j’y suis pas allé, j’ai prefere « XBox 360 GPU internals » hehe. Le truc c’est que c’est un outil qui vient de xbox comme tu l’as dit et que la plupart des docs sont encore dans le XDK, et sont en train d’etre portees pour etre generiques PC/XBox il me semble. Si tu me le rapelle apres le 11, je verrais ce que je peux denicher. Ils font des release de directx pour les devs assez souvent sinon, donc la mise a jour des docs et tout devrait pas prendre des mois. Si t’es au GDC l’annee prochaine on se verra peut etre pour que je puisse te donner une beta de XNA Studio :stuck_out_tongue:

[quote name=‹ GloP › date=’ 30 Jun 2005, 12:43’]Hehe non mais j’aime bien pouvoir repondre et aider :stuck_out_tongue: Sinon j’etais a GameFest 05 cet aprem et c’est pour ca que c’est « ralant » parceque y avait justement une session sur « commencer avec PIX » et j’y suis pas allé, j’ai prefere « XBox 360 GPU internals » hehe. Le truc c’est que c’est un outil qui vient de xbox comme tu l’as dit et que la plupart des docs sont encore dans le XDK, et sont en train d’etre portees pour etre generiques PC/XBox il me semble. Si tu me le rapelle apres le 11, je verrais ce que je peux denicher. Ils font des release de directx pour les devs assez souvent sinon, donc la mise a jour des docs et tout devrait pas prendre des mois. Si t’es au GDC l’annee prochaine on se verra peut etre pour que je puisse te donner une beta de XNA Studio :stuck_out_tongue:
[right][post=« 373211 »]<{POST_SNAPBACK}>[/post][/right][/quote]

Bah ne râle pas trop, PIX fait partie de ces logiciels dont tout le monde a entendu parler, mais peu de gens ont vraiment pris la peine de l’utiliser car ça a l’air compliqué. Et la présentation que j’ai eue a eu pour principal effet de m’ouvrir les yeux sur le monstrueux potentiel de l’outil et le fait que c’est finalement pas très compliqué. Comme je pense que tu n’es plus à convaincre, tu n’aurais probablement pas appris des masses.

Je dois aussi dire que la présentation a attiré mon attention sur autre chose de moins positif : ça manque encore pas mal de polish, c’est pas très compliqué à faire planter ou freezer, ça manque d’options pour faciliter l’analyse, et on est encore loin des features de folie de la version XBox. Clairement, tu vas pas chômer :stuck_out_tongue:

Tiens, au début je me demandais ce que pouvait bien foutre du DirectX sur un PIX. Après avoir lu, je comprends mieux. LeS Pix que je connais, ce sont des firewalls pas top de Cisco :stuck_out_tongue:

De rien pour ce post hautement constructif

WCHAR wszPath[MAX_PATH+1]; if( !::GetSystemDirectory( wszPath, MAX_PATH+1 ) ) return false; lstrcatW( wszPath, L"\\d3d9.dll" ); s_hModD3D9 = LoadLibrary( wszPath ); if( s_hModD3D9 == NULL ) return false; s_DynamicD3DPERF_BeginEvent = (LPD3DPERF_BEGINEVENT)GetProcAddress( s_hModD3D9, "D3DPERF_BeginEvent" );

L’example que tu donnes permets d’appeler la fonction D3DPERF_BeginEvent sans avoir a linker la lib static qui accompagne la dll, c’est un poil bourrin mais ca permet d’avoir:
a) Un link implicite : la dll charge EST TOUJOURS systemdirectory\d3d9.dll, aucune autre… super pratique quand tu build des APIs et que tu as 2038774 version de la meme qui trainent a gauche a droite !
petitbparenthese De forcer l’utilisation de la version la plus recente : Si la dll dans le systemdirectory est plus recente que celle que tu as utilise pour ecrire ton code, elle sera tout de meme utilise, alors qu’en appelant la fonction depuis la static lib, tu risques d’avoir des problemes qui vont te creer des soucis.

5ug4r3d1t: Putain de smiley !

Après réflexion, je pense que j’ai la réponse, c’est presque ce que c0unt0 a dit. En fait il semblerait que PIX n’aie été incorporé au SDK DX9.0c que lors d’une update, il n’était pas dans la release initiale. Ce qui fait donc que quelqu’un qui a un « ancien » DX9.0c ne dispose pas de ces fonctions, et si le programme n’était pas concu pour gérer leur absence, il refuserait simplement de se lancer.

Donc l’idée n’est pas d’utiliser la lib la plus récente, mais de permettre d’utiliser des « vieilles libs » :stuck_out_tongue:

Mais ça m’amène à la question suivante : pour PIX, je comprends qu’on puisse s’en passer si les fonctions ne sont pas là… (enfin de toutes façons ce genre de trucs ne devrait pas se retrouver en release, mais ça peut aider pour les alpha ou beta). Mais si on utilise des fonctions des updates SDK, dont on a vraiment besoin, on fait comment ? On demande au end user d’installer une version plus récente de DirectX 9.0c ?

Bah tu fais comme les jeux font: tu fourni la bonne version de DirectX avec le jeu, tu fais un install de directX à l’installation du jeu (sans demander l’utilisateur). L’installe de directX mettra tout seul DirectX à jour s’il le faut.