1 //////////////////////////////////////////////////////////////////////////////
\r
3 // Copyright (C) Microsoft Corporation. All Rights Reserved.
\r
5 // File: EffectReflection.cpp
\r
6 // Content: D3DX11 Effects public reflection APIs
\r
8 //////////////////////////////////////////////////////////////////////////////
\r
12 namespace D3DX11Effects
\r
15 SEffectInvalidType g_InvalidType;
\r
17 SEffectInvalidScalarVariable g_InvalidScalarVariable;
\r
18 SEffectInvalidVectorVariable g_InvalidVectorVariable;
\r
19 SEffectInvalidMatrixVariable g_InvalidMatrixVariable;
\r
20 SEffectInvalidStringVariable g_InvalidStringVariable;
\r
21 SEffectInvalidClassInstanceVariable g_InvalidClassInstanceVariable;
\r
22 SEffectInvalidInterfaceVariable g_InvalidInterfaceVariable;
\r
23 SEffectInvalidShaderResourceVariable g_InvalidShaderResourceVariable;
\r
24 SEffectInvalidUnorderedAccessViewVariable g_InvalidUnorderedAccessViewVariable;
\r
25 SEffectInvalidRenderTargetViewVariable g_InvalidRenderTargetViewVariable;
\r
26 SEffectInvalidDepthStencilViewVariable g_InvalidDepthStencilViewVariable;
\r
27 SEffectInvalidConstantBuffer g_InvalidConstantBuffer;
\r
28 SEffectInvalidShaderVariable g_InvalidShaderVariable;
\r
29 SEffectInvalidBlendVariable g_InvalidBlendVariable;
\r
30 SEffectInvalidDepthStencilVariable g_InvalidDepthStencilVariable;
\r
31 SEffectInvalidRasterizerVariable g_InvalidRasterizerVariable;
\r
32 SEffectInvalidSamplerVariable g_InvalidSamplerVariable;
\r
34 SEffectInvalidPass g_InvalidPass;
\r
35 SEffectInvalidTechnique g_InvalidTechnique;
\r
36 SEffectInvalidGroup g_InvalidGroup;
\r
39 //////////////////////////////////////////////////////////////////////////
\r
40 // Helper routine implementations
\r
41 //////////////////////////////////////////////////////////////////////////
\r
43 ID3DX11EffectConstantBuffer * NoParentCB()
\r
45 DPF(0, "ID3DX11EffectVariable::GetParentConstantBuffer: Variable does not have a parent constant buffer");
\r
46 // have to typecast because the type of g_InvalidScalarVariable has not been declared yet
\r
47 return &g_InvalidConstantBuffer;
\r
50 ID3DX11EffectVariable * GetAnnotationByIndexHelper(const char *pClassName, UINT Index, UINT AnnotationCount, SAnnotation *pAnnotations)
\r
52 if (Index >= AnnotationCount)
\r
54 DPF(0, "%s::GetAnnotationByIndex: Invalid index (%d, total: %d)", pClassName, Index, AnnotationCount);
\r
55 return &g_InvalidScalarVariable;
\r
58 return pAnnotations + Index;
\r
61 ID3DX11EffectVariable * GetAnnotationByNameHelper(const char *pClassName, LPCSTR Name, UINT AnnotationCount, SAnnotation *pAnnotations)
\r
64 for (i = 0; i < AnnotationCount; ++ i)
\r
66 if (strcmp(pAnnotations[i].pName, Name) == 0)
\r
68 return pAnnotations + i;
\r
72 DPF(0, "%s::GetAnnotationByName: Annotation [%s] not found", pClassName, Name);
\r
73 return &g_InvalidScalarVariable;
\r
76 //////////////////////////////////////////////////////////////////////////
\r
77 // Effect routines to pool interfaces
\r
78 //////////////////////////////////////////////////////////////////////////
\r
80 ID3DX11EffectType * CEffect::CreatePooledSingleElementTypeInterface(SType *pType)
\r
86 DPF(0, "ID3DX11Effect: Cannot create new type interfaces since the effect has been Optimize()'ed");
\r
87 return &g_InvalidType;
\r
90 for (i = 0; i < m_pTypeInterfaces.GetSize(); ++ i)
\r
92 if (m_pTypeInterfaces[i]->pType == pType)
\r
94 return (SSingleElementType*)m_pTypeInterfaces[i];
\r
97 SSingleElementType *pNewType;
\r
98 if (NULL == (pNewType = NEW SSingleElementType))
\r
100 DPF(0, "ID3DX11Effect: Out of memory while trying to create new type interface");
\r
101 return &g_InvalidType;
\r
104 pNewType->pType = pType;
\r
105 m_pTypeInterfaces.Add(pNewType);
\r
110 // Create a member variable (via GetMemberBy* or GetElement)
\r
111 ID3DX11EffectVariable * CEffect::CreatePooledVariableMemberInterface(TTopLevelVariable<ID3DX11EffectVariable> *pTopLevelEntity, SVariable *pMember, UDataPointer Data, BOOL IsSingleElement, UINT Index)
\r
118 DPF(0, "ID3DX11Effect: Cannot create new variable interfaces since the effect has been Optimize()'ed");
\r
119 return &g_InvalidScalarVariable;
\r
122 for (i = 0; i < m_pMemberInterfaces.GetSize(); ++ i)
\r
124 if (m_pMemberInterfaces[i]->pType == pMember->pType &&
\r
125 m_pMemberInterfaces[i]->pName == pMember->pName &&
\r
126 m_pMemberInterfaces[i]->pSemantic == pMember->pSemantic &&
\r
127 m_pMemberInterfaces[i]->Data.pGeneric == Data.pGeneric &&
\r
128 m_pMemberInterfaces[i]->IsSingleElement == IsSingleElement &&
\r
129 ((SMember*)m_pMemberInterfaces[i])->pTopLevelEntity == pTopLevelEntity)
\r
131 return (ID3DX11EffectVariable *) m_pMemberInterfaces[i];
\r
135 // is this annotation or runtime data?
\r
136 if( pTopLevelEntity->pEffect->IsReflectionData(pTopLevelEntity) )
\r
138 D3DXASSERT( pTopLevelEntity->pEffect->IsReflectionData(Data.pGeneric) );
\r
139 IsAnnotation = TRUE;
\r
143 // if the heap is empty, we are still loading the Effect, and thus creating a member for a variable initializer
\r
144 // ex. Interface myInt = myClassArray[2];
\r
145 if( pTopLevelEntity->pEffect->m_Heap.GetSize() > 0 )
\r
147 D3DXASSERT( pTopLevelEntity->pEffect->IsRuntimeData(pTopLevelEntity) );
\r
148 if (!pTopLevelEntity->pType->IsObjectType(EOT_String))
\r
150 // strings are funny; their data is reflection data, so ignore those
\r
151 D3DXASSERT( pTopLevelEntity->pEffect->IsRuntimeData(Data.pGeneric) );
\r
154 IsAnnotation = FALSE;
\r
157 SMember *pNewMember;
\r
159 if (NULL == (pNewMember = CreateNewMember((SType*)pMember->pType, IsAnnotation)))
\r
161 DPF(0, "ID3DX11Effect: Out of memory while trying to create new member variable interface");
\r
162 return &g_InvalidScalarVariable;
\r
165 pNewMember->pType = pMember->pType;
\r
166 pNewMember->pName = pMember->pName;
\r
167 pNewMember->pSemantic = pMember->pSemantic;
\r
168 pNewMember->Data.pGeneric = Data.pGeneric;
\r
169 pNewMember->IsSingleElement = IsSingleElement;
\r
170 pNewMember->pTopLevelEntity = pTopLevelEntity;
\r
172 if( IsSingleElement && pMember->pMemberData )
\r
174 D3DXASSERT( !IsAnnotation );
\r
175 // This is an element of a global variable array
\r
176 pNewMember->pMemberData = pMember->pMemberData + Index;
\r
179 if (FAILED(m_pMemberInterfaces.Add(pNewMember)))
\r
181 SAFE_DELETE(pNewMember);
\r
182 DPF(0, "ID3DX11Effect: Out of memory while trying to create new member variable interface");
\r
183 return &g_InvalidScalarVariable;
\r
186 return (ID3DX11EffectVariable *) pNewMember;
\r
189 //////////////////////////////////////////////////////////////////////////
\r
190 // ID3DX11EffectType (SType, SSingleElementType implementations)
\r
191 //////////////////////////////////////////////////////////////////////////
\r
193 static ID3DX11EffectType * GetTypeByIndexHelper(UINT Index, UINT VariableCount,
\r
194 SVariable *pVariables, UINT SizeOfVariableType)
\r
196 LPCSTR pFuncName = "ID3DX11EffectType::GetMemberTypeByIndex";
\r
198 if (Index >= VariableCount)
\r
200 DPF(0, "%s: Invalid index (%d, total: %d)", pFuncName, Index, VariableCount);
\r
201 return &g_InvalidType;
\r
204 SVariable *pVariable = (SVariable *)((BYTE *)pVariables + Index * SizeOfVariableType);
\r
205 if (NULL == pVariable->pName)
\r
207 DPF(0, "%s: Cannot get member types; Effect has been Optimize()'ed", pFuncName);
\r
208 return &g_InvalidType;
\r
211 return (ID3DX11EffectType *) pVariable->pType;
\r
214 static ID3DX11EffectType * GetTypeByNameHelper(LPCSTR Name, UINT VariableCount,
\r
215 SVariable *pVariables, UINT SizeOfVariableType)
\r
217 LPCSTR pFuncName = "ID3DX11EffectType::GetMemberTypeByName";
\r
221 DPF(0, "%s: Parameter Name was NULL.", pFuncName);
\r
222 return &g_InvalidType;
\r
226 SVariable *pVariable;
\r
228 for (i = 0; i < VariableCount; ++ i)
\r
230 pVariable = (SVariable *)((BYTE *)pVariables + i * SizeOfVariableType);
\r
231 if (NULL == pVariable->pName)
\r
233 DPF(0, "%s: Cannot get member types; Effect has been Optimize()'ed", pFuncName);
\r
234 return &g_InvalidType;
\r
236 if (strcmp(pVariable->pName, Name) == 0)
\r
238 return (ID3DX11EffectType *) pVariable->pType;
\r
242 DPF(0, "%s: Member type [%s] not found", pFuncName, Name);
\r
243 return &g_InvalidType;
\r
247 static ID3DX11EffectType * GetTypeBySemanticHelper(LPCSTR Semantic, UINT VariableCount,
\r
248 SVariable *pVariables, UINT SizeOfVariableType)
\r
250 LPCSTR pFuncName = "ID3DX11EffectType::GetMemberTypeBySemantic";
\r
252 if (NULL == Semantic)
\r
254 DPF(0, "%s: Parameter Semantic was NULL.", pFuncName);
\r
255 return &g_InvalidType;
\r
259 SVariable *pVariable;
\r
261 for (i = 0; i < VariableCount; ++ i)
\r
263 pVariable = (SVariable *)((BYTE *)pVariables + i * SizeOfVariableType);
\r
264 if (NULL == pVariable->pName)
\r
266 DPF(0, "%s: Cannot get member types; Effect has been Optimize()'ed", pFuncName);
\r
267 return &g_InvalidType;
\r
269 if (NULL != pVariable->pSemantic &&
\r
270 _stricmp(pVariable->pSemantic, Semantic) == 0)
\r
272 return (ID3DX11EffectType *) pVariable->pType;
\r
276 DPF(0, "%s: Member type with semantic [%s] not found", pFuncName, Semantic);
\r
277 return &g_InvalidType;
\r
280 ID3DX11EffectType * SType::GetMemberTypeByIndex(UINT Index)
\r
282 if (VarType != EVT_Struct)
\r
284 DPF(0, "ID3DX11EffectType::GetMemberTypeByIndex: This interface does not refer to a structure");
\r
285 return &g_InvalidType;
\r
288 return GetTypeByIndexHelper(Index, StructType.Members, StructType.pMembers, sizeof(SVariable));
\r
291 ID3DX11EffectType * SType::GetMemberTypeByName(LPCSTR Name)
\r
293 if (VarType != EVT_Struct)
\r
295 DPF(0, "ID3DX11EffectType::GetMemberTypeByName: This interface does not refer to a structure");
\r
296 return &g_InvalidType;
\r
299 return GetTypeByNameHelper(Name, StructType.Members, StructType.pMembers, sizeof(SVariable));
\r
302 ID3DX11EffectType * SType::GetMemberTypeBySemantic(LPCSTR Semantic)
\r
304 if (VarType != EVT_Struct)
\r
306 DPF(0, "ID3DX11EffectType::GetMemberTypeBySemantic: This interface does not refer to a structure");
\r
307 return &g_InvalidType;
\r
310 return GetTypeBySemanticHelper(Semantic, StructType.Members, StructType.pMembers, sizeof(SVariable));
\r
313 LPCSTR SType::GetMemberName(UINT Index)
\r
315 LPCSTR pFuncName = "ID3DX11EffectType::GetMemberName";
\r
317 if (VarType != EVT_Struct)
\r
319 DPF(0, "%s: This interface does not refer to a structure", pFuncName);
\r
323 if (Index >= StructType.Members)
\r
325 DPF(0, "%s: Invalid index (%d, total: %d)", pFuncName, Index, StructType.Members);
\r
329 SVariable *pVariable = StructType.pMembers + Index;
\r
331 if (NULL == pVariable->pName)
\r
333 DPF(0, "%s: Cannot get member names; Effect has been Optimize()'ed", pFuncName);
\r
337 return pVariable->pName;
\r
340 LPCSTR SType::GetMemberSemantic(UINT Index)
\r
342 LPCSTR pFuncName = "ID3DX11EffectType::GetMemberSemantic";
\r
344 if (VarType != EVT_Struct)
\r
346 DPF(0, "%s: This interface does not refer to a structure", pFuncName);
\r
350 if (Index >= StructType.Members)
\r
352 DPF(0, "%s: Invalid index (%d, total: %d)", pFuncName, Index, StructType.Members);
\r
356 SVariable *pVariable = StructType.pMembers + Index;
\r
358 if (NULL == pVariable->pName)
\r
360 DPF(0, "%s: Cannot get member semantics; Effect has been Optimize()'ed", pFuncName);
\r
364 return pVariable->pSemantic;
\r
367 HRESULT SType::GetDescHelper(D3DX11_EFFECT_TYPE_DESC *pDesc, BOOL IsSingleElement) const
\r
370 LPCSTR pFuncName = "ID3DX11EffectType::GetDesc";
\r
372 VERIFYPARAMETER(pDesc);
\r
374 pDesc->TypeName = pTypeName;
\r
376 // intentionally return 0 so they know it's not a single element array
\r
377 pDesc->Elements = IsSingleElement ? 0 : Elements;
\r
378 pDesc->PackedSize = GetTotalPackedSize(IsSingleElement);
\r
379 pDesc->UnpackedSize = GetTotalUnpackedSize(IsSingleElement);
\r
380 pDesc->Stride = Stride;
\r
385 switch (NumericType.NumericLayout)
\r
388 if (NumericType.IsColumnMajor)
\r
390 pDesc->Class = D3D10_SVC_MATRIX_COLUMNS;
\r
394 pDesc->Class = D3D10_SVC_MATRIX_ROWS;
\r
398 pDesc->Class = D3D10_SVC_VECTOR;
\r
401 pDesc->Class = D3D10_SVC_SCALAR;
\r
407 switch (NumericType.ScalarType)
\r
410 pDesc->Type = D3D10_SVT_BOOL;
\r
413 pDesc->Type = D3D10_SVT_INT;
\r
416 pDesc->Type = D3D10_SVT_UINT;
\r
419 pDesc->Type = D3D10_SVT_FLOAT;
\r
425 pDesc->Rows = NumericType.Rows;
\r
426 pDesc->Columns = NumericType.Columns;
\r
427 pDesc->Members = 0;
\r
433 pDesc->Columns = 0;
\r
434 pDesc->Members = StructType.Members;
\r
435 if( StructType.ImplementsInterface )
\r
437 pDesc->Class = D3D11_SVC_INTERFACE_CLASS;
\r
441 pDesc->Class = D3D10_SVC_STRUCT;
\r
443 pDesc->Type = D3D10_SVT_VOID;
\r
446 case EVT_Interface:
\r
448 pDesc->Columns = 0;
\r
449 pDesc->Members = 0;
\r
450 pDesc->Class = D3D11_SVC_INTERFACE_POINTER;
\r
451 pDesc->Type = D3D11_SVT_INTERFACE_POINTER;
\r
456 pDesc->Columns = 0;
\r
457 pDesc->Members = 0;
\r
458 pDesc->Class = D3D10_SVC_OBJECT;
\r
460 switch (ObjectType)
\r
463 pDesc->Type = D3D10_SVT_STRING;
\r
466 pDesc->Type = D3D10_SVT_BLEND;
\r
468 case EOT_DepthStencil:
\r
469 pDesc->Type = D3D10_SVT_DEPTHSTENCIL;
\r
471 case EOT_Rasterizer:
\r
472 pDesc->Type = D3D10_SVT_RASTERIZER;
\r
474 case EOT_PixelShader:
\r
475 case EOT_PixelShader5:
\r
476 pDesc->Type = D3D10_SVT_PIXELSHADER;
\r
478 case EOT_VertexShader:
\r
479 case EOT_VertexShader5:
\r
480 pDesc->Type = D3D10_SVT_VERTEXSHADER;
\r
482 case EOT_GeometryShader:
\r
483 case EOT_GeometryShaderSO:
\r
484 case EOT_GeometryShader5:
\r
485 pDesc->Type = D3D10_SVT_GEOMETRYSHADER;
\r
487 case EOT_HullShader5:
\r
488 pDesc->Type = D3D11_SVT_HULLSHADER;
\r
490 case EOT_DomainShader5:
\r
491 pDesc->Type = D3D11_SVT_DOMAINSHADER;
\r
493 case EOT_ComputeShader5:
\r
494 pDesc->Type = D3D11_SVT_COMPUTESHADER;
\r
497 pDesc->Type = D3D10_SVT_TEXTURE;
\r
499 case EOT_Texture1D:
\r
500 pDesc->Type = D3D10_SVT_TEXTURE1D;
\r
502 case EOT_Texture1DArray:
\r
503 pDesc->Type = D3D10_SVT_TEXTURE1DARRAY;
\r
505 case EOT_Texture2D:
\r
506 pDesc->Type = D3D10_SVT_TEXTURE2D;
\r
508 case EOT_Texture2DArray:
\r
509 pDesc->Type = D3D10_SVT_TEXTURE2DARRAY;
\r
511 case EOT_Texture2DMS:
\r
512 pDesc->Type = D3D10_SVT_TEXTURE2DMS;
\r
514 case EOT_Texture2DMSArray:
\r
515 pDesc->Type = D3D10_SVT_TEXTURE2DMSARRAY;
\r
517 case EOT_Texture3D:
\r
518 pDesc->Type = D3D10_SVT_TEXTURE3D;
\r
520 case EOT_TextureCube:
\r
521 pDesc->Type = D3D10_SVT_TEXTURECUBE;
\r
523 case EOT_TextureCubeArray:
\r
524 pDesc->Type = D3D10_SVT_TEXTURECUBEARRAY;
\r
527 pDesc->Type = D3D10_SVT_BUFFER;
\r
530 pDesc->Type = D3D10_SVT_SAMPLER;
\r
532 case EOT_RenderTargetView:
\r
533 pDesc->Type = D3D10_SVT_RENDERTARGETVIEW;
\r
535 case EOT_DepthStencilView:
\r
536 pDesc->Type = D3D10_SVT_DEPTHSTENCILVIEW;
\r
538 case EOT_RWTexture1D:
\r
539 pDesc->Type = D3D11_SVT_RWTEXTURE1D;
\r
541 case EOT_RWTexture1DArray:
\r
542 pDesc->Type = D3D11_SVT_RWTEXTURE1DARRAY;
\r
544 case EOT_RWTexture2D:
\r
545 pDesc->Type = D3D11_SVT_RWTEXTURE2D;
\r
547 case EOT_RWTexture2DArray:
\r
548 pDesc->Type = D3D11_SVT_RWTEXTURE2DARRAY;
\r
550 case EOT_RWTexture3D:
\r
551 pDesc->Type = D3D11_SVT_RWTEXTURE3D;
\r
554 pDesc->Type = D3D11_SVT_RWBUFFER;
\r
556 case EOT_ByteAddressBuffer:
\r
557 pDesc->Type = D3D11_SVT_BYTEADDRESS_BUFFER;
\r
559 case EOT_RWByteAddressBuffer:
\r
560 pDesc->Type = D3D11_SVT_RWBYTEADDRESS_BUFFER;
\r
562 case EOT_StructuredBuffer:
\r
563 pDesc->Type = D3D11_SVT_STRUCTURED_BUFFER;
\r
565 case EOT_RWStructuredBuffer:
\r
566 case EOT_RWStructuredBufferAlloc:
\r
567 case EOT_RWStructuredBufferConsume:
\r
568 pDesc->Type = D3D11_SVT_RWSTRUCTURED_BUFFER;
\r
570 case EOT_AppendStructuredBuffer:
\r
571 pDesc->Type = D3D11_SVT_APPEND_STRUCTURED_BUFFER;
\r
573 case EOT_ConsumeStructuredBuffer:
\r
574 pDesc->Type = D3D11_SVT_CONSUME_STRUCTURED_BUFFER;
\r
591 ////////////////////////////////////////////////////////////////////////////////
\r
592 // ID3DX11EffectShaderVariable (SAnonymousShader implementation)
\r
593 ////////////////////////////////////////////////////////////////////////////////
\r
595 SAnonymousShader::SAnonymousShader(SShaderBlock *pBlock)
\r
597 pShaderBlock = pBlock;
\r
600 BOOL SAnonymousShader::IsValid()
\r
602 return pShaderBlock && pShaderBlock->IsValid;
\r
605 ID3DX11EffectType * SAnonymousShader::GetType()
\r
607 return (ID3DX11EffectType *) this;
\r
610 HRESULT SAnonymousShader::GetDesc(D3DX11_EFFECT_VARIABLE_DESC *pDesc)
\r
612 pDesc->Annotations = 0;
\r
615 pDesc->Name = "$Anonymous";
\r
616 pDesc->Semantic = NULL;
\r
617 pDesc->BufferOffset = 0;
\r
622 ID3DX11EffectVariable * SAnonymousShader::GetAnnotationByIndex(UINT Index)
\r
624 DPF(0, "ID3DX11EffectVariable::GetAnnotationByIndex: Anonymous shaders cannot have annotations");
\r
625 return &g_InvalidScalarVariable;
\r
628 ID3DX11EffectVariable * SAnonymousShader::GetAnnotationByName(LPCSTR Name)
\r
630 DPF(0, "ID3DX11EffectVariable::GetAnnotationByName: Anonymous shaders cannot have annotations");
\r
631 return &g_InvalidScalarVariable;
\r
634 ID3DX11EffectVariable * SAnonymousShader::GetMemberByIndex(UINT Index)
\r
636 DPF(0, "ID3DX11EffectVariable::GetMemberByIndex: Variable is not a structure");
\r
637 return &g_InvalidScalarVariable;
\r
640 ID3DX11EffectVariable * SAnonymousShader::GetMemberByName(LPCSTR Name)
\r
642 DPF(0, "ID3DX11EffectVariable::GetMemberByName: Variable is not a structure");
\r
643 return &g_InvalidScalarVariable;
\r
646 ID3DX11EffectVariable * SAnonymousShader::GetMemberBySemantic(LPCSTR Semantic)
\r
648 DPF(0, "ID3DX11EffectVariable::GetMemberBySemantic: Variable is not a structure");
\r
649 return &g_InvalidScalarVariable;
\r
652 ID3DX11EffectVariable * SAnonymousShader::GetElement(UINT Index)
\r
654 DPF(0, "ID3DX11EffectVariable::GetElement: Anonymous shaders cannot have elements");
\r
655 return &g_InvalidScalarVariable;
\r
658 ID3DX11EffectConstantBuffer * SAnonymousShader::GetParentConstantBuffer()
\r
660 return NoParentCB();
\r
663 ID3DX11EffectShaderVariable * SAnonymousShader::AsShader()
\r
665 return (ID3DX11EffectShaderVariable *) this;
\r
668 HRESULT SAnonymousShader::SetRawValue(CONST void *pData, UINT Offset, UINT Count)
\r
670 return ObjectSetRawValue();
\r
673 HRESULT SAnonymousShader::GetRawValue(__out_bcount(Count) void *pData, UINT Offset, UINT Count)
\r
675 return ObjectGetRawValue();
\r
678 #define ANONYMOUS_SHADER_INDEX_CHECK() \
\r
679 HRESULT hr = S_OK; \
\r
680 if (0 != ShaderIndex) \
\r
682 DPF(0, "%s: Invalid index specified", pFuncName); \
\r
683 VH(E_INVALIDARG); \
\r
686 HRESULT SAnonymousShader::GetShaderDesc(UINT ShaderIndex, D3DX11_EFFECT_SHADER_DESC *pDesc)
\r
688 LPCSTR pFuncName = "ID3DX11EffectShaderVariable::GetShaderDesc";
\r
690 ANONYMOUS_SHADER_INDEX_CHECK();
\r
692 pShaderBlock->GetShaderDesc(pDesc, TRUE);
\r
698 HRESULT SAnonymousShader::GetVertexShader(UINT ShaderIndex, ID3D11VertexShader **ppVS)
\r
700 LPCSTR pFuncName = "ID3DX11EffectShaderVariable::GetVertexShader";
\r
702 ANONYMOUS_SHADER_INDEX_CHECK();
\r
704 VH( pShaderBlock->GetVertexShader(ppVS) );
\r
710 HRESULT SAnonymousShader::GetGeometryShader(UINT ShaderIndex, ID3D11GeometryShader **ppGS)
\r
712 LPCSTR pFuncName = "ID3DX11EffectShaderVariable::GetGeometryShader";
\r
714 ANONYMOUS_SHADER_INDEX_CHECK();
\r
716 VH( pShaderBlock->GetGeometryShader(ppGS) );
\r
722 HRESULT SAnonymousShader::GetPixelShader(UINT ShaderIndex, ID3D11PixelShader **ppPS)
\r
724 LPCSTR pFuncName = "ID3DX11EffectShaderVariable::GetPixelShader";
\r
726 ANONYMOUS_SHADER_INDEX_CHECK();
\r
728 VH( pShaderBlock->GetPixelShader(ppPS) );
\r
734 HRESULT SAnonymousShader::GetHullShader(UINT ShaderIndex, ID3D11HullShader **ppHS)
\r
736 LPCSTR pFuncName = "ID3DX11EffectShaderVariable::GetHullShader";
\r
738 ANONYMOUS_SHADER_INDEX_CHECK();
\r
740 VH( pShaderBlock->GetHullShader(ppHS) );
\r
746 HRESULT SAnonymousShader::GetDomainShader(UINT ShaderIndex, ID3D11DomainShader **ppCS)
\r
748 LPCSTR pFuncName = "ID3DX11EffectShaderVariable::GetDomainShader";
\r
750 ANONYMOUS_SHADER_INDEX_CHECK();
\r
752 VH( pShaderBlock->GetDomainShader(ppCS) );
\r
758 HRESULT SAnonymousShader::GetComputeShader(UINT ShaderIndex, ID3D11ComputeShader **ppCS)
\r
760 LPCSTR pFuncName = "ID3DX11EffectShaderVariable::GetComputeShader";
\r
762 ANONYMOUS_SHADER_INDEX_CHECK();
\r
764 VH( pShaderBlock->GetComputeShader(ppCS) );
\r
770 HRESULT SAnonymousShader::GetInputSignatureElementDesc(UINT ShaderIndex, UINT Element, D3D11_SIGNATURE_PARAMETER_DESC *pDesc)
\r
772 LPCSTR pFuncName = "ID3DX11EffectShaderVariable::GetInputSignatureElementDesc";
\r
774 ANONYMOUS_SHADER_INDEX_CHECK();
\r
776 VH( pShaderBlock->GetSignatureElementDesc(SShaderBlock::ST_Input, Element, pDesc) );
\r
782 HRESULT SAnonymousShader::GetOutputSignatureElementDesc(UINT ShaderIndex, UINT Element, D3D11_SIGNATURE_PARAMETER_DESC *pDesc)
\r
784 LPCSTR pFuncName = "ID3DX11EffectShaderVariable::GetOutputSignatureElementDesc";
\r
786 ANONYMOUS_SHADER_INDEX_CHECK();
\r
788 VH( pShaderBlock->GetSignatureElementDesc(SShaderBlock::ST_Output, Element, pDesc) );
\r
794 HRESULT SAnonymousShader::GetPatchConstantSignatureElementDesc(UINT ShaderIndex, UINT Element, D3D11_SIGNATURE_PARAMETER_DESC *pDesc)
\r
796 LPCSTR pFuncName = "ID3DX11EffectShaderVariable::GetPatchConstantSignatureElementDesc";
\r
798 ANONYMOUS_SHADER_INDEX_CHECK();
\r
800 VH( pShaderBlock->GetSignatureElementDesc(SShaderBlock::ST_PatchConstant, Element, pDesc) );
\r
806 HRESULT SAnonymousShader::GetDesc(D3DX11_EFFECT_TYPE_DESC *pDesc)
\r
808 pDesc->Class = D3D10_SVC_OBJECT;
\r
810 switch (pShaderBlock->GetShaderType())
\r
812 case EOT_VertexShader:
\r
813 case EOT_VertexShader5:
\r
814 pDesc->TypeName = "vertexshader";
\r
815 pDesc->Type = D3D10_SVT_VERTEXSHADER;
\r
817 case EOT_GeometryShader:
\r
818 case EOT_GeometryShader5:
\r
819 pDesc->TypeName = "geometryshader";
\r
820 pDesc->Type = D3D10_SVT_GEOMETRYSHADER;
\r
822 case EOT_PixelShader:
\r
823 case EOT_PixelShader5:
\r
824 pDesc->TypeName = "pixelshader";
\r
825 pDesc->Type = D3D10_SVT_PIXELSHADER;
\r
827 case EOT_HullShader5:
\r
828 pDesc->TypeName = "Hullshader";
\r
829 pDesc->Type = D3D11_SVT_HULLSHADER;
\r
831 case EOT_DomainShader5:
\r
832 pDesc->TypeName = "Domainshader";
\r
833 pDesc->Type = D3D11_SVT_DOMAINSHADER;
\r
835 case EOT_ComputeShader5:
\r
836 pDesc->TypeName = "Computeshader";
\r
837 pDesc->Type = D3D11_SVT_COMPUTESHADER;
\r
841 pDesc->Elements = 0;
\r
842 pDesc->Members = 0;
\r
844 pDesc->Columns = 0;
\r
845 pDesc->PackedSize = 0;
\r
846 pDesc->UnpackedSize = 0;
\r
852 ID3DX11EffectType * SAnonymousShader::GetMemberTypeByIndex(UINT Index)
\r
854 DPF(0, "ID3DX11EffectType::GetMemberTypeByIndex: This interface does not refer to a structure");
\r
855 return &g_InvalidType;
\r
858 ID3DX11EffectType * SAnonymousShader::GetMemberTypeByName(LPCSTR Name)
\r
860 DPF(0, "ID3DX11EffectType::GetMemberTypeByName: This interface does not refer to a structure");
\r
861 return &g_InvalidType;
\r
864 ID3DX11EffectType * SAnonymousShader::GetMemberTypeBySemantic(LPCSTR Semantic)
\r
866 DPF(0, "ID3DX11EffectType::GetMemberTypeBySemantic: This interface does not refer to a structure");
\r
867 return &g_InvalidType;
\r
870 LPCSTR SAnonymousShader::GetMemberName(UINT Index)
\r
872 DPF(0, "ID3DX11EffectType::GetMemberName: This interface does not refer to a structure");
\r
876 LPCSTR SAnonymousShader::GetMemberSemantic(UINT Index)
\r
878 DPF(0, "ID3DX11EffectType::GetMemberSemantic: This interface does not refer to a structure");
\r
882 //////////////////////////////////////////////////////////////////////////
\r
883 // ID3DX11EffectConstantBuffer (SConstantBuffer implementation)
\r
884 //////////////////////////////////////////////////////////////////////////
\r
886 BOOL SConstantBuffer::IsValid()
\r
891 ID3DX11EffectType * SConstantBuffer::GetType()
\r
893 return (ID3DX11EffectType *) this;
\r
896 HRESULT SConstantBuffer::GetDesc(D3DX11_EFFECT_VARIABLE_DESC *pDesc)
\r
898 pDesc->Annotations = AnnotationCount;
\r
901 pDesc->Name = pName;
\r
902 pDesc->Semantic = NULL;
\r
903 pDesc->BufferOffset = 0;
\r
905 if (ExplicitBindPoint != -1)
\r
907 pDesc->ExplicitBindPoint = ExplicitBindPoint;
\r
908 pDesc->Flags |= D3DX11_EFFECT_VARIABLE_EXPLICIT_BIND_POINT;
\r
912 pDesc->ExplicitBindPoint = 0;
\r
918 ID3DX11EffectVariable * SConstantBuffer::GetAnnotationByIndex(UINT Index)
\r
920 return GetAnnotationByIndexHelper("ID3DX11EffectVariable", Index, AnnotationCount, pAnnotations);
\r
923 ID3DX11EffectVariable * SConstantBuffer::GetAnnotationByName(LPCSTR Name)
\r
925 return GetAnnotationByNameHelper("ID3DX11EffectVariable", Name, AnnotationCount, pAnnotations);
\r
928 ID3DX11EffectVariable * SConstantBuffer::GetMemberByIndex(UINT Index)
\r
930 SGlobalVariable *pMember;
\r
931 UDataPointer dataPtr;
\r
933 if (IsEffectOptimized)
\r
935 DPF(0, "ID3DX11EffectVariable::GetMemberByIndex: Cannot get members; effect has been Optimize()'ed");
\r
936 return &g_InvalidScalarVariable;
\r
939 if (!GetVariableByIndexHelper<SGlobalVariable>(Index, VariableCount, (SGlobalVariable*)pVariables,
\r
940 NULL, &pMember, &dataPtr.pGeneric))
\r
942 return &g_InvalidScalarVariable;
\r
945 return (ID3DX11EffectVariable *) pMember;
\r
948 ID3DX11EffectVariable * SConstantBuffer::GetMemberByName(LPCSTR Name)
\r
950 SGlobalVariable *pMember;
\r
951 UDataPointer dataPtr;
\r
954 if (IsEffectOptimized)
\r
956 DPF(0, "ID3DX11EffectVariable::GetMemberByName: Cannot get members; effect has been Optimize()'ed");
\r
957 return &g_InvalidScalarVariable;
\r
960 if (!GetVariableByNameHelper<SGlobalVariable>(Name, VariableCount, (SGlobalVariable*)pVariables,
\r
961 NULL, &pMember, &dataPtr.pGeneric, &index))
\r
963 return &g_InvalidScalarVariable;
\r
966 return (ID3DX11EffectVariable *) pMember;
\r
969 ID3DX11EffectVariable * SConstantBuffer::GetMemberBySemantic(LPCSTR Semantic)
\r
971 SGlobalVariable *pMember;
\r
972 UDataPointer dataPtr;
\r
975 if (IsEffectOptimized)
\r
977 DPF(0, "ID3DX11EffectVariable::GetMemberBySemantic: Cannot get members; effect has been Optimize()'ed");
\r
978 return &g_InvalidScalarVariable;
\r
981 if (!GetVariableBySemanticHelper<SGlobalVariable>(Semantic, VariableCount, (SGlobalVariable*)pVariables,
\r
982 NULL, &pMember, &dataPtr.pGeneric, &index))
\r
984 return &g_InvalidScalarVariable;
\r
987 return (ID3DX11EffectVariable *) pMember;
\r
990 ID3DX11EffectVariable * SConstantBuffer::GetElement(UINT Index)
\r
992 LPCSTR pFuncName = "ID3DX11EffectVariable::GetElement";
\r
993 DPF(0, "%s: This interface does not refer to an array", pFuncName);
\r
994 return &g_InvalidScalarVariable;
\r
997 ID3DX11EffectConstantBuffer * SConstantBuffer::GetParentConstantBuffer()
\r
999 LPCSTR pFuncName = "ID3DX11EffectVariable::GetParentConstantBuffer";
\r
1000 DPF(0, "%s: Constant buffers do not have parent constant buffers", pFuncName);
\r
1001 return &g_InvalidConstantBuffer;
\r
1004 ID3DX11EffectConstantBuffer * SConstantBuffer::AsConstantBuffer()
\r
1006 return (ID3DX11EffectConstantBuffer *) this;
\r
1009 HRESULT SConstantBuffer::GetDesc(D3DX11_EFFECT_TYPE_DESC *pDesc)
\r
1011 pDesc->TypeName = IsTBuffer ? "tbuffer" : "cbuffer";
\r
1012 pDesc->Class = D3D10_SVC_OBJECT;
\r
1013 pDesc->Type = IsTBuffer ? D3D10_SVT_TBUFFER : D3D10_SVT_CBUFFER;
\r
1015 pDesc->Elements = 0;
\r
1016 pDesc->Members = VariableCount;
\r
1018 pDesc->Columns = 0;
\r
1021 pDesc->PackedSize = 0;
\r
1022 for (i = 0; i < VariableCount; ++ i)
\r
1024 pDesc->PackedSize += pVariables[i].pType->PackedSize;
\r
1027 pDesc->UnpackedSize = Size;
\r
1028 D3DXASSERT(pDesc->UnpackedSize >= pDesc->PackedSize);
\r
1030 pDesc->Stride = AlignToPowerOf2(pDesc->UnpackedSize, SType::c_RegisterSize);
\r
1035 ID3DX11EffectType * SConstantBuffer::GetMemberTypeByIndex(UINT Index)
\r
1037 return GetTypeByIndexHelper(Index, VariableCount, pVariables, sizeof (SGlobalVariable));
\r
1040 ID3DX11EffectType * SConstantBuffer::GetMemberTypeByName(LPCSTR Name)
\r
1042 return GetTypeByNameHelper(Name, VariableCount, pVariables, sizeof (SGlobalVariable));
\r
1045 ID3DX11EffectType * SConstantBuffer::GetMemberTypeBySemantic(LPCSTR Semantic)
\r
1047 return GetTypeBySemanticHelper(Semantic, VariableCount, pVariables, sizeof (SGlobalVariable));
\r
1050 LPCSTR SConstantBuffer::GetMemberName(UINT Index)
\r
1052 LPCSTR pFuncName = "ID3DX11EffectType::GetMemberName";
\r
1054 if (IsEffectOptimized)
\r
1056 DPF(0, "%s: Cannot get member names; Effect has been Optimize()'ed", pFuncName);
\r
1060 if (Index >= VariableCount)
\r
1062 DPF(0, "%s: Invalid index (%d, total: %d)", pFuncName, Index, VariableCount);
\r
1066 return pVariables[Index].pName;
\r
1069 LPCSTR SConstantBuffer::GetMemberSemantic(UINT Index)
\r
1071 LPCSTR pFuncName = "ID3DX11EffectType::GetMemberSemantic";
\r
1073 if (IsEffectOptimized)
\r
1075 DPF(0, "%s: Cannot get member semantics; Effect has been Optimize()'ed", pFuncName);
\r
1079 if (Index >= VariableCount)
\r
1081 DPF(0, "%s: Invalid index (%d, total: %d)", pFuncName, Index, VariableCount);
\r
1085 return pVariables[Index].pSemantic;
\r
1088 HRESULT SConstantBuffer::SetRawValue(CONST void *pData, UINT Offset, UINT Count)
\r
1090 HRESULT hr = S_OK;
\r
1093 LPCSTR pFuncName = "ID3DX11EffectVariable::SetRawValue";
\r
1095 VERIFYPARAMETER(pData);
\r
1097 if ((Offset + Count < Offset) ||
\r
1098 (Count + (BYTE*)pData < (BYTE*)pData) ||
\r
1099 ((Offset + Count) > Size))
\r
1101 // overflow of some kind
\r
1102 DPF(0, "%s: Invalid range specified", pFuncName);
\r
1107 if (IsUsedByExpression)
\r
1110 for (i = 0; i < VariableCount; ++ i)
\r
1112 ((SGlobalVariable*)pVariables)[i].DirtyVariable();
\r
1120 memcpy(pBackingStore + Offset, pData, Count);
\r
1126 HRESULT SConstantBuffer::GetRawValue(__out_bcount(Count) void *pData, UINT Offset, UINT Count)
\r
1128 HRESULT hr = S_OK;
\r
1131 LPCSTR pFuncName = "ID3DX11EffectVariable::GetRawValue";
\r
1133 VERIFYPARAMETER(pData);
\r
1135 if ((Offset + Count < Offset) ||
\r
1136 (Count + (BYTE*)pData < (BYTE*)pData) ||
\r
1137 ((Offset + Count) > Size))
\r
1139 // overflow of some kind
\r
1140 DPF(0, "%s: Invalid range specified", pFuncName);
\r
1145 memcpy(pData, pBackingStore + Offset, Count);
\r
1151 bool SConstantBuffer::ClonedSingle() const
\r
1153 return IsSingle && ( pEffect->m_Flags & D3DX11_EFFECT_CLONE );
\r
1156 HRESULT SConstantBuffer::SetConstantBuffer(ID3D11Buffer *pConstantBuffer)
\r
1158 HRESULT hr = S_OK;
\r
1159 LPCSTR pFuncName = "ID3DX11EffectConstantBuffer::SetConstantBuffer";
\r
1163 DPF(0, "%s: This is a texture buffer; use SetTextureBuffer instead", pFuncName);
\r
1164 VH(D3DERR_INVALIDCALL);
\r
1167 // Replace all references to the old shader block with this one
\r
1168 pEffect->ReplaceCBReference(this, pConstantBuffer);
\r
1170 if( !IsUserManaged )
\r
1172 // Save original cbuffer in case we UndoSet
\r
1173 D3DXASSERT( pMemberData[0].Type == MDT_Buffer );
\r
1174 VB( pMemberData[0].Data.pD3DEffectsManagedConstantBuffer == NULL );
\r
1175 pMemberData[0].Data.pD3DEffectsManagedConstantBuffer = pD3DObject;
\r
1176 pD3DObject = NULL;
\r
1177 IsUserManaged = TRUE;
\r
1178 IsNonUpdatable = TRUE;
\r
1181 SAFE_ADDREF( pConstantBuffer );
\r
1182 SAFE_RELEASE( pD3DObject );
\r
1183 pD3DObject = pConstantBuffer;
\r
1189 HRESULT SConstantBuffer::GetConstantBuffer(ID3D11Buffer **ppConstantBuffer)
\r
1191 HRESULT hr = S_OK;
\r
1192 LPCSTR pFuncName = "ID3DX11EffectConstantBuffer::GetConstantBuffer";
\r
1194 VERIFYPARAMETER(ppConstantBuffer);
\r
1198 DPF(0, "%s: This is a texture buffer; use GetTextureBuffer instead", pFuncName);
\r
1199 VH(D3DERR_INVALIDCALL);
\r
1202 *ppConstantBuffer = pD3DObject;
\r
1203 SAFE_ADDREF(*ppConstantBuffer);
\r
1209 HRESULT SConstantBuffer::UndoSetConstantBuffer()
\r
1211 HRESULT hr = S_OK;
\r
1212 LPCSTR pFuncName = "ID3DX11EffectConstantBuffer::UndoSetConstantBuffer";
\r
1216 DPF(0, "%s: This is a texture buffer; use UndoSetTextureBuffer instead", pFuncName);
\r
1217 VH(D3DERR_INVALIDCALL);
\r
1220 if( !IsUserManaged )
\r
1225 // Replace all references to the old shader block with this one
\r
1226 pEffect->ReplaceCBReference(this, pMemberData[0].Data.pD3DEffectsManagedConstantBuffer);
\r
1228 // Revert to original cbuffer
\r
1229 SAFE_RELEASE( pD3DObject );
\r
1230 pD3DObject = pMemberData[0].Data.pD3DEffectsManagedConstantBuffer;
\r
1231 pMemberData[0].Data.pD3DEffectsManagedConstantBuffer = NULL;
\r
1232 IsUserManaged = FALSE;
\r
1233 IsNonUpdatable = ClonedSingle();
\r
1239 HRESULT SConstantBuffer::SetTextureBuffer(ID3D11ShaderResourceView *pTextureBuffer)
\r
1241 HRESULT hr = S_OK;
\r
1242 LPCSTR pFuncName = "ID3DX11EffectConstantBuffer::SetTextureBuffer";
\r
1246 DPF(0, "%s: This is a constant buffer; use SetConstantBuffer instead", pFuncName);
\r
1247 VH(D3DERR_INVALIDCALL);
\r
1250 if( !IsUserManaged )
\r
1252 // Save original cbuffer and tbuffer in case we UndoSet
\r
1253 D3DXASSERT( pMemberData[0].Type == MDT_Buffer );
\r
1254 VB( pMemberData[0].Data.pD3DEffectsManagedConstantBuffer == NULL );
\r
1255 pMemberData[0].Data.pD3DEffectsManagedConstantBuffer = pD3DObject;
\r
1256 pD3DObject = NULL;
\r
1257 D3DXASSERT( pMemberData[1].Type == MDT_ShaderResourceView );
\r
1258 VB( pMemberData[1].Data.pD3DEffectsManagedTextureBuffer == NULL );
\r
1259 pMemberData[1].Data.pD3DEffectsManagedTextureBuffer = TBuffer.pShaderResource;
\r
1260 TBuffer.pShaderResource = NULL;
\r
1261 IsUserManaged = TRUE;
\r
1262 IsNonUpdatable = TRUE;
\r
1265 SAFE_ADDREF( pTextureBuffer );
\r
1266 SAFE_RELEASE(pD3DObject); // won't be needing this anymore...
\r
1267 SAFE_RELEASE( TBuffer.pShaderResource );
\r
1268 TBuffer.pShaderResource = pTextureBuffer;
\r
1274 HRESULT SConstantBuffer::GetTextureBuffer(ID3D11ShaderResourceView **ppTextureBuffer)
\r
1276 HRESULT hr = S_OK;
\r
1277 LPCSTR pFuncName = "ID3DX11EffectConstantBuffer::GetTextureBuffer";
\r
1279 VERIFYPARAMETER(ppTextureBuffer);
\r
1283 DPF(0, "%s: This is a constant buffer; use GetConstantBuffer instead", pFuncName);
\r
1284 VH(D3DERR_INVALIDCALL);
\r
1287 *ppTextureBuffer = TBuffer.pShaderResource;
\r
1288 SAFE_ADDREF(*ppTextureBuffer);
\r
1294 HRESULT SConstantBuffer::UndoSetTextureBuffer()
\r
1296 HRESULT hr = S_OK;
\r
1297 LPCSTR pFuncName = "ID3DX11EffectConstantBuffer::UndoSetTextureBuffer";
\r
1301 DPF(0, "%s: This is a texture buffer; use UndoSetConstantBuffer instead", pFuncName);
\r
1302 VH(D3DERR_INVALIDCALL);
\r
1305 if( !IsUserManaged )
\r
1310 // Revert to original cbuffer
\r
1311 SAFE_RELEASE( pD3DObject );
\r
1312 pD3DObject = pMemberData[0].Data.pD3DEffectsManagedConstantBuffer;
\r
1313 pMemberData[0].Data.pD3DEffectsManagedConstantBuffer = NULL;
\r
1314 SAFE_RELEASE( TBuffer.pShaderResource );
\r
1315 TBuffer.pShaderResource = pMemberData[1].Data.pD3DEffectsManagedTextureBuffer;
\r
1316 pMemberData[1].Data.pD3DEffectsManagedTextureBuffer = NULL;
\r
1317 IsUserManaged = FALSE;
\r
1318 IsNonUpdatable = ClonedSingle();
\r
1324 //////////////////////////////////////////////////////////////////////////
\r
1325 // ID3DX11EffectPass (CEffectPass implementation)
\r
1326 //////////////////////////////////////////////////////////////////////////
\r
1328 BOOL SPassBlock::IsValid()
\r
1330 if( HasDependencies )
\r
1331 return pEffect->ValidatePassBlock( this );
\r
1332 return InitiallyValid;
\r
1335 HRESULT SPassBlock::GetDesc(D3DX11_PASS_DESC *pDesc)
\r
1337 HRESULT hr = S_OK;
\r
1338 LPCSTR pFuncName = "ID3DX11EffectPass::GetDesc";
\r
1340 VERIFYPARAMETER(pDesc);
\r
1342 ZeroMemory(pDesc, sizeof(*pDesc));
\r
1344 pDesc->Name = pName;
\r
1345 pDesc->Annotations = AnnotationCount;
\r
1347 SAssignment *pAssignment;
\r
1348 SAssignment *pLastAssn;
\r
1350 pEffect->IncrementTimer();
\r
1352 pAssignment = pAssignments;
\r
1353 pLastAssn = pAssignments + AssignmentCount;
\r
1355 for(; pAssignment < pLastAssn; pAssignment++)
\r
1357 pEffect->EvaluateAssignment(pAssignment);
\r
1360 if( BackingStore.pVertexShaderBlock && BackingStore.pVertexShaderBlock->pInputSignatureBlob )
\r
1362 // pInputSignatureBlob can be null if we're setting a NULL VS "SetVertexShader( NULL )"
\r
1363 pDesc->pIAInputSignature = (BYTE*)BackingStore.pVertexShaderBlock->pInputSignatureBlob->GetBufferPointer();
\r
1364 pDesc->IAInputSignatureSize = BackingStore.pVertexShaderBlock->pInputSignatureBlob->GetBufferSize();
\r
1367 pDesc->StencilRef = BackingStore.StencilRef;
\r
1368 pDesc->SampleMask = BackingStore.SampleMask;
\r
1369 pDesc->BlendFactor[0] = BackingStore.BlendFactor[0];
\r
1370 pDesc->BlendFactor[1] = BackingStore.BlendFactor[1];
\r
1371 pDesc->BlendFactor[2] = BackingStore.BlendFactor[2];
\r
1372 pDesc->BlendFactor[3] = BackingStore.BlendFactor[3];
\r
1378 extern SShaderBlock g_NullVS;
\r
1379 extern SShaderBlock g_NullGS;
\r
1380 extern SShaderBlock g_NullPS;
\r
1381 extern SShaderBlock g_NullHS;
\r
1382 extern SShaderBlock g_NullDS;
\r
1383 extern SShaderBlock g_NullCS;
\r
1385 SAnonymousShader g_AnonymousNullVS(&g_NullVS);
\r
1386 SAnonymousShader g_AnonymousNullGS(&g_NullGS);
\r
1387 SAnonymousShader g_AnonymousNullPS(&g_NullPS);
\r
1388 SAnonymousShader g_AnonymousNullHS(&g_NullHS);
\r
1389 SAnonymousShader g_AnonymousNullDS(&g_NullDS);
\r
1390 SAnonymousShader g_AnonymousNullCS(&g_NullCS);
\r
1392 template<EObjectType EShaderType>
\r
1393 HRESULT SPassBlock::GetShaderDescHelper(D3DX11_PASS_SHADER_DESC *pDesc)
\r
1395 HRESULT hr = S_OK;
\r
1397 LPCSTR pFuncName = NULL;
\r
1398 SShaderBlock *pShaderBlock = NULL;
\r
1400 ApplyPassAssignments();
\r
1402 switch (EShaderType)
\r
1404 case EOT_VertexShader:
\r
1405 case EOT_VertexShader5:
\r
1406 #pragma prefast(suppress:__WARNING_UNUSED_POINTER_ASSIGNMENT, "pFuncName used in DPF")
\r
1407 pFuncName = "ID3DX11EffectPass::GetVertexShaderDesc";
\r
1408 pShaderBlock = BackingStore.pVertexShaderBlock;
\r
1410 case EOT_PixelShader:
\r
1411 case EOT_PixelShader5:
\r
1412 #pragma prefast(suppress:__WARNING_UNUSED_POINTER_ASSIGNMENT, "pFuncName used in DPF")
\r
1413 pFuncName = "ID3DX11EffectPass::GetPixelShaderDesc";
\r
1414 pShaderBlock = BackingStore.pPixelShaderBlock;
\r
1416 case EOT_GeometryShader:
\r
1417 case EOT_GeometryShader5:
\r
1418 #pragma prefast(suppress:__WARNING_UNUSED_POINTER_ASSIGNMENT, "pFuncName used in DPF")
\r
1419 pFuncName = "ID3DX11EffectPass::GetGeometryShaderDesc";
\r
1420 pShaderBlock = BackingStore.pGeometryShaderBlock;
\r
1422 case EOT_HullShader5:
\r
1423 #pragma prefast(suppress:__WARNING_UNUSED_POINTER_ASSIGNMENT, "pFuncName used in DPF")
\r
1424 pFuncName = "ID3DX11EffectPass::GetHullShaderDesc";
\r
1425 pShaderBlock = BackingStore.pHullShaderBlock;
\r
1427 case EOT_DomainShader5:
\r
1428 #pragma prefast(suppress:__WARNING_UNUSED_POINTER_ASSIGNMENT, "pFuncName used in DPF")
\r
1429 pFuncName = "ID3DX11EffectPass::GetDomainShaderDesc";
\r
1430 pShaderBlock = BackingStore.pDomainShaderBlock;
\r
1432 case EOT_ComputeShader5:
\r
1433 #pragma prefast(suppress:__WARNING_UNUSED_POINTER_ASSIGNMENT, "pFuncName used in DPF")
\r
1434 pFuncName = "ID3DX11EffectPass::GetComputeShaderDesc";
\r
1435 pShaderBlock = BackingStore.pComputeShaderBlock;
\r
1441 VERIFYPARAMETER(pDesc);
\r
1443 // in case of error (or in case the assignment doesn't exist), return something reasonable
\r
1444 pDesc->pShaderVariable = &g_InvalidShaderVariable;
\r
1445 pDesc->ShaderIndex = 0;
\r
1447 if (NULL != pShaderBlock)
\r
1449 UINT elements, varCount, anonymousShaderCount;
\r
1450 SGlobalVariable *pVariables;
\r
1451 SAnonymousShader *pAnonymousShaders;
\r
1453 if (pShaderBlock == &g_NullVS)
\r
1455 pDesc->pShaderVariable = &g_AnonymousNullVS;
\r
1456 pDesc->ShaderIndex = 0;
\r
1460 else if (pShaderBlock == &g_NullGS)
\r
1462 pDesc->pShaderVariable = &g_AnonymousNullGS;
\r
1463 pDesc->ShaderIndex = 0;
\r
1467 else if (pShaderBlock == &g_NullPS)
\r
1469 pDesc->pShaderVariable = &g_AnonymousNullPS;
\r
1470 pDesc->ShaderIndex = 0;
\r
1474 else if (pShaderBlock == &g_NullHS)
\r
1476 pDesc->pShaderVariable = &g_AnonymousNullHS;
\r
1477 pDesc->ShaderIndex = 0;
\r
1481 else if (pShaderBlock == &g_NullDS)
\r
1483 pDesc->pShaderVariable = &g_AnonymousNullDS;
\r
1484 pDesc->ShaderIndex = 0;
\r
1488 else if (pShaderBlock == &g_NullCS)
\r
1490 pDesc->pShaderVariable = &g_AnonymousNullCS;
\r
1491 pDesc->ShaderIndex = 0;
\r
1497 VB( pEffect->IsRuntimeData(pShaderBlock) );
\r
1498 varCount = pEffect->m_VariableCount;
\r
1499 pVariables = pEffect->m_pVariables;
\r
1500 anonymousShaderCount = pEffect->m_AnonymousShaderCount;
\r
1501 pAnonymousShaders = pEffect->m_pAnonymousShaders;
\r
1504 for (i = 0; i < varCount; ++ i)
\r
1506 elements = max(1, pVariables[i].pType->Elements);
\r
1507 // make sure the variable type matches, and don't forget about GeometryShaderSO's
\r
1508 if (pVariables[i].pType->IsShader())
\r
1510 if (pShaderBlock >= pVariables[i].Data.pShader && pShaderBlock < pVariables[i].Data.pShader + elements)
\r
1512 pDesc->pShaderVariable = (ID3DX11EffectShaderVariable *)(pVariables + i);
\r
1513 pDesc->ShaderIndex = (UINT)(UINT_PTR)(pShaderBlock - pVariables[i].Data.pShader);
\r
1520 for (i = 0; i < anonymousShaderCount; ++ i)
\r
1522 if (pShaderBlock == pAnonymousShaders[i].pShaderBlock)
\r
1524 VB(EShaderType == pAnonymousShaders[i].pShaderBlock->GetShaderType())
\r
1525 pDesc->pShaderVariable = (pAnonymousShaders + i);
\r
1526 pDesc->ShaderIndex = 0;
\r
1532 DPF(0, "%s: Internal error; shader not found", pFuncName);
\r
1540 HRESULT SPassBlock::GetVertexShaderDesc(D3DX11_PASS_SHADER_DESC *pDesc)
\r
1542 return GetShaderDescHelper<EOT_VertexShader>(pDesc);
\r
1545 HRESULT SPassBlock::GetPixelShaderDesc(D3DX11_PASS_SHADER_DESC *pDesc)
\r
1547 return GetShaderDescHelper<EOT_PixelShader>(pDesc);
\r
1550 HRESULT SPassBlock::GetGeometryShaderDesc(D3DX11_PASS_SHADER_DESC *pDesc)
\r
1552 return GetShaderDescHelper<EOT_GeometryShader>(pDesc);
\r
1555 HRESULT SPassBlock::GetHullShaderDesc(D3DX11_PASS_SHADER_DESC *pDesc)
\r
1557 return GetShaderDescHelper<EOT_HullShader5>(pDesc);
\r
1560 HRESULT SPassBlock::GetDomainShaderDesc(D3DX11_PASS_SHADER_DESC *pDesc)
\r
1562 return GetShaderDescHelper<EOT_DomainShader5>(pDesc);
\r
1565 HRESULT SPassBlock::GetComputeShaderDesc(D3DX11_PASS_SHADER_DESC *pDesc)
\r
1567 return GetShaderDescHelper<EOT_ComputeShader5>(pDesc);
\r
1570 ID3DX11EffectVariable * SPassBlock::GetAnnotationByIndex(UINT Index)
\r
1572 return GetAnnotationByIndexHelper("ID3DX11EffectPass", Index, AnnotationCount, pAnnotations);
\r
1575 ID3DX11EffectVariable * SPassBlock::GetAnnotationByName(LPCSTR Name)
\r
1577 return GetAnnotationByNameHelper("ID3DX11EffectPass", Name, AnnotationCount, pAnnotations);
\r
1580 HRESULT SPassBlock::Apply(UINT Flags, ID3D11DeviceContext* pContext)
\r
1582 HRESULT hr = S_OK;
\r
1584 // TODO: Flags are not yet implemented
\r
1586 D3DXASSERT( pEffect->m_pContext == NULL );
\r
1587 pEffect->m_pContext = pContext;
\r
1588 pEffect->ApplyPassBlock(this);
\r
1589 pEffect->m_pContext = NULL;
\r
1595 HRESULT SPassBlock::ComputeStateBlockMask(D3DX11_STATE_BLOCK_MASK *pStateBlockMask)
\r
1597 HRESULT hr = S_OK;
\r
1600 // flags indicating whether the following shader types were caught by assignment checks or not
\r
1601 BOOL bVS = FALSE, bGS = FALSE, bPS = FALSE, bHS = FALSE, bDS = FALSE, bCS = FALSE;
\r
1603 for (i = 0; i < AssignmentCount; ++ i)
\r
1605 BOOL bShader = FALSE;
\r
1607 switch (pAssignments[i].LhsType)
\r
1609 case ELHS_VertexShaderBlock:
\r
1613 case ELHS_GeometryShaderBlock:
\r
1617 case ELHS_PixelShaderBlock:
\r
1621 case ELHS_HullShaderBlock:
\r
1625 case ELHS_DomainShaderBlock:
\r
1629 case ELHS_ComputeShaderBlock:
\r
1634 case ELHS_RasterizerBlock:
\r
1635 pStateBlockMask->RSRasterizerState = 1;
\r
1637 case ELHS_BlendBlock:
\r
1638 pStateBlockMask->OMBlendState = 1;
\r
1640 case ELHS_DepthStencilBlock:
\r
1641 pStateBlockMask->OMDepthStencilState = 1;
\r
1645 // ignore this assignment (must be a scalar/vector assignment associated with a state object)
\r
1651 for (j = 0; j < pAssignments[i].MaxElements; ++ j)
\r
1653 // compute state block mask for the union of ALL shaders
\r
1654 VH( pAssignments[i].Source.pShader[j].ComputeStateBlockMask(pStateBlockMask) );
\r
1659 // go over the state block objects in case there was no corresponding assignment
\r
1660 if (NULL != BackingStore.pRasterizerBlock)
\r
1662 pStateBlockMask->RSRasterizerState = 1;
\r
1664 if (NULL != BackingStore.pBlendBlock)
\r
1666 pStateBlockMask->OMBlendState = 1;
\r
1668 if (NULL != BackingStore.pDepthStencilBlock)
\r
1670 pStateBlockMask->OMDepthStencilState = 1;
\r
1673 // go over the shaders only if an assignment didn't already catch them
\r
1674 if (FALSE == bVS && NULL != BackingStore.pVertexShaderBlock)
\r
1676 VH( BackingStore.pVertexShaderBlock->ComputeStateBlockMask(pStateBlockMask) );
\r
1678 if (FALSE == bGS && NULL != BackingStore.pGeometryShaderBlock)
\r
1680 VH( BackingStore.pGeometryShaderBlock->ComputeStateBlockMask(pStateBlockMask) );
\r
1682 if (FALSE == bPS && NULL != BackingStore.pPixelShaderBlock)
\r
1684 VH( BackingStore.pPixelShaderBlock->ComputeStateBlockMask(pStateBlockMask) );
\r
1686 if (FALSE == bHS && NULL != BackingStore.pHullShaderBlock)
\r
1688 VH( BackingStore.pHullShaderBlock->ComputeStateBlockMask(pStateBlockMask) );
\r
1690 if (FALSE == bDS && NULL != BackingStore.pDomainShaderBlock)
\r
1692 VH( BackingStore.pDomainShaderBlock->ComputeStateBlockMask(pStateBlockMask) );
\r
1694 if (FALSE == bCS && NULL != BackingStore.pComputeShaderBlock)
\r
1696 VH( BackingStore.pComputeShaderBlock->ComputeStateBlockMask(pStateBlockMask) );
\r
1703 //////////////////////////////////////////////////////////////////////////
\r
1704 // ID3DX11EffectTechnique (STechnique implementation)
\r
1705 //////////////////////////////////////////////////////////////////////////
\r
1707 BOOL STechnique::IsValid()
\r
1709 if( HasDependencies )
\r
1711 for( UINT i = 0; i < PassCount; i++ )
\r
1713 if( !((SPassBlock*)pPasses)[i].IsValid() )
\r
1718 return InitiallyValid;
\r
1721 HRESULT STechnique::GetDesc(D3DX11_TECHNIQUE_DESC *pDesc)
\r
1723 HRESULT hr = S_OK;
\r
1725 LPCSTR pFuncName = "ID3DX11EffectTechnique::GetDesc";
\r
1727 VERIFYPARAMETER(pDesc);
\r
1729 pDesc->Name = pName;
\r
1730 pDesc->Annotations = AnnotationCount;
\r
1731 pDesc->Passes = PassCount;
\r
1737 ID3DX11EffectVariable * STechnique::GetAnnotationByIndex(UINT Index)
\r
1739 return GetAnnotationByIndexHelper("ID3DX11EffectTechnique", Index, AnnotationCount, pAnnotations);
\r
1742 ID3DX11EffectVariable * STechnique::GetAnnotationByName(LPCSTR Name)
\r
1744 return GetAnnotationByNameHelper("ID3DX11EffectTechnique", Name, AnnotationCount, pAnnotations);
\r
1747 ID3DX11EffectPass * STechnique::GetPassByIndex(UINT Index)
\r
1749 LPCSTR pFuncName = "ID3DX11EffectTechnique::GetPassByIndex";
\r
1751 if (Index >= PassCount)
\r
1753 DPF(0, "%s: Invalid pass index (%d, total: %d)", pFuncName, Index, PassCount);
\r
1754 return &g_InvalidPass;
\r
1757 return (ID3DX11EffectPass *)(pPasses + Index);
\r
1760 ID3DX11EffectPass * STechnique::GetPassByName(LPCSTR Name)
\r
1762 LPCSTR pFuncName = "ID3DX11EffectTechnique::GetPassByName";
\r
1766 for (i = 0; i < PassCount; ++ i)
\r
1768 if (NULL != pPasses[i].pName &&
\r
1769 strcmp(pPasses[i].pName, Name) == 0)
\r
1775 if (i == PassCount)
\r
1777 DPF(0, "%s: Pass [%s] not found", pFuncName, Name);
\r
1778 return &g_InvalidPass;
\r
1781 return (ID3DX11EffectPass *)(pPasses + i);
\r
1784 HRESULT STechnique::ComputeStateBlockMask(D3DX11_STATE_BLOCK_MASK *pStateBlockMask)
\r
1786 HRESULT hr = S_OK;
\r
1789 for (i = 0; i < PassCount; ++ i)
\r
1791 VH( ((SPassBlock*)pPasses)[i].ComputeStateBlockMask(pStateBlockMask) );
\r
1798 //////////////////////////////////////////////////////////////////////////
\r
1799 // ID3DX11EffectGroup (SGroup implementation)
\r
1800 //////////////////////////////////////////////////////////////////////////
\r
1802 BOOL SGroup::IsValid()
\r
1804 if( HasDependencies )
\r
1806 for( UINT i = 0; i < TechniqueCount; i++ )
\r
1808 if( !((STechnique*)pTechniques)[i].IsValid() )
\r
1813 return InitiallyValid;
\r
1816 HRESULT SGroup::GetDesc(D3DX11_GROUP_DESC *pDesc)
\r
1818 HRESULT hr = S_OK;
\r
1820 LPCSTR pFuncName = "ID3DX11EffectGroup::GetDesc";
\r
1822 VERIFYPARAMETER(pDesc);
\r
1824 pDesc->Name = pName;
\r
1825 pDesc->Annotations = AnnotationCount;
\r
1826 pDesc->Techniques = TechniqueCount;
\r
1832 ID3DX11EffectVariable * SGroup::GetAnnotationByIndex(UINT Index)
\r
1834 return GetAnnotationByIndexHelper("ID3DX11EffectGroup", Index, AnnotationCount, pAnnotations);
\r
1837 ID3DX11EffectVariable * SGroup::GetAnnotationByName(LPCSTR Name)
\r
1839 return GetAnnotationByNameHelper("ID3DX11EffectGroup", Name, AnnotationCount, pAnnotations);
\r
1842 ID3DX11EffectTechnique * SGroup::GetTechniqueByIndex(UINT Index)
\r
1844 LPCSTR pFuncName = "ID3DX11EffectGroup::GetTechniqueByIndex";
\r
1846 if (Index >= TechniqueCount)
\r
1848 DPF(0, "%s: Invalid pass index (%d, total: %d)", pFuncName, Index, TechniqueCount);
\r
1849 return &g_InvalidTechnique;
\r
1852 return (ID3DX11EffectTechnique *)(pTechniques + Index);
\r
1855 ID3DX11EffectTechnique * SGroup::GetTechniqueByName(LPCSTR Name)
\r
1857 LPCSTR pFuncName = "ID3DX11EffectGroup::GetTechniqueByName";
\r
1861 for (i = 0; i < TechniqueCount; ++ i)
\r
1863 if (NULL != pTechniques[i].pName &&
\r
1864 strcmp(pTechniques[i].pName, Name) == 0)
\r
1870 if (i == TechniqueCount)
\r
1872 DPF(0, "%s: Technique [%s] not found", pFuncName, Name);
\r
1873 return &g_InvalidTechnique;
\r
1876 return (ID3DX11EffectTechnique *)(pTechniques + i);
\r
1879 //////////////////////////////////////////////////////////////////////////
\r
1880 // ID3DX11Effect Public Reflection APIs (CEffect)
\r
1881 //////////////////////////////////////////////////////////////////////////
\r
1883 HRESULT CEffect::GetDevice(ID3D11Device **ppDevice)
\r
1885 HRESULT hr = S_OK;
\r
1886 LPCSTR pFuncName = "ID3DX11Effect::GetDevice";
\r
1887 VERIFYPARAMETER(ppDevice);
\r
1889 m_pDevice->AddRef();
\r
1890 *ppDevice = m_pDevice;
\r
1896 HRESULT CEffect::GetDesc(D3DX11_EFFECT_DESC *pDesc)
\r
1898 HRESULT hr = S_OK;
\r
1900 LPCSTR pFuncName = "ID3DX11Effect::GetDesc";
\r
1902 VERIFYPARAMETER(pDesc);
\r
1904 pDesc->ConstantBuffers = m_CBCount;
\r
1905 pDesc->GlobalVariables = m_VariableCount;
\r
1906 pDesc->Techniques = m_TechniqueCount;
\r
1907 pDesc->Groups = m_GroupCount;
\r
1908 pDesc->InterfaceVariables = m_InterfaceCount;
\r
1914 ID3DX11EffectConstantBuffer * CEffect::GetConstantBufferByIndex(UINT Index)
\r
1916 LPCSTR pFuncName = "ID3DX11Effect::GetConstantBufferByIndex";
\r
1918 if (Index < m_CBCount)
\r
1920 return m_pCBs + Index;
\r
1923 DPF(0, "%s: Invalid constant buffer index", pFuncName);
\r
1924 return &g_InvalidConstantBuffer;
\r
1927 ID3DX11EffectConstantBuffer * CEffect::GetConstantBufferByName(LPCSTR Name)
\r
1929 HRESULT hr = S_OK;
\r
1930 LPCSTR pFuncName = "ID3DX11Effect::GetConstantBufferByName";
\r
1932 if (IsOptimized())
\r
1934 DPF(0, "%s: Cannot get constant buffer interfaces by name since the effect has been Optimize()'ed", pFuncName);
\r
1935 return &g_InvalidConstantBuffer;
\r
1940 DPF(0, "%s: Parameter Name was NULL.", pFuncName);
\r
1941 return &g_InvalidConstantBuffer;
\r
1946 for (i = 0; i < m_CBCount; ++ i)
\r
1948 if (strcmp(m_pCBs[i].pName, Name) == 0)
\r
1950 return m_pCBs + i;
\r
1954 DPF(0, "%s: Constant Buffer [%s] not found", pFuncName, Name);
\r
1955 return &g_InvalidConstantBuffer;
\r
1958 ID3DX11EffectVariable * CEffect::GetVariableByIndex(UINT Index)
\r
1960 LPCSTR pFuncName = "ID3DX11Effect::GetVariableByIndex";
\r
1962 if (Index < m_VariableCount)
\r
1964 return m_pVariables + Index;
\r
1967 DPF(0, "%s: Invalid variable index", pFuncName);
\r
1968 return &g_InvalidScalarVariable;
\r
1971 ID3DX11EffectVariable * CEffect::GetVariableByName(LPCSTR Name)
\r
1973 HRESULT hr = S_OK;
\r
1974 LPCSTR pFuncName = "ID3DX11Effect::GetVariableByName";
\r
1976 if (IsOptimized())
\r
1978 DPF(0, "%s: Cannot get variable interfaces by name since the effect has been Optimize()'ed", pFuncName);
\r
1979 return &g_InvalidScalarVariable;
\r
1984 DPF(0, "%s: Parameter Name was NULL.", pFuncName);
\r
1985 return &g_InvalidScalarVariable;
\r
1990 for (i = 0; i < m_VariableCount; ++ i)
\r
1992 if (strcmp(m_pVariables[i].pName, Name) == 0)
\r
1994 return m_pVariables + i;
\r
1998 DPF(0, "%s: Variable [%s] not found", pFuncName, Name);
\r
1999 return &g_InvalidScalarVariable;
\r
2002 ID3DX11EffectVariable * CEffect::GetVariableBySemantic(LPCSTR Semantic)
\r
2004 LPCSTR pFuncName = "ID3DX11Effect::GetVariableBySemantic";
\r
2006 if (IsOptimized())
\r
2008 DPF(0, "%s: Cannot get variable interfaces by semantic since the effect has been Optimize()'ed", pFuncName);
\r
2009 return &g_InvalidScalarVariable;
\r
2012 if (NULL == Semantic)
\r
2014 DPF(0, "%s: Parameter Semantic was NULL.", pFuncName);
\r
2015 return &g_InvalidScalarVariable;
\r
2020 for (i = 0; i < m_VariableCount; ++ i)
\r
2022 if (NULL != m_pVariables[i].pSemantic &&
\r
2023 _stricmp(m_pVariables[i].pSemantic, Semantic) == 0)
\r
2025 return (ID3DX11EffectVariable *)(m_pVariables + i);
\r
2029 DPF(0, "%s: Variable with semantic [%s] not found", pFuncName, Semantic);
\r
2030 return &g_InvalidScalarVariable;
\r
2033 ID3DX11EffectTechnique * CEffect::GetTechniqueByIndex(UINT Index)
\r
2035 LPCSTR pFuncName = "ID3DX11Effect::GetTechniqueByIndex";
\r
2037 if( Index < m_TechniqueCount )
\r
2040 for( i=0; i < m_GroupCount; i++ )
\r
2042 if( Index < m_pGroups[i].TechniqueCount )
\r
2044 return (ID3DX11EffectTechnique *)(m_pGroups[i].pTechniques + Index);
\r
2046 Index -= m_pGroups[i].TechniqueCount;
\r
2048 D3DXASSERT( FALSE );
\r
2050 DPF(0, "%s: Invalid technique index (%d)", pFuncName, Index);
\r
2051 return &g_InvalidTechnique;
\r
2054 ID3DX11EffectTechnique * CEffect::GetTechniqueByName(LPCSTR Name)
\r
2056 HRESULT hr = S_OK;
\r
2057 LPCSTR pFuncName = "ID3DX11Effect::GetTechniqueByName";
\r
2058 const UINT MAX_GROUP_TECHNIQUE_SIZE = 256;
\r
2059 char NameCopy[MAX_GROUP_TECHNIQUE_SIZE];
\r
2061 if (IsOptimized())
\r
2063 DPF(0, "ID3DX11Effect::GetTechniqueByName: Cannot get technique interfaces by name since the effect has been Optimize()'ed");
\r
2064 return &g_InvalidTechnique;
\r
2069 DPF(0, "%s: Parameter Name was NULL.", pFuncName);
\r
2070 return &g_InvalidTechnique;
\r
2073 if( FAILED( StringCchCopyA( NameCopy, MAX_GROUP_TECHNIQUE_SIZE, Name ) ) )
\r
2075 DPF( 0, "Group|Technique name has a length greater than %d.", MAX_GROUP_TECHNIQUE_SIZE );
\r
2076 return &g_InvalidTechnique;
\r
2079 char* pDelimiter = strchr( NameCopy, '|' );
\r
2080 if( pDelimiter == NULL )
\r
2082 if ( m_pNullGroup == NULL )
\r
2084 DPF( 0, "The effect contains no default group." );
\r
2085 return &g_InvalidTechnique;
\r
2088 return m_pNullGroup->GetTechniqueByName( Name );
\r
2091 // separate group name and technique name
\r
2094 return GetGroupByName( NameCopy )->GetTechniqueByName( pDelimiter + 1 );
\r
2097 ID3D11ClassLinkage * CEffect::GetClassLinkage()
\r
2099 SAFE_ADDREF( m_pClassLinkage );
\r
2100 return m_pClassLinkage;
\r
2103 ID3DX11EffectGroup * CEffect::GetGroupByIndex(UINT Index)
\r
2105 LPCSTR pFuncName = "ID3DX11Effect::GetGroupByIndex";
\r
2107 if( Index < m_GroupCount )
\r
2109 return (ID3DX11EffectGroup *)(m_pGroups + Index);
\r
2111 DPF(0, "%s: Invalid group index (%d)", pFuncName, Index);
\r
2112 return &g_InvalidGroup;
\r
2115 ID3DX11EffectGroup * CEffect::GetGroupByName(LPCSTR Name)
\r
2117 HRESULT hr = S_OK;
\r
2118 LPCSTR pFuncName = "ID3DX11Effect::GetGroupByName";
\r
2120 if (IsOptimized())
\r
2122 DPF(0, "ID3DX11Effect::GetGroupByName: Cannot get group interfaces by name since the effect has been Optimize()'ed");
\r
2123 return &g_InvalidGroup;
\r
2126 if (NULL == Name || Name[0] == 0 )
\r
2128 return m_pNullGroup ? (ID3DX11EffectGroup *)m_pNullGroup : &g_InvalidGroup;
\r
2133 for (i = 0; i < m_GroupCount; ++ i)
\r
2135 if (NULL != m_pGroups[i].pName &&
\r
2136 strcmp(m_pGroups[i].pName, Name) == 0)
\r
2142 if (i == m_GroupCount)
\r
2144 DPF(0, "%s: Group [%s] not found", pFuncName, Name);
\r
2145 return &g_InvalidGroup;
\r
2148 return (ID3DX11EffectGroup *)(m_pGroups + i);
\r