Author Topic: Au secouuuuurs !  (Read 1659 times)

0 Members and 1 Guest are viewing this topic.

Offline Patapom

  • Base
    • View Profile
    • www.patapom.com
  • Ancienneté: 1988
  • Groupe: Bomb!
  • Rôle: Coder
  • Ville: Lyon
Au secouuuuurs !
« on: 27 February 2013 à 18:18:48 »
**DX10 / 11**

Help ! Je deviens fou !

Pour la première fois de ma vie j'ai décidé d'utiliser le stencil buffer. Grand mal m'en a pris car je suis pas allé plus loin que créer les DepthStencilStates !
En effet, là où n'importe qui crée son state sans se soucier de quoi que ce soit, comme je l'ai toujours fait jusque là, voilà ce que ça me sort dans la console (et bien sûr mon state est NULL) :

Code: [Select]
D3D11: ERROR: ID3D11Device::CreateDepthStencilState: FrontFace.StencilFailOp has an unrecognized value. [ STATE_CREATION ERROR #202: CREATEDEPTHSTENCILSTATE_INVALIDFRONTFACESTENCILFAILOP ]
D3D11: ERROR: ID3D11Device::CreateDepthStencilState: FrontFace.StencilDepthFailOp has an unrecognized value. [ STATE_CREATION ERROR #203: CREATEDEPTHSTENCILSTATE_INVALIDFRONTFACESTENCILZFAILOP ]
D3D11: ERROR: ID3D11Device::CreateDepthStencilState: FrontFace.StencilPassOp has an unrecognized value. [ STATE_CREATION ERROR #204: CREATEDEPTHSTENCILSTATE_INVALIDFRONTFACESTENCILPASSOP ]
D3D11: ERROR: ID3D11Device::CreateDepthStencilState: FrontFace.StencilFunc has an unrecognized value. [ STATE_CREATION ERROR #205: CREATEDEPTHSTENCILSTATE_INVALIDFRONTFACESTENCILFUNC ]
D3D11: ERROR: ID3D11Device::CreateDepthStencilState: BackFace.StencilFailOp has an unrecognized value. [ STATE_CREATION ERROR #206: CREATEDEPTHSTENCILSTATE_INVALIDBACKFACESTENCILFAILOP ]
D3D11: ERROR: ID3D11Device::CreateDepthStencilState: BackFace.StencilDepthFailOp has an unrecognized value. [ STATE_CREATION ERROR #207: CREATEDEPTHSTENCILSTATE_INVALIDBACKFACESTENCILZFAILOP ]
D3D11: ERROR: ID3D11Device::CreateDepthStencilState: BackFace.StencilPassOp has an unrecognized value. [ STATE_CREATION ERROR #208: CREATEDEPTHSTENCILSTATE_INVALIDBACKFACESTENCILPASSOP ]
D3D11: ERROR: ID3D11Device::CreateDepthStencilState: BackFace.StencilFunc has an unrecognized value. [ STATE_CREATION ERROR #209: CREATEDEPTHSTENCILSTATE_INVALIDBACKFACESTENCILFUNC ]

Alors j'ai pris le descripteur du state que je voulais créer dans mon code, je l'ai mis dans un code d'exemple du SDK de DX qui crée des states et ça passe sans problème.
J'ai quasiment recopié tout ce qu'ils faisaient dans DXUT pour initialiser leur device, y compris la création de la window class et de la window elle-même, j'ai les mêmes flags partout pourtant, eux ça marche et moi pas...

Ca fait 1 journée que je suis sur cette merde, y a personne qui a ce problème sur le net, je deviens fou !
Est-ce que ça fait *DING* dans votre tête quelque part ??

HEEEEEEEEEEELP !  :'(
.  Pom  .

Offline Patapom

  • Base
    • View Profile
    • www.patapom.com
  • Ancienneté: 1988
  • Groupe: Bomb!
  • Rôle: Coder
  • Ville: Lyon
Re : Au secouuuuurs !
« Reply #1 on: 27 February 2013 à 18:33:08 »
Si vous voulez le code de création du state c'est aussi con que ça :

Code: [Select]
D3D11_DEPTH_STENCIL_DESC DepthStencilDescDepthWriteStencilTest = {
TRUE,                           // BOOL DepthEnable;
D3D11_DEPTH_WRITE_MASK_ALL,     // D3D11_DEPTH_WRITE_MASK DepthWriteMask;
D3D11_COMPARISON_LESS_EQUAL,    // D3D11_COMPARISON_FUNC DepthFunc;
TRUE,                           // BOOL StencilEnable;
0xFF, // UINT8 StencilReadMask;
0,                              // UINT8 StencilWriteMask;
{                               // D3D11_DEPTH_STENCILOP_DESC FrontFace;
    D3D11_STENCIL_OP_KEEP,      // D3D11_STENCIL_OP StencilFailOp;
    D3D11_STENCIL_OP_KEEP,      // D3D11_STENCIL_OP StencilDepthFailOp;
    D3D11_STENCIL_OP_KEEP,      // D3D11_STENCIL_OP StencilPassOp;
    D3D11_COMPARISON_EQUAL,     // D3D11_COMPARISON_FUNC StencilFunc;
},
{                               // D3D11_DEPTH_STENCILOP_DESC BackFace;
    D3D11_STENCIL_OP_KEEP,      // D3D11_STENCIL_OP StencilFailOp;
    D3D11_STENCIL_OP_KEEP,      // D3D11_STENCIL_OP StencilDepthFailOp;
    D3D11_STENCIL_OP_KEEP,      // D3D11_STENCIL_OP StencilPassOp;
    D3D11_COMPARISON_EQUAL,     // D3D11_COMPARISON_FUNC StencilFunc;
},
};
ID3D11DepthStencilState* pState;
m_pDevice->CreateDepthStencilState( &DepthStencilDescDepthWriteStencilTest, &pState );
ASSERT( pState, "RHAA MAIS FUCK A LA FIN !" );
.  Pom  .

Offline Patapom

  • Base
    • View Profile
    • www.patapom.com
  • Ancienneté: 1988
  • Groupe: Bomb!
  • Rôle: Coder
  • Ville: Lyon
Re : Au secouuuuurs !
« Reply #2 on: 27 February 2013 à 19:47:35 »
Mouais alors ça venait de cette salope d'option de projet C/C++ > Code Generation > Struct Member Alignment > 1 byte
Ca fausse tout !

Voici la structure mémoire du descripteur de state alignée normalement :
Code: [Select]
// 0x0018FDBC  00000001 00000001 00000004 00000001 001800ff 00000001  ................ÿ.......
// 0x0018FDD4  00000001 00000001 00000003 00000001 00000001 00000001  ........................
// 0x0018FDEC  00000003

Et la version 1-byte :
Code: [Select]
// 0x0042FAF8  00000001 00000001 00000004 00000001 000100ff 00010000  ................ÿ.......
// 0x0042FB10  00010000 00030000 00010000 00010000 00010000 00030000  ........................
// 0x0042FB28  00000000

On voit que ça se mélange dedans après les read/write masks de stencil qui sont effectivement packés sur 2 octets alors que dans la version du haut les 2 octets de masque sont alignés sur 4 octets et c'est l'amour...

1 journée de paumée là dessus... Ca se passe de commentaire... :(
.  Pom  .

Offline xoofx

  • Base
    • Pouet.net
    • View Profile
    • xoofx
  • Ancienneté: 1989
  • Groupe: FRequency
  • Rôle: code (+musique), web
  • Ville: Grenoble
Re : Au secouuuuurs !
« Reply #3 on: 28 February 2013 à 02:29:51 »
ah ben c'est balou ca, t'avais pas qu'a changer l'alignement au niveau du projet!  :P Utilise les pragmas pour ce genre de truc, sinon ça fait tout péter  ;)

Offline Patapom

  • Base
    • View Profile
    • www.patapom.com
  • Ancienneté: 1988
  • Groupe: Bomb!
  • Rôle: Coder
  • Ville: Lyon
Re : Au secouuuuurs !
« Reply #4 on: 28 February 2013 à 12:19:27 »
C'est pas moi qu'a changé ! J'ai repompé le framework 64K d'iQ et c'était comme ça... ;D
Mais bon, un p'tit coup de #pragma pack autour des includes de DX et le tour est joué ! Tu m'étonnes que c'est balot de paumer du temps sur ça... En plus tu t'en veux toujours de pas avoir trouvé plus vite une fois que tu connais la solution.
.  Pom  .