+++ /dev/null
-//////////////////////////////////////////////////////////////////////////////\r
-//\r
-// Copyright (C) Microsoft Corporation. All Rights Reserved.\r
-//\r
-// File: EffectReflection.cpp\r
-// Content: D3DX11 Effects public reflection APIs\r
-//\r
-//////////////////////////////////////////////////////////////////////////////\r
-\r
-#include "pchfx.h"\r
-\r
-namespace D3DX11Effects\r
-{\r
-\r
-SEffectInvalidType g_InvalidType;\r
-\r
-SEffectInvalidScalarVariable g_InvalidScalarVariable;\r
-SEffectInvalidVectorVariable g_InvalidVectorVariable;\r
-SEffectInvalidMatrixVariable g_InvalidMatrixVariable;\r
-SEffectInvalidStringVariable g_InvalidStringVariable;\r
-SEffectInvalidClassInstanceVariable g_InvalidClassInstanceVariable;\r
-SEffectInvalidInterfaceVariable g_InvalidInterfaceVariable;\r
-SEffectInvalidShaderResourceVariable g_InvalidShaderResourceVariable;\r
-SEffectInvalidUnorderedAccessViewVariable g_InvalidUnorderedAccessViewVariable;\r
-SEffectInvalidRenderTargetViewVariable g_InvalidRenderTargetViewVariable;\r
-SEffectInvalidDepthStencilViewVariable g_InvalidDepthStencilViewVariable;\r
-SEffectInvalidConstantBuffer g_InvalidConstantBuffer;\r
-SEffectInvalidShaderVariable g_InvalidShaderVariable;\r
-SEffectInvalidBlendVariable g_InvalidBlendVariable;\r
-SEffectInvalidDepthStencilVariable g_InvalidDepthStencilVariable;\r
-SEffectInvalidRasterizerVariable g_InvalidRasterizerVariable;\r
-SEffectInvalidSamplerVariable g_InvalidSamplerVariable;\r
-\r
-SEffectInvalidPass g_InvalidPass;\r
-SEffectInvalidTechnique g_InvalidTechnique;\r
-SEffectInvalidGroup g_InvalidGroup;\r
-\r
-\r
-//////////////////////////////////////////////////////////////////////////\r
-// Helper routine implementations\r
-//////////////////////////////////////////////////////////////////////////\r
-\r
-ID3DX11EffectConstantBuffer * NoParentCB()\r
-{\r
- DPF(0, "ID3DX11EffectVariable::GetParentConstantBuffer: Variable does not have a parent constant buffer");\r
- // have to typecast because the type of g_InvalidScalarVariable has not been declared yet\r
- return &g_InvalidConstantBuffer;\r
-}\r
-\r
-ID3DX11EffectVariable * GetAnnotationByIndexHelper(const char *pClassName, UINT Index, UINT AnnotationCount, SAnnotation *pAnnotations)\r
-{\r
- if (Index >= AnnotationCount)\r
- {\r
- DPF(0, "%s::GetAnnotationByIndex: Invalid index (%d, total: %d)", pClassName, Index, AnnotationCount);\r
- return &g_InvalidScalarVariable;\r
- }\r
-\r
- return pAnnotations + Index;\r
-}\r
-\r
-ID3DX11EffectVariable * GetAnnotationByNameHelper(const char *pClassName, LPCSTR Name, UINT AnnotationCount, SAnnotation *pAnnotations)\r
-{\r
- UINT i;\r
- for (i = 0; i < AnnotationCount; ++ i)\r
- {\r
- if (strcmp(pAnnotations[i].pName, Name) == 0)\r
- {\r
- return pAnnotations + i;\r
- }\r
- }\r
-\r
- DPF(0, "%s::GetAnnotationByName: Annotation [%s] not found", pClassName, Name);\r
- return &g_InvalidScalarVariable;\r
-}\r
-\r
-//////////////////////////////////////////////////////////////////////////\r
-// Effect routines to pool interfaces\r
-//////////////////////////////////////////////////////////////////////////\r
-\r
-ID3DX11EffectType * CEffect::CreatePooledSingleElementTypeInterface(SType *pType)\r
-{\r
- UINT i;\r
-\r
- if (IsOptimized())\r
- {\r
- DPF(0, "ID3DX11Effect: Cannot create new type interfaces since the effect has been Optimize()'ed");\r
- return &g_InvalidType;\r
- }\r
-\r
- for (i = 0; i < m_pTypeInterfaces.GetSize(); ++ i)\r
- {\r
- if (m_pTypeInterfaces[i]->pType == pType)\r
- {\r
- return (SSingleElementType*)m_pTypeInterfaces[i];\r
- }\r
- }\r
- SSingleElementType *pNewType;\r
- if (NULL == (pNewType = NEW SSingleElementType))\r
- {\r
- DPF(0, "ID3DX11Effect: Out of memory while trying to create new type interface");\r
- return &g_InvalidType;\r
- }\r
-\r
- pNewType->pType = pType;\r
- m_pTypeInterfaces.Add(pNewType);\r
-\r
- return pNewType;\r
-}\r
-\r
-// Create a member variable (via GetMemberBy* or GetElement)\r
-ID3DX11EffectVariable * CEffect::CreatePooledVariableMemberInterface(TTopLevelVariable<ID3DX11EffectVariable> *pTopLevelEntity, SVariable *pMember, UDataPointer Data, BOOL IsSingleElement, UINT Index)\r
-{\r
- BOOL IsAnnotation;\r
- UINT i;\r
-\r
- if (IsOptimized())\r
- {\r
- DPF(0, "ID3DX11Effect: Cannot create new variable interfaces since the effect has been Optimize()'ed");\r
- return &g_InvalidScalarVariable;\r
- }\r
-\r
- for (i = 0; i < m_pMemberInterfaces.GetSize(); ++ i)\r
- {\r
- if (m_pMemberInterfaces[i]->pType == pMember->pType && \r
- m_pMemberInterfaces[i]->pName == pMember->pName &&\r
- m_pMemberInterfaces[i]->pSemantic == pMember->pSemantic &&\r
- m_pMemberInterfaces[i]->Data.pGeneric == Data.pGeneric &&\r
- m_pMemberInterfaces[i]->IsSingleElement == IsSingleElement &&\r
- ((SMember*)m_pMemberInterfaces[i])->pTopLevelEntity == pTopLevelEntity)\r
- {\r
- return (ID3DX11EffectVariable *) m_pMemberInterfaces[i];\r
- }\r
- }\r
-\r
- // is this annotation or runtime data?\r
- if( pTopLevelEntity->pEffect->IsReflectionData(pTopLevelEntity) )\r
- {\r
- D3DXASSERT( pTopLevelEntity->pEffect->IsReflectionData(Data.pGeneric) );\r
- IsAnnotation = TRUE;\r
- }\r
- else\r
- {\r
- // if the heap is empty, we are still loading the Effect, and thus creating a member for a variable initializer\r
- // ex. Interface myInt = myClassArray[2];\r
- if( pTopLevelEntity->pEffect->m_Heap.GetSize() > 0 )\r
- {\r
- D3DXASSERT( pTopLevelEntity->pEffect->IsRuntimeData(pTopLevelEntity) );\r
- if (!pTopLevelEntity->pType->IsObjectType(EOT_String))\r
- {\r
- // strings are funny; their data is reflection data, so ignore those\r
- D3DXASSERT( pTopLevelEntity->pEffect->IsRuntimeData(Data.pGeneric) );\r
- }\r
- }\r
- IsAnnotation = FALSE;\r
- }\r
-\r
- SMember *pNewMember;\r
-\r
- if (NULL == (pNewMember = CreateNewMember((SType*)pMember->pType, IsAnnotation)))\r
- {\r
- DPF(0, "ID3DX11Effect: Out of memory while trying to create new member variable interface");\r
- return &g_InvalidScalarVariable;\r
- }\r
- \r
- pNewMember->pType = pMember->pType;\r
- pNewMember->pName = pMember->pName;\r
- pNewMember->pSemantic = pMember->pSemantic;\r
- pNewMember->Data.pGeneric = Data.pGeneric;\r
- pNewMember->IsSingleElement = IsSingleElement;\r
- pNewMember->pTopLevelEntity = pTopLevelEntity;\r
-\r
- if( IsSingleElement && pMember->pMemberData )\r
- {\r
- D3DXASSERT( !IsAnnotation );\r
- // This is an element of a global variable array\r
- pNewMember->pMemberData = pMember->pMemberData + Index;\r
- }\r
-\r
- if (FAILED(m_pMemberInterfaces.Add(pNewMember)))\r
- {\r
- SAFE_DELETE(pNewMember);\r
- DPF(0, "ID3DX11Effect: Out of memory while trying to create new member variable interface");\r
- return &g_InvalidScalarVariable;\r
- }\r
-\r
- return (ID3DX11EffectVariable *) pNewMember;\r
-}\r
-\r
-//////////////////////////////////////////////////////////////////////////\r
-// ID3DX11EffectType (SType, SSingleElementType implementations)\r
-//////////////////////////////////////////////////////////////////////////\r
-\r
-static ID3DX11EffectType * GetTypeByIndexHelper(UINT Index, UINT VariableCount, \r
- SVariable *pVariables, UINT SizeOfVariableType)\r
-{\r
- LPCSTR pFuncName = "ID3DX11EffectType::GetMemberTypeByIndex";\r
-\r
- if (Index >= VariableCount)\r
- {\r
- DPF(0, "%s: Invalid index (%d, total: %d)", pFuncName, Index, VariableCount);\r
- return &g_InvalidType;\r
- }\r
-\r
- SVariable *pVariable = (SVariable *)((BYTE *)pVariables + Index * SizeOfVariableType);\r
- if (NULL == pVariable->pName)\r
- {\r
- DPF(0, "%s: Cannot get member types; Effect has been Optimize()'ed", pFuncName);\r
- return &g_InvalidType;\r
- }\r
-\r
- return (ID3DX11EffectType *) pVariable->pType;\r
-}\r
-\r
-static ID3DX11EffectType * GetTypeByNameHelper(LPCSTR Name, UINT VariableCount, \r
- SVariable *pVariables, UINT SizeOfVariableType)\r
-{\r
- LPCSTR pFuncName = "ID3DX11EffectType::GetMemberTypeByName";\r
-\r
- if (NULL == Name)\r
- {\r
- DPF(0, "%s: Parameter Name was NULL.", pFuncName);\r
- return &g_InvalidType;\r
- }\r
-\r
- UINT i;\r
- SVariable *pVariable;\r
-\r
- for (i = 0; i < VariableCount; ++ i)\r
- {\r
- pVariable = (SVariable *)((BYTE *)pVariables + i * SizeOfVariableType);\r
- if (NULL == pVariable->pName)\r
- {\r
- DPF(0, "%s: Cannot get member types; Effect has been Optimize()'ed", pFuncName);\r
- return &g_InvalidType;\r
- }\r
- if (strcmp(pVariable->pName, Name) == 0)\r
- {\r
- return (ID3DX11EffectType *) pVariable->pType;\r
- }\r
- }\r
-\r
- DPF(0, "%s: Member type [%s] not found", pFuncName, Name);\r
- return &g_InvalidType;\r
-}\r
-\r
-\r
-static ID3DX11EffectType * GetTypeBySemanticHelper(LPCSTR Semantic, UINT VariableCount, \r
- SVariable *pVariables, UINT SizeOfVariableType)\r
-{\r
- LPCSTR pFuncName = "ID3DX11EffectType::GetMemberTypeBySemantic";\r
-\r
- if (NULL == Semantic)\r
- {\r
- DPF(0, "%s: Parameter Semantic was NULL.", pFuncName);\r
- return &g_InvalidType;\r
- }\r
-\r
- UINT i;\r
- SVariable *pVariable;\r
-\r
- for (i = 0; i < VariableCount; ++ i)\r
- {\r
- pVariable = (SVariable *)((BYTE *)pVariables + i * SizeOfVariableType);\r
- if (NULL == pVariable->pName)\r
- {\r
- DPF(0, "%s: Cannot get member types; Effect has been Optimize()'ed", pFuncName);\r
- return &g_InvalidType;\r
- }\r
- if (NULL != pVariable->pSemantic &&\r
- _stricmp(pVariable->pSemantic, Semantic) == 0)\r
- {\r
- return (ID3DX11EffectType *) pVariable->pType;\r
- }\r
- }\r
-\r
- DPF(0, "%s: Member type with semantic [%s] not found", pFuncName, Semantic);\r
- return &g_InvalidType;\r
-}\r
-\r
-ID3DX11EffectType * SType::GetMemberTypeByIndex(UINT Index)\r
-{\r
- if (VarType != EVT_Struct)\r
- {\r
- DPF(0, "ID3DX11EffectType::GetMemberTypeByIndex: This interface does not refer to a structure");\r
- return &g_InvalidType;\r
- }\r
-\r
- return GetTypeByIndexHelper(Index, StructType.Members, StructType.pMembers, sizeof(SVariable));\r
-}\r
-\r
-ID3DX11EffectType * SType::GetMemberTypeByName(LPCSTR Name)\r
-{\r
- if (VarType != EVT_Struct)\r
- {\r
- DPF(0, "ID3DX11EffectType::GetMemberTypeByName: This interface does not refer to a structure");\r
- return &g_InvalidType;\r
- }\r
-\r
- return GetTypeByNameHelper(Name, StructType.Members, StructType.pMembers, sizeof(SVariable));\r
-}\r
-\r
-ID3DX11EffectType * SType::GetMemberTypeBySemantic(LPCSTR Semantic)\r
-{\r
- if (VarType != EVT_Struct)\r
- {\r
- DPF(0, "ID3DX11EffectType::GetMemberTypeBySemantic: This interface does not refer to a structure");\r
- return &g_InvalidType;\r
- }\r
-\r
- return GetTypeBySemanticHelper(Semantic, StructType.Members, StructType.pMembers, sizeof(SVariable));\r
-}\r
-\r
-LPCSTR SType::GetMemberName(UINT Index)\r
-{\r
- LPCSTR pFuncName = "ID3DX11EffectType::GetMemberName";\r
-\r
- if (VarType != EVT_Struct)\r
- {\r
- DPF(0, "%s: This interface does not refer to a structure", pFuncName);\r
- return NULL;\r
- }\r
-\r
- if (Index >= StructType.Members)\r
- {\r
- DPF(0, "%s: Invalid index (%d, total: %d)", pFuncName, Index, StructType.Members);\r
- return NULL;\r
- }\r
-\r
- SVariable *pVariable = StructType.pMembers + Index;\r
-\r
- if (NULL == pVariable->pName)\r
- {\r
- DPF(0, "%s: Cannot get member names; Effect has been Optimize()'ed", pFuncName);\r
- return NULL;\r
- }\r
-\r
- return pVariable->pName;\r
-}\r
-\r
-LPCSTR SType::GetMemberSemantic(UINT Index)\r
-{\r
- LPCSTR pFuncName = "ID3DX11EffectType::GetMemberSemantic";\r
-\r
- if (VarType != EVT_Struct)\r
- {\r
- DPF(0, "%s: This interface does not refer to a structure", pFuncName);\r
- return NULL;\r
- }\r
-\r
- if (Index >= StructType.Members)\r
- {\r
- DPF(0, "%s: Invalid index (%d, total: %d)", pFuncName, Index, StructType.Members);\r
- return NULL;\r
- }\r
-\r
- SVariable *pVariable = StructType.pMembers + Index;\r
-\r
- if (NULL == pVariable->pName)\r
- {\r
- DPF(0, "%s: Cannot get member semantics; Effect has been Optimize()'ed", pFuncName);\r
- return NULL;\r
- }\r
-\r
- return pVariable->pSemantic;\r
-}\r
-\r
-HRESULT SType::GetDescHelper(D3DX11_EFFECT_TYPE_DESC *pDesc, BOOL IsSingleElement) const\r
-{\r
- HRESULT hr = S_OK;\r
- LPCSTR pFuncName = "ID3DX11EffectType::GetDesc";\r
-\r
- VERIFYPARAMETER(pDesc);\r
- \r
- pDesc->TypeName = pTypeName;\r
-\r
- // intentionally return 0 so they know it's not a single element array\r
- pDesc->Elements = IsSingleElement ? 0 : Elements;\r
- pDesc->PackedSize = GetTotalPackedSize(IsSingleElement);\r
- pDesc->UnpackedSize = GetTotalUnpackedSize(IsSingleElement);\r
- pDesc->Stride = Stride;\r
-\r
- switch (VarType)\r
- {\r
- case EVT_Numeric:\r
- switch (NumericType.NumericLayout)\r
- {\r
- case ENL_Matrix:\r
- if (NumericType.IsColumnMajor)\r
- {\r
- pDesc->Class = D3D10_SVC_MATRIX_COLUMNS;\r
- }\r
- else\r
- {\r
- pDesc->Class = D3D10_SVC_MATRIX_ROWS;\r
- }\r
- break;\r
- case ENL_Vector:\r
- pDesc->Class = D3D10_SVC_VECTOR;\r
- break;\r
- case ENL_Scalar:\r
- pDesc->Class = D3D10_SVC_SCALAR;\r
- break;\r
- default:\r
- D3DXASSERT(0);\r
- }\r
-\r
- switch (NumericType.ScalarType)\r
- {\r
- case EST_Bool:\r
- pDesc->Type = D3D10_SVT_BOOL;\r
- break;\r
- case EST_Int:\r
- pDesc->Type = D3D10_SVT_INT;\r
- break;\r
- case EST_UInt:\r
- pDesc->Type = D3D10_SVT_UINT;\r
- break;\r
- case EST_Float:\r
- pDesc->Type = D3D10_SVT_FLOAT;\r
- break;\r
- default:\r
- D3DXASSERT(0);\r
- }\r
-\r
- pDesc->Rows = NumericType.Rows;\r
- pDesc->Columns = NumericType.Columns;\r
- pDesc->Members = 0;\r
-\r
- break;\r
-\r
- case EVT_Struct:\r
- pDesc->Rows = 0;\r
- pDesc->Columns = 0;\r
- pDesc->Members = StructType.Members;\r
- if( StructType.ImplementsInterface )\r
- {\r
- pDesc->Class = D3D11_SVC_INTERFACE_CLASS;\r
- }\r
- else\r
- {\r
- pDesc->Class = D3D10_SVC_STRUCT;\r
- }\r
- pDesc->Type = D3D10_SVT_VOID;\r
- break;\r
-\r
- case EVT_Interface:\r
- pDesc->Rows = 0;\r
- pDesc->Columns = 0;\r
- pDesc->Members = 0;\r
- pDesc->Class = D3D11_SVC_INTERFACE_POINTER;\r
- pDesc->Type = D3D11_SVT_INTERFACE_POINTER;\r
- break;\r
-\r
- case EVT_Object:\r
- pDesc->Rows = 0;\r
- pDesc->Columns = 0;\r
- pDesc->Members = 0;\r
- pDesc->Class = D3D10_SVC_OBJECT; \r
-\r
- switch (ObjectType)\r
- {\r
- case EOT_String:\r
- pDesc->Type = D3D10_SVT_STRING;\r
- break;\r
- case EOT_Blend:\r
- pDesc->Type = D3D10_SVT_BLEND; \r
- break;\r
- case EOT_DepthStencil:\r
- pDesc->Type = D3D10_SVT_DEPTHSTENCIL;\r
- break;\r
- case EOT_Rasterizer:\r
- pDesc->Type = D3D10_SVT_RASTERIZER;\r
- break;\r
- case EOT_PixelShader:\r
- case EOT_PixelShader5:\r
- pDesc->Type = D3D10_SVT_PIXELSHADER;\r
- break;\r
- case EOT_VertexShader:\r
- case EOT_VertexShader5:\r
- pDesc->Type = D3D10_SVT_VERTEXSHADER;\r
- break;\r
- case EOT_GeometryShader:\r
- case EOT_GeometryShaderSO:\r
- case EOT_GeometryShader5:\r
- pDesc->Type = D3D10_SVT_GEOMETRYSHADER;\r
- break;\r
- case EOT_HullShader5:\r
- pDesc->Type = D3D11_SVT_HULLSHADER;\r
- break;\r
- case EOT_DomainShader5:\r
- pDesc->Type = D3D11_SVT_DOMAINSHADER;\r
- break;\r
- case EOT_ComputeShader5:\r
- pDesc->Type = D3D11_SVT_COMPUTESHADER;\r
- break;\r
- case EOT_Texture:\r
- pDesc->Type = D3D10_SVT_TEXTURE;\r
- break;\r
- case EOT_Texture1D:\r
- pDesc->Type = D3D10_SVT_TEXTURE1D;\r
- break;\r
- case EOT_Texture1DArray:\r
- pDesc->Type = D3D10_SVT_TEXTURE1DARRAY;\r
- break;\r
- case EOT_Texture2D:\r
- pDesc->Type = D3D10_SVT_TEXTURE2D;\r
- break;\r
- case EOT_Texture2DArray:\r
- pDesc->Type = D3D10_SVT_TEXTURE2DARRAY;\r
- break;\r
- case EOT_Texture2DMS:\r
- pDesc->Type = D3D10_SVT_TEXTURE2DMS;\r
- break;\r
- case EOT_Texture2DMSArray:\r
- pDesc->Type = D3D10_SVT_TEXTURE2DMSARRAY;\r
- break;\r
- case EOT_Texture3D:\r
- pDesc->Type = D3D10_SVT_TEXTURE3D;\r
- break;\r
- case EOT_TextureCube:\r
- pDesc->Type = D3D10_SVT_TEXTURECUBE;\r
- break;\r
- case EOT_TextureCubeArray:\r
- pDesc->Type = D3D10_SVT_TEXTURECUBEARRAY;\r
- break;\r
- case EOT_Buffer:\r
- pDesc->Type = D3D10_SVT_BUFFER;\r
- break;\r
- case EOT_Sampler:\r
- pDesc->Type = D3D10_SVT_SAMPLER;\r
- break;\r
- case EOT_RenderTargetView:\r
- pDesc->Type = D3D10_SVT_RENDERTARGETVIEW;\r
- break;\r
- case EOT_DepthStencilView:\r
- pDesc->Type = D3D10_SVT_DEPTHSTENCILVIEW;\r
- break;\r
- case EOT_RWTexture1D:\r
- pDesc->Type = D3D11_SVT_RWTEXTURE1D;\r
- break;\r
- case EOT_RWTexture1DArray:\r
- pDesc->Type = D3D11_SVT_RWTEXTURE1DARRAY;\r
- break;\r
- case EOT_RWTexture2D:\r
- pDesc->Type = D3D11_SVT_RWTEXTURE2D;\r
- break;\r
- case EOT_RWTexture2DArray:\r
- pDesc->Type = D3D11_SVT_RWTEXTURE2DARRAY;\r
- break;\r
- case EOT_RWTexture3D:\r
- pDesc->Type = D3D11_SVT_RWTEXTURE3D;\r
- break;\r
- case EOT_RWBuffer:\r
- pDesc->Type = D3D11_SVT_RWBUFFER;\r
- break;\r
- case EOT_ByteAddressBuffer:\r
- pDesc->Type = D3D11_SVT_BYTEADDRESS_BUFFER;\r
- break;\r
- case EOT_RWByteAddressBuffer:\r
- pDesc->Type = D3D11_SVT_RWBYTEADDRESS_BUFFER;\r
- break;\r
- case EOT_StructuredBuffer:\r
- pDesc->Type = D3D11_SVT_STRUCTURED_BUFFER;\r
- break;\r
- case EOT_RWStructuredBuffer:\r
- case EOT_RWStructuredBufferAlloc:\r
- case EOT_RWStructuredBufferConsume:\r
- pDesc->Type = D3D11_SVT_RWSTRUCTURED_BUFFER;\r
- break;\r
- case EOT_AppendStructuredBuffer:\r
- pDesc->Type = D3D11_SVT_APPEND_STRUCTURED_BUFFER;\r
- break;\r
- case EOT_ConsumeStructuredBuffer:\r
- pDesc->Type = D3D11_SVT_CONSUME_STRUCTURED_BUFFER;\r
- break;\r
-\r
- default:\r
- D3DXASSERT(0);\r
- }\r
- break;\r
-\r
- default:\r
- D3DXASSERT(0);\r
- }\r
-\r
-lExit:\r
- return hr;\r
-\r
-}\r
-\r
-////////////////////////////////////////////////////////////////////////////////\r
-// ID3DX11EffectShaderVariable (SAnonymousShader implementation)\r
-////////////////////////////////////////////////////////////////////////////////\r
-\r
-SAnonymousShader::SAnonymousShader(SShaderBlock *pBlock)\r
-{\r
- pShaderBlock = pBlock;\r
-}\r
-\r
-BOOL SAnonymousShader::IsValid()\r
-{\r
- return pShaderBlock && pShaderBlock->IsValid;\r
-}\r
-\r
-ID3DX11EffectType * SAnonymousShader::GetType()\r
-{\r
- return (ID3DX11EffectType *) this;\r
-}\r
-\r
-HRESULT SAnonymousShader::GetDesc(D3DX11_EFFECT_VARIABLE_DESC *pDesc)\r
-{\r
- pDesc->Annotations = 0;\r
- pDesc->Flags = 0;\r
-\r
- pDesc->Name = "$Anonymous";\r
- pDesc->Semantic = NULL;\r
- pDesc->BufferOffset = 0;\r
-\r
- return S_OK;\r
-}\r
-\r
-ID3DX11EffectVariable * SAnonymousShader::GetAnnotationByIndex(UINT Index)\r
-{\r
- DPF(0, "ID3DX11EffectVariable::GetAnnotationByIndex: Anonymous shaders cannot have annotations");\r
- return &g_InvalidScalarVariable;\r
-}\r
-\r
-ID3DX11EffectVariable * SAnonymousShader::GetAnnotationByName(LPCSTR Name)\r
-{\r
- DPF(0, "ID3DX11EffectVariable::GetAnnotationByName: Anonymous shaders cannot have annotations");\r
- return &g_InvalidScalarVariable;\r
-}\r
-\r
-ID3DX11EffectVariable * SAnonymousShader::GetMemberByIndex(UINT Index)\r
-{\r
- DPF(0, "ID3DX11EffectVariable::GetMemberByIndex: Variable is not a structure");\r
- return &g_InvalidScalarVariable;\r
-}\r
-\r
-ID3DX11EffectVariable * SAnonymousShader::GetMemberByName(LPCSTR Name)\r
-{\r
- DPF(0, "ID3DX11EffectVariable::GetMemberByName: Variable is not a structure");\r
- return &g_InvalidScalarVariable;\r
-}\r
-\r
-ID3DX11EffectVariable * SAnonymousShader::GetMemberBySemantic(LPCSTR Semantic)\r
-{\r
- DPF(0, "ID3DX11EffectVariable::GetMemberBySemantic: Variable is not a structure");\r
- return &g_InvalidScalarVariable;\r
-}\r
-\r
-ID3DX11EffectVariable * SAnonymousShader::GetElement(UINT Index)\r
-{\r
- DPF(0, "ID3DX11EffectVariable::GetElement: Anonymous shaders cannot have elements");\r
- return &g_InvalidScalarVariable;\r
-}\r
-\r
-ID3DX11EffectConstantBuffer * SAnonymousShader::GetParentConstantBuffer()\r
-{\r
- return NoParentCB();\r
-}\r
-\r
-ID3DX11EffectShaderVariable * SAnonymousShader::AsShader()\r
-{\r
- return (ID3DX11EffectShaderVariable *) this;\r
-}\r
-\r
-HRESULT SAnonymousShader::SetRawValue(CONST void *pData, UINT Offset, UINT Count) \r
-{ \r
- return ObjectSetRawValue(); \r
-}\r
-\r
-HRESULT SAnonymousShader::GetRawValue(__out_bcount(Count) void *pData, UINT Offset, UINT Count) \r
-{ \r
- return ObjectGetRawValue(); \r
-}\r
-\r
-#define ANONYMOUS_SHADER_INDEX_CHECK() \\r
- HRESULT hr = S_OK; \\r
- if (0 != ShaderIndex) \\r
- { \\r
- DPF(0, "%s: Invalid index specified", pFuncName); \\r
- VH(E_INVALIDARG); \\r
- } \\r
-\r
-HRESULT SAnonymousShader::GetShaderDesc(UINT ShaderIndex, D3DX11_EFFECT_SHADER_DESC *pDesc)\r
-{\r
- LPCSTR pFuncName = "ID3DX11EffectShaderVariable::GetShaderDesc";\r
-\r
- ANONYMOUS_SHADER_INDEX_CHECK();\r
-\r
- pShaderBlock->GetShaderDesc(pDesc, TRUE);\r
-\r
-lExit:\r
- return hr;\r
-}\r
-\r
-HRESULT SAnonymousShader::GetVertexShader(UINT ShaderIndex, ID3D11VertexShader **ppVS)\r
-{\r
- LPCSTR pFuncName = "ID3DX11EffectShaderVariable::GetVertexShader";\r
-\r
- ANONYMOUS_SHADER_INDEX_CHECK();\r
-\r
- VH( pShaderBlock->GetVertexShader(ppVS) );\r
-\r
-lExit:\r
- return hr;\r
-}\r
-\r
-HRESULT SAnonymousShader::GetGeometryShader(UINT ShaderIndex, ID3D11GeometryShader **ppGS)\r
-{\r
- LPCSTR pFuncName = "ID3DX11EffectShaderVariable::GetGeometryShader";\r
-\r
- ANONYMOUS_SHADER_INDEX_CHECK();\r
-\r
- VH( pShaderBlock->GetGeometryShader(ppGS) );\r
-\r
-lExit:\r
- return hr;\r
-}\r
-\r
-HRESULT SAnonymousShader::GetPixelShader(UINT ShaderIndex, ID3D11PixelShader **ppPS)\r
-{\r
- LPCSTR pFuncName = "ID3DX11EffectShaderVariable::GetPixelShader";\r
-\r
- ANONYMOUS_SHADER_INDEX_CHECK();\r
-\r
- VH( pShaderBlock->GetPixelShader(ppPS) );\r
-\r
-lExit:\r
- return hr;\r
-}\r
-\r
-HRESULT SAnonymousShader::GetHullShader(UINT ShaderIndex, ID3D11HullShader **ppHS)\r
-{\r
- LPCSTR pFuncName = "ID3DX11EffectShaderVariable::GetHullShader";\r
-\r
- ANONYMOUS_SHADER_INDEX_CHECK();\r
-\r
- VH( pShaderBlock->GetHullShader(ppHS) );\r
-\r
-lExit:\r
- return hr;\r
-}\r
-\r
-HRESULT SAnonymousShader::GetDomainShader(UINT ShaderIndex, ID3D11DomainShader **ppCS)\r
-{\r
- LPCSTR pFuncName = "ID3DX11EffectShaderVariable::GetDomainShader";\r
-\r
- ANONYMOUS_SHADER_INDEX_CHECK();\r
-\r
- VH( pShaderBlock->GetDomainShader(ppCS) );\r
-\r
-lExit:\r
- return hr;\r
-}\r
-\r
-HRESULT SAnonymousShader::GetComputeShader(UINT ShaderIndex, ID3D11ComputeShader **ppCS)\r
-{\r
- LPCSTR pFuncName = "ID3DX11EffectShaderVariable::GetComputeShader";\r
-\r
- ANONYMOUS_SHADER_INDEX_CHECK();\r
-\r
- VH( pShaderBlock->GetComputeShader(ppCS) );\r
-\r
-lExit:\r
- return hr;\r
-}\r
-\r
-HRESULT SAnonymousShader::GetInputSignatureElementDesc(UINT ShaderIndex, UINT Element, D3D11_SIGNATURE_PARAMETER_DESC *pDesc)\r
-{\r
- LPCSTR pFuncName = "ID3DX11EffectShaderVariable::GetInputSignatureElementDesc";\r
-\r
- ANONYMOUS_SHADER_INDEX_CHECK();\r
-\r
- VH( pShaderBlock->GetSignatureElementDesc(SShaderBlock::ST_Input, Element, pDesc) );\r
-\r
-lExit:\r
- return hr;\r
-}\r
-\r
-HRESULT SAnonymousShader::GetOutputSignatureElementDesc(UINT ShaderIndex, UINT Element, D3D11_SIGNATURE_PARAMETER_DESC *pDesc)\r
-{\r
- LPCSTR pFuncName = "ID3DX11EffectShaderVariable::GetOutputSignatureElementDesc";\r
-\r
- ANONYMOUS_SHADER_INDEX_CHECK();\r
-\r
- VH( pShaderBlock->GetSignatureElementDesc(SShaderBlock::ST_Output, Element, pDesc) );\r
-\r
-lExit:\r
- return hr;\r
-}\r
-\r
-HRESULT SAnonymousShader::GetPatchConstantSignatureElementDesc(UINT ShaderIndex, UINT Element, D3D11_SIGNATURE_PARAMETER_DESC *pDesc)\r
-{\r
- LPCSTR pFuncName = "ID3DX11EffectShaderVariable::GetPatchConstantSignatureElementDesc";\r
-\r
- ANONYMOUS_SHADER_INDEX_CHECK();\r
-\r
- VH( pShaderBlock->GetSignatureElementDesc(SShaderBlock::ST_PatchConstant, Element, pDesc) );\r
-\r
-lExit:\r
- return hr;\r
-}\r
-\r
-HRESULT SAnonymousShader::GetDesc(D3DX11_EFFECT_TYPE_DESC *pDesc)\r
-{\r
- pDesc->Class = D3D10_SVC_OBJECT;\r
-\r
- switch (pShaderBlock->GetShaderType())\r
- {\r
- case EOT_VertexShader:\r
- case EOT_VertexShader5:\r
- pDesc->TypeName = "vertexshader";\r
- pDesc->Type = D3D10_SVT_VERTEXSHADER;\r
- break;\r
- case EOT_GeometryShader:\r
- case EOT_GeometryShader5:\r
- pDesc->TypeName = "geometryshader";\r
- pDesc->Type = D3D10_SVT_GEOMETRYSHADER;\r
- break;\r
- case EOT_PixelShader:\r
- case EOT_PixelShader5:\r
- pDesc->TypeName = "pixelshader";\r
- pDesc->Type = D3D10_SVT_PIXELSHADER;\r
- break;\r
- case EOT_HullShader5:\r
- pDesc->TypeName = "Hullshader";\r
- pDesc->Type = D3D11_SVT_HULLSHADER;\r
- break;\r
- case EOT_DomainShader5:\r
- pDesc->TypeName = "Domainshader";\r
- pDesc->Type = D3D11_SVT_DOMAINSHADER;\r
- break;\r
- case EOT_ComputeShader5:\r
- pDesc->TypeName = "Computeshader";\r
- pDesc->Type = D3D11_SVT_COMPUTESHADER;\r
- break;\r
- }\r
-\r
- pDesc->Elements = 0;\r
- pDesc->Members = 0;\r
- pDesc->Rows = 0;\r
- pDesc->Columns = 0;\r
- pDesc->PackedSize = 0;\r
- pDesc->UnpackedSize = 0;\r
- pDesc->Stride = 0;\r
-\r
- return S_OK;\r
-}\r
-\r
-ID3DX11EffectType * SAnonymousShader::GetMemberTypeByIndex(UINT Index)\r
-{\r
- DPF(0, "ID3DX11EffectType::GetMemberTypeByIndex: This interface does not refer to a structure");\r
- return &g_InvalidType;\r
-}\r
-\r
-ID3DX11EffectType * SAnonymousShader::GetMemberTypeByName(LPCSTR Name)\r
-{\r
- DPF(0, "ID3DX11EffectType::GetMemberTypeByName: This interface does not refer to a structure");\r
- return &g_InvalidType;\r
-}\r
-\r
-ID3DX11EffectType * SAnonymousShader::GetMemberTypeBySemantic(LPCSTR Semantic)\r
-{\r
- DPF(0, "ID3DX11EffectType::GetMemberTypeBySemantic: This interface does not refer to a structure");\r
- return &g_InvalidType;\r
-}\r
-\r
-LPCSTR SAnonymousShader::GetMemberName(UINT Index)\r
-{\r
- DPF(0, "ID3DX11EffectType::GetMemberName: This interface does not refer to a structure");\r
- return NULL;\r
-}\r
-\r
-LPCSTR SAnonymousShader::GetMemberSemantic(UINT Index)\r
-{\r
- DPF(0, "ID3DX11EffectType::GetMemberSemantic: This interface does not refer to a structure");\r
- return NULL;\r
-}\r
-\r
-//////////////////////////////////////////////////////////////////////////\r
-// ID3DX11EffectConstantBuffer (SConstantBuffer implementation)\r
-//////////////////////////////////////////////////////////////////////////\r
-\r
-BOOL SConstantBuffer::IsValid()\r
-{\r
- return TRUE;\r
-}\r
-\r
-ID3DX11EffectType * SConstantBuffer::GetType()\r
-{\r
- return (ID3DX11EffectType *) this;\r
-}\r
-\r
-HRESULT SConstantBuffer::GetDesc(D3DX11_EFFECT_VARIABLE_DESC *pDesc)\r
-{\r
- pDesc->Annotations = AnnotationCount;\r
- pDesc->Flags = 0;\r
-\r
- pDesc->Name = pName;\r
- pDesc->Semantic = NULL;\r
- pDesc->BufferOffset = 0;\r
-\r
- if (ExplicitBindPoint != -1)\r
- {\r
- pDesc->ExplicitBindPoint = ExplicitBindPoint;\r
- pDesc->Flags |= D3DX11_EFFECT_VARIABLE_EXPLICIT_BIND_POINT;\r
- }\r
- else\r
- {\r
- pDesc->ExplicitBindPoint = 0;\r
- }\r
-\r
- return S_OK;\r
-}\r
-\r
-ID3DX11EffectVariable * SConstantBuffer::GetAnnotationByIndex(UINT Index)\r
-{\r
- return GetAnnotationByIndexHelper("ID3DX11EffectVariable", Index, AnnotationCount, pAnnotations);\r
-}\r
-\r
-ID3DX11EffectVariable * SConstantBuffer::GetAnnotationByName(LPCSTR Name)\r
-{\r
- return GetAnnotationByNameHelper("ID3DX11EffectVariable", Name, AnnotationCount, pAnnotations);\r
-}\r
-\r
-ID3DX11EffectVariable * SConstantBuffer::GetMemberByIndex(UINT Index)\r
-{\r
- SGlobalVariable *pMember;\r
- UDataPointer dataPtr;\r
-\r
- if (IsEffectOptimized)\r
- {\r
- DPF(0, "ID3DX11EffectVariable::GetMemberByIndex: Cannot get members; effect has been Optimize()'ed");\r
- return &g_InvalidScalarVariable;\r
- }\r
-\r
- if (!GetVariableByIndexHelper<SGlobalVariable>(Index, VariableCount, (SGlobalVariable*)pVariables, \r
- NULL, &pMember, &dataPtr.pGeneric))\r
- {\r
- return &g_InvalidScalarVariable;\r
- }\r
-\r
- return (ID3DX11EffectVariable *) pMember;\r
-}\r
-\r
-ID3DX11EffectVariable * SConstantBuffer::GetMemberByName(LPCSTR Name)\r
-{\r
- SGlobalVariable *pMember;\r
- UDataPointer dataPtr;\r
- UINT index;\r
-\r
- if (IsEffectOptimized)\r
- {\r
- DPF(0, "ID3DX11EffectVariable::GetMemberByName: Cannot get members; effect has been Optimize()'ed");\r
- return &g_InvalidScalarVariable;\r
- }\r
-\r
- if (!GetVariableByNameHelper<SGlobalVariable>(Name, VariableCount, (SGlobalVariable*)pVariables, \r
- NULL, &pMember, &dataPtr.pGeneric, &index))\r
- {\r
- return &g_InvalidScalarVariable;\r
- }\r
-\r
- return (ID3DX11EffectVariable *) pMember;\r
-}\r
-\r
-ID3DX11EffectVariable * SConstantBuffer::GetMemberBySemantic(LPCSTR Semantic)\r
-{\r
- SGlobalVariable *pMember;\r
- UDataPointer dataPtr;\r
- UINT index;\r
-\r
- if (IsEffectOptimized)\r
- {\r
- DPF(0, "ID3DX11EffectVariable::GetMemberBySemantic: Cannot get members; effect has been Optimize()'ed");\r
- return &g_InvalidScalarVariable;\r
- }\r
-\r
- if (!GetVariableBySemanticHelper<SGlobalVariable>(Semantic, VariableCount, (SGlobalVariable*)pVariables, \r
- NULL, &pMember, &dataPtr.pGeneric, &index))\r
- {\r
- return &g_InvalidScalarVariable;\r
- }\r
-\r
- return (ID3DX11EffectVariable *) pMember;\r
-}\r
-\r
-ID3DX11EffectVariable * SConstantBuffer::GetElement(UINT Index)\r
-{\r
- LPCSTR pFuncName = "ID3DX11EffectVariable::GetElement";\r
- DPF(0, "%s: This interface does not refer to an array", pFuncName);\r
- return &g_InvalidScalarVariable;\r
-}\r
-\r
-ID3DX11EffectConstantBuffer * SConstantBuffer::GetParentConstantBuffer()\r
-{\r
- LPCSTR pFuncName = "ID3DX11EffectVariable::GetParentConstantBuffer";\r
- DPF(0, "%s: Constant buffers do not have parent constant buffers", pFuncName);\r
- return &g_InvalidConstantBuffer;\r
-}\r
-\r
-ID3DX11EffectConstantBuffer * SConstantBuffer::AsConstantBuffer()\r
-{\r
- return (ID3DX11EffectConstantBuffer *) this;\r
-}\r
-\r
-HRESULT SConstantBuffer::GetDesc(D3DX11_EFFECT_TYPE_DESC *pDesc)\r
-{\r
- pDesc->TypeName = IsTBuffer ? "tbuffer" : "cbuffer";\r
- pDesc->Class = D3D10_SVC_OBJECT;\r
- pDesc->Type = IsTBuffer ? D3D10_SVT_TBUFFER : D3D10_SVT_CBUFFER;\r
-\r
- pDesc->Elements = 0;\r
- pDesc->Members = VariableCount;\r
- pDesc->Rows = 0;\r
- pDesc->Columns = 0;\r
-\r
- UINT i;\r
- pDesc->PackedSize = 0;\r
- for (i = 0; i < VariableCount; ++ i)\r
- {\r
- pDesc->PackedSize += pVariables[i].pType->PackedSize;\r
- }\r
-\r
- pDesc->UnpackedSize = Size;\r
- D3DXASSERT(pDesc->UnpackedSize >= pDesc->PackedSize);\r
-\r
- pDesc->Stride = AlignToPowerOf2(pDesc->UnpackedSize, SType::c_RegisterSize);\r
-\r
- return S_OK;\r
-}\r
-\r
-ID3DX11EffectType * SConstantBuffer::GetMemberTypeByIndex(UINT Index)\r
-{\r
- return GetTypeByIndexHelper(Index, VariableCount, pVariables, sizeof (SGlobalVariable));\r
-}\r
-\r
-ID3DX11EffectType * SConstantBuffer::GetMemberTypeByName(LPCSTR Name)\r
-{\r
- return GetTypeByNameHelper(Name, VariableCount, pVariables, sizeof (SGlobalVariable));\r
-}\r
-\r
-ID3DX11EffectType * SConstantBuffer::GetMemberTypeBySemantic(LPCSTR Semantic)\r
-{\r
- return GetTypeBySemanticHelper(Semantic, VariableCount, pVariables, sizeof (SGlobalVariable));\r
-}\r
-\r
-LPCSTR SConstantBuffer::GetMemberName(UINT Index)\r
-{\r
- LPCSTR pFuncName = "ID3DX11EffectType::GetMemberName";\r
-\r
- if (IsEffectOptimized)\r
- {\r
- DPF(0, "%s: Cannot get member names; Effect has been Optimize()'ed", pFuncName);\r
- return NULL;\r
- }\r
-\r
- if (Index >= VariableCount)\r
- {\r
- DPF(0, "%s: Invalid index (%d, total: %d)", pFuncName, Index, VariableCount);\r
- return NULL;\r
- }\r
-\r
- return pVariables[Index].pName;\r
-}\r
-\r
-LPCSTR SConstantBuffer::GetMemberSemantic(UINT Index)\r
-{\r
- LPCSTR pFuncName = "ID3DX11EffectType::GetMemberSemantic";\r
-\r
- if (IsEffectOptimized)\r
- {\r
- DPF(0, "%s: Cannot get member semantics; Effect has been Optimize()'ed", pFuncName);\r
- return NULL;\r
- }\r
-\r
- if (Index >= VariableCount)\r
- {\r
- DPF(0, "%s: Invalid index (%d, total: %d)", pFuncName, Index, VariableCount);\r
- return NULL;\r
- }\r
-\r
- return pVariables[Index].pSemantic;\r
-}\r
-\r
-HRESULT SConstantBuffer::SetRawValue(CONST void *pData, UINT Offset, UINT Count)\r
-{\r
- HRESULT hr = S_OK; \r
-\r
-#ifdef _DEBUG\r
- LPCSTR pFuncName = "ID3DX11EffectVariable::SetRawValue";\r
-\r
- VERIFYPARAMETER(pData);\r
-\r
- if ((Offset + Count < Offset) ||\r
- (Count + (BYTE*)pData < (BYTE*)pData) ||\r
- ((Offset + Count) > Size))\r
- {\r
- // overflow of some kind\r
- DPF(0, "%s: Invalid range specified", pFuncName);\r
- VH(E_INVALIDARG);\r
- }\r
-#endif\r
-\r
- if (IsUsedByExpression)\r
- {\r
- UINT i;\r
- for (i = 0; i < VariableCount; ++ i)\r
- {\r
- ((SGlobalVariable*)pVariables)[i].DirtyVariable();\r
- }\r
- }\r
- else\r
- {\r
- IsDirty = TRUE;\r
- }\r
-\r
- memcpy(pBackingStore + Offset, pData, Count);\r
-\r
-lExit:\r
- return hr;\r
-}\r
-\r
-HRESULT SConstantBuffer::GetRawValue(__out_bcount(Count) void *pData, UINT Offset, UINT Count)\r
-{\r
- HRESULT hr = S_OK; \r
-\r
-#ifdef _DEBUG\r
- LPCSTR pFuncName = "ID3DX11EffectVariable::GetRawValue";\r
-\r
- VERIFYPARAMETER(pData);\r
-\r
- if ((Offset + Count < Offset) ||\r
- (Count + (BYTE*)pData < (BYTE*)pData) ||\r
- ((Offset + Count) > Size))\r
- {\r
- // overflow of some kind\r
- DPF(0, "%s: Invalid range specified", pFuncName);\r
- VH(E_INVALIDARG);\r
- }\r
-#endif\r
-\r
- memcpy(pData, pBackingStore + Offset, Count);\r
-\r
-lExit:\r
- return hr;\r
-}\r
-\r
-bool SConstantBuffer::ClonedSingle() const\r
-{\r
- return IsSingle && ( pEffect->m_Flags & D3DX11_EFFECT_CLONE );\r
-}\r
-\r
-HRESULT SConstantBuffer::SetConstantBuffer(ID3D11Buffer *pConstantBuffer)\r
-{\r
- HRESULT hr = S_OK;\r
- LPCSTR pFuncName = "ID3DX11EffectConstantBuffer::SetConstantBuffer";\r
-\r
- if (IsTBuffer)\r
- {\r
- DPF(0, "%s: This is a texture buffer; use SetTextureBuffer instead", pFuncName);\r
- VH(D3DERR_INVALIDCALL);\r
- }\r
-\r
- // Replace all references to the old shader block with this one\r
- pEffect->ReplaceCBReference(this, pConstantBuffer);\r
-\r
- if( !IsUserManaged )\r
- {\r
- // Save original cbuffer in case we UndoSet\r
- D3DXASSERT( pMemberData[0].Type == MDT_Buffer );\r
- VB( pMemberData[0].Data.pD3DEffectsManagedConstantBuffer == NULL );\r
- pMemberData[0].Data.pD3DEffectsManagedConstantBuffer = pD3DObject;\r
- pD3DObject = NULL;\r
- IsUserManaged = TRUE;\r
- IsNonUpdatable = TRUE;\r
- }\r
-\r
- SAFE_ADDREF( pConstantBuffer );\r
- SAFE_RELEASE( pD3DObject );\r
- pD3DObject = pConstantBuffer;\r
-\r
-lExit:\r
- return hr;\r
-}\r
-\r
-HRESULT SConstantBuffer::GetConstantBuffer(ID3D11Buffer **ppConstantBuffer)\r
-{\r
- HRESULT hr = S_OK;\r
- LPCSTR pFuncName = "ID3DX11EffectConstantBuffer::GetConstantBuffer";\r
-\r
- VERIFYPARAMETER(ppConstantBuffer);\r
-\r
- if (IsTBuffer)\r
- {\r
- DPF(0, "%s: This is a texture buffer; use GetTextureBuffer instead", pFuncName);\r
- VH(D3DERR_INVALIDCALL);\r
- }\r
-\r
- *ppConstantBuffer = pD3DObject;\r
- SAFE_ADDREF(*ppConstantBuffer);\r
-\r
-lExit:\r
- return hr;\r
-}\r
-\r
-HRESULT SConstantBuffer::UndoSetConstantBuffer() \r
-{\r
- HRESULT hr = S_OK;\r
- LPCSTR pFuncName = "ID3DX11EffectConstantBuffer::UndoSetConstantBuffer";\r
-\r
- if (IsTBuffer)\r
- {\r
- DPF(0, "%s: This is a texture buffer; use UndoSetTextureBuffer instead", pFuncName);\r
- VH(D3DERR_INVALIDCALL);\r
- }\r
-\r
- if( !IsUserManaged )\r
- {\r
- return S_FALSE;\r
- }\r
-\r
- // Replace all references to the old shader block with this one\r
- pEffect->ReplaceCBReference(this, pMemberData[0].Data.pD3DEffectsManagedConstantBuffer);\r
-\r
- // Revert to original cbuffer\r
- SAFE_RELEASE( pD3DObject );\r
- pD3DObject = pMemberData[0].Data.pD3DEffectsManagedConstantBuffer;\r
- pMemberData[0].Data.pD3DEffectsManagedConstantBuffer = NULL;\r
- IsUserManaged = FALSE;\r
- IsNonUpdatable = ClonedSingle();\r
-\r
-lExit:\r
- return hr;\r
-}\r
-\r
-HRESULT SConstantBuffer::SetTextureBuffer(ID3D11ShaderResourceView *pTextureBuffer)\r
-{\r
- HRESULT hr = S_OK;\r
- LPCSTR pFuncName = "ID3DX11EffectConstantBuffer::SetTextureBuffer";\r
-\r
- if (!IsTBuffer)\r
- {\r
- DPF(0, "%s: This is a constant buffer; use SetConstantBuffer instead", pFuncName);\r
- VH(D3DERR_INVALIDCALL);\r
- }\r
-\r
- if( !IsUserManaged )\r
- {\r
- // Save original cbuffer and tbuffer in case we UndoSet\r
- D3DXASSERT( pMemberData[0].Type == MDT_Buffer );\r
- VB( pMemberData[0].Data.pD3DEffectsManagedConstantBuffer == NULL );\r
- pMemberData[0].Data.pD3DEffectsManagedConstantBuffer = pD3DObject;\r
- pD3DObject = NULL;\r
- D3DXASSERT( pMemberData[1].Type == MDT_ShaderResourceView );\r
- VB( pMemberData[1].Data.pD3DEffectsManagedTextureBuffer == NULL );\r
- pMemberData[1].Data.pD3DEffectsManagedTextureBuffer = TBuffer.pShaderResource;\r
- TBuffer.pShaderResource = NULL;\r
- IsUserManaged = TRUE;\r
- IsNonUpdatable = TRUE;\r
- }\r
-\r
- SAFE_ADDREF( pTextureBuffer );\r
- SAFE_RELEASE(pD3DObject); // won't be needing this anymore...\r
- SAFE_RELEASE( TBuffer.pShaderResource );\r
- TBuffer.pShaderResource = pTextureBuffer;\r
-\r
-lExit:\r
- return hr;\r
-}\r
-\r
-HRESULT SConstantBuffer::GetTextureBuffer(ID3D11ShaderResourceView **ppTextureBuffer)\r
-{\r
- HRESULT hr = S_OK;\r
- LPCSTR pFuncName = "ID3DX11EffectConstantBuffer::GetTextureBuffer";\r
-\r
- VERIFYPARAMETER(ppTextureBuffer);\r
-\r
- if (!IsTBuffer)\r
- {\r
- DPF(0, "%s: This is a constant buffer; use GetConstantBuffer instead", pFuncName);\r
- VH(D3DERR_INVALIDCALL);\r
- }\r
-\r
- *ppTextureBuffer = TBuffer.pShaderResource;\r
- SAFE_ADDREF(*ppTextureBuffer);\r
-\r
-lExit:\r
- return hr;\r
-}\r
-\r
-HRESULT SConstantBuffer::UndoSetTextureBuffer()\r
-{\r
- HRESULT hr = S_OK;\r
- LPCSTR pFuncName = "ID3DX11EffectConstantBuffer::UndoSetTextureBuffer";\r
-\r
- if (!IsTBuffer)\r
- {\r
- DPF(0, "%s: This is a texture buffer; use UndoSetConstantBuffer instead", pFuncName);\r
- VH(D3DERR_INVALIDCALL);\r
- }\r
-\r
- if( !IsUserManaged )\r
- {\r
- return S_FALSE;\r
- }\r
-\r
- // Revert to original cbuffer\r
- SAFE_RELEASE( pD3DObject );\r
- pD3DObject = pMemberData[0].Data.pD3DEffectsManagedConstantBuffer;\r
- pMemberData[0].Data.pD3DEffectsManagedConstantBuffer = NULL;\r
- SAFE_RELEASE( TBuffer.pShaderResource );\r
- TBuffer.pShaderResource = pMemberData[1].Data.pD3DEffectsManagedTextureBuffer;\r
- pMemberData[1].Data.pD3DEffectsManagedTextureBuffer = NULL;\r
- IsUserManaged = FALSE;\r
- IsNonUpdatable = ClonedSingle();\r
-\r
-lExit:\r
- return hr;\r
-}\r
-\r
-//////////////////////////////////////////////////////////////////////////\r
-// ID3DX11EffectPass (CEffectPass implementation)\r
-//////////////////////////////////////////////////////////////////////////\r
-\r
-BOOL SPassBlock::IsValid()\r
-{\r
- if( HasDependencies )\r
- return pEffect->ValidatePassBlock( this );\r
- return InitiallyValid;\r
-}\r
-\r
-HRESULT SPassBlock::GetDesc(D3DX11_PASS_DESC *pDesc)\r
-{\r
- HRESULT hr = S_OK;\r
- LPCSTR pFuncName = "ID3DX11EffectPass::GetDesc";\r
-\r
- VERIFYPARAMETER(pDesc);\r
-\r
- ZeroMemory(pDesc, sizeof(*pDesc));\r
-\r
- pDesc->Name = pName;\r
- pDesc->Annotations = AnnotationCount;\r
- \r
- SAssignment *pAssignment;\r
- SAssignment *pLastAssn;\r
-\r
- pEffect->IncrementTimer();\r
-\r
- pAssignment = pAssignments;\r
- pLastAssn = pAssignments + AssignmentCount;\r
-\r
- for(; pAssignment < pLastAssn; pAssignment++)\r
- {\r
- pEffect->EvaluateAssignment(pAssignment);\r
- }\r
-\r
- if( BackingStore.pVertexShaderBlock && BackingStore.pVertexShaderBlock->pInputSignatureBlob )\r
- {\r
- // pInputSignatureBlob can be null if we're setting a NULL VS "SetVertexShader( NULL )"\r
- pDesc->pIAInputSignature = (BYTE*)BackingStore.pVertexShaderBlock->pInputSignatureBlob->GetBufferPointer();\r
- pDesc->IAInputSignatureSize = BackingStore.pVertexShaderBlock->pInputSignatureBlob->GetBufferSize();\r
- }\r
-\r
- pDesc->StencilRef = BackingStore.StencilRef;\r
- pDesc->SampleMask = BackingStore.SampleMask;\r
- pDesc->BlendFactor[0] = BackingStore.BlendFactor[0];\r
- pDesc->BlendFactor[1] = BackingStore.BlendFactor[1];\r
- pDesc->BlendFactor[2] = BackingStore.BlendFactor[2];\r
- pDesc->BlendFactor[3] = BackingStore.BlendFactor[3];\r
-\r
-lExit:\r
- return hr;\r
-}\r
-\r
-extern SShaderBlock g_NullVS;\r
-extern SShaderBlock g_NullGS;\r
-extern SShaderBlock g_NullPS;\r
-extern SShaderBlock g_NullHS;\r
-extern SShaderBlock g_NullDS;\r
-extern SShaderBlock g_NullCS;\r
-\r
-SAnonymousShader g_AnonymousNullVS(&g_NullVS);\r
-SAnonymousShader g_AnonymousNullGS(&g_NullGS);\r
-SAnonymousShader g_AnonymousNullPS(&g_NullPS);\r
-SAnonymousShader g_AnonymousNullHS(&g_NullHS);\r
-SAnonymousShader g_AnonymousNullDS(&g_NullDS);\r
-SAnonymousShader g_AnonymousNullCS(&g_NullCS);\r
-\r
-template<EObjectType EShaderType>\r
-HRESULT SPassBlock::GetShaderDescHelper(D3DX11_PASS_SHADER_DESC *pDesc)\r
-{\r
- HRESULT hr = S_OK;\r
- UINT i;\r
- LPCSTR pFuncName = NULL;\r
- SShaderBlock *pShaderBlock = NULL;\r
-\r
- ApplyPassAssignments();\r
-\r
- switch (EShaderType)\r
- {\r
- case EOT_VertexShader:\r
- case EOT_VertexShader5:\r
-#pragma prefast(suppress:__WARNING_UNUSED_POINTER_ASSIGNMENT, "pFuncName used in DPF")\r
- pFuncName = "ID3DX11EffectPass::GetVertexShaderDesc";\r
- pShaderBlock = BackingStore.pVertexShaderBlock;\r
- break;\r
- case EOT_PixelShader:\r
- case EOT_PixelShader5:\r
-#pragma prefast(suppress:__WARNING_UNUSED_POINTER_ASSIGNMENT, "pFuncName used in DPF")\r
- pFuncName = "ID3DX11EffectPass::GetPixelShaderDesc";\r
- pShaderBlock = BackingStore.pPixelShaderBlock;\r
- break;\r
- case EOT_GeometryShader:\r
- case EOT_GeometryShader5:\r
-#pragma prefast(suppress:__WARNING_UNUSED_POINTER_ASSIGNMENT, "pFuncName used in DPF")\r
- pFuncName = "ID3DX11EffectPass::GetGeometryShaderDesc";\r
- pShaderBlock = BackingStore.pGeometryShaderBlock;\r
- break;\r
- case EOT_HullShader5:\r
-#pragma prefast(suppress:__WARNING_UNUSED_POINTER_ASSIGNMENT, "pFuncName used in DPF")\r
- pFuncName = "ID3DX11EffectPass::GetHullShaderDesc";\r
- pShaderBlock = BackingStore.pHullShaderBlock;\r
- break;\r
- case EOT_DomainShader5:\r
-#pragma prefast(suppress:__WARNING_UNUSED_POINTER_ASSIGNMENT, "pFuncName used in DPF")\r
- pFuncName = "ID3DX11EffectPass::GetDomainShaderDesc";\r
- pShaderBlock = BackingStore.pDomainShaderBlock;\r
- break;\r
- case EOT_ComputeShader5:\r
-#pragma prefast(suppress:__WARNING_UNUSED_POINTER_ASSIGNMENT, "pFuncName used in DPF")\r
- pFuncName = "ID3DX11EffectPass::GetComputeShaderDesc";\r
- pShaderBlock = BackingStore.pComputeShaderBlock;\r
- break;\r
- default:\r
- D3DXASSERT(0);\r
- }\r
-\r
- VERIFYPARAMETER(pDesc);\r
-\r
- // in case of error (or in case the assignment doesn't exist), return something reasonable\r
- pDesc->pShaderVariable = &g_InvalidShaderVariable;\r
- pDesc->ShaderIndex = 0;\r
-\r
- if (NULL != pShaderBlock)\r
- {\r
- UINT elements, varCount, anonymousShaderCount;\r
- SGlobalVariable *pVariables;\r
- SAnonymousShader *pAnonymousShaders;\r
-\r
- if (pShaderBlock == &g_NullVS)\r
- {\r
- pDesc->pShaderVariable = &g_AnonymousNullVS;\r
- pDesc->ShaderIndex = 0;\r
- // we're done\r
- goto lExit;\r
- }\r
- else if (pShaderBlock == &g_NullGS)\r
- {\r
- pDesc->pShaderVariable = &g_AnonymousNullGS;\r
- pDesc->ShaderIndex = 0;\r
- // we're done\r
- goto lExit;\r
- }\r
- else if (pShaderBlock == &g_NullPS)\r
- {\r
- pDesc->pShaderVariable = &g_AnonymousNullPS;\r
- pDesc->ShaderIndex = 0;\r
- // we're done\r
- goto lExit;\r
- }\r
- else if (pShaderBlock == &g_NullHS)\r
- {\r
- pDesc->pShaderVariable = &g_AnonymousNullHS;\r
- pDesc->ShaderIndex = 0;\r
- // we're done\r
- goto lExit;\r
- }\r
- else if (pShaderBlock == &g_NullDS)\r
- {\r
- pDesc->pShaderVariable = &g_AnonymousNullDS;\r
- pDesc->ShaderIndex = 0;\r
- // we're done\r
- goto lExit;\r
- }\r
- else if (pShaderBlock == &g_NullCS)\r
- {\r
- pDesc->pShaderVariable = &g_AnonymousNullCS;\r
- pDesc->ShaderIndex = 0;\r
- // we're done\r
- goto lExit;\r
- }\r
- else \r
- {\r
- VB( pEffect->IsRuntimeData(pShaderBlock) );\r
- varCount = pEffect->m_VariableCount;\r
- pVariables = pEffect->m_pVariables;\r
- anonymousShaderCount = pEffect->m_AnonymousShaderCount;\r
- pAnonymousShaders = pEffect->m_pAnonymousShaders;\r
- }\r
-\r
- for (i = 0; i < varCount; ++ i)\r
- {\r
- elements = max(1, pVariables[i].pType->Elements);\r
- // make sure the variable type matches, and don't forget about GeometryShaderSO's\r
- if (pVariables[i].pType->IsShader())\r
- {\r
- if (pShaderBlock >= pVariables[i].Data.pShader && pShaderBlock < pVariables[i].Data.pShader + elements)\r
- {\r
- pDesc->pShaderVariable = (ID3DX11EffectShaderVariable *)(pVariables + i);\r
- pDesc->ShaderIndex = (UINT)(UINT_PTR)(pShaderBlock - pVariables[i].Data.pShader);\r
- // we're done\r
- goto lExit;\r
- }\r
- }\r
- }\r
-\r
- for (i = 0; i < anonymousShaderCount; ++ i)\r
- {\r
- if (pShaderBlock == pAnonymousShaders[i].pShaderBlock)\r
- {\r
- VB(EShaderType == pAnonymousShaders[i].pShaderBlock->GetShaderType())\r
- pDesc->pShaderVariable = (pAnonymousShaders + i);\r
- pDesc->ShaderIndex = 0;\r
- // we're done\r
- goto lExit;\r
- }\r
- }\r
-\r
- DPF(0, "%s: Internal error; shader not found", pFuncName);\r
- VH( E_FAIL );\r
- }\r
-\r
-lExit:\r
- return hr;\r
-}\r
-\r
-HRESULT SPassBlock::GetVertexShaderDesc(D3DX11_PASS_SHADER_DESC *pDesc)\r
-{\r
- return GetShaderDescHelper<EOT_VertexShader>(pDesc);\r
-}\r
-\r
-HRESULT SPassBlock::GetPixelShaderDesc(D3DX11_PASS_SHADER_DESC *pDesc)\r
-{\r
- return GetShaderDescHelper<EOT_PixelShader>(pDesc);\r
-}\r
-\r
-HRESULT SPassBlock::GetGeometryShaderDesc(D3DX11_PASS_SHADER_DESC *pDesc)\r
-{\r
- return GetShaderDescHelper<EOT_GeometryShader>(pDesc);\r
-}\r
-\r
-HRESULT SPassBlock::GetHullShaderDesc(D3DX11_PASS_SHADER_DESC *pDesc)\r
-{\r
- return GetShaderDescHelper<EOT_HullShader5>(pDesc);\r
-}\r
-\r
-HRESULT SPassBlock::GetDomainShaderDesc(D3DX11_PASS_SHADER_DESC *pDesc)\r
-{\r
- return GetShaderDescHelper<EOT_DomainShader5>(pDesc);\r
-}\r
-\r
-HRESULT SPassBlock::GetComputeShaderDesc(D3DX11_PASS_SHADER_DESC *pDesc)\r
-{\r
- return GetShaderDescHelper<EOT_ComputeShader5>(pDesc);\r
-}\r
-\r
-ID3DX11EffectVariable * SPassBlock::GetAnnotationByIndex(UINT Index)\r
-{\r
- return GetAnnotationByIndexHelper("ID3DX11EffectPass", Index, AnnotationCount, pAnnotations);\r
-}\r
-\r
-ID3DX11EffectVariable * SPassBlock::GetAnnotationByName(LPCSTR Name)\r
-{\r
- return GetAnnotationByNameHelper("ID3DX11EffectPass", Name, AnnotationCount, pAnnotations);\r
-}\r
-\r
-HRESULT SPassBlock::Apply(UINT Flags, ID3D11DeviceContext* pContext)\r
-{\r
- HRESULT hr = S_OK;\r
-\r
- // TODO: Flags are not yet implemented \r
-\r
- D3DXASSERT( pEffect->m_pContext == NULL );\r
- pEffect->m_pContext = pContext;\r
- pEffect->ApplyPassBlock(this);\r
- pEffect->m_pContext = NULL;\r
-\r
-lExit:\r
- return hr;\r
-}\r
-\r
-HRESULT SPassBlock::ComputeStateBlockMask(D3DX11_STATE_BLOCK_MASK *pStateBlockMask)\r
-{\r
- HRESULT hr = S_OK;\r
- UINT i, j;\r
- \r
- // flags indicating whether the following shader types were caught by assignment checks or not\r
- BOOL bVS = FALSE, bGS = FALSE, bPS = FALSE, bHS = FALSE, bDS = FALSE, bCS = FALSE;\r
-\r
- for (i = 0; i < AssignmentCount; ++ i)\r
- {\r
- BOOL bShader = FALSE;\r
- \r
- switch (pAssignments[i].LhsType)\r
- {\r
- case ELHS_VertexShaderBlock:\r
- bVS = TRUE;\r
- bShader = TRUE;\r
- break;\r
- case ELHS_GeometryShaderBlock:\r
- bGS = TRUE;\r
- bShader = TRUE;\r
- break;\r
- case ELHS_PixelShaderBlock:\r
- bPS = TRUE;\r
- bShader = TRUE;\r
- break;\r
- case ELHS_HullShaderBlock:\r
- bHS = TRUE;\r
- bShader = TRUE;\r
- break;\r
- case ELHS_DomainShaderBlock:\r
- bDS = TRUE;\r
- bShader = TRUE;\r
- break;\r
- case ELHS_ComputeShaderBlock:\r
- bCS = TRUE;\r
- bShader = TRUE;\r
- break;\r
-\r
- case ELHS_RasterizerBlock:\r
- pStateBlockMask->RSRasterizerState = 1;\r
- break;\r
- case ELHS_BlendBlock:\r
- pStateBlockMask->OMBlendState = 1;\r
- break;\r
- case ELHS_DepthStencilBlock:\r
- pStateBlockMask->OMDepthStencilState = 1;\r
- break;\r
-\r
- default: \r
- // ignore this assignment (must be a scalar/vector assignment associated with a state object)\r
- break;\r
- }\r
-\r
- if (bShader)\r
- {\r
- for (j = 0; j < pAssignments[i].MaxElements; ++ j)\r
- {\r
- // compute state block mask for the union of ALL shaders\r
- VH( pAssignments[i].Source.pShader[j].ComputeStateBlockMask(pStateBlockMask) );\r
- }\r
- }\r
- }\r
-\r
- // go over the state block objects in case there was no corresponding assignment\r
- if (NULL != BackingStore.pRasterizerBlock)\r
- {\r
- pStateBlockMask->RSRasterizerState = 1;\r
- }\r
- if (NULL != BackingStore.pBlendBlock)\r
- {\r
- pStateBlockMask->OMBlendState = 1;\r
- }\r
- if (NULL != BackingStore.pDepthStencilBlock)\r
- {\r
- pStateBlockMask->OMDepthStencilState = 1;\r
- }\r
-\r
- // go over the shaders only if an assignment didn't already catch them\r
- if (FALSE == bVS && NULL != BackingStore.pVertexShaderBlock)\r
- {\r
- VH( BackingStore.pVertexShaderBlock->ComputeStateBlockMask(pStateBlockMask) );\r
- }\r
- if (FALSE == bGS && NULL != BackingStore.pGeometryShaderBlock)\r
- {\r
- VH( BackingStore.pGeometryShaderBlock->ComputeStateBlockMask(pStateBlockMask) );\r
- }\r
- if (FALSE == bPS && NULL != BackingStore.pPixelShaderBlock)\r
- {\r
- VH( BackingStore.pPixelShaderBlock->ComputeStateBlockMask(pStateBlockMask) );\r
- }\r
- if (FALSE == bHS && NULL != BackingStore.pHullShaderBlock)\r
- {\r
- VH( BackingStore.pHullShaderBlock->ComputeStateBlockMask(pStateBlockMask) );\r
- }\r
- if (FALSE == bDS && NULL != BackingStore.pDomainShaderBlock)\r
- {\r
- VH( BackingStore.pDomainShaderBlock->ComputeStateBlockMask(pStateBlockMask) );\r
- }\r
- if (FALSE == bCS && NULL != BackingStore.pComputeShaderBlock)\r
- {\r
- VH( BackingStore.pComputeShaderBlock->ComputeStateBlockMask(pStateBlockMask) );\r
- }\r
- \r
-lExit:\r
- return hr;\r
-}\r
-\r
-//////////////////////////////////////////////////////////////////////////\r
-// ID3DX11EffectTechnique (STechnique implementation)\r
-//////////////////////////////////////////////////////////////////////////\r
-\r
-BOOL STechnique::IsValid()\r
-{ \r
- if( HasDependencies )\r
- {\r
- for( UINT i = 0; i < PassCount; i++ )\r
- {\r
- if( !((SPassBlock*)pPasses)[i].IsValid() )\r
- return FALSE;\r
- }\r
- return TRUE;\r
- }\r
- return InitiallyValid;\r
-}\r
-\r
-HRESULT STechnique::GetDesc(D3DX11_TECHNIQUE_DESC *pDesc)\r
-{\r
- HRESULT hr = S_OK;\r
-\r
- LPCSTR pFuncName = "ID3DX11EffectTechnique::GetDesc";\r
-\r
- VERIFYPARAMETER(pDesc);\r
-\r
- pDesc->Name = pName;\r
- pDesc->Annotations = AnnotationCount;\r
- pDesc->Passes = PassCount;\r
-\r
-lExit:\r
- return hr;\r
-}\r
-\r
-ID3DX11EffectVariable * STechnique::GetAnnotationByIndex(UINT Index)\r
-{\r
- return GetAnnotationByIndexHelper("ID3DX11EffectTechnique", Index, AnnotationCount, pAnnotations);\r
-}\r
-\r
-ID3DX11EffectVariable * STechnique::GetAnnotationByName(LPCSTR Name)\r
-{\r
- return GetAnnotationByNameHelper("ID3DX11EffectTechnique", Name, AnnotationCount, pAnnotations);\r
-}\r
-\r
-ID3DX11EffectPass * STechnique::GetPassByIndex(UINT Index)\r
-{\r
- LPCSTR pFuncName = "ID3DX11EffectTechnique::GetPassByIndex";\r
-\r
- if (Index >= PassCount)\r
- {\r
- DPF(0, "%s: Invalid pass index (%d, total: %d)", pFuncName, Index, PassCount);\r
- return &g_InvalidPass;\r
- }\r
-\r
- return (ID3DX11EffectPass *)(pPasses + Index);\r
-}\r
-\r
-ID3DX11EffectPass * STechnique::GetPassByName(LPCSTR Name)\r
-{\r
- LPCSTR pFuncName = "ID3DX11EffectTechnique::GetPassByName";\r
-\r
- UINT i;\r
-\r
- for (i = 0; i < PassCount; ++ i)\r
- {\r
- if (NULL != pPasses[i].pName &&\r
- strcmp(pPasses[i].pName, Name) == 0)\r
- {\r
- break;\r
- }\r
- }\r
-\r
- if (i == PassCount)\r
- {\r
- DPF(0, "%s: Pass [%s] not found", pFuncName, Name);\r
- return &g_InvalidPass;\r
- }\r
-\r
- return (ID3DX11EffectPass *)(pPasses + i);\r
-}\r
-\r
-HRESULT STechnique::ComputeStateBlockMask(D3DX11_STATE_BLOCK_MASK *pStateBlockMask)\r
-{\r
- HRESULT hr = S_OK;\r
- UINT i;\r
-\r
- for (i = 0; i < PassCount; ++ i)\r
- {\r
- VH( ((SPassBlock*)pPasses)[i].ComputeStateBlockMask(pStateBlockMask) );\r
- }\r
-\r
-lExit:\r
- return hr;\r
-}\r
-\r
-//////////////////////////////////////////////////////////////////////////\r
-// ID3DX11EffectGroup (SGroup implementation)\r
-//////////////////////////////////////////////////////////////////////////\r
-\r
-BOOL SGroup::IsValid()\r
-{ \r
- if( HasDependencies )\r
- {\r
- for( UINT i = 0; i < TechniqueCount; i++ )\r
- {\r
- if( !((STechnique*)pTechniques)[i].IsValid() )\r
- return FALSE;\r
- }\r
- return TRUE;\r
- }\r
- return InitiallyValid;\r
-}\r
-\r
-HRESULT SGroup::GetDesc(D3DX11_GROUP_DESC *pDesc)\r
-{\r
- HRESULT hr = S_OK;\r
-\r
- LPCSTR pFuncName = "ID3DX11EffectGroup::GetDesc";\r
-\r
- VERIFYPARAMETER(pDesc);\r
-\r
- pDesc->Name = pName;\r
- pDesc->Annotations = AnnotationCount;\r
- pDesc->Techniques = TechniqueCount;\r
-\r
-lExit:\r
- return hr;\r
-}\r
-\r
-ID3DX11EffectVariable * SGroup::GetAnnotationByIndex(UINT Index)\r
-{\r
- return GetAnnotationByIndexHelper("ID3DX11EffectGroup", Index, AnnotationCount, pAnnotations);\r
-}\r
-\r
-ID3DX11EffectVariable * SGroup::GetAnnotationByName(LPCSTR Name)\r
-{\r
- return GetAnnotationByNameHelper("ID3DX11EffectGroup", Name, AnnotationCount, pAnnotations);\r
-}\r
-\r
-ID3DX11EffectTechnique * SGroup::GetTechniqueByIndex(UINT Index)\r
-{\r
- LPCSTR pFuncName = "ID3DX11EffectGroup::GetTechniqueByIndex";\r
-\r
- if (Index >= TechniqueCount)\r
- {\r
- DPF(0, "%s: Invalid pass index (%d, total: %d)", pFuncName, Index, TechniqueCount);\r
- return &g_InvalidTechnique;\r
- }\r
-\r
- return (ID3DX11EffectTechnique *)(pTechniques + Index);\r
-}\r
-\r
-ID3DX11EffectTechnique * SGroup::GetTechniqueByName(LPCSTR Name)\r
-{\r
- LPCSTR pFuncName = "ID3DX11EffectGroup::GetTechniqueByName";\r
-\r
- UINT i;\r
-\r
- for (i = 0; i < TechniqueCount; ++ i)\r
- {\r
- if (NULL != pTechniques[i].pName &&\r
- strcmp(pTechniques[i].pName, Name) == 0)\r
- {\r
- break;\r
- }\r
- }\r
-\r
- if (i == TechniqueCount)\r
- {\r
- DPF(0, "%s: Technique [%s] not found", pFuncName, Name);\r
- return &g_InvalidTechnique;\r
- }\r
-\r
- return (ID3DX11EffectTechnique *)(pTechniques + i);\r
-}\r
-\r
-//////////////////////////////////////////////////////////////////////////\r
-// ID3DX11Effect Public Reflection APIs (CEffect)\r
-//////////////////////////////////////////////////////////////////////////\r
-\r
-HRESULT CEffect::GetDevice(ID3D11Device **ppDevice)\r
-{\r
- HRESULT hr = S_OK;\r
- LPCSTR pFuncName = "ID3DX11Effect::GetDevice";\r
- VERIFYPARAMETER(ppDevice);\r
-\r
- m_pDevice->AddRef();\r
- *ppDevice = m_pDevice;\r
-\r
-lExit:\r
- return hr;\r
-}\r
-\r
-HRESULT CEffect::GetDesc(D3DX11_EFFECT_DESC *pDesc)\r
-{\r
- HRESULT hr = S_OK;\r
-\r
- LPCSTR pFuncName = "ID3DX11Effect::GetDesc";\r
-\r
- VERIFYPARAMETER(pDesc);\r
-\r
- pDesc->ConstantBuffers = m_CBCount;\r
- pDesc->GlobalVariables = m_VariableCount;\r
- pDesc->Techniques = m_TechniqueCount;\r
- pDesc->Groups = m_GroupCount;\r
- pDesc->InterfaceVariables = m_InterfaceCount;\r
-\r
-lExit:\r
- return hr; \r
-}\r
-\r
-ID3DX11EffectConstantBuffer * CEffect::GetConstantBufferByIndex(UINT Index)\r
-{\r
- LPCSTR pFuncName = "ID3DX11Effect::GetConstantBufferByIndex";\r
-\r
- if (Index < m_CBCount)\r
- {\r
- return m_pCBs + Index;\r
- }\r
-\r
- DPF(0, "%s: Invalid constant buffer index", pFuncName);\r
- return &g_InvalidConstantBuffer;\r
-}\r
-\r
-ID3DX11EffectConstantBuffer * CEffect::GetConstantBufferByName(LPCSTR Name)\r
-{\r
- HRESULT hr = S_OK;\r
- LPCSTR pFuncName = "ID3DX11Effect::GetConstantBufferByName";\r
-\r
- if (IsOptimized())\r
- {\r
- DPF(0, "%s: Cannot get constant buffer interfaces by name since the effect has been Optimize()'ed", pFuncName);\r
- return &g_InvalidConstantBuffer;\r
- }\r
-\r
- if (NULL == Name)\r
- {\r
- DPF(0, "%s: Parameter Name was NULL.", pFuncName);\r
- return &g_InvalidConstantBuffer;\r
- }\r
-\r
- UINT i;\r
-\r
- for (i = 0; i < m_CBCount; ++ i)\r
- {\r
- if (strcmp(m_pCBs[i].pName, Name) == 0)\r
- {\r
- return m_pCBs + i;\r
- }\r
- }\r
-\r
- DPF(0, "%s: Constant Buffer [%s] not found", pFuncName, Name);\r
- return &g_InvalidConstantBuffer;\r
-}\r
-\r
-ID3DX11EffectVariable * CEffect::GetVariableByIndex(UINT Index)\r
-{\r
- LPCSTR pFuncName = "ID3DX11Effect::GetVariableByIndex";\r
-\r
- if (Index < m_VariableCount)\r
- {\r
- return m_pVariables + Index;\r
- }\r
-\r
- DPF(0, "%s: Invalid variable index", pFuncName);\r
- return &g_InvalidScalarVariable;\r
-}\r
-\r
-ID3DX11EffectVariable * CEffect::GetVariableByName(LPCSTR Name)\r
-{\r
- HRESULT hr = S_OK;\r
- LPCSTR pFuncName = "ID3DX11Effect::GetVariableByName";\r
-\r
- if (IsOptimized())\r
- {\r
- DPF(0, "%s: Cannot get variable interfaces by name since the effect has been Optimize()'ed", pFuncName);\r
- return &g_InvalidScalarVariable;\r
- }\r
-\r
- if (NULL == Name)\r
- {\r
- DPF(0, "%s: Parameter Name was NULL.", pFuncName);\r
- return &g_InvalidScalarVariable;\r
- }\r
-\r
- UINT i;\r
-\r
- for (i = 0; i < m_VariableCount; ++ i)\r
- {\r
- if (strcmp(m_pVariables[i].pName, Name) == 0)\r
- {\r
- return m_pVariables + i;\r
- }\r
- }\r
-\r
- DPF(0, "%s: Variable [%s] not found", pFuncName, Name);\r
- return &g_InvalidScalarVariable;\r
-}\r
-\r
-ID3DX11EffectVariable * CEffect::GetVariableBySemantic(LPCSTR Semantic)\r
-{ \r
- LPCSTR pFuncName = "ID3DX11Effect::GetVariableBySemantic";\r
-\r
- if (IsOptimized())\r
- {\r
- DPF(0, "%s: Cannot get variable interfaces by semantic since the effect has been Optimize()'ed", pFuncName);\r
- return &g_InvalidScalarVariable;\r
- }\r
-\r
- if (NULL == Semantic)\r
- {\r
- DPF(0, "%s: Parameter Semantic was NULL.", pFuncName);\r
- return &g_InvalidScalarVariable;\r
- }\r
-\r
- UINT i;\r
-\r
- for (i = 0; i < m_VariableCount; ++ i)\r
- {\r
- if (NULL != m_pVariables[i].pSemantic && \r
- _stricmp(m_pVariables[i].pSemantic, Semantic) == 0)\r
- {\r
- return (ID3DX11EffectVariable *)(m_pVariables + i);\r
- }\r
- }\r
-\r
- DPF(0, "%s: Variable with semantic [%s] not found", pFuncName, Semantic);\r
- return &g_InvalidScalarVariable;\r
-}\r
-\r
-ID3DX11EffectTechnique * CEffect::GetTechniqueByIndex(UINT Index)\r
-{\r
- LPCSTR pFuncName = "ID3DX11Effect::GetTechniqueByIndex";\r
-\r
- if( Index < m_TechniqueCount )\r
- {\r
- UINT i;\r
- for( i=0; i < m_GroupCount; i++ )\r
- {\r
- if( Index < m_pGroups[i].TechniqueCount )\r
- {\r
- return (ID3DX11EffectTechnique *)(m_pGroups[i].pTechniques + Index);\r
- }\r
- Index -= m_pGroups[i].TechniqueCount;\r
- }\r
- D3DXASSERT( FALSE );\r
- }\r
- DPF(0, "%s: Invalid technique index (%d)", pFuncName, Index);\r
- return &g_InvalidTechnique;\r
-}\r
-\r
-ID3DX11EffectTechnique * CEffect::GetTechniqueByName(LPCSTR Name)\r
-{\r
- HRESULT hr = S_OK;\r
- LPCSTR pFuncName = "ID3DX11Effect::GetTechniqueByName";\r
- const UINT MAX_GROUP_TECHNIQUE_SIZE = 256;\r
- char NameCopy[MAX_GROUP_TECHNIQUE_SIZE];\r
-\r
- if (IsOptimized())\r
- {\r
- DPF(0, "ID3DX11Effect::GetTechniqueByName: Cannot get technique interfaces by name since the effect has been Optimize()'ed");\r
- return &g_InvalidTechnique;\r
- }\r
-\r
- if (NULL == Name)\r
- {\r
- DPF(0, "%s: Parameter Name was NULL.", pFuncName);\r
- return &g_InvalidTechnique;\r
- }\r
-\r
- if( FAILED( StringCchCopyA( NameCopy, MAX_GROUP_TECHNIQUE_SIZE, Name ) ) )\r
- {\r
- DPF( 0, "Group|Technique name has a length greater than %d.", MAX_GROUP_TECHNIQUE_SIZE );\r
- return &g_InvalidTechnique;\r
- }\r
-\r
- char* pDelimiter = strchr( NameCopy, '|' );\r
- if( pDelimiter == NULL )\r
- {\r
- if ( m_pNullGroup == NULL )\r
- {\r
- DPF( 0, "The effect contains no default group." );\r
- return &g_InvalidTechnique;\r
- }\r
-\r
- return m_pNullGroup->GetTechniqueByName( Name );\r
- }\r
-\r
- // separate group name and technique name\r
- *pDelimiter = 0; \r
-\r
- return GetGroupByName( NameCopy )->GetTechniqueByName( pDelimiter + 1 );\r
-}\r
-\r
-ID3D11ClassLinkage * CEffect::GetClassLinkage()\r
-{\r
- SAFE_ADDREF( m_pClassLinkage );\r
- return m_pClassLinkage;\r
-}\r
-\r
-ID3DX11EffectGroup * CEffect::GetGroupByIndex(UINT Index)\r
-{\r
- LPCSTR pFuncName = "ID3DX11Effect::GetGroupByIndex";\r
-\r
- if( Index < m_GroupCount )\r
- {\r
- return (ID3DX11EffectGroup *)(m_pGroups + Index);\r
- }\r
- DPF(0, "%s: Invalid group index (%d)", pFuncName, Index);\r
- return &g_InvalidGroup;\r
-}\r
-\r
-ID3DX11EffectGroup * CEffect::GetGroupByName(LPCSTR Name)\r
-{\r
- HRESULT hr = S_OK;\r
- LPCSTR pFuncName = "ID3DX11Effect::GetGroupByName";\r
-\r
- if (IsOptimized())\r
- {\r
- DPF(0, "ID3DX11Effect::GetGroupByName: Cannot get group interfaces by name since the effect has been Optimize()'ed");\r
- return &g_InvalidGroup;\r
- }\r
-\r
- if (NULL == Name || Name[0] == 0 )\r
- {\r
- return m_pNullGroup ? (ID3DX11EffectGroup *)m_pNullGroup : &g_InvalidGroup;\r
- }\r
-\r
- UINT i;\r
-\r
- for (i = 0; i < m_GroupCount; ++ i)\r
- {\r
- if (NULL != m_pGroups[i].pName && \r
- strcmp(m_pGroups[i].pName, Name) == 0)\r
- {\r
- break;\r
- }\r
- }\r
-\r
- if (i == m_GroupCount)\r
- {\r
- DPF(0, "%s: Group [%s] not found", pFuncName, Name);\r
- return &g_InvalidGroup;\r
- }\r
-\r
- return (ID3DX11EffectGroup *)(m_pGroups + i);\r
-}\r
-\r
-}\r