EffectReflection.cpp 63 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184
  1. //--------------------------------------------------------------------------------------
  2. // File: EffectReflection.cpp
  3. //
  4. // Direct3D 11 Effects public reflection APIs
  5. //
  6. //
  7. // THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
  8. // ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
  9. // THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
  10. // PARTICULAR PURPOSE.
  11. //
  12. // Copyright (c) Microsoft Corporation. All rights reserved.
  13. //
  14. // http://go.microsoft.com/fwlink/p/?LinkId=271568
  15. //--------------------------------------------------------------------------------------
  16. #include "pchfx.h"
  17. namespace D3DX11Effects
  18. {
  19. SEffectInvalidType g_InvalidType;
  20. SEffectInvalidScalarVariable g_InvalidScalarVariable;
  21. SEffectInvalidVectorVariable g_InvalidVectorVariable;
  22. SEffectInvalidMatrixVariable g_InvalidMatrixVariable;
  23. SEffectInvalidStringVariable g_InvalidStringVariable;
  24. SEffectInvalidClassInstanceVariable g_InvalidClassInstanceVariable;
  25. SEffectInvalidInterfaceVariable g_InvalidInterfaceVariable;
  26. SEffectInvalidShaderResourceVariable g_InvalidShaderResourceVariable;
  27. SEffectInvalidUnorderedAccessViewVariable g_InvalidUnorderedAccessViewVariable;
  28. SEffectInvalidRenderTargetViewVariable g_InvalidRenderTargetViewVariable;
  29. SEffectInvalidDepthStencilViewVariable g_InvalidDepthStencilViewVariable;
  30. SEffectInvalidConstantBuffer g_InvalidConstantBuffer;
  31. SEffectInvalidShaderVariable g_InvalidShaderVariable;
  32. SEffectInvalidBlendVariable g_InvalidBlendVariable;
  33. SEffectInvalidDepthStencilVariable g_InvalidDepthStencilVariable;
  34. SEffectInvalidRasterizerVariable g_InvalidRasterizerVariable;
  35. SEffectInvalidSamplerVariable g_InvalidSamplerVariable;
  36. SEffectInvalidPass g_InvalidPass;
  37. SEffectInvalidTechnique g_InvalidTechnique;
  38. SEffectInvalidGroup g_InvalidGroup;
  39. //////////////////////////////////////////////////////////////////////////
  40. // Helper routine implementations
  41. //////////////////////////////////////////////////////////////////////////
  42. ID3DX11EffectConstantBuffer * NoParentCB()
  43. {
  44. DPF(0, "ID3DX11EffectVariable::GetParentConstantBuffer: Variable does not have a parent constant buffer");
  45. // have to typecast because the type of g_InvalidScalarVariable has not been declared yet
  46. return &g_InvalidConstantBuffer;
  47. }
  48. _Use_decl_annotations_
  49. ID3DX11EffectVariable * GetAnnotationByIndexHelper(const char *pClassName, uint32_t Index, uint32_t AnnotationCount, SAnnotation *pAnnotations)
  50. {
  51. if (Index >= AnnotationCount)
  52. {
  53. DPF(0, "%s::GetAnnotationByIndex: Invalid index (%u, total: %u)", pClassName, Index, AnnotationCount);
  54. return &g_InvalidScalarVariable;
  55. }
  56. return pAnnotations + Index;
  57. }
  58. _Use_decl_annotations_
  59. ID3DX11EffectVariable * GetAnnotationByNameHelper(const char *pClassName, LPCSTR Name, uint32_t AnnotationCount, SAnnotation *pAnnotations)
  60. {
  61. uint32_t i;
  62. for (i = 0; i < AnnotationCount; ++ i)
  63. {
  64. if (strcmp(pAnnotations[i].pName, Name) == 0)
  65. {
  66. return pAnnotations + i;
  67. }
  68. }
  69. DPF(0, "%s::GetAnnotationByName: Annotation [%s] not found", pClassName, Name);
  70. return &g_InvalidScalarVariable;
  71. }
  72. //////////////////////////////////////////////////////////////////////////
  73. // Effect routines to pool interfaces
  74. //////////////////////////////////////////////////////////////////////////
  75. ID3DX11EffectType * CEffect::CreatePooledSingleElementTypeInterface(_In_ SType *pType)
  76. {
  77. if (IsOptimized())
  78. {
  79. DPF(0, "ID3DX11Effect: Cannot create new type interfaces since the effect has been Optimize()'ed");
  80. return &g_InvalidType;
  81. }
  82. for (size_t i = 0; i < m_pTypeInterfaces.GetSize(); ++ i)
  83. {
  84. if (m_pTypeInterfaces[i]->pType == pType)
  85. {
  86. return (SSingleElementType*)m_pTypeInterfaces[i];
  87. }
  88. }
  89. SSingleElementType *pNewType;
  90. if (nullptr == (pNewType = new SSingleElementType))
  91. {
  92. DPF(0, "ID3DX11Effect: Out of memory while trying to create new type interface");
  93. return &g_InvalidType;
  94. }
  95. pNewType->pType = pType;
  96. m_pTypeInterfaces.Add(pNewType);
  97. return pNewType;
  98. }
  99. // Create a member variable (via GetMemberBy* or GetElement)
  100. _Use_decl_annotations_
  101. ID3DX11EffectVariable * CEffect::CreatePooledVariableMemberInterface(TTopLevelVariable<ID3DX11EffectVariable> *pTopLevelEntity,
  102. const SVariable *pMember,
  103. const UDataPointer Data, bool IsSingleElement, uint32_t Index)
  104. {
  105. bool IsAnnotation;
  106. if (IsOptimized())
  107. {
  108. DPF(0, "ID3DX11Effect: Cannot create new variable interfaces since the effect has been Optimize()'ed");
  109. return &g_InvalidScalarVariable;
  110. }
  111. for (size_t i = 0; i < m_pMemberInterfaces.GetSize(); ++ i)
  112. {
  113. if (m_pMemberInterfaces[i]->pType == pMember->pType &&
  114. m_pMemberInterfaces[i]->pName == pMember->pName &&
  115. m_pMemberInterfaces[i]->pSemantic == pMember->pSemantic &&
  116. m_pMemberInterfaces[i]->Data.pGeneric == Data.pGeneric &&
  117. m_pMemberInterfaces[i]->IsSingleElement == (uint32_t)IsSingleElement &&
  118. ((SMember*)m_pMemberInterfaces[i])->pTopLevelEntity == pTopLevelEntity)
  119. {
  120. return (ID3DX11EffectVariable *) m_pMemberInterfaces[i];
  121. }
  122. }
  123. // is this annotation or runtime data?
  124. if( pTopLevelEntity->pEffect->IsReflectionData(pTopLevelEntity) )
  125. {
  126. assert( pTopLevelEntity->pEffect->IsReflectionData(Data.pGeneric) );
  127. IsAnnotation = true;
  128. }
  129. else
  130. {
  131. // if the heap is empty, we are still loading the Effect, and thus creating a member for a variable initializer
  132. // ex. Interface myInt = myClassArray[2];
  133. if( pTopLevelEntity->pEffect->m_Heap.GetSize() > 0 )
  134. {
  135. assert( pTopLevelEntity->pEffect->IsRuntimeData(pTopLevelEntity) );
  136. if (!pTopLevelEntity->pType->IsObjectType(EOT_String))
  137. {
  138. // strings are funny; their data is reflection data, so ignore those
  139. assert( pTopLevelEntity->pEffect->IsRuntimeData(Data.pGeneric) );
  140. }
  141. }
  142. IsAnnotation = false;
  143. }
  144. SMember *pNewMember;
  145. if (nullptr == (pNewMember = CreateNewMember((SType*)pMember->pType, IsAnnotation)))
  146. {
  147. DPF(0, "ID3DX11Effect: Out of memory while trying to create new member variable interface");
  148. return &g_InvalidScalarVariable;
  149. }
  150. pNewMember->pType = pMember->pType;
  151. pNewMember->pName = pMember->pName;
  152. pNewMember->pSemantic = pMember->pSemantic;
  153. pNewMember->Data.pGeneric = Data.pGeneric;
  154. pNewMember->IsSingleElement = IsSingleElement;
  155. pNewMember->pTopLevelEntity = pTopLevelEntity;
  156. if( IsSingleElement && pMember->pMemberData )
  157. {
  158. assert( !IsAnnotation );
  159. // This is an element of a global variable array
  160. pNewMember->pMemberData = pMember->pMemberData + Index;
  161. }
  162. if (FAILED(m_pMemberInterfaces.Add(pNewMember)))
  163. {
  164. SAFE_DELETE(pNewMember);
  165. DPF(0, "ID3DX11Effect: Out of memory while trying to create new member variable interface");
  166. return &g_InvalidScalarVariable;
  167. }
  168. return (ID3DX11EffectVariable *) pNewMember;
  169. }
  170. //////////////////////////////////////////////////////////////////////////
  171. // ID3DX11EffectType (SType, SSingleElementType implementations)
  172. //////////////////////////////////////////////////////////////////////////
  173. static ID3DX11EffectType * GetTypeByIndexHelper(uint32_t Index, uint32_t VariableCount,
  174. SVariable *pVariables, uint32_t SizeOfVariableType)
  175. {
  176. static LPCSTR pFuncName = "ID3DX11EffectType::GetMemberTypeByIndex";
  177. if (Index >= VariableCount)
  178. {
  179. DPF(0, "%s: Invalid index (%u, total: %u)", pFuncName, Index, VariableCount);
  180. return &g_InvalidType;
  181. }
  182. SVariable *pVariable = (SVariable *)((uint8_t *)pVariables + Index * SizeOfVariableType);
  183. if (nullptr == pVariable->pName)
  184. {
  185. DPF(0, "%s: Cannot get member types; Effect has been Optimize()'ed", pFuncName);
  186. return &g_InvalidType;
  187. }
  188. return (ID3DX11EffectType *) pVariable->pType;
  189. }
  190. static ID3DX11EffectType * GetTypeByNameHelper(LPCSTR Name, uint32_t VariableCount,
  191. SVariable *pVariables, uint32_t SizeOfVariableType)
  192. {
  193. static LPCSTR pFuncName = "ID3DX11EffectType::GetMemberTypeByName";
  194. if (nullptr == Name)
  195. {
  196. DPF(0, "%s: Parameter Name was nullptr.", pFuncName);
  197. return &g_InvalidType;
  198. }
  199. uint32_t i;
  200. SVariable *pVariable;
  201. for (i = 0; i < VariableCount; ++ i)
  202. {
  203. pVariable = (SVariable *)((uint8_t *)pVariables + i * SizeOfVariableType);
  204. if (nullptr == pVariable->pName)
  205. {
  206. DPF(0, "%s: Cannot get member types; Effect has been Optimize()'ed", pFuncName);
  207. return &g_InvalidType;
  208. }
  209. if (strcmp(pVariable->pName, Name) == 0)
  210. {
  211. return (ID3DX11EffectType *) pVariable->pType;
  212. }
  213. }
  214. DPF(0, "%s: Member type [%s] not found", pFuncName, Name);
  215. return &g_InvalidType;
  216. }
  217. static ID3DX11EffectType * GetTypeBySemanticHelper(LPCSTR Semantic, uint32_t VariableCount,
  218. SVariable *pVariables, uint32_t SizeOfVariableType)
  219. {
  220. static LPCSTR pFuncName = "ID3DX11EffectType::GetMemberTypeBySemantic";
  221. if (nullptr == Semantic)
  222. {
  223. DPF(0, "%s: Parameter Semantic was nullptr.", pFuncName);
  224. return &g_InvalidType;
  225. }
  226. uint32_t i;
  227. SVariable *pVariable;
  228. for (i = 0; i < VariableCount; ++ i)
  229. {
  230. pVariable = (SVariable *)((uint8_t *)pVariables + i * SizeOfVariableType);
  231. if (nullptr == pVariable->pName)
  232. {
  233. DPF(0, "%s: Cannot get member types; Effect has been Optimize()'ed", pFuncName);
  234. return &g_InvalidType;
  235. }
  236. if (nullptr != pVariable->pSemantic &&
  237. _stricmp(pVariable->pSemantic, Semantic) == 0)
  238. {
  239. return (ID3DX11EffectType *) pVariable->pType;
  240. }
  241. }
  242. DPF(0, "%s: Member type with semantic [%s] not found", pFuncName, Semantic);
  243. return &g_InvalidType;
  244. }
  245. ID3DX11EffectType * SType::GetMemberTypeByIndex(_In_ uint32_t Index)
  246. {
  247. if (VarType != EVT_Struct)
  248. {
  249. DPF(0, "ID3DX11EffectType::GetMemberTypeByIndex: This interface does not refer to a structure");
  250. return &g_InvalidType;
  251. }
  252. return GetTypeByIndexHelper(Index, StructType.Members, StructType.pMembers, sizeof(SVariable));
  253. }
  254. ID3DX11EffectType * SType::GetMemberTypeByName(_In_z_ LPCSTR Name)
  255. {
  256. if (VarType != EVT_Struct)
  257. {
  258. DPF(0, "ID3DX11EffectType::GetMemberTypeByName: This interface does not refer to a structure");
  259. return &g_InvalidType;
  260. }
  261. return GetTypeByNameHelper(Name, StructType.Members, StructType.pMembers, sizeof(SVariable));
  262. }
  263. ID3DX11EffectType * SType::GetMemberTypeBySemantic(_In_z_ LPCSTR Semantic)
  264. {
  265. if (VarType != EVT_Struct)
  266. {
  267. DPF(0, "ID3DX11EffectType::GetMemberTypeBySemantic: This interface does not refer to a structure");
  268. return &g_InvalidType;
  269. }
  270. return GetTypeBySemanticHelper(Semantic, StructType.Members, StructType.pMembers, sizeof(SVariable));
  271. }
  272. LPCSTR SType::GetMemberName(_In_ uint32_t Index)
  273. {
  274. static LPCSTR pFuncName = "ID3DX11EffectType::GetMemberName";
  275. if (VarType != EVT_Struct)
  276. {
  277. DPF(0, "%s: This interface does not refer to a structure", pFuncName);
  278. return nullptr;
  279. }
  280. if (Index >= StructType.Members)
  281. {
  282. DPF(0, "%s: Invalid index (%u, total: %u)", pFuncName, Index, StructType.Members);
  283. return nullptr;
  284. }
  285. SVariable *pVariable = StructType.pMembers + Index;
  286. if (nullptr == pVariable->pName)
  287. {
  288. DPF(0, "%s: Cannot get member names; Effect has been Optimize()'ed", pFuncName);
  289. return nullptr;
  290. }
  291. return pVariable->pName;
  292. }
  293. LPCSTR SType::GetMemberSemantic(_In_ uint32_t Index)
  294. {
  295. static LPCSTR pFuncName = "ID3DX11EffectType::GetMemberSemantic";
  296. if (VarType != EVT_Struct)
  297. {
  298. DPF(0, "%s: This interface does not refer to a structure", pFuncName);
  299. return nullptr;
  300. }
  301. if (Index >= StructType.Members)
  302. {
  303. DPF(0, "%s: Invalid index (%u, total: %u)", pFuncName, Index, StructType.Members);
  304. return nullptr;
  305. }
  306. SVariable *pVariable = StructType.pMembers + Index;
  307. if (nullptr == pVariable->pName)
  308. {
  309. DPF(0, "%s: Cannot get member semantics; Effect has been Optimize()'ed", pFuncName);
  310. return nullptr;
  311. }
  312. return pVariable->pSemantic;
  313. }
  314. HRESULT SType::GetDescHelper(_Out_ D3DX11_EFFECT_TYPE_DESC *pDesc, _In_ bool IsSingleElement) const
  315. {
  316. HRESULT hr = S_OK;
  317. static LPCSTR pFuncName = "ID3DX11EffectType::GetDesc";
  318. VERIFYPARAMETER(pDesc);
  319. pDesc->TypeName = pTypeName;
  320. // intentionally return 0 so they know it's not a single element array
  321. pDesc->Elements = IsSingleElement ? 0 : Elements;
  322. pDesc->PackedSize = GetTotalPackedSize(IsSingleElement);
  323. pDesc->UnpackedSize = GetTotalUnpackedSize(IsSingleElement);
  324. pDesc->Stride = Stride;
  325. switch (VarType)
  326. {
  327. case EVT_Numeric:
  328. switch (NumericType.NumericLayout)
  329. {
  330. case ENL_Matrix:
  331. if (NumericType.IsColumnMajor)
  332. {
  333. pDesc->Class = D3D_SVC_MATRIX_COLUMNS;
  334. }
  335. else
  336. {
  337. pDesc->Class = D3D_SVC_MATRIX_ROWS;
  338. }
  339. break;
  340. case ENL_Vector:
  341. pDesc->Class = D3D_SVC_VECTOR;
  342. break;
  343. case ENL_Scalar:
  344. pDesc->Class = D3D_SVC_SCALAR;
  345. break;
  346. default:
  347. assert(0);
  348. }
  349. switch (NumericType.ScalarType)
  350. {
  351. case EST_Bool:
  352. pDesc->Type = D3D_SVT_BOOL;
  353. break;
  354. case EST_Int:
  355. pDesc->Type = D3D_SVT_INT;
  356. break;
  357. case EST_UInt:
  358. pDesc->Type = D3D_SVT_UINT;
  359. break;
  360. case EST_Float:
  361. pDesc->Type = D3D_SVT_FLOAT;
  362. break;
  363. default:
  364. assert(0);
  365. }
  366. pDesc->Rows = NumericType.Rows;
  367. pDesc->Columns = NumericType.Columns;
  368. pDesc->Members = 0;
  369. break;
  370. case EVT_Struct:
  371. pDesc->Rows = 0;
  372. pDesc->Columns = 0;
  373. pDesc->Members = StructType.Members;
  374. if( StructType.ImplementsInterface )
  375. {
  376. pDesc->Class = D3D_SVC_INTERFACE_CLASS;
  377. }
  378. else
  379. {
  380. pDesc->Class = D3D_SVC_STRUCT;
  381. }
  382. pDesc->Type = D3D_SVT_VOID;
  383. break;
  384. case EVT_Interface:
  385. pDesc->Rows = 0;
  386. pDesc->Columns = 0;
  387. pDesc->Members = 0;
  388. pDesc->Class = D3D_SVC_INTERFACE_POINTER;
  389. pDesc->Type = D3D_SVT_INTERFACE_POINTER;
  390. break;
  391. case EVT_Object:
  392. pDesc->Rows = 0;
  393. pDesc->Columns = 0;
  394. pDesc->Members = 0;
  395. pDesc->Class = D3D_SVC_OBJECT;
  396. switch (ObjectType)
  397. {
  398. case EOT_String:
  399. pDesc->Type = D3D_SVT_STRING;
  400. break;
  401. case EOT_Blend:
  402. pDesc->Type = D3D_SVT_BLEND;
  403. break;
  404. case EOT_DepthStencil:
  405. pDesc->Type = D3D_SVT_DEPTHSTENCIL;
  406. break;
  407. case EOT_Rasterizer:
  408. pDesc->Type = D3D_SVT_RASTERIZER;
  409. break;
  410. case EOT_PixelShader:
  411. case EOT_PixelShader5:
  412. pDesc->Type = D3D_SVT_PIXELSHADER;
  413. break;
  414. case EOT_VertexShader:
  415. case EOT_VertexShader5:
  416. pDesc->Type = D3D_SVT_VERTEXSHADER;
  417. break;
  418. case EOT_GeometryShader:
  419. case EOT_GeometryShaderSO:
  420. case EOT_GeometryShader5:
  421. pDesc->Type = D3D_SVT_GEOMETRYSHADER;
  422. break;
  423. case EOT_HullShader5:
  424. pDesc->Type = D3D_SVT_HULLSHADER;
  425. break;
  426. case EOT_DomainShader5:
  427. pDesc->Type = D3D_SVT_DOMAINSHADER;
  428. break;
  429. case EOT_ComputeShader5:
  430. pDesc->Type = D3D_SVT_COMPUTESHADER;
  431. break;
  432. case EOT_Texture:
  433. pDesc->Type = D3D_SVT_TEXTURE;
  434. break;
  435. case EOT_Texture1D:
  436. pDesc->Type = D3D_SVT_TEXTURE1D;
  437. break;
  438. case EOT_Texture1DArray:
  439. pDesc->Type = D3D_SVT_TEXTURE1DARRAY;
  440. break;
  441. case EOT_Texture2D:
  442. pDesc->Type = D3D_SVT_TEXTURE2D;
  443. break;
  444. case EOT_Texture2DArray:
  445. pDesc->Type = D3D_SVT_TEXTURE2DARRAY;
  446. break;
  447. case EOT_Texture2DMS:
  448. pDesc->Type = D3D_SVT_TEXTURE2DMS;
  449. break;
  450. case EOT_Texture2DMSArray:
  451. pDesc->Type = D3D_SVT_TEXTURE2DMSARRAY;
  452. break;
  453. case EOT_Texture3D:
  454. pDesc->Type = D3D_SVT_TEXTURE3D;
  455. break;
  456. case EOT_TextureCube:
  457. pDesc->Type = D3D_SVT_TEXTURECUBE;
  458. break;
  459. case EOT_TextureCubeArray:
  460. pDesc->Type = D3D_SVT_TEXTURECUBEARRAY;
  461. break;
  462. case EOT_Buffer:
  463. pDesc->Type = D3D_SVT_BUFFER;
  464. break;
  465. case EOT_Sampler:
  466. pDesc->Type = D3D_SVT_SAMPLER;
  467. break;
  468. case EOT_RenderTargetView:
  469. pDesc->Type = D3D_SVT_RENDERTARGETVIEW;
  470. break;
  471. case EOT_DepthStencilView:
  472. pDesc->Type = D3D_SVT_DEPTHSTENCILVIEW;
  473. break;
  474. case EOT_RWTexture1D:
  475. pDesc->Type = D3D_SVT_RWTEXTURE1D;
  476. break;
  477. case EOT_RWTexture1DArray:
  478. pDesc->Type = D3D_SVT_RWTEXTURE1DARRAY;
  479. break;
  480. case EOT_RWTexture2D:
  481. pDesc->Type = D3D_SVT_RWTEXTURE2D;
  482. break;
  483. case EOT_RWTexture2DArray:
  484. pDesc->Type = D3D_SVT_RWTEXTURE2DARRAY;
  485. break;
  486. case EOT_RWTexture3D:
  487. pDesc->Type = D3D_SVT_RWTEXTURE3D;
  488. break;
  489. case EOT_RWBuffer:
  490. pDesc->Type = D3D_SVT_RWBUFFER;
  491. break;
  492. case EOT_ByteAddressBuffer:
  493. pDesc->Type = D3D_SVT_BYTEADDRESS_BUFFER;
  494. break;
  495. case EOT_RWByteAddressBuffer:
  496. pDesc->Type = D3D_SVT_RWBYTEADDRESS_BUFFER;
  497. break;
  498. case EOT_StructuredBuffer:
  499. pDesc->Type = D3D_SVT_STRUCTURED_BUFFER;
  500. break;
  501. case EOT_RWStructuredBuffer:
  502. case EOT_RWStructuredBufferAlloc:
  503. case EOT_RWStructuredBufferConsume:
  504. pDesc->Type = D3D_SVT_RWSTRUCTURED_BUFFER;
  505. break;
  506. case EOT_AppendStructuredBuffer:
  507. pDesc->Type = D3D_SVT_APPEND_STRUCTURED_BUFFER;
  508. break;
  509. case EOT_ConsumeStructuredBuffer:
  510. pDesc->Type = D3D_SVT_CONSUME_STRUCTURED_BUFFER;
  511. break;
  512. default:
  513. assert(0);
  514. }
  515. break;
  516. default:
  517. assert(0);
  518. }
  519. lExit:
  520. return hr;
  521. }
  522. ////////////////////////////////////////////////////////////////////////////////
  523. // ID3DX11EffectShaderVariable (SAnonymousShader implementation)
  524. ////////////////////////////////////////////////////////////////////////////////
  525. SAnonymousShader::SAnonymousShader(_In_opt_ SShaderBlock *pBlock) : pShaderBlock(pBlock)
  526. {
  527. }
  528. bool SAnonymousShader::IsValid()
  529. {
  530. return pShaderBlock && pShaderBlock->IsValid;
  531. }
  532. ID3DX11EffectType * SAnonymousShader::GetType()
  533. {
  534. return (ID3DX11EffectType *) this;
  535. }
  536. HRESULT SAnonymousShader::GetDesc(_Out_ D3DX11_EFFECT_VARIABLE_DESC *pDesc)
  537. {
  538. pDesc->Annotations = 0;
  539. pDesc->Flags = 0;
  540. pDesc->Name = "$Anonymous";
  541. pDesc->Semantic = nullptr;
  542. pDesc->BufferOffset = 0;
  543. return S_OK;
  544. }
  545. ID3DX11EffectVariable * SAnonymousShader::GetAnnotationByIndex(_In_ uint32_t Index)
  546. {
  547. UNREFERENCED_PARAMETER(Index);
  548. DPF(0, "ID3DX11EffectVariable::GetAnnotationByIndex: Anonymous shaders cannot have annotations");
  549. return &g_InvalidScalarVariable;
  550. }
  551. ID3DX11EffectVariable * SAnonymousShader::GetAnnotationByName(_In_z_ LPCSTR Name)
  552. {
  553. UNREFERENCED_PARAMETER(Name);
  554. DPF(0, "ID3DX11EffectVariable::GetAnnotationByName: Anonymous shaders cannot have annotations");
  555. return &g_InvalidScalarVariable;
  556. }
  557. ID3DX11EffectVariable * SAnonymousShader::GetMemberByIndex(_In_ uint32_t Index)
  558. {
  559. UNREFERENCED_PARAMETER(Index);
  560. DPF(0, "ID3DX11EffectVariable::GetMemberByIndex: Variable is not a structure");
  561. return &g_InvalidScalarVariable;
  562. }
  563. ID3DX11EffectVariable * SAnonymousShader::GetMemberByName(_In_z_ LPCSTR Name)
  564. {
  565. UNREFERENCED_PARAMETER(Name);
  566. DPF(0, "ID3DX11EffectVariable::GetMemberByName: Variable is not a structure");
  567. return &g_InvalidScalarVariable;
  568. }
  569. ID3DX11EffectVariable * SAnonymousShader::GetMemberBySemantic(_In_z_ LPCSTR Semantic)
  570. {
  571. UNREFERENCED_PARAMETER(Semantic);
  572. DPF(0, "ID3DX11EffectVariable::GetMemberBySemantic: Variable is not a structure");
  573. return &g_InvalidScalarVariable;
  574. }
  575. ID3DX11EffectVariable * SAnonymousShader::GetElement(_In_ uint32_t Index)
  576. {
  577. UNREFERENCED_PARAMETER(Index);
  578. DPF(0, "ID3DX11EffectVariable::GetElement: Anonymous shaders cannot have elements");
  579. return &g_InvalidScalarVariable;
  580. }
  581. ID3DX11EffectConstantBuffer * SAnonymousShader::GetParentConstantBuffer()
  582. {
  583. return NoParentCB();
  584. }
  585. ID3DX11EffectShaderVariable * SAnonymousShader::AsShader()
  586. {
  587. return (ID3DX11EffectShaderVariable *) this;
  588. }
  589. _Use_decl_annotations_
  590. HRESULT SAnonymousShader::SetRawValue(const void *pData, uint32_t Offset, uint32_t Count)
  591. {
  592. UNREFERENCED_PARAMETER(pData);
  593. UNREFERENCED_PARAMETER(Offset);
  594. UNREFERENCED_PARAMETER(Count);
  595. return ObjectSetRawValue();
  596. }
  597. _Use_decl_annotations_
  598. HRESULT SAnonymousShader::GetRawValue(void *pData, uint32_t Offset, uint32_t Count)
  599. {
  600. UNREFERENCED_PARAMETER(pData);
  601. UNREFERENCED_PARAMETER(Offset);
  602. UNREFERENCED_PARAMETER(Count);
  603. return ObjectGetRawValue();
  604. }
  605. #define ANONYMOUS_SHADER_INDEX_CHECK() \
  606. HRESULT hr = S_OK; \
  607. if (0 != ShaderIndex) \
  608. { \
  609. DPF(0, "%s: Invalid index specified", pFuncName); \
  610. VH(E_INVALIDARG); \
  611. } \
  612. HRESULT SAnonymousShader::GetShaderDesc(_In_ uint32_t ShaderIndex, _Out_ D3DX11_EFFECT_SHADER_DESC *pDesc)
  613. {
  614. static LPCSTR pFuncName = "ID3DX11EffectShaderVariable::GetShaderDesc";
  615. ANONYMOUS_SHADER_INDEX_CHECK();
  616. hr = pShaderBlock->GetShaderDesc(pDesc, true);
  617. lExit:
  618. return hr;
  619. }
  620. _Use_decl_annotations_
  621. HRESULT SAnonymousShader::GetVertexShader(uint32_t ShaderIndex, ID3D11VertexShader **ppVS)
  622. {
  623. static LPCSTR pFuncName = "ID3DX11EffectShaderVariable::GetVertexShader";
  624. ANONYMOUS_SHADER_INDEX_CHECK();
  625. VH( pShaderBlock->GetVertexShader(ppVS) );
  626. lExit:
  627. return hr;
  628. }
  629. _Use_decl_annotations_
  630. HRESULT SAnonymousShader::GetGeometryShader(uint32_t ShaderIndex, ID3D11GeometryShader **ppGS)
  631. {
  632. static LPCSTR pFuncName = "ID3DX11EffectShaderVariable::GetGeometryShader";
  633. ANONYMOUS_SHADER_INDEX_CHECK();
  634. VH( pShaderBlock->GetGeometryShader(ppGS) );
  635. lExit:
  636. return hr;
  637. }
  638. _Use_decl_annotations_
  639. HRESULT SAnonymousShader::GetPixelShader(uint32_t ShaderIndex, ID3D11PixelShader **ppPS)
  640. {
  641. static LPCSTR pFuncName = "ID3DX11EffectShaderVariable::GetPixelShader";
  642. ANONYMOUS_SHADER_INDEX_CHECK();
  643. VH( pShaderBlock->GetPixelShader(ppPS) );
  644. lExit:
  645. return hr;
  646. }
  647. _Use_decl_annotations_
  648. HRESULT SAnonymousShader::GetHullShader(uint32_t ShaderIndex, ID3D11HullShader **ppHS)
  649. {
  650. static LPCSTR pFuncName = "ID3DX11EffectShaderVariable::GetHullShader";
  651. ANONYMOUS_SHADER_INDEX_CHECK();
  652. VH( pShaderBlock->GetHullShader(ppHS) );
  653. lExit:
  654. return hr;
  655. }
  656. _Use_decl_annotations_
  657. HRESULT SAnonymousShader::GetDomainShader(uint32_t ShaderIndex, ID3D11DomainShader **ppDS)
  658. {
  659. static LPCSTR pFuncName = "ID3DX11EffectShaderVariable::GetDomainShader";
  660. ANONYMOUS_SHADER_INDEX_CHECK();
  661. VH( pShaderBlock->GetDomainShader(ppDS) );
  662. lExit:
  663. return hr;
  664. }
  665. _Use_decl_annotations_
  666. HRESULT SAnonymousShader::GetComputeShader(uint32_t ShaderIndex, ID3D11ComputeShader **ppCS)
  667. {
  668. static LPCSTR pFuncName = "ID3DX11EffectShaderVariable::GetComputeShader";
  669. ANONYMOUS_SHADER_INDEX_CHECK();
  670. VH( pShaderBlock->GetComputeShader(ppCS) );
  671. lExit:
  672. return hr;
  673. }
  674. _Use_decl_annotations_
  675. HRESULT SAnonymousShader::GetInputSignatureElementDesc(uint32_t ShaderIndex, uint32_t Element, D3D11_SIGNATURE_PARAMETER_DESC *pDesc)
  676. {
  677. static LPCSTR pFuncName = "ID3DX11EffectShaderVariable::GetInputSignatureElementDesc";
  678. ANONYMOUS_SHADER_INDEX_CHECK();
  679. VH( pShaderBlock->GetSignatureElementDesc(SShaderBlock::ST_Input, Element, pDesc) );
  680. lExit:
  681. return hr;
  682. }
  683. _Use_decl_annotations_
  684. HRESULT SAnonymousShader::GetOutputSignatureElementDesc(uint32_t ShaderIndex, uint32_t Element, D3D11_SIGNATURE_PARAMETER_DESC *pDesc)
  685. {
  686. static LPCSTR pFuncName = "ID3DX11EffectShaderVariable::GetOutputSignatureElementDesc";
  687. ANONYMOUS_SHADER_INDEX_CHECK();
  688. VH( pShaderBlock->GetSignatureElementDesc(SShaderBlock::ST_Output, Element, pDesc) );
  689. lExit:
  690. return hr;
  691. }
  692. _Use_decl_annotations_
  693. HRESULT SAnonymousShader::GetPatchConstantSignatureElementDesc(uint32_t ShaderIndex, uint32_t Element, D3D11_SIGNATURE_PARAMETER_DESC *pDesc)
  694. {
  695. static LPCSTR pFuncName = "ID3DX11EffectShaderVariable::GetPatchConstantSignatureElementDesc";
  696. ANONYMOUS_SHADER_INDEX_CHECK();
  697. VH( pShaderBlock->GetSignatureElementDesc(SShaderBlock::ST_PatchConstant, Element, pDesc) );
  698. lExit:
  699. return hr;
  700. }
  701. HRESULT SAnonymousShader::GetDesc(_Out_ D3DX11_EFFECT_TYPE_DESC *pDesc)
  702. {
  703. pDesc->Class = D3D_SVC_OBJECT;
  704. switch (pShaderBlock->GetShaderType())
  705. {
  706. case EOT_VertexShader:
  707. case EOT_VertexShader5:
  708. pDesc->TypeName = "vertexshader";
  709. pDesc->Type = D3D_SVT_VERTEXSHADER;
  710. break;
  711. case EOT_GeometryShader:
  712. case EOT_GeometryShader5:
  713. pDesc->TypeName = "geometryshader";
  714. pDesc->Type = D3D_SVT_GEOMETRYSHADER;
  715. break;
  716. case EOT_PixelShader:
  717. case EOT_PixelShader5:
  718. pDesc->TypeName = "pixelshader";
  719. pDesc->Type = D3D_SVT_PIXELSHADER;
  720. break;
  721. case EOT_HullShader5:
  722. pDesc->TypeName = "Hullshader";
  723. pDesc->Type = D3D_SVT_HULLSHADER;
  724. break;
  725. case EOT_DomainShader5:
  726. pDesc->TypeName = "Domainshader";
  727. pDesc->Type = D3D_SVT_DOMAINSHADER;
  728. break;
  729. case EOT_ComputeShader5:
  730. pDesc->TypeName = "Computeshader";
  731. pDesc->Type = D3D_SVT_COMPUTESHADER;
  732. break;
  733. }
  734. pDesc->Elements = 0;
  735. pDesc->Members = 0;
  736. pDesc->Rows = 0;
  737. pDesc->Columns = 0;
  738. pDesc->PackedSize = 0;
  739. pDesc->UnpackedSize = 0;
  740. pDesc->Stride = 0;
  741. return S_OK;
  742. }
  743. ID3DX11EffectType * SAnonymousShader::GetMemberTypeByIndex(_In_ uint32_t Index)
  744. {
  745. UNREFERENCED_PARAMETER(Index);
  746. DPF(0, "ID3DX11EffectType::GetMemberTypeByIndex: This interface does not refer to a structure");
  747. return &g_InvalidType;
  748. }
  749. ID3DX11EffectType * SAnonymousShader::GetMemberTypeByName(_In_z_ LPCSTR Name)
  750. {
  751. UNREFERENCED_PARAMETER(Name);
  752. DPF(0, "ID3DX11EffectType::GetMemberTypeByName: This interface does not refer to a structure");
  753. return &g_InvalidType;
  754. }
  755. ID3DX11EffectType * SAnonymousShader::GetMemberTypeBySemantic(_In_z_ LPCSTR Semantic)
  756. {
  757. UNREFERENCED_PARAMETER(Semantic);
  758. DPF(0, "ID3DX11EffectType::GetMemberTypeBySemantic: This interface does not refer to a structure");
  759. return &g_InvalidType;
  760. }
  761. LPCSTR SAnonymousShader::GetMemberName(_In_ uint32_t Index)
  762. {
  763. UNREFERENCED_PARAMETER(Index);
  764. DPF(0, "ID3DX11EffectType::GetMemberName: This interface does not refer to a structure");
  765. return nullptr;
  766. }
  767. LPCSTR SAnonymousShader::GetMemberSemantic(_In_ uint32_t Index)
  768. {
  769. UNREFERENCED_PARAMETER(Index);
  770. DPF(0, "ID3DX11EffectType::GetMemberSemantic: This interface does not refer to a structure");
  771. return nullptr;
  772. }
  773. //////////////////////////////////////////////////////////////////////////
  774. // ID3DX11EffectConstantBuffer (SConstantBuffer implementation)
  775. //////////////////////////////////////////////////////////////////////////
  776. bool SConstantBuffer::IsValid()
  777. {
  778. return true;
  779. }
  780. ID3DX11EffectType * SConstantBuffer::GetType()
  781. {
  782. return (ID3DX11EffectType *) this;
  783. }
  784. HRESULT SConstantBuffer::GetDesc(_Out_ D3DX11_EFFECT_VARIABLE_DESC *pDesc)
  785. {
  786. pDesc->Annotations = AnnotationCount;
  787. pDesc->Flags = 0;
  788. pDesc->Name = pName;
  789. pDesc->Semantic = nullptr;
  790. pDesc->BufferOffset = 0;
  791. if (ExplicitBindPoint != -1)
  792. {
  793. pDesc->ExplicitBindPoint = ExplicitBindPoint;
  794. pDesc->Flags |= D3DX11_EFFECT_VARIABLE_EXPLICIT_BIND_POINT;
  795. }
  796. else
  797. {
  798. pDesc->ExplicitBindPoint = 0;
  799. }
  800. return S_OK;
  801. }
  802. ID3DX11EffectVariable * SConstantBuffer::GetAnnotationByIndex(_In_ uint32_t Index)
  803. {
  804. return GetAnnotationByIndexHelper("ID3DX11EffectVariable", Index, AnnotationCount, pAnnotations);
  805. }
  806. ID3DX11EffectVariable * SConstantBuffer::GetAnnotationByName(_In_z_ LPCSTR Name)
  807. {
  808. return GetAnnotationByNameHelper("ID3DX11EffectVariable", Name, AnnotationCount, pAnnotations);
  809. }
  810. ID3DX11EffectVariable * SConstantBuffer::GetMemberByIndex(_In_ uint32_t Index)
  811. {
  812. SGlobalVariable *pMember;
  813. UDataPointer dataPtr;
  814. if (IsEffectOptimized)
  815. {
  816. DPF(0, "ID3DX11EffectVariable::GetMemberByIndex: Cannot get members; effect has been Optimize()'ed");
  817. return &g_InvalidScalarVariable;
  818. }
  819. if (!GetVariableByIndexHelper<SGlobalVariable>(Index, VariableCount, (SGlobalVariable*)pVariables,
  820. nullptr, &pMember, &dataPtr.pGeneric))
  821. {
  822. return &g_InvalidScalarVariable;
  823. }
  824. return (ID3DX11EffectVariable *) pMember;
  825. }
  826. ID3DX11EffectVariable * SConstantBuffer::GetMemberByName(_In_z_ LPCSTR Name)
  827. {
  828. SGlobalVariable *pMember;
  829. UDataPointer dataPtr;
  830. uint32_t index;
  831. if (IsEffectOptimized)
  832. {
  833. DPF(0, "ID3DX11EffectVariable::GetMemberByName: Cannot get members; effect has been Optimize()'ed");
  834. return &g_InvalidScalarVariable;
  835. }
  836. if (!GetVariableByNameHelper<SGlobalVariable>(Name, VariableCount, (SGlobalVariable*)pVariables,
  837. nullptr, &pMember, &dataPtr.pGeneric, &index))
  838. {
  839. return &g_InvalidScalarVariable;
  840. }
  841. return (ID3DX11EffectVariable *) pMember;
  842. }
  843. ID3DX11EffectVariable * SConstantBuffer::GetMemberBySemantic(_In_z_ LPCSTR Semantic)
  844. {
  845. SGlobalVariable *pMember;
  846. UDataPointer dataPtr;
  847. uint32_t index;
  848. if (IsEffectOptimized)
  849. {
  850. DPF(0, "ID3DX11EffectVariable::GetMemberBySemantic: Cannot get members; effect has been Optimize()'ed");
  851. return &g_InvalidScalarVariable;
  852. }
  853. if (!GetVariableBySemanticHelper<SGlobalVariable>(Semantic, VariableCount, (SGlobalVariable*)pVariables,
  854. nullptr, &pMember, &dataPtr.pGeneric, &index))
  855. {
  856. return &g_InvalidScalarVariable;
  857. }
  858. return (ID3DX11EffectVariable *) pMember;
  859. }
  860. ID3DX11EffectVariable * SConstantBuffer::GetElement(_In_ uint32_t Index)
  861. {
  862. UNREFERENCED_PARAMETER(Index);
  863. static LPCSTR pFuncName = "ID3DX11EffectVariable::GetElement";
  864. DPF(0, "%s: This interface does not refer to an array", pFuncName);
  865. return &g_InvalidScalarVariable;
  866. }
  867. ID3DX11EffectConstantBuffer * SConstantBuffer::GetParentConstantBuffer()
  868. {
  869. static LPCSTR pFuncName = "ID3DX11EffectVariable::GetParentConstantBuffer";
  870. DPF(0, "%s: Constant buffers do not have parent constant buffers", pFuncName);
  871. return &g_InvalidConstantBuffer;
  872. }
  873. ID3DX11EffectConstantBuffer * SConstantBuffer::AsConstantBuffer()
  874. {
  875. return (ID3DX11EffectConstantBuffer *) this;
  876. }
  877. HRESULT SConstantBuffer::GetDesc(_Out_ D3DX11_EFFECT_TYPE_DESC *pDesc)
  878. {
  879. pDesc->TypeName = IsTBuffer ? "tbuffer" : "cbuffer";
  880. pDesc->Class = D3D_SVC_OBJECT;
  881. pDesc->Type = IsTBuffer ? D3D_SVT_TBUFFER : D3D_SVT_CBUFFER;
  882. pDesc->Elements = 0;
  883. pDesc->Members = VariableCount;
  884. pDesc->Rows = 0;
  885. pDesc->Columns = 0;
  886. uint32_t i;
  887. pDesc->PackedSize = 0;
  888. for (i = 0; i < VariableCount; ++ i)
  889. {
  890. pDesc->PackedSize += pVariables[i].pType->PackedSize;
  891. }
  892. pDesc->UnpackedSize = Size;
  893. assert(pDesc->UnpackedSize >= pDesc->PackedSize);
  894. pDesc->Stride = AlignToPowerOf2(pDesc->UnpackedSize, SType::c_RegisterSize);
  895. return S_OK;
  896. }
  897. ID3DX11EffectType * SConstantBuffer::GetMemberTypeByIndex(_In_ uint32_t Index)
  898. {
  899. return GetTypeByIndexHelper(Index, VariableCount, pVariables, sizeof (SGlobalVariable));
  900. }
  901. ID3DX11EffectType * SConstantBuffer::GetMemberTypeByName(_In_z_ LPCSTR Name)
  902. {
  903. return GetTypeByNameHelper(Name, VariableCount, pVariables, sizeof (SGlobalVariable));
  904. }
  905. ID3DX11EffectType * SConstantBuffer::GetMemberTypeBySemantic(_In_z_ LPCSTR Semantic)
  906. {
  907. return GetTypeBySemanticHelper(Semantic, VariableCount, pVariables, sizeof (SGlobalVariable));
  908. }
  909. LPCSTR SConstantBuffer::GetMemberName(_In_ uint32_t Index)
  910. {
  911. static LPCSTR pFuncName = "ID3DX11EffectType::GetMemberName";
  912. if (IsEffectOptimized)
  913. {
  914. DPF(0, "%s: Cannot get member names; Effect has been Optimize()'ed", pFuncName);
  915. return nullptr;
  916. }
  917. if (Index >= VariableCount)
  918. {
  919. DPF(0, "%s: Invalid index (%u, total: %u)", pFuncName, Index, VariableCount);
  920. return nullptr;
  921. }
  922. return pVariables[Index].pName;
  923. }
  924. LPCSTR SConstantBuffer::GetMemberSemantic(_In_ uint32_t Index)
  925. {
  926. static LPCSTR pFuncName = "ID3DX11EffectType::GetMemberSemantic";
  927. if (IsEffectOptimized)
  928. {
  929. DPF(0, "%s: Cannot get member semantics; Effect has been Optimize()'ed", pFuncName);
  930. return nullptr;
  931. }
  932. if (Index >= VariableCount)
  933. {
  934. DPF(0, "%s: Invalid index (%u, total: %u)", pFuncName, Index, VariableCount);
  935. return nullptr;
  936. }
  937. return pVariables[Index].pSemantic;
  938. }
  939. _Use_decl_annotations_
  940. HRESULT SConstantBuffer::SetRawValue(const void *pData, uint32_t Offset, uint32_t Count)
  941. {
  942. HRESULT hr = S_OK;
  943. #ifdef _DEBUG
  944. static LPCSTR pFuncName = "ID3DX11EffectVariable::SetRawValue";
  945. VERIFYPARAMETER(pData);
  946. if ((Offset + Count < Offset) ||
  947. (Count + (uint8_t*)pData < (uint8_t*)pData) ||
  948. ((Offset + Count) > Size))
  949. {
  950. // overflow of some kind
  951. DPF(0, "%s: Invalid range specified", pFuncName);
  952. VH(E_INVALIDARG);
  953. }
  954. #endif
  955. if (IsUsedByExpression)
  956. {
  957. uint32_t i;
  958. for (i = 0; i < VariableCount; ++ i)
  959. {
  960. ((SGlobalVariable*)pVariables)[i].DirtyVariable();
  961. }
  962. }
  963. else
  964. {
  965. IsDirty = true;
  966. }
  967. memcpy(pBackingStore + Offset, pData, Count);
  968. lExit:
  969. return hr;
  970. }
  971. _Use_decl_annotations_
  972. HRESULT SConstantBuffer::GetRawValue(void *pData, uint32_t Offset, uint32_t Count)
  973. {
  974. HRESULT hr = S_OK;
  975. #ifdef _DEBUG
  976. static LPCSTR pFuncName = "ID3DX11EffectVariable::GetRawValue";
  977. VERIFYPARAMETER(pData);
  978. if ((Offset + Count < Offset) ||
  979. (Count + (uint8_t*)pData < (uint8_t*)pData) ||
  980. ((Offset + Count) > Size))
  981. {
  982. // overflow of some kind
  983. DPF(0, "%s: Invalid range specified", pFuncName);
  984. VH(E_INVALIDARG);
  985. }
  986. #endif
  987. memcpy(pData, pBackingStore + Offset, Count);
  988. lExit:
  989. return hr;
  990. }
  991. bool SConstantBuffer::ClonedSingle() const
  992. {
  993. return IsSingle && ( pEffect->m_Flags & D3DX11_EFFECT_CLONE );
  994. }
  995. HRESULT SConstantBuffer::SetConstantBuffer(_In_ ID3D11Buffer *pConstantBuffer)
  996. {
  997. HRESULT hr = S_OK;
  998. static LPCSTR pFuncName = "ID3DX11EffectConstantBuffer::SetConstantBuffer";
  999. if (IsTBuffer)
  1000. {
  1001. DPF(0, "%s: This is a texture buffer; use SetTextureBuffer instead", pFuncName);
  1002. VH(D3DERR_INVALIDCALL);
  1003. }
  1004. // Replace all references to the old shader block with this one
  1005. pEffect->ReplaceCBReference(this, pConstantBuffer);
  1006. if( !IsUserManaged )
  1007. {
  1008. // Save original cbuffer in case we UndoSet
  1009. assert( pMemberData[0].Type == MDT_Buffer );
  1010. VB( pMemberData[0].Data.pD3DEffectsManagedConstantBuffer == nullptr );
  1011. pMemberData[0].Data.pD3DEffectsManagedConstantBuffer = pD3DObject;
  1012. pD3DObject = nullptr;
  1013. IsUserManaged = true;
  1014. IsNonUpdatable = true;
  1015. }
  1016. SAFE_ADDREF( pConstantBuffer );
  1017. SAFE_RELEASE( pD3DObject );
  1018. pD3DObject = pConstantBuffer;
  1019. lExit:
  1020. return hr;
  1021. }
  1022. HRESULT SConstantBuffer::GetConstantBuffer(_Outptr_ ID3D11Buffer **ppConstantBuffer)
  1023. {
  1024. HRESULT hr = S_OK;
  1025. static LPCSTR pFuncName = "ID3DX11EffectConstantBuffer::GetConstantBuffer";
  1026. VERIFYPARAMETER(ppConstantBuffer);
  1027. if (IsTBuffer)
  1028. {
  1029. DPF(0, "%s: This is a texture buffer; use GetTextureBuffer instead", pFuncName);
  1030. VH(D3DERR_INVALIDCALL);
  1031. }
  1032. assert( pD3DObject );
  1033. _Analysis_assume_( pD3DObject );
  1034. *ppConstantBuffer = pD3DObject;
  1035. SAFE_ADDREF(*ppConstantBuffer);
  1036. lExit:
  1037. return hr;
  1038. }
  1039. HRESULT SConstantBuffer::UndoSetConstantBuffer()
  1040. {
  1041. HRESULT hr = S_OK;
  1042. static LPCSTR pFuncName = "ID3DX11EffectConstantBuffer::UndoSetConstantBuffer";
  1043. if (IsTBuffer)
  1044. {
  1045. DPF(0, "%s: This is a texture buffer; use UndoSetTextureBuffer instead", pFuncName);
  1046. VH(D3DERR_INVALIDCALL);
  1047. }
  1048. if( !IsUserManaged )
  1049. {
  1050. return S_FALSE;
  1051. }
  1052. // Replace all references to the old shader block with this one
  1053. pEffect->ReplaceCBReference(this, pMemberData[0].Data.pD3DEffectsManagedConstantBuffer);
  1054. // Revert to original cbuffer
  1055. SAFE_RELEASE( pD3DObject );
  1056. pD3DObject = pMemberData[0].Data.pD3DEffectsManagedConstantBuffer;
  1057. pMemberData[0].Data.pD3DEffectsManagedConstantBuffer = nullptr;
  1058. IsUserManaged = false;
  1059. IsNonUpdatable = ClonedSingle();
  1060. lExit:
  1061. return hr;
  1062. }
  1063. HRESULT SConstantBuffer::SetTextureBuffer(_In_ ID3D11ShaderResourceView *pTextureBuffer)
  1064. {
  1065. HRESULT hr = S_OK;
  1066. static LPCSTR pFuncName = "ID3DX11EffectConstantBuffer::SetTextureBuffer";
  1067. if (!IsTBuffer)
  1068. {
  1069. DPF(0, "%s: This is a constant buffer; use SetConstantBuffer instead", pFuncName);
  1070. VH(D3DERR_INVALIDCALL);
  1071. }
  1072. if( !IsUserManaged )
  1073. {
  1074. // Save original cbuffer and tbuffer in case we UndoSet
  1075. assert( pMemberData[0].Type == MDT_Buffer );
  1076. VB( pMemberData[0].Data.pD3DEffectsManagedConstantBuffer == nullptr );
  1077. pMemberData[0].Data.pD3DEffectsManagedConstantBuffer = pD3DObject;
  1078. pD3DObject = nullptr;
  1079. assert( pMemberData[1].Type == MDT_ShaderResourceView );
  1080. VB( pMemberData[1].Data.pD3DEffectsManagedTextureBuffer == nullptr );
  1081. pMemberData[1].Data.pD3DEffectsManagedTextureBuffer = TBuffer.pShaderResource;
  1082. TBuffer.pShaderResource = nullptr;
  1083. IsUserManaged = true;
  1084. IsNonUpdatable = true;
  1085. }
  1086. SAFE_ADDREF( pTextureBuffer );
  1087. SAFE_RELEASE(pD3DObject); // won't be needing this anymore...
  1088. SAFE_RELEASE( TBuffer.pShaderResource );
  1089. TBuffer.pShaderResource = pTextureBuffer;
  1090. lExit:
  1091. return hr;
  1092. }
  1093. HRESULT SConstantBuffer::GetTextureBuffer(_Outptr_ ID3D11ShaderResourceView **ppTextureBuffer)
  1094. {
  1095. HRESULT hr = S_OK;
  1096. static LPCSTR pFuncName = "ID3DX11EffectConstantBuffer::GetTextureBuffer";
  1097. VERIFYPARAMETER(ppTextureBuffer);
  1098. if (!IsTBuffer)
  1099. {
  1100. DPF(0, "%s: This is a constant buffer; use GetConstantBuffer instead", pFuncName);
  1101. VH(D3DERR_INVALIDCALL);
  1102. }
  1103. assert( TBuffer.pShaderResource );
  1104. _Analysis_assume_( TBuffer.pShaderResource );
  1105. *ppTextureBuffer = TBuffer.pShaderResource;
  1106. SAFE_ADDREF(*ppTextureBuffer);
  1107. lExit:
  1108. return hr;
  1109. }
  1110. HRESULT SConstantBuffer::UndoSetTextureBuffer()
  1111. {
  1112. HRESULT hr = S_OK;
  1113. static LPCSTR pFuncName = "ID3DX11EffectConstantBuffer::UndoSetTextureBuffer";
  1114. if (!IsTBuffer)
  1115. {
  1116. DPF(0, "%s: This is a texture buffer; use UndoSetConstantBuffer instead", pFuncName);
  1117. VH(D3DERR_INVALIDCALL);
  1118. }
  1119. if( !IsUserManaged )
  1120. {
  1121. return S_FALSE;
  1122. }
  1123. // Revert to original cbuffer
  1124. SAFE_RELEASE( pD3DObject );
  1125. pD3DObject = pMemberData[0].Data.pD3DEffectsManagedConstantBuffer;
  1126. pMemberData[0].Data.pD3DEffectsManagedConstantBuffer = nullptr;
  1127. SAFE_RELEASE( TBuffer.pShaderResource );
  1128. TBuffer.pShaderResource = pMemberData[1].Data.pD3DEffectsManagedTextureBuffer;
  1129. pMemberData[1].Data.pD3DEffectsManagedTextureBuffer = nullptr;
  1130. IsUserManaged = false;
  1131. IsNonUpdatable = ClonedSingle();
  1132. lExit:
  1133. return hr;
  1134. }
  1135. //////////////////////////////////////////////////////////////////////////
  1136. // ID3DX11EffectPass (CEffectPass implementation)
  1137. //////////////////////////////////////////////////////////////////////////
  1138. bool SPassBlock::IsValid()
  1139. {
  1140. if( HasDependencies )
  1141. return pEffect->ValidatePassBlock( this );
  1142. return InitiallyValid;
  1143. }
  1144. HRESULT SPassBlock::GetDesc(_Out_ D3DX11_PASS_DESC *pDesc)
  1145. {
  1146. HRESULT hr = S_OK;
  1147. static LPCSTR pFuncName = "ID3DX11EffectPass::GetDesc";
  1148. VERIFYPARAMETER(pDesc);
  1149. ZeroMemory(pDesc, sizeof(*pDesc));
  1150. pDesc->Name = pName;
  1151. pDesc->Annotations = AnnotationCount;
  1152. SAssignment *pAssignment;
  1153. SAssignment *pLastAssn;
  1154. pEffect->IncrementTimer();
  1155. pAssignment = pAssignments;
  1156. pLastAssn = pAssignments + AssignmentCount;
  1157. for(; pAssignment < pLastAssn; pAssignment++)
  1158. {
  1159. pEffect->EvaluateAssignment(pAssignment);
  1160. }
  1161. if( BackingStore.pVertexShaderBlock && BackingStore.pVertexShaderBlock->pInputSignatureBlob )
  1162. {
  1163. // pInputSignatureBlob can be null if we're setting a nullptr VS "SetVertexShader( nullptr )"
  1164. pDesc->pIAInputSignature = (uint8_t*)BackingStore.pVertexShaderBlock->pInputSignatureBlob->GetBufferPointer();
  1165. pDesc->IAInputSignatureSize = BackingStore.pVertexShaderBlock->pInputSignatureBlob->GetBufferSize();
  1166. }
  1167. pDesc->StencilRef = BackingStore.StencilRef;
  1168. pDesc->SampleMask = BackingStore.SampleMask;
  1169. pDesc->BlendFactor[0] = BackingStore.BlendFactor[0];
  1170. pDesc->BlendFactor[1] = BackingStore.BlendFactor[1];
  1171. pDesc->BlendFactor[2] = BackingStore.BlendFactor[2];
  1172. pDesc->BlendFactor[3] = BackingStore.BlendFactor[3];
  1173. lExit:
  1174. return hr;
  1175. }
  1176. extern SShaderBlock g_NullVS;
  1177. extern SShaderBlock g_NullGS;
  1178. extern SShaderBlock g_NullPS;
  1179. extern SShaderBlock g_NullHS;
  1180. extern SShaderBlock g_NullDS;
  1181. extern SShaderBlock g_NullCS;
  1182. SAnonymousShader g_AnonymousNullVS(&g_NullVS);
  1183. SAnonymousShader g_AnonymousNullGS(&g_NullGS);
  1184. SAnonymousShader g_AnonymousNullPS(&g_NullPS);
  1185. SAnonymousShader g_AnonymousNullHS(&g_NullHS);
  1186. SAnonymousShader g_AnonymousNullDS(&g_NullDS);
  1187. SAnonymousShader g_AnonymousNullCS(&g_NullCS);
  1188. template<EObjectType EShaderType>
  1189. HRESULT SPassBlock::GetShaderDescHelper(D3DX11_PASS_SHADER_DESC *pDesc)
  1190. {
  1191. HRESULT hr = S_OK;
  1192. uint32_t i;
  1193. LPCSTR pFuncName = nullptr;
  1194. SShaderBlock *pShaderBlock = nullptr;
  1195. ApplyPassAssignments();
  1196. switch (EShaderType)
  1197. {
  1198. case EOT_VertexShader:
  1199. case EOT_VertexShader5:
  1200. pFuncName = "ID3DX11EffectPass::GetVertexShaderDesc";
  1201. pShaderBlock = BackingStore.pVertexShaderBlock;
  1202. break;
  1203. case EOT_PixelShader:
  1204. case EOT_PixelShader5:
  1205. pFuncName = "ID3DX11EffectPass::GetPixelShaderDesc";
  1206. pShaderBlock = BackingStore.pPixelShaderBlock;
  1207. break;
  1208. case EOT_GeometryShader:
  1209. case EOT_GeometryShader5:
  1210. pFuncName = "ID3DX11EffectPass::GetGeometryShaderDesc";
  1211. pShaderBlock = BackingStore.pGeometryShaderBlock;
  1212. break;
  1213. case EOT_HullShader5:
  1214. #pragma prefast(suppress:__WARNING_UNUSED_POINTER_ASSIGNMENT, "pFuncName used in DPF")
  1215. pFuncName = "ID3DX11EffectPass::GetHullShaderDesc";
  1216. pShaderBlock = BackingStore.pHullShaderBlock;
  1217. break;
  1218. case EOT_DomainShader5:
  1219. #pragma prefast(suppress:__WARNING_UNUSED_POINTER_ASSIGNMENT, "pFuncName used in DPF")
  1220. pFuncName = "ID3DX11EffectPass::GetDomainShaderDesc";
  1221. pShaderBlock = BackingStore.pDomainShaderBlock;
  1222. break;
  1223. case EOT_ComputeShader5:
  1224. #pragma prefast(suppress:__WARNING_UNUSED_POINTER_ASSIGNMENT, "pFuncName used in DPF")
  1225. pFuncName = "ID3DX11EffectPass::GetComputeShaderDesc";
  1226. pShaderBlock = BackingStore.pComputeShaderBlock;
  1227. break;
  1228. default:
  1229. assert(0);
  1230. }
  1231. VERIFYPARAMETER(pDesc);
  1232. // in case of error (or in case the assignment doesn't exist), return something reasonable
  1233. pDesc->pShaderVariable = &g_InvalidShaderVariable;
  1234. pDesc->ShaderIndex = 0;
  1235. if (nullptr != pShaderBlock)
  1236. {
  1237. uint32_t elements, varCount, anonymousShaderCount;
  1238. SGlobalVariable *pVariables;
  1239. SAnonymousShader *pAnonymousShaders;
  1240. if (pShaderBlock == &g_NullVS)
  1241. {
  1242. pDesc->pShaderVariable = &g_AnonymousNullVS;
  1243. pDesc->ShaderIndex = 0;
  1244. // we're done
  1245. goto lExit;
  1246. }
  1247. else if (pShaderBlock == &g_NullGS)
  1248. {
  1249. pDesc->pShaderVariable = &g_AnonymousNullGS;
  1250. pDesc->ShaderIndex = 0;
  1251. // we're done
  1252. goto lExit;
  1253. }
  1254. else if (pShaderBlock == &g_NullPS)
  1255. {
  1256. pDesc->pShaderVariable = &g_AnonymousNullPS;
  1257. pDesc->ShaderIndex = 0;
  1258. // we're done
  1259. goto lExit;
  1260. }
  1261. else if (pShaderBlock == &g_NullHS)
  1262. {
  1263. pDesc->pShaderVariable = &g_AnonymousNullHS;
  1264. pDesc->ShaderIndex = 0;
  1265. // we're done
  1266. goto lExit;
  1267. }
  1268. else if (pShaderBlock == &g_NullDS)
  1269. {
  1270. pDesc->pShaderVariable = &g_AnonymousNullDS;
  1271. pDesc->ShaderIndex = 0;
  1272. // we're done
  1273. goto lExit;
  1274. }
  1275. else if (pShaderBlock == &g_NullCS)
  1276. {
  1277. pDesc->pShaderVariable = &g_AnonymousNullCS;
  1278. pDesc->ShaderIndex = 0;
  1279. // we're done
  1280. goto lExit;
  1281. }
  1282. else
  1283. {
  1284. VB( pEffect->IsRuntimeData(pShaderBlock) );
  1285. varCount = pEffect->m_VariableCount;
  1286. pVariables = pEffect->m_pVariables;
  1287. anonymousShaderCount = pEffect->m_AnonymousShaderCount;
  1288. pAnonymousShaders = pEffect->m_pAnonymousShaders;
  1289. }
  1290. for (i = 0; i < varCount; ++ i)
  1291. {
  1292. elements = std::max<uint32_t>(1, pVariables[i].pType->Elements);
  1293. // make sure the variable type matches, and don't forget about GeometryShaderSO's
  1294. if (pVariables[i].pType->IsShader())
  1295. {
  1296. if (pShaderBlock >= pVariables[i].Data.pShader && pShaderBlock < pVariables[i].Data.pShader + elements)
  1297. {
  1298. pDesc->pShaderVariable = (ID3DX11EffectShaderVariable *)(pVariables + i);
  1299. pDesc->ShaderIndex = (uint32_t)(UINT_PTR)(pShaderBlock - pVariables[i].Data.pShader);
  1300. // we're done
  1301. goto lExit;
  1302. }
  1303. }
  1304. }
  1305. for (i = 0; i < anonymousShaderCount; ++ i)
  1306. {
  1307. if (pShaderBlock == pAnonymousShaders[i].pShaderBlock)
  1308. {
  1309. VB(EShaderType == pAnonymousShaders[i].pShaderBlock->GetShaderType())
  1310. pDesc->pShaderVariable = (pAnonymousShaders + i);
  1311. pDesc->ShaderIndex = 0;
  1312. // we're done
  1313. goto lExit;
  1314. }
  1315. }
  1316. DPF(0, "%s: Internal error; shader not found", pFuncName);
  1317. VH( E_FAIL );
  1318. }
  1319. lExit:
  1320. return hr;
  1321. }
  1322. HRESULT SPassBlock::GetVertexShaderDesc(_Out_ D3DX11_PASS_SHADER_DESC *pDesc)
  1323. {
  1324. return GetShaderDescHelper<EOT_VertexShader>(pDesc);
  1325. }
  1326. HRESULT SPassBlock::GetPixelShaderDesc(_Out_ D3DX11_PASS_SHADER_DESC *pDesc)
  1327. {
  1328. return GetShaderDescHelper<EOT_PixelShader>(pDesc);
  1329. }
  1330. HRESULT SPassBlock::GetGeometryShaderDesc(_Out_ D3DX11_PASS_SHADER_DESC *pDesc)
  1331. {
  1332. return GetShaderDescHelper<EOT_GeometryShader>(pDesc);
  1333. }
  1334. HRESULT SPassBlock::GetHullShaderDesc(_Out_ D3DX11_PASS_SHADER_DESC *pDesc)
  1335. {
  1336. return GetShaderDescHelper<EOT_HullShader5>(pDesc);
  1337. }
  1338. HRESULT SPassBlock::GetDomainShaderDesc(_Out_ D3DX11_PASS_SHADER_DESC *pDesc)
  1339. {
  1340. return GetShaderDescHelper<EOT_DomainShader5>(pDesc);
  1341. }
  1342. HRESULT SPassBlock::GetComputeShaderDesc(_Out_ D3DX11_PASS_SHADER_DESC *pDesc)
  1343. {
  1344. return GetShaderDescHelper<EOT_ComputeShader5>(pDesc);
  1345. }
  1346. ID3DX11EffectVariable * SPassBlock::GetAnnotationByIndex(_In_ uint32_t Index)
  1347. {
  1348. return GetAnnotationByIndexHelper("ID3DX11EffectPass", Index, AnnotationCount, pAnnotations);
  1349. }
  1350. ID3DX11EffectVariable * SPassBlock::GetAnnotationByName(_In_z_ LPCSTR Name)
  1351. {
  1352. return GetAnnotationByNameHelper("ID3DX11EffectPass", Name, AnnotationCount, pAnnotations);
  1353. }
  1354. HRESULT SPassBlock::Apply(_In_ uint32_t Flags, _In_ ID3D11DeviceContext* pContext)
  1355. {
  1356. UNREFERENCED_PARAMETER(Flags);
  1357. HRESULT hr = S_OK;
  1358. // Flags are unused, so should be 0
  1359. assert( pEffect->m_pContext == nullptr );
  1360. pEffect->m_pContext = pContext;
  1361. pEffect->ApplyPassBlock(this);
  1362. pEffect->m_pContext = nullptr;
  1363. lExit:
  1364. return hr;
  1365. }
  1366. HRESULT SPassBlock::ComputeStateBlockMask(_Inout_ D3DX11_STATE_BLOCK_MASK *pStateBlockMask)
  1367. {
  1368. HRESULT hr = S_OK;
  1369. // flags indicating whether the following shader types were caught by assignment checks or not
  1370. bool bVS = false, bGS = false, bPS = false, bHS = false, bDS = false, bCS = false;
  1371. for (size_t i = 0; i < AssignmentCount; ++ i)
  1372. {
  1373. bool bShader = false;
  1374. switch (pAssignments[i].LhsType)
  1375. {
  1376. case ELHS_VertexShaderBlock:
  1377. bVS = true;
  1378. bShader = true;
  1379. break;
  1380. case ELHS_GeometryShaderBlock:
  1381. bGS = true;
  1382. bShader = true;
  1383. break;
  1384. case ELHS_PixelShaderBlock:
  1385. bPS = true;
  1386. bShader = true;
  1387. break;
  1388. case ELHS_HullShaderBlock:
  1389. bHS = true;
  1390. bShader = true;
  1391. break;
  1392. case ELHS_DomainShaderBlock:
  1393. bDS = true;
  1394. bShader = true;
  1395. break;
  1396. case ELHS_ComputeShaderBlock:
  1397. bCS = true;
  1398. bShader = true;
  1399. break;
  1400. case ELHS_RasterizerBlock:
  1401. pStateBlockMask->RSRasterizerState = 1;
  1402. break;
  1403. case ELHS_BlendBlock:
  1404. pStateBlockMask->OMBlendState = 1;
  1405. break;
  1406. case ELHS_DepthStencilBlock:
  1407. pStateBlockMask->OMDepthStencilState = 1;
  1408. break;
  1409. default:
  1410. // ignore this assignment (must be a scalar/vector assignment associated with a state object)
  1411. break;
  1412. }
  1413. if (bShader)
  1414. {
  1415. for (size_t j = 0; j < pAssignments[i].MaxElements; ++ j)
  1416. {
  1417. // compute state block mask for the union of ALL shaders
  1418. VH( pAssignments[i].Source.pShader[j].ComputeStateBlockMask(pStateBlockMask) );
  1419. }
  1420. }
  1421. }
  1422. // go over the state block objects in case there was no corresponding assignment
  1423. if (nullptr != BackingStore.pRasterizerBlock)
  1424. {
  1425. pStateBlockMask->RSRasterizerState = 1;
  1426. }
  1427. if (nullptr != BackingStore.pBlendBlock)
  1428. {
  1429. pStateBlockMask->OMBlendState = 1;
  1430. }
  1431. if (nullptr != BackingStore.pDepthStencilBlock)
  1432. {
  1433. pStateBlockMask->OMDepthStencilState = 1;
  1434. }
  1435. // go over the shaders only if an assignment didn't already catch them
  1436. if (false == bVS && nullptr != BackingStore.pVertexShaderBlock)
  1437. {
  1438. VH( BackingStore.pVertexShaderBlock->ComputeStateBlockMask(pStateBlockMask) );
  1439. }
  1440. if (false == bGS && nullptr != BackingStore.pGeometryShaderBlock)
  1441. {
  1442. VH( BackingStore.pGeometryShaderBlock->ComputeStateBlockMask(pStateBlockMask) );
  1443. }
  1444. if (false == bPS && nullptr != BackingStore.pPixelShaderBlock)
  1445. {
  1446. VH( BackingStore.pPixelShaderBlock->ComputeStateBlockMask(pStateBlockMask) );
  1447. }
  1448. if (false == bHS && nullptr != BackingStore.pHullShaderBlock)
  1449. {
  1450. VH( BackingStore.pHullShaderBlock->ComputeStateBlockMask(pStateBlockMask) );
  1451. }
  1452. if (false == bDS && nullptr != BackingStore.pDomainShaderBlock)
  1453. {
  1454. VH( BackingStore.pDomainShaderBlock->ComputeStateBlockMask(pStateBlockMask) );
  1455. }
  1456. if (false == bCS && nullptr != BackingStore.pComputeShaderBlock)
  1457. {
  1458. VH( BackingStore.pComputeShaderBlock->ComputeStateBlockMask(pStateBlockMask) );
  1459. }
  1460. lExit:
  1461. return hr;
  1462. }
  1463. //////////////////////////////////////////////////////////////////////////
  1464. // ID3DX11EffectTechnique (STechnique implementation)
  1465. //////////////////////////////////////////////////////////////////////////
  1466. bool STechnique::IsValid()
  1467. {
  1468. if( HasDependencies )
  1469. {
  1470. for( size_t i = 0; i < PassCount; i++ )
  1471. {
  1472. if( !((SPassBlock*)pPasses)[i].IsValid() )
  1473. return false;
  1474. }
  1475. return true;
  1476. }
  1477. return InitiallyValid;
  1478. }
  1479. HRESULT STechnique::GetDesc(_Out_ D3DX11_TECHNIQUE_DESC *pDesc)
  1480. {
  1481. HRESULT hr = S_OK;
  1482. static LPCSTR pFuncName = "ID3DX11EffectTechnique::GetDesc";
  1483. VERIFYPARAMETER(pDesc);
  1484. pDesc->Name = pName;
  1485. pDesc->Annotations = AnnotationCount;
  1486. pDesc->Passes = PassCount;
  1487. lExit:
  1488. return hr;
  1489. }
  1490. ID3DX11EffectVariable * STechnique::GetAnnotationByIndex(_In_ uint32_t Index)
  1491. {
  1492. return GetAnnotationByIndexHelper("ID3DX11EffectTechnique", Index, AnnotationCount, pAnnotations);
  1493. }
  1494. ID3DX11EffectVariable * STechnique::GetAnnotationByName(_In_z_ LPCSTR Name)
  1495. {
  1496. return GetAnnotationByNameHelper("ID3DX11EffectTechnique", Name, AnnotationCount, pAnnotations);
  1497. }
  1498. ID3DX11EffectPass * STechnique::GetPassByIndex(_In_ uint32_t Index)
  1499. {
  1500. static LPCSTR pFuncName = "ID3DX11EffectTechnique::GetPassByIndex";
  1501. if (Index >= PassCount)
  1502. {
  1503. DPF(0, "%s: Invalid pass index (%u, total: %u)", pFuncName, Index, PassCount);
  1504. return &g_InvalidPass;
  1505. }
  1506. return (ID3DX11EffectPass *)(pPasses + Index);
  1507. }
  1508. ID3DX11EffectPass * STechnique::GetPassByName(_In_z_ LPCSTR Name)
  1509. {
  1510. static LPCSTR pFuncName = "ID3DX11EffectTechnique::GetPassByName";
  1511. uint32_t i;
  1512. for (i = 0; i < PassCount; ++ i)
  1513. {
  1514. if (nullptr != pPasses[i].pName &&
  1515. strcmp(pPasses[i].pName, Name) == 0)
  1516. {
  1517. break;
  1518. }
  1519. }
  1520. if (i == PassCount)
  1521. {
  1522. DPF(0, "%s: Pass [%s] not found", pFuncName, Name);
  1523. return &g_InvalidPass;
  1524. }
  1525. return (ID3DX11EffectPass *)(pPasses + i);
  1526. }
  1527. HRESULT STechnique::ComputeStateBlockMask(_Inout_ D3DX11_STATE_BLOCK_MASK *pStateBlockMask)
  1528. {
  1529. HRESULT hr = S_OK;
  1530. uint32_t i;
  1531. _Analysis_assume_( PassCount == 0 || pPasses != 0 );
  1532. for (i = 0; i < PassCount; ++ i)
  1533. {
  1534. VH( ((SPassBlock*)pPasses)[i].ComputeStateBlockMask(pStateBlockMask) );
  1535. }
  1536. lExit:
  1537. return hr;
  1538. }
  1539. //////////////////////////////////////////////////////////////////////////
  1540. // ID3DX11EffectGroup (SGroup implementation)
  1541. //////////////////////////////////////////////////////////////////////////
  1542. bool SGroup::IsValid()
  1543. {
  1544. if( HasDependencies )
  1545. {
  1546. for( size_t i = 0; i < TechniqueCount; i++ )
  1547. {
  1548. if( !((STechnique*)pTechniques)[i].IsValid() )
  1549. return false;
  1550. }
  1551. return true;
  1552. }
  1553. return InitiallyValid;
  1554. }
  1555. HRESULT SGroup::GetDesc(_Out_ D3DX11_GROUP_DESC *pDesc)
  1556. {
  1557. HRESULT hr = S_OK;
  1558. static LPCSTR pFuncName = "ID3DX11EffectGroup::GetDesc";
  1559. VERIFYPARAMETER(pDesc);
  1560. pDesc->Name = pName;
  1561. pDesc->Annotations = AnnotationCount;
  1562. pDesc->Techniques = TechniqueCount;
  1563. lExit:
  1564. return hr;
  1565. }
  1566. ID3DX11EffectVariable * SGroup::GetAnnotationByIndex(_In_ uint32_t Index)
  1567. {
  1568. return GetAnnotationByIndexHelper("ID3DX11EffectGroup", Index, AnnotationCount, pAnnotations);
  1569. }
  1570. ID3DX11EffectVariable * SGroup::GetAnnotationByName(_In_z_ LPCSTR Name)
  1571. {
  1572. return GetAnnotationByNameHelper("ID3DX11EffectGroup", Name, AnnotationCount, pAnnotations);
  1573. }
  1574. ID3DX11EffectTechnique * SGroup::GetTechniqueByIndex(_In_ uint32_t Index)
  1575. {
  1576. static LPCSTR pFuncName = "ID3DX11EffectGroup::GetTechniqueByIndex";
  1577. if (Index >= TechniqueCount)
  1578. {
  1579. DPF(0, "%s: Invalid pass index (%u, total: %u)", pFuncName, Index, TechniqueCount);
  1580. return &g_InvalidTechnique;
  1581. }
  1582. return (ID3DX11EffectTechnique *)(pTechniques + Index);
  1583. }
  1584. ID3DX11EffectTechnique * SGroup::GetTechniqueByName(_In_z_ LPCSTR Name)
  1585. {
  1586. static LPCSTR pFuncName = "ID3DX11EffectGroup::GetTechniqueByName";
  1587. uint32_t i;
  1588. for (i = 0; i < TechniqueCount; ++ i)
  1589. {
  1590. if (nullptr != pTechniques[i].pName &&
  1591. strcmp(pTechniques[i].pName, Name) == 0)
  1592. {
  1593. break;
  1594. }
  1595. }
  1596. if (i == TechniqueCount)
  1597. {
  1598. DPF(0, "%s: Technique [%s] not found", pFuncName, Name);
  1599. return &g_InvalidTechnique;
  1600. }
  1601. return (ID3DX11EffectTechnique *)(pTechniques + i);
  1602. }
  1603. //////////////////////////////////////////////////////////////////////////
  1604. // ID3DX11Effect Public Reflection APIs (CEffect)
  1605. //////////////////////////////////////////////////////////////////////////
  1606. HRESULT CEffect::GetDevice(_Outptr_ ID3D11Device **ppDevice)
  1607. {
  1608. HRESULT hr = S_OK;
  1609. static LPCSTR pFuncName = "ID3DX11Effect::GetDevice";
  1610. VERIFYPARAMETER(ppDevice);
  1611. m_pDevice->AddRef();
  1612. *ppDevice = m_pDevice;
  1613. lExit:
  1614. return hr;
  1615. }
  1616. HRESULT CEffect::GetDesc(_Out_ D3DX11_EFFECT_DESC *pDesc)
  1617. {
  1618. HRESULT hr = S_OK;
  1619. static LPCSTR pFuncName = "ID3DX11Effect::GetDesc";
  1620. VERIFYPARAMETER(pDesc);
  1621. pDesc->ConstantBuffers = m_CBCount;
  1622. pDesc->GlobalVariables = m_VariableCount;
  1623. pDesc->Techniques = m_TechniqueCount;
  1624. pDesc->Groups = m_GroupCount;
  1625. pDesc->InterfaceVariables = m_InterfaceCount;
  1626. lExit:
  1627. return hr;
  1628. }
  1629. ID3DX11EffectConstantBuffer * CEffect::GetConstantBufferByIndex(_In_ uint32_t Index)
  1630. {
  1631. static LPCSTR pFuncName = "ID3DX11Effect::GetConstantBufferByIndex";
  1632. if (Index < m_CBCount)
  1633. {
  1634. return m_pCBs + Index;
  1635. }
  1636. DPF(0, "%s: Invalid constant buffer index", pFuncName);
  1637. return &g_InvalidConstantBuffer;
  1638. }
  1639. ID3DX11EffectConstantBuffer * CEffect::GetConstantBufferByName(_In_z_ LPCSTR Name)
  1640. {
  1641. static LPCSTR pFuncName = "ID3DX11Effect::GetConstantBufferByName";
  1642. if (IsOptimized())
  1643. {
  1644. DPF(0, "%s: Cannot get constant buffer interfaces by name since the effect has been Optimize()'ed", pFuncName);
  1645. return &g_InvalidConstantBuffer;
  1646. }
  1647. if (nullptr == Name)
  1648. {
  1649. DPF(0, "%s: Parameter Name was nullptr.", pFuncName);
  1650. return &g_InvalidConstantBuffer;
  1651. }
  1652. for (uint32_t i = 0; i < m_CBCount; ++ i)
  1653. {
  1654. if (strcmp(m_pCBs[i].pName, Name) == 0)
  1655. {
  1656. return m_pCBs + i;
  1657. }
  1658. }
  1659. DPF(0, "%s: Constant Buffer [%s] not found", pFuncName, Name);
  1660. return &g_InvalidConstantBuffer;
  1661. }
  1662. ID3DX11EffectVariable * CEffect::GetVariableByIndex(_In_ uint32_t Index)
  1663. {
  1664. static LPCSTR pFuncName = "ID3DX11Effect::GetVariableByIndex";
  1665. if (Index < m_VariableCount)
  1666. {
  1667. return m_pVariables + Index;
  1668. }
  1669. DPF(0, "%s: Invalid variable index", pFuncName);
  1670. return &g_InvalidScalarVariable;
  1671. }
  1672. ID3DX11EffectVariable * CEffect::GetVariableByName(_In_z_ LPCSTR Name)
  1673. {
  1674. static LPCSTR pFuncName = "ID3DX11Effect::GetVariableByName";
  1675. if (IsOptimized())
  1676. {
  1677. DPF(0, "%s: Cannot get variable interfaces by name since the effect has been Optimize()'ed", pFuncName);
  1678. return &g_InvalidScalarVariable;
  1679. }
  1680. if (nullptr == Name)
  1681. {
  1682. DPF(0, "%s: Parameter Name was nullptr.", pFuncName);
  1683. return &g_InvalidScalarVariable;
  1684. }
  1685. for (uint32_t i = 0; i < m_VariableCount; ++ i)
  1686. {
  1687. if (strcmp(m_pVariables[i].pName, Name) == 0)
  1688. {
  1689. return m_pVariables + i;
  1690. }
  1691. }
  1692. DPF(0, "%s: Variable [%s] not found", pFuncName, Name);
  1693. return &g_InvalidScalarVariable;
  1694. }
  1695. ID3DX11EffectVariable * CEffect::GetVariableBySemantic(_In_z_ LPCSTR Semantic)
  1696. {
  1697. static LPCSTR pFuncName = "ID3DX11Effect::GetVariableBySemantic";
  1698. if (IsOptimized())
  1699. {
  1700. DPF(0, "%s: Cannot get variable interfaces by semantic since the effect has been Optimize()'ed", pFuncName);
  1701. return &g_InvalidScalarVariable;
  1702. }
  1703. if (nullptr == Semantic)
  1704. {
  1705. DPF(0, "%s: Parameter Semantic was nullptr.", pFuncName);
  1706. return &g_InvalidScalarVariable;
  1707. }
  1708. uint32_t i;
  1709. for (i = 0; i < m_VariableCount; ++ i)
  1710. {
  1711. if (nullptr != m_pVariables[i].pSemantic &&
  1712. _stricmp(m_pVariables[i].pSemantic, Semantic) == 0)
  1713. {
  1714. return (ID3DX11EffectVariable *)(m_pVariables + i);
  1715. }
  1716. }
  1717. DPF(0, "%s: Variable with semantic [%s] not found", pFuncName, Semantic);
  1718. return &g_InvalidScalarVariable;
  1719. }
  1720. ID3DX11EffectTechnique * CEffect::GetTechniqueByIndex(_In_ uint32_t Index)
  1721. {
  1722. static LPCSTR pFuncName = "ID3DX11Effect::GetTechniqueByIndex";
  1723. if( Index < m_TechniqueCount )
  1724. {
  1725. for( size_t i=0; i < m_GroupCount; i++ )
  1726. {
  1727. if( Index < m_pGroups[i].TechniqueCount )
  1728. {
  1729. return (ID3DX11EffectTechnique *)(m_pGroups[i].pTechniques + Index);
  1730. }
  1731. Index -= m_pGroups[i].TechniqueCount;
  1732. }
  1733. assert( false );
  1734. }
  1735. DPF(0, "%s: Invalid technique index (%u)", pFuncName, Index);
  1736. return &g_InvalidTechnique;
  1737. }
  1738. ID3DX11EffectTechnique * CEffect::GetTechniqueByName(_In_z_ LPCSTR Name)
  1739. {
  1740. static LPCSTR pFuncName = "ID3DX11Effect::GetTechniqueByName";
  1741. const size_t MAX_GROUP_TECHNIQUE_SIZE = 256;
  1742. char NameCopy[MAX_GROUP_TECHNIQUE_SIZE];
  1743. if (IsOptimized())
  1744. {
  1745. DPF(0, "ID3DX11Effect::GetTechniqueByName: Cannot get technique interfaces by name since the effect has been Optimize()'ed");
  1746. return &g_InvalidTechnique;
  1747. }
  1748. if (nullptr == Name)
  1749. {
  1750. DPF(0, "%s: Parameter Name was nullptr.", pFuncName);
  1751. return &g_InvalidTechnique;
  1752. }
  1753. if( FAILED( strcpy_s( NameCopy, MAX_GROUP_TECHNIQUE_SIZE, Name ) ) )
  1754. {
  1755. DPF( 0, "Group|Technique name has a length greater than %u.", MAX_GROUP_TECHNIQUE_SIZE );
  1756. return &g_InvalidTechnique;
  1757. }
  1758. char* pDelimiter = strchr( NameCopy, '|' );
  1759. if( pDelimiter == nullptr )
  1760. {
  1761. if ( m_pNullGroup == nullptr )
  1762. {
  1763. DPF( 0, "The effect contains no default group." );
  1764. return &g_InvalidTechnique;
  1765. }
  1766. return m_pNullGroup->GetTechniqueByName( Name );
  1767. }
  1768. // separate group name and technique name
  1769. *pDelimiter = 0;
  1770. return GetGroupByName( NameCopy )->GetTechniqueByName( pDelimiter + 1 );
  1771. }
  1772. ID3D11ClassLinkage * CEffect::GetClassLinkage()
  1773. {
  1774. SAFE_ADDREF( m_pClassLinkage );
  1775. return m_pClassLinkage;
  1776. }
  1777. ID3DX11EffectGroup * CEffect::GetGroupByIndex(_In_ uint32_t Index)
  1778. {
  1779. static LPCSTR pFuncName = "ID3DX11Effect::GetGroupByIndex";
  1780. if( Index < m_GroupCount )
  1781. {
  1782. return (ID3DX11EffectGroup *)(m_pGroups + Index);
  1783. }
  1784. DPF(0, "%s: Invalid group index (%u)", pFuncName, Index);
  1785. return &g_InvalidGroup;
  1786. }
  1787. ID3DX11EffectGroup * CEffect::GetGroupByName(_In_z_ LPCSTR Name)
  1788. {
  1789. static LPCSTR pFuncName = "ID3DX11Effect::GetGroupByName";
  1790. if (IsOptimized())
  1791. {
  1792. DPF(0, "ID3DX11Effect::GetGroupByName: Cannot get group interfaces by name since the effect has been Optimize()'ed");
  1793. return &g_InvalidGroup;
  1794. }
  1795. if (nullptr == Name || Name[0] == 0 )
  1796. {
  1797. return m_pNullGroup ? (ID3DX11EffectGroup *)m_pNullGroup : &g_InvalidGroup;
  1798. }
  1799. uint32_t i = 0;
  1800. for (; i < m_GroupCount; ++ i)
  1801. {
  1802. if (nullptr != m_pGroups[i].pName &&
  1803. strcmp(m_pGroups[i].pName, Name) == 0)
  1804. {
  1805. break;
  1806. }
  1807. }
  1808. if (i == m_GroupCount)
  1809. {
  1810. DPF(0, "%s: Group [%s] not found", pFuncName, Name);
  1811. return &g_InvalidGroup;
  1812. }
  1813. return (ID3DX11EffectGroup *)(m_pGroups + i);
  1814. }
  1815. }