OSDN Git Service

Merge branch 'feature/#36529_SlimDXからSharpDXへの移行' into develop
[dtxmania/dtxmania.git] / SlimDXc_Jun2010(VC++2008) / external / Effects11 / EffectNonRuntime.cpp
diff --git a/SlimDXc_Jun2010(VC++2008)/external/Effects11/EffectNonRuntime.cpp b/SlimDXc_Jun2010(VC++2008)/external/Effects11/EffectNonRuntime.cpp
deleted file mode 100644 (file)
index 2e84794..0000000
+++ /dev/null
@@ -1,2963 +0,0 @@
-//////////////////////////////////////////////////////////////////////////////\r
-//\r
-//  Copyright (C) Microsoft Corporation.  All Rights Reserved.\r
-//\r
-//  File:       EffectNonRuntime.cpp\r
-//  Content:    D3DX11 Effect low-frequency utility functions\r
-//              These functions are not intended to be called regularly.  They\r
-//              are typically called when creating, cloning, or optimizing an \r
-//              Effect, or reflecting a variable.\r
-//\r
-//////////////////////////////////////////////////////////////////////////////\r
-\r
-#include "pchfx.h"\r
-#include "SOParser.h"\r
-\r
-namespace D3DX11Effects\r
-{\r
-\r
-extern SUnorderedAccessView g_NullUnorderedAccessView;\r
-\r
-SBaseBlock::SBaseBlock()\r
-: BlockType(EBT_Invalid)\r
-, IsUserManaged(FALSE)\r
-, AssignmentCount(0)\r
-, pAssignments(NULL)\r
-{\r
-\r
-}\r
-\r
-SPassBlock::SPassBlock()\r
-{\r
-    pName = NULL;\r
-    AnnotationCount = 0;\r
-    pAnnotations = NULL;\r
-    InitiallyValid = TRUE;\r
-    HasDependencies = FALSE;\r
-    ZeroMemory(&BackingStore, sizeof(BackingStore));\r
-}\r
-\r
-STechnique::STechnique()\r
-: pName(NULL)\r
-, PassCount(0)\r
-, pPasses(NULL)\r
-, AnnotationCount(0)\r
-, pAnnotations(NULL)\r
-, InitiallyValid( TRUE )\r
-, HasDependencies( FALSE )\r
-{\r
-}\r
-\r
-SGroup::SGroup()\r
-: pName(NULL)\r
-, TechniqueCount(0)\r
-, pTechniques(NULL)\r
-, AnnotationCount(0)\r
-, pAnnotations(NULL)\r
-, InitiallyValid( TRUE )\r
-, HasDependencies( FALSE )\r
-{\r
-}\r
-\r
-SDepthStencilBlock::SDepthStencilBlock()\r
-{\r
-    pDSObject = NULL;\r
-    ZeroMemory(&BackingStore, sizeof(BackingStore));\r
-    IsValid = TRUE;\r
-\r
-    BackingStore.BackFace.StencilFailOp = D3D11_STENCIL_OP_KEEP;\r
-    BackingStore.BackFace.StencilFunc = D3D11_COMPARISON_ALWAYS;\r
-    BackingStore.BackFace.StencilPassOp = D3D11_STENCIL_OP_KEEP;\r
-    BackingStore.BackFace.StencilDepthFailOp = D3D11_STENCIL_OP_KEEP;\r
-    BackingStore.DepthEnable = TRUE;\r
-    BackingStore.DepthFunc = D3D11_COMPARISON_LESS;\r
-    BackingStore.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL;\r
-    BackingStore.FrontFace.StencilFailOp = D3D11_STENCIL_OP_KEEP;\r
-    BackingStore.FrontFace.StencilFunc = D3D11_COMPARISON_ALWAYS;\r
-    BackingStore.FrontFace.StencilPassOp = D3D11_STENCIL_OP_KEEP;\r
-    BackingStore.FrontFace.StencilDepthFailOp = D3D11_STENCIL_OP_KEEP;\r
-    BackingStore.StencilEnable = FALSE;\r
-    BackingStore.StencilReadMask = D3D11_DEFAULT_STENCIL_READ_MASK;\r
-    BackingStore.StencilWriteMask = D3D11_DEFAULT_STENCIL_WRITE_MASK;\r
-}\r
-\r
-SBlendBlock::SBlendBlock()\r
-{\r
-    pBlendObject = NULL;\r
-    ZeroMemory(&BackingStore, sizeof(BackingStore));\r
-    IsValid = TRUE;\r
-\r
-    BackingStore.AlphaToCoverageEnable = FALSE;\r
-    BackingStore.IndependentBlendEnable = TRUE;\r
-    for( UINT i=0; i < D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT; i++ )\r
-    {\r
-        BackingStore.RenderTarget[i].SrcBlend = D3D11_BLEND_ONE;\r
-        BackingStore.RenderTarget[i].DestBlend = D3D11_BLEND_ZERO;\r
-        BackingStore.RenderTarget[i].BlendOp = D3D11_BLEND_OP_ADD;\r
-        BackingStore.RenderTarget[i].SrcBlendAlpha = D3D11_BLEND_ONE;\r
-        BackingStore.RenderTarget[i].DestBlendAlpha = D3D11_BLEND_ZERO;\r
-        BackingStore.RenderTarget[i].BlendOpAlpha = D3D11_BLEND_OP_ADD;\r
-        memset(&BackingStore.RenderTarget[i].RenderTargetWriteMask, 0x0F, sizeof(BackingStore.RenderTarget[i].RenderTargetWriteMask));\r
-    }\r
-}\r
-\r
-SRasterizerBlock::SRasterizerBlock()\r
-{\r
-    pRasterizerObject = NULL;\r
-    ZeroMemory(&BackingStore, sizeof(BackingStore));\r
-    IsValid = TRUE;\r
-\r
-    BackingStore.AntialiasedLineEnable = FALSE;\r
-    BackingStore.CullMode = D3D11_CULL_BACK;\r
-    BackingStore.DepthBias = D3D11_DEFAULT_DEPTH_BIAS;\r
-    BackingStore.DepthBiasClamp = D3D11_DEFAULT_DEPTH_BIAS_CLAMP;\r
-    BackingStore.FillMode = D3D11_FILL_SOLID;\r
-    BackingStore.FrontCounterClockwise = FALSE;\r
-    BackingStore.MultisampleEnable = FALSE;\r
-    BackingStore.ScissorEnable = FALSE;\r
-    BackingStore.SlopeScaledDepthBias = D3D11_DEFAULT_SLOPE_SCALED_DEPTH_BIAS;\r
-    BackingStore.DepthClipEnable = TRUE;\r
-}\r
-\r
-SSamplerBlock::SSamplerBlock()\r
-{\r
-    pD3DObject = NULL;\r
-    ZeroMemory(&BackingStore, sizeof(BackingStore));\r
-\r
-    BackingStore.SamplerDesc.AddressU = D3D11_TEXTURE_ADDRESS_CLAMP;\r
-    BackingStore.SamplerDesc.AddressV = D3D11_TEXTURE_ADDRESS_CLAMP;\r
-    BackingStore.SamplerDesc.AddressW = D3D11_TEXTURE_ADDRESS_CLAMP;\r
-    BackingStore.SamplerDesc.BorderColor[3] = D3D11_DEFAULT_BORDER_COLOR_COMPONENT;\r
-    BackingStore.SamplerDesc.BorderColor[2] = D3D11_DEFAULT_BORDER_COLOR_COMPONENT;\r
-    BackingStore.SamplerDesc.BorderColor[1] = D3D11_DEFAULT_BORDER_COLOR_COMPONENT;\r
-    BackingStore.SamplerDesc.BorderColor[0] = D3D11_DEFAULT_BORDER_COLOR_COMPONENT;\r
-    BackingStore.SamplerDesc.ComparisonFunc = D3D11_COMPARISON_NEVER;\r
-    BackingStore.SamplerDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR;\r
-    BackingStore.SamplerDesc.MaxAnisotropy = (UINT32) D3D11_DEFAULT_MAX_ANISOTROPY;\r
-    BackingStore.SamplerDesc.MipLODBias = D3D11_DEFAULT_MIP_LOD_BIAS;\r
-    BackingStore.SamplerDesc.MinLOD = -FLT_MAX;\r
-    BackingStore.SamplerDesc.MaxLOD = FLT_MAX;\r
-}\r
-\r
-SShaderBlock::SShaderBlock(SD3DShaderVTable *pVirtualTable)\r
-{\r
-    IsValid = TRUE;\r
-\r
-    pVT = pVirtualTable;\r
-\r
-    pReflectionData = NULL;\r
-    \r
-    pD3DObject = NULL;\r
-\r
-    CBDepCount = 0;\r
-    pCBDeps = NULL;\r
-\r
-    SampDepCount = 0;\r
-    pSampDeps = NULL;\r
-\r
-    InterfaceDepCount = 0;\r
-    pInterfaceDeps = NULL;\r
-\r
-    ResourceDepCount = 0;\r
-    pResourceDeps = NULL;\r
-\r
-    UAVDepCount = 0;\r
-    pUAVDeps = NULL;\r
-\r
-    TBufferDepCount = 0;\r
-    ppTbufDeps = NULL;\r
-\r
-    pInputSignatureBlob = NULL;\r
-}\r
-\r
-HRESULT SShaderBlock::OnDeviceBind()\r
-{\r
-    HRESULT hr = S_OK;\r
-    UINT  i, j;\r
-\r
-    // Update all CB deps\r
-    for (i=0; i<CBDepCount; i++)\r
-    {\r
-        D3DXASSERT(pCBDeps[i].Count);\r
-\r
-        for (j=0; j<pCBDeps[i].Count; j++)\r
-        {\r
-            pCBDeps[i].ppD3DObjects[j] = pCBDeps[i].ppFXPointers[j]->pD3DObject;\r
-\r
-            if ( !pCBDeps[i].ppD3DObjects[j] )\r
-                VH( E_FAIL );\r
-        }\r
-    }\r
-\r
-    // Update all sampler deps\r
-    for (i=0; i<SampDepCount; i++)\r
-    {\r
-        D3DXASSERT(pSampDeps[i].Count);\r
-\r
-        for (j=0; j<pSampDeps[i].Count; j++)\r
-        {\r
-            pSampDeps[i].ppD3DObjects[j] = pSampDeps[i].ppFXPointers[j]->pD3DObject;\r
-\r
-            if ( !pSampDeps[i].ppD3DObjects[j] )\r
-                VH( E_FAIL );\r
-        }\r
-    }\r
-\r
-    // Texture deps will be set automatically on use since they are initially marked dirty.\r
-\r
-lExit:\r
-    return hr;\r
-}\r
-\r
-extern SD3DShaderVTable g_vtVS;\r
-extern SD3DShaderVTable g_vtGS;\r
-extern SD3DShaderVTable g_vtPS;\r
-extern SD3DShaderVTable g_vtHS;\r
-extern SD3DShaderVTable g_vtDS;\r
-extern SD3DShaderVTable g_vtCS;\r
-\r
-EObjectType SShaderBlock::GetShaderType()\r
-{\r
-    if (&g_vtVS == pVT)\r
-        return EOT_VertexShader;\r
-    else if (&g_vtGS == pVT)\r
-        return EOT_GeometryShader;\r
-    else if (&g_vtPS == pVT)\r
-        return EOT_PixelShader;\r
-    else if (&g_vtHS == pVT)\r
-        return EOT_HullShader5;\r
-    else if (&g_vtDS == pVT)\r
-        return EOT_DomainShader5;\r
-    else if (&g_vtCS == pVT)\r
-        return EOT_ComputeShader5;\r
-    \r
-    return EOT_Invalid;\r
-}\r
-\r
-#define _SET_BIT(bytes, x) (bytes[x / 8] |= (1 << (x % 8)))\r
-\r
-HRESULT SShaderBlock::ComputeStateBlockMask(D3DX11_STATE_BLOCK_MASK *pStateBlockMask)\r
-{\r
-    HRESULT hr = S_OK;\r
-    UINT i, j;\r
-    BYTE *pSamplerMask = NULL, *pShaderResourceMask = NULL, *pConstantBufferMask = NULL, *pUnorderedAccessViewMask = NULL, *pInterfaceMask = NULL;\r
-\r
-    switch (GetShaderType())\r
-    {\r
-    case EOT_VertexShader:\r
-    case EOT_VertexShader5:\r
-        pStateBlockMask->VS = 1;\r
-        pSamplerMask = pStateBlockMask->VSSamplers;\r
-        pShaderResourceMask = pStateBlockMask->VSShaderResources;\r
-        pConstantBufferMask = pStateBlockMask->VSConstantBuffers;\r
-        pInterfaceMask = pStateBlockMask->VSInterfaces;\r
-        pUnorderedAccessViewMask = NULL;\r
-        break;\r
-\r
-    case EOT_GeometryShader:\r
-    case EOT_GeometryShader5:\r
-        pStateBlockMask->GS = 1;\r
-        pSamplerMask = pStateBlockMask->GSSamplers;\r
-        pShaderResourceMask = pStateBlockMask->GSShaderResources;\r
-        pConstantBufferMask = pStateBlockMask->GSConstantBuffers;\r
-        pInterfaceMask = pStateBlockMask->GSInterfaces;\r
-        pUnorderedAccessViewMask = NULL;\r
-        break;\r
-\r
-    case EOT_PixelShader:\r
-    case EOT_PixelShader5:\r
-        pStateBlockMask->PS = 1;\r
-        pSamplerMask = pStateBlockMask->PSSamplers;\r
-        pShaderResourceMask = pStateBlockMask->PSShaderResources;\r
-        pConstantBufferMask = pStateBlockMask->PSConstantBuffers;\r
-        pInterfaceMask = pStateBlockMask->PSInterfaces;\r
-        pUnorderedAccessViewMask = &pStateBlockMask->PSUnorderedAccessViews;\r
-        break;\r
-\r
-    case EOT_HullShader5:\r
-        pStateBlockMask->HS = 1;\r
-        pSamplerMask = pStateBlockMask->HSSamplers;\r
-        pShaderResourceMask = pStateBlockMask->HSShaderResources;\r
-        pConstantBufferMask = pStateBlockMask->HSConstantBuffers;\r
-        pInterfaceMask = pStateBlockMask->HSInterfaces;\r
-        pUnorderedAccessViewMask = NULL;\r
-        break;\r
-\r
-    case EOT_DomainShader5:\r
-        pStateBlockMask->DS = 1;\r
-        pSamplerMask = pStateBlockMask->DSSamplers;\r
-        pShaderResourceMask = pStateBlockMask->DSShaderResources;\r
-        pConstantBufferMask = pStateBlockMask->DSConstantBuffers;\r
-        pInterfaceMask = pStateBlockMask->DSInterfaces;\r
-        pUnorderedAccessViewMask = NULL;\r
-        break;\r
-\r
-    case EOT_ComputeShader5:\r
-        pStateBlockMask->CS = 1;\r
-        pSamplerMask = pStateBlockMask->CSSamplers;\r
-        pShaderResourceMask = pStateBlockMask->CSShaderResources;\r
-        pConstantBufferMask = pStateBlockMask->CSConstantBuffers;\r
-        pInterfaceMask = pStateBlockMask->CSInterfaces;\r
-        pUnorderedAccessViewMask = &pStateBlockMask->CSUnorderedAccessViews;\r
-        break;\r
-\r
-    default:\r
-        D3DXASSERT(0);\r
-        VH(E_FAIL);\r
-    }\r
-\r
-    for (i = 0; i < SampDepCount; ++ i)\r
-    {\r
-        for (j = 0; j < pSampDeps[i].Count; ++ j)\r
-        {\r
-            _SET_BIT(pSamplerMask, (pSampDeps[i].StartIndex + j));\r
-        }\r
-    }\r
-\r
-    for (i = 0; i < InterfaceDepCount; ++ i)\r
-    {\r
-        for (j = 0; j < pInterfaceDeps[i].Count; ++ j)\r
-        {\r
-            _SET_BIT(pInterfaceMask, (pInterfaceDeps[i].StartIndex + j));\r
-        }\r
-    }\r
-\r
-    for (i = 0; i < ResourceDepCount; ++ i)\r
-    {\r
-        for (j = 0; j < pResourceDeps[i].Count; ++ j)\r
-        {\r
-            _SET_BIT(pShaderResourceMask, (pResourceDeps[i].StartIndex + j));\r
-        }\r
-    }\r
-\r
-    for (i = 0; i < CBDepCount; ++ i)\r
-    {\r
-        for (j = 0; j < pCBDeps[i].Count; ++ j)\r
-        {\r
-            _SET_BIT(pConstantBufferMask, (pCBDeps[i].StartIndex + j));\r
-        }\r
-    }\r
-\r
-    for (i = 0; i < UAVDepCount; ++ i)\r
-    {\r
-        D3DXASSERT( pUnorderedAccessViewMask != NULL );\r
-        for (j = 0; j < pUAVDeps[i].Count; ++ j)\r
-        {\r
-            if( pUAVDeps[i].ppFXPointers[j] != &g_NullUnorderedAccessView )\r
-                _SET_BIT(pUnorderedAccessViewMask, (pUAVDeps[i].StartIndex + j));\r
-        }\r
-    }\r
-\r
-lExit:\r
-    return hr;\r
-}\r
-\r
-#undef _SET_BIT\r
-\r
-HRESULT SShaderBlock::GetShaderDesc(D3DX11_EFFECT_SHADER_DESC *pDesc, BOOL IsInline)\r
-{\r
-    HRESULT hr = S_OK;\r
-    \r
-    ZeroMemory(pDesc, sizeof(*pDesc));\r
-\r
-    pDesc->pInputSignature = pInputSignatureBlob ? (const BYTE*)pInputSignatureBlob->GetBufferPointer() : NULL;\r
-    pDesc->IsInline = IsInline;\r
-\r
-    if (NULL != pReflectionData)\r
-    {\r
-        // initialize these only if present; otherwise leave them NULL or 0\r
-        pDesc->pBytecode = pReflectionData->pBytecode;\r
-        pDesc->BytecodeLength = pReflectionData->BytecodeLength;\r
-        for( UINT iDecl=0; iDecl < D3D11_SO_STREAM_COUNT; ++iDecl )\r
-        {\r
-            pDesc->SODecls[iDecl] = pReflectionData->pStreamOutDecls[iDecl];\r
-        }\r
-        pDesc->RasterizedStream = pReflectionData->RasterizedStream;\r
-\r
-        // get # of input & output signature entries\r
-        D3DXASSERT( pReflectionData->pReflection != NULL );\r
-\r
-        D3D11_SHADER_DESC ShaderDesc;\r
-        pReflectionData->pReflection->GetDesc( &ShaderDesc );\r
-        pDesc->NumInputSignatureEntries = ShaderDesc.InputParameters;\r
-        pDesc->NumOutputSignatureEntries = ShaderDesc.OutputParameters;\r
-        pDesc->NumPatchConstantSignatureEntries = ShaderDesc.PatchConstantParameters;\r
-    }\r
-lExit:\r
-    return hr;\r
-}\r
-\r
-HRESULT SShaderBlock::GetVertexShader(ID3D11VertexShader **ppVS)\r
-{\r
-    if (EOT_VertexShader == GetShaderType() ||\r
-        EOT_VertexShader5 == GetShaderType())\r
-    {\r
-        *ppVS = (ID3D11VertexShader *) pD3DObject;\r
-        SAFE_ADDREF(*ppVS);\r
-        return S_OK;\r
-    }\r
-    else\r
-    {\r
-        *ppVS = NULL;\r
-        DPF(0, "ID3DX11EffectShaderVariable::GetVertexShader: This shader variable is not a vertex shader");\r
-        return D3DERR_INVALIDCALL;\r
-    }\r
-}\r
-\r
-HRESULT SShaderBlock::GetGeometryShader(ID3D11GeometryShader **ppGS)\r
-{\r
-    if (EOT_GeometryShader == GetShaderType() ||\r
-        EOT_GeometryShaderSO == GetShaderType() ||\r
-        EOT_GeometryShader5 == GetShaderType())\r
-    {\r
-        *ppGS = (ID3D11GeometryShader *) pD3DObject;\r
-        SAFE_ADDREF(*ppGS);\r
-        return S_OK;\r
-    }\r
-    else\r
-    {\r
-        *ppGS = NULL;\r
-        DPF(0, "ID3DX11EffectShaderVariable::GetGeometryShader: This shader variable is not a geometry shader");\r
-        return D3DERR_INVALIDCALL;\r
-    }\r
-}\r
-\r
-HRESULT SShaderBlock::GetPixelShader(ID3D11PixelShader **ppPS)\r
-{\r
-    if (EOT_PixelShader == GetShaderType() ||\r
-        EOT_PixelShader5 == GetShaderType())\r
-    {\r
-        *ppPS = (ID3D11PixelShader *) pD3DObject;\r
-        SAFE_ADDREF(*ppPS);\r
-        return S_OK;\r
-    }\r
-    else\r
-    {\r
-        *ppPS = NULL;\r
-        DPF(0, "ID3DX11EffectShaderVariable::GetPixelShader: This shader variable is not a pixel shader");\r
-        return D3DERR_INVALIDCALL;\r
-    }\r
-}\r
-\r
-HRESULT SShaderBlock::GetHullShader(ID3D11HullShader **ppHS)\r
-{\r
-    if (EOT_HullShader5 == GetShaderType())\r
-    {\r
-        *ppHS = (ID3D11HullShader *) pD3DObject;\r
-        SAFE_ADDREF(*ppHS);\r
-        return S_OK;\r
-    }\r
-    else\r
-    {\r
-        *ppHS = NULL;\r
-        DPF(0, "ID3DX11EffectShaderVariable::GetHullShader: This shader variable is not a hull shader");\r
-        return D3DERR_INVALIDCALL;\r
-    }\r
-}\r
-\r
-HRESULT SShaderBlock::GetDomainShader(ID3D11DomainShader **ppDS)\r
-{\r
-    if (EOT_DomainShader5 == GetShaderType())\r
-    {\r
-        *ppDS = (ID3D11DomainShader *) pD3DObject;\r
-        SAFE_ADDREF(*ppDS);\r
-        return S_OK;\r
-    }\r
-    else\r
-    {\r
-        *ppDS = NULL;\r
-        DPF(0, "ID3DX11EffectShaderVariable::GetDomainShader: This shader variable is not a domain shader");\r
-        return D3DERR_INVALIDCALL;\r
-    }\r
-}\r
-\r
-HRESULT SShaderBlock::GetComputeShader(ID3D11ComputeShader **ppCS)\r
-{\r
-    if (EOT_ComputeShader5 == GetShaderType())\r
-    {\r
-        *ppCS = (ID3D11ComputeShader *) pD3DObject;\r
-        SAFE_ADDREF(*ppCS);\r
-        return S_OK;\r
-    }\r
-    else\r
-    {\r
-        *ppCS = NULL;\r
-        DPF(0, "ID3DX11EffectShaderVariable::GetComputeShader: This shader variable is not a compute shader");\r
-        return D3DERR_INVALIDCALL;\r
-    }\r
-}\r
-\r
-HRESULT SShaderBlock::GetSignatureElementDesc(ESigType SigType, UINT Element, D3D11_SIGNATURE_PARAMETER_DESC *pDesc)\r
-{\r
-    HRESULT hr = S_OK;\r
-    LPCSTR pFuncName;\r
-    switch( SigType )\r
-    {\r
-    case ST_Input:\r
-#pragma prefast(suppress:__WARNING_UNUSED_POINTER_ASSIGNMENT, "pFuncName used in DPF")\r
-        pFuncName = "ID3DX11EffectShaderVariable::GetInputSignatureElementDesc";\r
-        break;\r
-    case ST_Output:\r
-#pragma prefast(suppress:__WARNING_UNUSED_POINTER_ASSIGNMENT, "pFuncName used in DPF")\r
-        pFuncName = "ID3DX11EffectShaderVariable::GetOutputSignatureElementDesc";\r
-        break;\r
-    case ST_PatchConstant:\r
-#pragma prefast(suppress:__WARNING_UNUSED_POINTER_ASSIGNMENT, "pFuncName used in DPF")\r
-        pFuncName = "ID3DX11EffectShaderVariable::GetPatchConstantSignatureElementDesc";\r
-        break;\r
-    default:\r
-        D3DXASSERT( false );\r
-        return E_FAIL;\r
-    };\r
-\r
-    if (NULL != pReflectionData)\r
-    {\r
-        // get # of signature entries\r
-        D3DXASSERT( pReflectionData->pReflection != NULL );\r
-\r
-        D3D11_SHADER_DESC ShaderDesc;\r
-        VH( pReflectionData->pReflection->GetDesc( &ShaderDesc ) );\r
-\r
-        D3D11_SIGNATURE_PARAMETER_DESC ParamDesc;\r
-        if( pReflectionData->IsNullGS )\r
-        {\r
-            switch( SigType )\r
-            {\r
-            case ST_Input:\r
-                // The input signature for a null-GS is the output signature of the previous VS\r
-                SigType = ST_Output;\r
-                break;\r
-            case ST_PatchConstant:\r
-                // GeometryShaders cannot have patch constant signatures\r
-                return E_INVALIDARG;\r
-            };\r
-        }\r
-\r
-        switch( SigType )\r
-        {\r
-        case ST_Input:\r
-            if( Element >= ShaderDesc.InputParameters )\r
-            {\r
-                DPF( 0, "%s: Invalid Element index (%d) specified", pFuncName, Element );\r
-                VH( E_INVALIDARG );\r
-            }\r
-            VH( pReflectionData->pReflection->GetInputParameterDesc( Element, &ParamDesc ) );\r
-            break;\r
-        case ST_Output:\r
-            if( Element >= ShaderDesc.OutputParameters )\r
-            {\r
-                DPF( 0, "%s: Invalid Element index (%d) specified", pFuncName, Element );\r
-                VH( E_INVALIDARG );\r
-            }\r
-            VH( pReflectionData->pReflection->GetOutputParameterDesc( Element, &ParamDesc ) );\r
-            break;\r
-        case ST_PatchConstant:\r
-            if( Element >= ShaderDesc.PatchConstantParameters )\r
-            {\r
-                DPF( 0, "%s: Invalid Element index (%d) specified", pFuncName, Element );\r
-                VH( E_INVALIDARG );\r
-            }\r
-            VH( pReflectionData->pReflection->GetPatchConstantParameterDesc( Element, &ParamDesc ) );\r
-            break;\r
-        };\r
-\r
-        pDesc->SemanticName = ParamDesc.SemanticName;\r
-        pDesc->SystemValueType = ParamDesc.SystemValueType;\r
-\r
-        // Pixel shaders need to be special-cased as they don't technically output SVs\r
-        if( pDesc->SystemValueType == D3D10_NAME_UNDEFINED && GetShaderType() == EOT_PixelShader )\r
-        {\r
-            if( _stricmp(pDesc->SemanticName, "SV_TARGET") == 0 )\r
-            {\r
-                pDesc->SystemValueType = D3D10_NAME_TARGET;\r
-            } \r
-            else if( _stricmp(pDesc->SemanticName, "SV_DEPTH") == 0 )\r
-            {\r
-                pDesc->SystemValueType = D3D10_NAME_DEPTH;\r
-            } \r
-            else if( _stricmp(pDesc->SemanticName, "SV_COVERAGE") == 0 )\r
-            {\r
-                pDesc->SystemValueType = D3D10_NAME_COVERAGE;\r
-            }\r
-        }\r
-\r
-        pDesc->SemanticIndex = ParamDesc.SemanticIndex;\r
-        pDesc->Register = ParamDesc.Register;\r
-        pDesc->Mask = ParamDesc.Mask;\r
-        pDesc->ComponentType = ParamDesc.ComponentType;\r
-        pDesc->ReadWriteMask = ParamDesc.ReadWriteMask;\r
-    }\r
-    else\r
-    {\r
-        DPF(0, "%s: Cannot get signatures; shader bytecode is not present", pFuncName);\r
-        VH( D3DERR_INVALIDCALL );\r
-    }\r
-    \r
-lExit:\r
-    return hr;\r
-}\r
-\r
-SString::SString()\r
-{\r
-    pString = NULL;\r
-}\r
-\r
-SRenderTargetView::SRenderTargetView()\r
-{\r
-    pRenderTargetView = NULL;\r
-}\r
-\r
-SDepthStencilView::SDepthStencilView()\r
-{\r
-    pDepthStencilView = NULL;\r
-}\r
-\r
-void * GetBlockByIndex(EVarType VarType, EObjectType ObjectType, void *pBaseBlock, UINT  Index)\r
-{\r
-    switch( VarType )\r
-    {\r
-    case EVT_Interface:\r
-        return (SInterface *)pBaseBlock + Index;\r
-    case EVT_Object:\r
-        switch (ObjectType)\r
-        {\r
-        case EOT_Blend:\r
-            return (SBlendBlock *)pBaseBlock + Index;\r
-        case EOT_DepthStencil:\r
-            return (SDepthStencilBlock *)pBaseBlock + Index;\r
-        case EOT_Rasterizer:\r
-            return (SRasterizerBlock *)pBaseBlock + Index;\r
-        case EOT_PixelShader:\r
-        case EOT_PixelShader5:\r
-        case EOT_GeometryShader:\r
-        case EOT_GeometryShaderSO:\r
-        case EOT_GeometryShader5:\r
-        case EOT_VertexShader:\r
-        case EOT_VertexShader5:\r
-        case EOT_HullShader5:\r
-        case EOT_DomainShader5:\r
-        case EOT_ComputeShader5:\r
-            return (SShaderBlock *)pBaseBlock + Index;\r
-        case EOT_String:\r
-            return (SString *)pBaseBlock + Index;\r
-        case EOT_Sampler:\r
-            return (SSamplerBlock *)pBaseBlock + Index;\r
-        case EOT_Buffer:\r
-        case EOT_Texture:\r
-        case EOT_Texture1D:\r
-        case EOT_Texture1DArray:\r
-        case EOT_Texture2D:\r
-        case EOT_Texture2DArray:\r
-        case EOT_Texture2DMS:\r
-        case EOT_Texture2DMSArray:\r
-        case EOT_Texture3D:\r
-        case EOT_TextureCube:\r
-        case EOT_TextureCubeArray:\r
-        case EOT_ByteAddressBuffer:\r
-        case EOT_StructuredBuffer:\r
-            return (SShaderResource *)pBaseBlock + Index;\r
-        case EOT_DepthStencilView:\r
-            return (SDepthStencilView *)pBaseBlock + Index;\r
-        case EOT_RenderTargetView:\r
-            return (SRenderTargetView *)pBaseBlock + Index;\r
-        case EOT_RWTexture1D:\r
-        case EOT_RWTexture1DArray:\r
-        case EOT_RWTexture2D:\r
-        case EOT_RWTexture2DArray:\r
-        case EOT_RWTexture3D:\r
-        case EOT_RWBuffer:\r
-        case EOT_RWByteAddressBuffer:\r
-        case EOT_RWStructuredBuffer:\r
-        case EOT_RWStructuredBufferAlloc:\r
-        case EOT_RWStructuredBufferConsume:\r
-        case EOT_AppendStructuredBuffer:\r
-        case EOT_ConsumeStructuredBuffer:    \r
-            return (SUnorderedAccessView *)pBaseBlock + Index;\r
-        default:\r
-            D3DXASSERT(0);\r
-            return NULL;\r
-        }\r
-    default:\r
-        D3DXASSERT(0);\r
-        return NULL;\r
-    }\r
-}\r
-\r
-CEffect::CEffect( UINT Flags )\r
-{\r
-    m_RefCount = 1;\r
-\r
-    m_pVariables = NULL;\r
-    m_pAnonymousShaders = NULL;\r
-    m_pGroups = NULL;\r
-    m_pNullGroup = NULL;\r
-    m_pShaderBlocks = NULL;\r
-    m_pDepthStencilBlocks = NULL;\r
-    m_pBlendBlocks = NULL;\r
-    m_pRasterizerBlocks = NULL;\r
-    m_pSamplerBlocks = NULL;\r
-    m_pCBs = NULL;\r
-    m_pStrings = NULL;\r
-    m_pMemberDataBlocks = NULL;\r
-    m_pInterfaces = NULL;\r
-    m_pShaderResources = NULL;\r
-    m_pUnorderedAccessViews = NULL;\r
-    m_pRenderTargetViews = NULL;\r
-    m_pDepthStencilViews = NULL;\r
-    m_pDevice = NULL;\r
-    m_pClassLinkage = NULL;\r
-    m_pContext = NULL;\r
-\r
-    m_VariableCount = 0;\r
-    m_AnonymousShaderCount = 0;\r
-    m_ShaderBlockCount = 0;\r
-    m_DepthStencilBlockCount = 0;\r
-    m_BlendBlockCount = 0;\r
-    m_RasterizerBlockCount = 0;\r
-    m_SamplerBlockCount = 0;\r
-    m_StringCount = 0;\r
-    m_MemberDataCount = 0;\r
-    m_InterfaceCount = 0;\r
-    m_ShaderResourceCount = 0;\r
-    m_UnorderedAccessViewCount = 0;\r
-    m_RenderTargetViewCount = 0;\r
-    m_DepthStencilViewCount = 0;\r
-    m_CBCount = 0;\r
-    m_TechniqueCount = 0;\r
-    m_GroupCount = 0;\r
-\r
-    m_pReflection = NULL;\r
-    m_LocalTimer = 1;\r
-    m_Flags = Flags;\r
-    m_FXLIndex = 0;\r
-\r
-    m_pTypePool = NULL;\r
-    m_pStringPool = NULL;\r
-    m_pPooledHeap = NULL;\r
-    m_pOptimizedTypeHeap = NULL;\r
-}\r
-\r
-void CEffect::ReleaseShaderRefection()\r
-{\r
-    for( UINT i = 0; i < m_ShaderBlockCount; ++ i )\r
-    {\r
-        SAFE_RELEASE( m_pShaderBlocks[i].pInputSignatureBlob );\r
-        if( m_pShaderBlocks[i].pReflectionData )\r
-        {\r
-            SAFE_RELEASE( m_pShaderBlocks[i].pReflectionData->pReflection );\r
-        }\r
-    }\r
-}\r
-\r
-CEffect::~CEffect()\r
-{\r
-    ID3D11InfoQueue *pInfoQueue = NULL;\r
-\r
-    // Mute debug spew\r
-    if (m_pDevice)\r
-        m_pDevice->QueryInterface(__uuidof(ID3D11InfoQueue), (void**) &pInfoQueue);\r
-\r
-    if (pInfoQueue)\r
-    {\r
-        D3D11_INFO_QUEUE_FILTER filter;\r
-        D3D11_MESSAGE_CATEGORY messageCategory = D3D11_MESSAGE_CATEGORY_STATE_SETTING;\r
-        ZeroMemory(&filter, sizeof(filter));\r
-\r
-        filter.DenyList.NumCategories = 1;\r
-        filter.DenyList.pCategoryList = &messageCategory;\r
-        pInfoQueue->PushStorageFilter(&filter);\r
-    }\r
-\r
-    UINT  i;\r
-\r
-    if( NULL != m_pDevice )\r
-    {\r
-        // if m_pDevice == NULL, then we failed LoadEffect(), which means ReleaseShaderReflection was already called.\r
-\r
-        // Release the shader reflection info, as it was not created on the private heap\r
-        // This must be called before we delete m_pReflection\r
-        ReleaseShaderRefection();\r
-    }\r
-\r
-    SAFE_DELETE( m_pReflection );\r
-    SAFE_DELETE( m_pTypePool );\r
-    SAFE_DELETE( m_pStringPool );\r
-    SAFE_DELETE( m_pPooledHeap );\r
-    SAFE_DELETE( m_pOptimizedTypeHeap );\r
-\r
-    // this code assumes the effect has been loaded & relocated,\r
-    // so check for that before freeing the resources\r
-\r
-    if (NULL != m_pDevice)\r
-    {\r
-        // Keep the following in line with AddRefAllForCloning\r
-\r
-        D3DXASSERT(NULL == m_pRasterizerBlocks || m_Heap.IsInHeap(m_pRasterizerBlocks));\r
-        for (i = 0; i < m_RasterizerBlockCount; ++ i)\r
-        {\r
-            SAFE_RELEASE(m_pRasterizerBlocks[i].pRasterizerObject);\r
-        }\r
-\r
-        D3DXASSERT(NULL == m_pBlendBlocks || m_Heap.IsInHeap(m_pBlendBlocks));\r
-        for (i = 0; i < m_BlendBlockCount; ++ i)\r
-        {\r
-            SAFE_RELEASE(m_pBlendBlocks[i].pBlendObject);\r
-        }\r
-\r
-        D3DXASSERT(NULL == m_pDepthStencilBlocks || m_Heap.IsInHeap(m_pDepthStencilBlocks));\r
-        for (i = 0; i < m_DepthStencilBlockCount; ++ i)\r
-        {\r
-            SAFE_RELEASE(m_pDepthStencilBlocks[i].pDSObject);\r
-        }\r
-\r
-        D3DXASSERT(NULL == m_pSamplerBlocks || m_Heap.IsInHeap(m_pSamplerBlocks));\r
-        for (i = 0; i < m_SamplerBlockCount; ++ i)\r
-        {\r
-            SAFE_RELEASE(m_pSamplerBlocks[i].pD3DObject);\r
-        }\r
-\r
-        D3DXASSERT(NULL == m_pShaderResources || m_Heap.IsInHeap(m_pShaderResources));\r
-        for (i = 0; i < m_ShaderResourceCount; ++ i)\r
-        {\r
-            SAFE_RELEASE(m_pShaderResources[i].pShaderResource);\r
-        }\r
-\r
-        D3DXASSERT(NULL == m_pUnorderedAccessViews || m_Heap.IsInHeap(m_pUnorderedAccessViews));\r
-        for (i = 0; i < m_UnorderedAccessViewCount; ++ i)\r
-        {\r
-            SAFE_RELEASE(m_pUnorderedAccessViews[i].pUnorderedAccessView);\r
-        }\r
-\r
-        D3DXASSERT(NULL == m_pRenderTargetViews || m_Heap.IsInHeap(m_pRenderTargetViews));\r
-        for (i = 0; i < m_RenderTargetViewCount; ++ i)\r
-        {\r
-            SAFE_RELEASE(m_pRenderTargetViews[i].pRenderTargetView);\r
-        }\r
-\r
-        D3DXASSERT(NULL == m_pDepthStencilViews || m_Heap.IsInHeap(m_pDepthStencilViews));\r
-        for (i = 0; i < m_DepthStencilViewCount; ++ i)\r
-        {\r
-            SAFE_RELEASE(m_pDepthStencilViews[i].pDepthStencilView);\r
-        }\r
-\r
-        D3DXASSERT(NULL == m_pMemberDataBlocks || m_Heap.IsInHeap(m_pMemberDataBlocks));\r
-        for (i = 0; i < m_MemberDataCount; ++ i)\r
-        {\r
-            switch( m_pMemberDataBlocks[i].Type )\r
-            {\r
-            case MDT_ClassInstance:\r
-                SAFE_RELEASE(m_pMemberDataBlocks[i].Data.pD3DClassInstance);\r
-                break;\r
-            case MDT_BlendState:\r
-                SAFE_RELEASE(m_pMemberDataBlocks[i].Data.pD3DEffectsManagedBlendState);\r
-                break;\r
-            case MDT_DepthStencilState:\r
-                SAFE_RELEASE(m_pMemberDataBlocks[i].Data.pD3DEffectsManagedDepthStencilState);\r
-                break;\r
-            case MDT_RasterizerState:\r
-                SAFE_RELEASE(m_pMemberDataBlocks[i].Data.pD3DEffectsManagedRasterizerState);\r
-                break;\r
-            case MDT_SamplerState:\r
-                SAFE_RELEASE(m_pMemberDataBlocks[i].Data.pD3DEffectsManagedSamplerState);\r
-                break;\r
-            case MDT_Buffer:\r
-                SAFE_RELEASE(m_pMemberDataBlocks[i].Data.pD3DEffectsManagedConstantBuffer);\r
-                break;\r
-            case MDT_ShaderResourceView:\r
-                SAFE_RELEASE(m_pMemberDataBlocks[i].Data.pD3DEffectsManagedTextureBuffer);\r
-                break;\r
-            default:\r
-                D3DXASSERT( false );\r
-            }\r
-        }\r
-\r
-        D3DXASSERT(NULL == m_pCBs || m_Heap.IsInHeap(m_pCBs));\r
-        for (i = 0; i < m_CBCount; ++ i)\r
-        {\r
-            SAFE_RELEASE(m_pCBs[i].TBuffer.pShaderResource);\r
-            SAFE_RELEASE(m_pCBs[i].pD3DObject);\r
-        }\r
-\r
-        D3DXASSERT(NULL == m_pShaderBlocks || m_Heap.IsInHeap(m_pShaderBlocks));\r
-        for (i = 0; i < m_ShaderBlockCount; ++ i)\r
-        {\r
-            SAFE_RELEASE(m_pShaderBlocks[i].pD3DObject);\r
-        }\r
-\r
-        SAFE_RELEASE( m_pDevice );\r
-    }\r
-    SAFE_RELEASE( m_pClassLinkage );\r
-    D3DXASSERT( m_pContext == NULL );\r
-\r
-    // Restore debug spew\r
-    if (pInfoQueue)\r
-    {\r
-        pInfoQueue->PopStorageFilter();\r
-        SAFE_RELEASE(pInfoQueue);\r
-    }\r
-}\r
-\r
-// AddRef all D3D object when cloning\r
-void CEffect::AddRefAllForCloning( CEffect* pEffectSource )\r
-{\r
-    UINT  i;\r
-\r
-    // Keep the following in line with ~CEffect\r
-\r
-    D3DXASSERT( m_pDevice != NULL );\r
-\r
-    for( UINT i = 0; i < m_ShaderBlockCount; ++ i )\r
-    {\r
-        SAFE_ADDREF( m_pShaderBlocks[i].pInputSignatureBlob );\r
-        if( m_pShaderBlocks[i].pReflectionData )\r
-        {\r
-            SAFE_ADDREF( m_pShaderBlocks[i].pReflectionData->pReflection );\r
-        }\r
-    }\r
-\r
-    D3DXASSERT(NULL == m_pRasterizerBlocks || pEffectSource->m_Heap.IsInHeap(m_pRasterizerBlocks));\r
-    for (i = 0; i < m_RasterizerBlockCount; ++ i)\r
-    {\r
-        SAFE_ADDREF(m_pRasterizerBlocks[i].pRasterizerObject);\r
-    }\r
-\r
-    D3DXASSERT(NULL == m_pBlendBlocks || pEffectSource->m_Heap.IsInHeap(m_pBlendBlocks));\r
-    for (i = 0; i < m_BlendBlockCount; ++ i)\r
-    {\r
-        SAFE_ADDREF(m_pBlendBlocks[i].pBlendObject);\r
-    }\r
-\r
-    D3DXASSERT(NULL == m_pDepthStencilBlocks || pEffectSource->m_Heap.IsInHeap(m_pDepthStencilBlocks));\r
-    for (i = 0; i < m_DepthStencilBlockCount; ++ i)\r
-    {\r
-        SAFE_ADDREF(m_pDepthStencilBlocks[i].pDSObject);\r
-    }\r
-\r
-    D3DXASSERT(NULL == m_pSamplerBlocks || pEffectSource->m_Heap.IsInHeap(m_pSamplerBlocks));\r
-    for (i = 0; i < m_SamplerBlockCount; ++ i)\r
-    {\r
-        SAFE_ADDREF(m_pSamplerBlocks[i].pD3DObject);\r
-    }\r
-\r
-    D3DXASSERT(NULL == m_pShaderResources || pEffectSource->m_Heap.IsInHeap(m_pShaderResources));\r
-    for (i = 0; i < m_ShaderResourceCount; ++ i)\r
-    {\r
-        SAFE_ADDREF(m_pShaderResources[i].pShaderResource);\r
-    }\r
-\r
-    D3DXASSERT(NULL == m_pUnorderedAccessViews || pEffectSource->m_Heap.IsInHeap(m_pUnorderedAccessViews));\r
-    for (i = 0; i < m_UnorderedAccessViewCount; ++ i)\r
-    {\r
-        SAFE_ADDREF(m_pUnorderedAccessViews[i].pUnorderedAccessView);\r
-    }\r
-\r
-    D3DXASSERT(NULL == m_pRenderTargetViews || pEffectSource->m_Heap.IsInHeap(m_pRenderTargetViews));\r
-    for (i = 0; i < m_RenderTargetViewCount; ++ i)\r
-    {\r
-        SAFE_ADDREF(m_pRenderTargetViews[i].pRenderTargetView);\r
-    }\r
-\r
-    D3DXASSERT(NULL == m_pDepthStencilViews || pEffectSource->m_Heap.IsInHeap(m_pDepthStencilViews));\r
-    for (i = 0; i < m_DepthStencilViewCount; ++ i)\r
-    {\r
-        SAFE_ADDREF(m_pDepthStencilViews[i].pDepthStencilView);\r
-    }\r
-\r
-    D3DXASSERT(NULL == m_pMemberDataBlocks || pEffectSource->m_Heap.IsInHeap(m_pMemberDataBlocks));\r
-    for (i = 0; i < m_MemberDataCount; ++ i)\r
-    {\r
-        switch( m_pMemberDataBlocks[i].Type )\r
-        {\r
-        case MDT_ClassInstance:\r
-            SAFE_ADDREF(m_pMemberDataBlocks[i].Data.pD3DClassInstance);\r
-            break;\r
-        case MDT_BlendState:\r
-            SAFE_ADDREF(m_pMemberDataBlocks[i].Data.pD3DEffectsManagedBlendState);\r
-            break;\r
-        case MDT_DepthStencilState:\r
-            SAFE_ADDREF(m_pMemberDataBlocks[i].Data.pD3DEffectsManagedDepthStencilState);\r
-            break;\r
-        case MDT_RasterizerState:\r
-            SAFE_ADDREF(m_pMemberDataBlocks[i].Data.pD3DEffectsManagedRasterizerState);\r
-            break;\r
-        case MDT_SamplerState:\r
-            SAFE_ADDREF(m_pMemberDataBlocks[i].Data.pD3DEffectsManagedSamplerState);\r
-            break;\r
-        case MDT_Buffer:\r
-            SAFE_ADDREF(m_pMemberDataBlocks[i].Data.pD3DEffectsManagedConstantBuffer);\r
-            break;\r
-        case MDT_ShaderResourceView:\r
-            SAFE_ADDREF(m_pMemberDataBlocks[i].Data.pD3DEffectsManagedTextureBuffer);\r
-            break;\r
-        default:\r
-            D3DXASSERT( false );\r
-        }\r
-    }\r
-\r
-    // There's no need to AddRef CBs, since they are recreated\r
-    D3DXASSERT(NULL == m_pCBs || pEffectSource->m_Heap.IsInHeap(m_pCBs));\r
-    for (i = 0; i < m_CBCount; ++ i)\r
-    {\r
-        SAFE_ADDREF(m_pCBs[i].TBuffer.pShaderResource);\r
-        SAFE_ADDREF(m_pCBs[i].pD3DObject);\r
-    }\r
-\r
-    D3DXASSERT(NULL == m_pShaderBlocks || pEffectSource->m_Heap.IsInHeap(m_pShaderBlocks));\r
-    for (i = 0; i < m_ShaderBlockCount; ++ i)\r
-    {\r
-        SAFE_ADDREF(m_pShaderBlocks[i].pD3DObject);\r
-    }\r
-\r
-    SAFE_ADDREF( m_pDevice );\r
-\r
-    SAFE_ADDREF( m_pClassLinkage );\r
-    D3DXASSERT( m_pContext == NULL );\r
-}\r
-\r
-HRESULT CEffect::QueryInterface(REFIID iid, LPVOID *ppv)\r
-{\r
-    HRESULT hr = S_OK;\r
-\r
-    if(NULL == ppv)\r
-    {\r
-        DPF(0, "ID3DX11Effect::QueryInterface: NULL parameter");\r
-        hr = E_INVALIDARG;\r
-        goto EXIT;\r
-    }\r
-\r
-    *ppv = NULL;\r
-    if(IsEqualIID(iid, IID_IUnknown))\r
-    {\r
-        *ppv = (IUnknown *) this;\r
-    }\r
-    else if(IsEqualIID(iid, IID_ID3DX11Effect))\r
-    {\r
-        *ppv = (ID3DX11Effect *) this;\r
-    }\r
-    else\r
-    {\r
-        return E_NOINTERFACE;\r
-    }\r
-\r
-    AddRef();\r
-\r
-EXIT:\r
-    return hr;\r
-}\r
-\r
-ULONG CEffect::AddRef()\r
-{\r
-    return ++ m_RefCount;\r
-}\r
-\r
-ULONG CEffect::Release()\r
-{\r
-    if (-- m_RefCount > 0)\r
-    {\r
-        return m_RefCount;\r
-    }\r
-    else\r
-    {\r
-        delete this;\r
-    }\r
-\r
-    return 0;\r
-}\r
-\r
-// In all shaders, replace pOldBufferBlock with pNewBuffer, if pOldBufferBlock is a dependency\r
-void CEffect::ReplaceCBReference(SConstantBuffer *pOldBufferBlock, ID3D11Buffer *pNewBuffer)\r
-{\r
-    UINT iShaderBlock;\r
-\r
-    for (iShaderBlock=0; iShaderBlock<m_ShaderBlockCount; iShaderBlock++)\r
-    {\r
-        for (UINT iCBDep = 0; iCBDep < m_pShaderBlocks[iShaderBlock].CBDepCount; iCBDep++)\r
-        {\r
-            for (UINT iCB = 0; iCB < m_pShaderBlocks[iShaderBlock].pCBDeps[iCBDep].Count; iCB++)\r
-            {\r
-                if (m_pShaderBlocks[iShaderBlock].pCBDeps[iCBDep].ppFXPointers[iCB] == pOldBufferBlock)\r
-                    m_pShaderBlocks[iShaderBlock].pCBDeps[iCBDep].ppD3DObjects[iCB] = pNewBuffer;\r
-            }\r
-        }\r
-    }\r
-}\r
-\r
-// In all shaders, replace pOldSamplerBlock with pNewSampler, if pOldSamplerBlock is a dependency\r
-void CEffect::ReplaceSamplerReference(SSamplerBlock *pOldSamplerBlock, ID3D11SamplerState *pNewSampler)\r
-{\r
-    UINT iShaderBlock;\r
-\r
-    for (iShaderBlock=0; iShaderBlock<m_ShaderBlockCount; iShaderBlock++)\r
-    {\r
-        for (UINT iSamplerDep = 0; iSamplerDep < m_pShaderBlocks[iShaderBlock].SampDepCount; iSamplerDep++)\r
-        {\r
-            for (UINT iSampler = 0; iSampler < m_pShaderBlocks[iShaderBlock].pSampDeps[iSamplerDep].Count; iSampler++)\r
-            {\r
-                if (m_pShaderBlocks[iShaderBlock].pSampDeps[iSamplerDep].ppFXPointers[iSampler] == pOldSamplerBlock)\r
-                    m_pShaderBlocks[iShaderBlock].pSampDeps[iSamplerDep].ppD3DObjects[iSampler] = pNewSampler;\r
-            }\r
-        }\r
-    }\r
-}\r
-\r
-// Call BindToDevice after the effect has been fully loaded.\r
-// BindToDevice will release all D3D11 objects and create new ones on the new device\r
-HRESULT CEffect::BindToDevice(ID3D11Device *pDevice)\r
-{\r
-    HRESULT hr = S_OK;\r
-\r
-    // Set new device\r
-    if (pDevice == NULL)\r
-    {\r
-        DPF(0, "ID3DX11Effect: pDevice must point to a valid D3D11 device");\r
-        return D3DERR_INVALIDCALL;\r
-    }\r
-\r
-    if (m_pDevice != NULL)\r
-    {\r
-        DPF(0, "ID3DX11Effect: Internal error, rebinding effects to a new device is not supported");\r
-        return D3DERR_INVALIDCALL;\r
-    }\r
-\r
-    bool featureLevelGE11 = ( pDevice->GetFeatureLevel() >= D3D_FEATURE_LEVEL_11_0 );\r
-\r
-    pDevice->AddRef();\r
-    SAFE_RELEASE(m_pDevice);\r
-    m_pDevice = pDevice;\r
-    VH( m_pDevice->CreateClassLinkage( &m_pClassLinkage ) );\r
-\r
-    // Create all constant buffers\r
-    SConstantBuffer *pCB = m_pCBs;\r
-    SConstantBuffer *pCBLast = m_pCBs + m_CBCount;\r
-    for(; pCB != pCBLast; pCB++)\r
-    {\r
-        SAFE_RELEASE(pCB->pD3DObject);\r
-        SAFE_RELEASE(pCB->TBuffer.pShaderResource);\r
-\r
-        // This is a CBuffer\r
-        if (pCB->Size > 0)\r
-        {\r
-            if (pCB->IsTBuffer)\r
-            {\r
-                D3D11_BUFFER_DESC bufDesc;\r
-                // size is always register aligned\r
-                bufDesc.ByteWidth = pCB->Size;\r
-                bufDesc.Usage = D3D11_USAGE_DEFAULT;\r
-                bufDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE;\r
-                bufDesc.CPUAccessFlags = 0;\r
-                bufDesc.MiscFlags = 0;\r
-\r
-                VH( pDevice->CreateBuffer( &bufDesc, NULL, &pCB->pD3DObject) );\r
-                \r
-                D3D11_SHADER_RESOURCE_VIEW_DESC viewDesc;\r
-                viewDesc.Format = DXGI_FORMAT_R32G32B32A32_UINT;\r
-                viewDesc.ViewDimension = D3D11_SRV_DIMENSION_BUFFER;\r
-                viewDesc.Buffer.ElementOffset = 0;\r
-                viewDesc.Buffer.ElementWidth = pCB->Size / SType::c_RegisterSize;\r
-\r
-                VH( pDevice->CreateShaderResourceView( pCB->pD3DObject, &viewDesc, &pCB->TBuffer.pShaderResource) );\r
-            }\r
-            else\r
-            {\r
-                D3D11_BUFFER_DESC bufDesc;\r
-                // size is always register aligned\r
-                bufDesc.ByteWidth = pCB->Size;\r
-                bufDesc.Usage = D3D11_USAGE_DEFAULT;\r
-                bufDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;\r
-                bufDesc.CPUAccessFlags = 0;\r
-                bufDesc.MiscFlags = 0;\r
-\r
-                VH( pDevice->CreateBuffer( &bufDesc, NULL, &pCB->pD3DObject) );\r
-                pCB->TBuffer.pShaderResource = NULL;\r
-            }\r
-\r
-            pCB->IsDirty = TRUE;\r
-        }\r
-        else\r
-        {\r
-            pCB->IsDirty = FALSE;\r
-        }\r
-    }\r
-\r
-    // Create all RasterizerStates\r
-    SRasterizerBlock *pRB = m_pRasterizerBlocks;\r
-    SRasterizerBlock *pRBLast = m_pRasterizerBlocks + m_RasterizerBlockCount;\r
-    for(; pRB != pRBLast; pRB++)\r
-    {\r
-        SAFE_RELEASE(pRB->pRasterizerObject);\r
-        if( SUCCEEDED( m_pDevice->CreateRasterizerState( &pRB->BackingStore, &pRB->pRasterizerObject) ) )\r
-            pRB->IsValid = TRUE;\r
-        else\r
-            pRB->IsValid = FALSE;\r
-    }\r
-\r
-    // Create all DepthStencils\r
-    SDepthStencilBlock *pDS = m_pDepthStencilBlocks;\r
-    SDepthStencilBlock *pDSLast = m_pDepthStencilBlocks + m_DepthStencilBlockCount;\r
-    for(; pDS != pDSLast; pDS++)\r
-    {\r
-        SAFE_RELEASE(pDS->pDSObject);\r
-        if( SUCCEEDED( m_pDevice->CreateDepthStencilState( &pDS->BackingStore, &pDS->pDSObject) ) )\r
-            pDS->IsValid = TRUE;\r
-        else\r
-            pDS->IsValid = FALSE;\r
-    }\r
-\r
-    // Create all BlendStates\r
-    SBlendBlock *pBlend = m_pBlendBlocks;\r
-    SBlendBlock *pBlendLast = m_pBlendBlocks + m_BlendBlockCount;\r
-    for(; pBlend != pBlendLast; pBlend++)\r
-    {\r
-        SAFE_RELEASE(pBlend->pBlendObject);\r
-        if( SUCCEEDED( m_pDevice->CreateBlendState( &pBlend->BackingStore, &pBlend->pBlendObject ) ) )\r
-            pBlend->IsValid = TRUE;\r
-        else\r
-            pBlend->IsValid = FALSE;\r
-    }\r
-\r
-    // Create all Samplers\r
-    SSamplerBlock *pSampler = m_pSamplerBlocks;\r
-    SSamplerBlock *pSamplerLast = m_pSamplerBlocks + m_SamplerBlockCount;\r
-    for(; pSampler != pSamplerLast; pSampler++)\r
-    {\r
-        SAFE_RELEASE(pSampler->pD3DObject);\r
-\r
-        VH( m_pDevice->CreateSamplerState( &pSampler->BackingStore.SamplerDesc, &pSampler->pD3DObject) );\r
-    }\r
-\r
-    // Create all shaders\r
-    ID3D11ClassLinkage* neededClassLinkage = featureLevelGE11 ? m_pClassLinkage : NULL;\r
-    SShaderBlock *pShader = m_pShaderBlocks;\r
-    SShaderBlock *pShaderLast = m_pShaderBlocks + m_ShaderBlockCount;\r
-    for(; pShader != pShaderLast; pShader++)\r
-    {\r
-        SAFE_RELEASE(pShader->pD3DObject);\r
-\r
-        if (NULL == pShader->pReflectionData)\r
-        {\r
-            // NULL shader. It's one of these:\r
-            // PixelShader ps;\r
-            // or\r
-            // SetPixelShader( NULL );\r
-            continue;\r
-        }\r
-        \r
-        if (pShader->pReflectionData->pStreamOutDecls[0] || pShader->pReflectionData->pStreamOutDecls[1] || \r
-            pShader->pReflectionData->pStreamOutDecls[2] || pShader->pReflectionData->pStreamOutDecls[3] )\r
-        {\r
-            // This is a geometry shader, process it's data\r
-            CSOParser soParser;\r
-            VH( soParser.Parse(pShader->pReflectionData->pStreamOutDecls) );\r
-            UINT strides[4];\r
-            soParser.GetStrides( strides );\r
-            hr = m_pDevice->CreateGeometryShaderWithStreamOutput((UINT*) pShader->pReflectionData->pBytecode,\r
-                                                                pShader->pReflectionData->BytecodeLength,\r
-                                                                soParser.GetDeclArray(),\r
-                                                                soParser.GetDeclCount(),\r
-                                                                strides,\r
-                                                                featureLevelGE11 ? 4 : 1,\r
-                                                                pShader->pReflectionData->RasterizedStream,\r
-                                                                neededClassLinkage,\r
-                                                                (ID3D11GeometryShader**) &pShader->pD3DObject);\r
-            if (FAILED(hr))\r
-            {\r
-                DPF(1, "ID3DX11Effect::Load - failed to create GeometryShader with StreamOutput decl: \"%s\"", soParser.GetErrorString() );\r
-                pShader->IsValid = FALSE;\r
-                hr = S_OK;\r
-            }\r
-        }\r
-        else\r
-        {\r
-            // This is a regular shader\r
-            if( pShader->pReflectionData->RasterizedStream == D3D11_SO_NO_RASTERIZED_STREAM )\r
-                pShader->IsValid = FALSE;\r
-            else \r
-            {\r
-                if( FAILED( (m_pDevice->*(pShader->pVT->pCreateShader))( (UINT *) pShader->pReflectionData->pBytecode, pShader->pReflectionData->BytecodeLength, neededClassLinkage, &pShader->pD3DObject) ) )\r
-                {\r
-                    DPF(1, "ID3DX11Effect::Load - failed to create shader" );\r
-                    pShader->IsValid = FALSE;\r
-                }\r
-            }\r
-        }\r
-\r
-        // Update all dependency pointers\r
-        VH( pShader->OnDeviceBind() );\r
-    }\r
-\r
-    // Initialize the member data pointers for all variables\r
-    UINT CurMemberData = 0;\r
-    for (UINT i = 0; i < m_VariableCount; ++ i)\r
-    {\r
-        if( m_pVariables[i].pMemberData )\r
-        {\r
-            if( m_pVariables[i].pType->IsClassInstance() )\r
-            {\r
-                for (UINT j = 0; j < max(m_pVariables[i].pType->Elements,1); ++j)\r
-                {\r
-                    D3DXASSERT( CurMemberData < m_MemberDataCount );\r
-                    ID3D11ClassInstance** ppCI = &(m_pVariables[i].pMemberData + j)->Data.pD3DClassInstance;\r
-                    (m_pVariables[i].pMemberData + j)->Type = MDT_ClassInstance;\r
-                    (m_pVariables[i].pMemberData + j)->Data.pD3DClassInstance = NULL;\r
-                    if( m_pVariables[i].pType->TotalSize > 0 )\r
-                    {\r
-                        // ignore failures in GetClassInstance;\r
-                        m_pClassLinkage->GetClassInstance( m_pVariables[i].pName, j, ppCI );\r
-                    }\r
-                    else\r
-                    {\r
-                        // The HLSL compiler optimizes out zero-sized classes, so we have to create class instances from scratch\r
-                        if( FAILED( m_pClassLinkage->CreateClassInstance( m_pVariables[i].pType->pTypeName, 0, 0, 0, 0, ppCI ) ) )\r
-                        {\r
-                            DPF(0, "ID3DX11Effect: Out of memory while trying to create new class instance interface");\r
-                        }\r
-                    }\r
-                    CurMemberData++;\r
-                }\r
-            }\r
-            else if( m_pVariables[i].pType->IsStateBlockObject() )\r
-            {\r
-                for (UINT j = 0; j < max(m_pVariables[i].pType->Elements,1); ++j)\r
-                {\r
-                    switch( m_pVariables[i].pType->ObjectType )\r
-                    {\r
-                    case EOT_Blend:\r
-                        (m_pVariables[i].pMemberData + j)->Type = MDT_BlendState;\r
-                        (m_pVariables[i].pMemberData + j)->Data.pD3DEffectsManagedBlendState = NULL;\r
-                        break;\r
-                    case EOT_Rasterizer:\r
-                        (m_pVariables[i].pMemberData + j)->Type = MDT_RasterizerState;\r
-                        (m_pVariables[i].pMemberData + j)->Data.pD3DEffectsManagedRasterizerState = NULL;\r
-                        break;\r
-                    case EOT_DepthStencil:\r
-                        (m_pVariables[i].pMemberData + j)->Type = MDT_DepthStencilState;\r
-                        (m_pVariables[i].pMemberData + j)->Data.pD3DEffectsManagedDepthStencilState = NULL;\r
-                        break;\r
-                    case EOT_Sampler:\r
-                        (m_pVariables[i].pMemberData + j)->Type = MDT_SamplerState;\r
-                        (m_pVariables[i].pMemberData + j)->Data.pD3DEffectsManagedSamplerState = NULL;\r
-                        break;\r
-                    default:\r
-                        VB( FALSE );\r
-                    }\r
-                    CurMemberData++;\r
-                }\r
-            }\r
-            else\r
-            {\r
-                VB( FALSE );\r
-            }\r
-        }\r
-    }\r
-    for(pCB = m_pCBs; pCB != pCBLast; pCB++)\r
-    {\r
-        (pCB->pMemberData + 0)->Type = MDT_Buffer;\r
-        (pCB->pMemberData + 0)->Data.pD3DEffectsManagedConstantBuffer = NULL;\r
-        CurMemberData++;\r
-        (pCB->pMemberData + 1)->Type = MDT_ShaderResourceView;\r
-        (pCB->pMemberData + 1)->Data.pD3DEffectsManagedTextureBuffer = NULL;\r
-        CurMemberData++;\r
-    }\r
-\r
-\r
-    // Determine which techniques and passes are known to be invalid\r
-    for( UINT iGroup=0; iGroup < m_GroupCount; iGroup++ )\r
-    {\r
-        SGroup* pGroup = &m_pGroups[iGroup];\r
-        pGroup->InitiallyValid = TRUE;\r
-\r
-        for( UINT iTech=0; iTech < pGroup->TechniqueCount; iTech++ )\r
-        {\r
-            STechnique* pTechnique = &pGroup->pTechniques[iTech];\r
-            pTechnique->InitiallyValid = TRUE;\r
-           \r
-            for( UINT iPass = 0; iPass < pTechnique->PassCount; iPass++ )\r
-            {\r
-                SPassBlock* pPass = &pTechnique->pPasses[iPass];\r
-                pPass->InitiallyValid = TRUE;\r
-\r
-                if( pPass->BackingStore.pBlendBlock != NULL && !pPass->BackingStore.pBlendBlock->IsValid )\r
-                    pPass->InitiallyValid = FALSE;\r
-                if( pPass->BackingStore.pDepthStencilBlock != NULL && !pPass->BackingStore.pDepthStencilBlock->IsValid )\r
-                    pPass->InitiallyValid = FALSE;\r
-                if( pPass->BackingStore.pRasterizerBlock != NULL && !pPass->BackingStore.pRasterizerBlock->IsValid )\r
-                    pPass->InitiallyValid = FALSE;\r
-                if( pPass->BackingStore.pVertexShaderBlock != NULL && !pPass->BackingStore.pVertexShaderBlock->IsValid )\r
-                    pPass->InitiallyValid = FALSE;\r
-                if( pPass->BackingStore.pPixelShaderBlock != NULL && !pPass->BackingStore.pPixelShaderBlock->IsValid )\r
-                    pPass->InitiallyValid = FALSE;\r
-                if( pPass->BackingStore.pGeometryShaderBlock != NULL && !pPass->BackingStore.pGeometryShaderBlock->IsValid )\r
-                    pPass->InitiallyValid = FALSE;\r
-                if( pPass->BackingStore.pHullShaderBlock != NULL && !pPass->BackingStore.pHullShaderBlock->IsValid )\r
-                    pPass->InitiallyValid = FALSE;\r
-                if( pPass->BackingStore.pDomainShaderBlock != NULL && !pPass->BackingStore.pDomainShaderBlock->IsValid )\r
-                    pPass->InitiallyValid = FALSE;\r
-                if( pPass->BackingStore.pComputeShaderBlock != NULL && !pPass->BackingStore.pComputeShaderBlock->IsValid )\r
-                    pPass->InitiallyValid = FALSE;\r
-\r
-                pTechnique->InitiallyValid &= pPass->InitiallyValid;\r
-            }\r
-            pGroup->InitiallyValid &= pTechnique->InitiallyValid;\r
-        }\r
-    }\r
-\r
-lExit:\r
-    return hr;\r
-}\r
-\r
-// FindVariableByName, plus an understanding of literal indices\r
-// This code handles A[i].\r
-// It does not handle anything else, like A.B, A[B[i]], A[B]\r
-SVariable * CEffect::FindVariableByNameWithParsing(LPCSTR pName)\r
-{\r
-    SGlobalVariable *pVariable;\r
-    const UINT MAX_PARSABLE_NAME_LENGTH = 256;\r
-    char pScratchString[MAX_PARSABLE_NAME_LENGTH];\r
-\r
-    const char* pSource = pName;\r
-    char* pDest = pScratchString;\r
-    char* pEnd = pScratchString + MAX_PARSABLE_NAME_LENGTH;\r
-\r
-    pVariable = NULL;\r
-\r
-    while( *pSource != 0 )\r
-    {\r
-        if( pDest == pEnd )\r
-        {\r
-            pVariable = FindLocalVariableByName(pName);\r
-            if( pVariable == NULL )\r
-            {\r
-                DPF( 0, "Name %s is too long to parse", &pName );\r
-            }\r
-            return pVariable;\r
-        }\r
-\r
-        if( *pSource == '[' )\r
-        {\r
-            // parse previous variable name\r
-            *pDest = 0;\r
-            D3DXASSERT( pVariable == NULL );\r
-            pVariable = FindLocalVariableByName(pScratchString);\r
-            if( pVariable == NULL )\r
-            {\r
-                return NULL;\r
-            }\r
-            pDest = pScratchString;\r
-        }\r
-        else if( *pSource == ']' )\r
-        {\r
-            // parse integer\r
-            *pDest = 0;\r
-            UINT index = atoi(pScratchString);\r
-            D3DXASSERT( pVariable != NULL );\r
-            pVariable = (SGlobalVariable*)pVariable->GetElement(index);\r
-            if( pVariable && !pVariable->IsValid() )\r
-            {\r
-                pVariable = NULL;\r
-            }\r
-            return pVariable;\r
-        }\r
-        else\r
-        {\r
-            // add character\r
-            *pDest = *pSource;\r
-            pDest++;\r
-        }\r
-        pSource++;\r
-    }\r
-\r
-    if( pDest != pScratchString )\r
-    {\r
-        // parse the variable name (there was no [i])\r
-        *pDest = 0;\r
-        D3DXASSERT( pVariable == NULL );\r
-        pVariable = FindLocalVariableByName(pScratchString);\r
-    }\r
-\r
-    return pVariable;\r
-}\r
-\r
-SGlobalVariable * CEffect::FindVariableByName(LPCSTR pName)\r
-{\r
-    SGlobalVariable *pVariable;\r
-\r
-    pVariable = FindLocalVariableByName(pName);\r
-\r
-    return pVariable;\r
-}\r
-\r
-SGlobalVariable * CEffect::FindLocalVariableByName(LPCSTR pName)\r
-{\r
-    SGlobalVariable *pVariable, *pVariableEnd;\r
-\r
-    pVariableEnd = m_pVariables + m_VariableCount;\r
-    for (pVariable = m_pVariables; pVariable != pVariableEnd; pVariable++)\r
-    {\r
-        if (strcmp( pVariable->pName, pName) == 0)\r
-        {\r
-            return pVariable;\r
-        }\r
-    }\r
-\r
-    return NULL;\r
-}\r
-\r
-\r
-//\r
-// Checks to see if two types are equivalent (either at runtime\r
-// or during the type-pooling load process)\r
-//\r
-// Major assumption: if both types are structures, then their\r
-// member types & names should already have been added to the pool,\r
-// in which case their member type & name pointers should be equal.\r
-//\r
-// This is true because complex data types (structures) have all\r
-// sub-types translated before the containing type is translated,\r
-// which means that simple sub-types (numeric types) have already\r
-// been pooled.\r
-//\r
-BOOL SType::IsEqual(SType *pOtherType) CONST\r
-{\r
-    if (VarType != pOtherType->VarType || Elements != pOtherType->Elements\r
-        || strcmp(pTypeName, pOtherType->pTypeName) != 0)\r
-    {\r
-        return FALSE;\r
-    }\r
-\r
-    switch (VarType)\r
-    {\r
-    case EVT_Struct:\r
-        {\r
-            if (StructType.Members != pOtherType->StructType.Members)\r
-            {\r
-                return FALSE;\r
-            }\r
-            D3DXASSERT(StructType.pMembers != NULL && pOtherType->StructType.pMembers != NULL);\r
-\r
-            UINT  i;\r
-            for (i = 0; i < StructType.Members; ++ i)\r
-            {\r
-                // names for types must exist (not true for semantics)\r
-                D3DXASSERT(StructType.pMembers[i].pName != NULL && pOtherType->StructType.pMembers[i].pName != NULL);\r
-\r
-                if (StructType.pMembers[i].pType != pOtherType->StructType.pMembers[i].pType ||\r
-                    StructType.pMembers[i].Data.Offset != pOtherType->StructType.pMembers[i].Data.Offset ||\r
-                    StructType.pMembers[i].pName != pOtherType->StructType.pMembers[i].pName ||\r
-                    StructType.pMembers[i].pSemantic != pOtherType->StructType.pMembers[i].pSemantic)\r
-                {\r
-                    return FALSE;\r
-                }\r
-            }\r
-        }\r
-        break;\r
-\r
-    case EVT_Object:\r
-        {\r
-            if (ObjectType != pOtherType->ObjectType)\r
-            {\r
-                return FALSE;\r
-            }\r
-        }\r
-        break;\r
-\r
-    case EVT_Numeric:\r
-        {\r
-            if (NumericType.Rows != pOtherType->NumericType.Rows ||\r
-                NumericType.Columns != pOtherType->NumericType.Columns ||\r
-                NumericType.ScalarType != pOtherType->NumericType.ScalarType ||\r
-                NumericType.NumericLayout != pOtherType->NumericType.NumericLayout ||\r
-                NumericType.IsColumnMajor != pOtherType->NumericType.IsColumnMajor ||\r
-                NumericType.IsPackedArray != pOtherType->NumericType.IsPackedArray)\r
-            {\r
-                return FALSE;\r
-            }\r
-        }\r
-        break;\r
-\r
-    case EVT_Interface:\r
-        {\r
-            // VarType and pTypeName handled above\r
-        }\r
-        break;\r
-\r
-    default:\r
-        {\r
-            D3DXASSERT(0);\r
-            return FALSE;\r
-        }\r
-        break;\r
-    }\r
-\r
-    D3DXASSERT(TotalSize == pOtherType->TotalSize && Stride == pOtherType->Stride && PackedSize == pOtherType->PackedSize);\r
-\r
-    return TRUE;\r
-}\r
-\r
-UINT SType::GetTotalUnpackedSize(BOOL IsSingleElement) CONST\r
-{\r
-    if (VarType == EVT_Object)\r
-    {\r
-        return 0;\r
-    }\r
-    else if (VarType == EVT_Interface)\r
-    {\r
-        return 0;\r
-    }\r
-    else if (Elements > 0 && IsSingleElement)\r
-    {\r
-        D3DXASSERT( ( TotalSize == 0 && Stride == 0 ) ||\r
-                    ( (TotalSize > (Stride * (Elements - 1))) && (TotalSize <= (Stride * Elements)) ) );\r
-        return TotalSize - Stride * (Elements - 1);\r
-    }\r
-    else\r
-    {\r
-        return TotalSize;\r
-    }\r
-}\r
-\r
-UINT SType::GetTotalPackedSize(BOOL IsSingleElement) CONST\r
-{\r
-    if (Elements > 0 && IsSingleElement)\r
-    {\r
-        D3DXASSERT(PackedSize % Elements == 0);\r
-        return PackedSize / Elements;\r
-    }\r
-    else\r
-    {\r
-        return PackedSize;\r
-    }\r
-}\r
-\r
-SConstantBuffer *CEffect::FindCB(LPCSTR pName)\r
-{\r
-    UINT  i;\r
-\r
-    for (i=0; i<m_CBCount; i++)\r
-    {\r
-        if (!strcmp(m_pCBs[i].pName, pName))\r
-        {\r
-            return &m_pCBs[i];\r
-        }\r
-    }\r
-\r
-    return NULL;\r
-}\r
-\r
-inline UINT  PtrToDword(void *pPtr)\r
-{\r
-    return (UINT)(UINT_PTR) pPtr;\r
-}\r
-\r
-BOOL CEffect::IsOptimized()\r
-{\r
-    if ((m_Flags & D3DX11_EFFECT_OPTIMIZED) != 0)\r
-    {\r
-        D3DXASSERT(NULL == m_pReflection);\r
-        return TRUE;\r
-    }\r
-    else\r
-    {\r
-        D3DXASSERT(NULL != m_pReflection);\r
-        return FALSE;\r
-    }\r
-}\r
-\r
-// Replace *ppType with the corresponding value in pMappingTable\r
-// pMappingTable table describes how to map old type pointers to new type pointers\r
-static HRESULT RemapType(SType **ppType, CPointerMappingTable *pMappingTable)\r
-{\r
-    HRESULT hr = S_OK;\r
-\r
-    SPointerMapping ptrMapping;\r
-    CPointerMappingTable::CIterator iter;\r
-    ptrMapping.pOld = *ppType;\r
-    VH( pMappingTable->FindValueWithHash(ptrMapping, ptrMapping.Hash(), &iter) );\r
-    *ppType = (SType *) iter.GetData().pNew;\r
-\r
-lExit:\r
-    return hr;\r
-}\r
-\r
-// Replace *ppString with the corresponding value in pMappingTable\r
-// pMappingTable table describes how to map old string pointers to new string pointers\r
-static HRESULT RemapString(__in char **ppString, CPointerMappingTable *pMappingTable)\r
-{\r
-    HRESULT hr = S_OK;\r
-\r
-    SPointerMapping ptrMapping;\r
-    CPointerMappingTable::CIterator iter;\r
-    ptrMapping.pOld = *ppString;\r
-    VH( pMappingTable->FindValueWithHash(ptrMapping, ptrMapping.Hash(), &iter) );\r
-    *ppString = (char *) iter.GetData().pNew;\r
-\r
-lExit:\r
-    return hr;\r
-}\r
-\r
-// Used in cloning, copy m_pMemberInterfaces from pEffectSource to this\r
-HRESULT CEffect::CopyMemberInterfaces( CEffect* pEffectSource )\r
-{\r
-    HRESULT hr = S_OK;\r
-    UINT i; // after a failure, this holds the failing index\r
-\r
-    UINT Members = pEffectSource->m_pMemberInterfaces.GetSize();\r
-    m_pMemberInterfaces.AddRange(Members);\r
-    for( i=0; i < Members; i++ )\r
-    {\r
-        SMember* pOldMember = pEffectSource->m_pMemberInterfaces[i];\r
-        if( pOldMember == NULL )\r
-        {\r
-            // During Optimization, m_pMemberInterfaces[i] was set to NULL because it was an annotation\r
-            m_pMemberInterfaces[i] = NULL;\r
-            continue;\r
-        }\r
-\r
-        SMember *pNewMember;\r
-        D3DXASSERT( pOldMember->pTopLevelEntity != NULL );\r
-\r
-        if (NULL == (pNewMember = CreateNewMember((SType*)pOldMember->pType, FALSE)))\r
-        {\r
-            DPF(0, "ID3DX11Effect: Out of memory while trying to create new member variable interface");\r
-            VN( pNewMember );\r
-        }\r
-\r
-        pNewMember->pType = pOldMember->pType;\r
-        pNewMember->pName = pOldMember->pName;\r
-        pNewMember->pSemantic = pOldMember->pSemantic;\r
-        pNewMember->Data.pGeneric = pOldMember->Data.pGeneric;\r
-        pNewMember->IsSingleElement = pOldMember->IsSingleElement;\r
-        pNewMember->pTopLevelEntity = pOldMember->pTopLevelEntity;\r
-        pNewMember->pMemberData = pOldMember->pMemberData;\r
-\r
-        m_pMemberInterfaces[i] = pNewMember;\r
-    }\r
-\r
-lExit:\r
-    if( FAILED(hr) )\r
-    {\r
-        D3DXASSERT( i < Members );\r
-        ZeroMemory( &m_pMemberInterfaces[i], sizeof(SMember) * ( Members - i ) );\r
-    }\r
-    return hr;\r
-}\r
-\r
-// Used in cloning, copy the string pool from pEffectSource to this and build mappingTable\r
-// for use in RemapString\r
-HRESULT CEffect::CopyStringPool( CEffect* pEffectSource, CPointerMappingTable& mappingTable )\r
-{\r
-    HRESULT hr = S_OK;\r
-    D3DXASSERT( m_pPooledHeap != NULL );\r
-    VN( m_pStringPool = NEW CEffect::CStringHashTable );\r
-    m_pStringPool->SetPrivateHeap(m_pPooledHeap);\r
-    VH( m_pStringPool->AutoGrow() );\r
-\r
-    CStringHashTable::CIterator stringIter;\r
-\r
-    // move strings over, build mapping table\r
-    for (pEffectSource->m_pStringPool->GetFirstEntry(&stringIter); !pEffectSource->m_pStringPool->PastEnd(&stringIter); pEffectSource->m_pStringPool->GetNextEntry(&stringIter))\r
-    {\r
-        SPointerMapping ptrMapping;\r
-        char *pString;\r
-\r
-        const char* pOldString = stringIter.GetData();\r
-        ptrMapping.pOld = (void*)pOldString;\r
-        UINT len = (UINT)strlen(pOldString);\r
-        UINT hash = ptrMapping.Hash();\r
-        VN( pString = new(*m_pPooledHeap) char[len + 1] );\r
-        ptrMapping.pNew = (void*)pString;\r
-        memcpy(ptrMapping.pNew, ptrMapping.pOld, len + 1);\r
-        VH( m_pStringPool->AddValueWithHash(pString, hash) );\r
-\r
-        VH( mappingTable.AddValueWithHash(ptrMapping, hash) );\r
-    }\r
-\r
-    // Uncomment to print string mapping\r
-    /*\r
-    CPointerMappingTable::CIterator mapIter;\r
-    for (mappingTable.GetFirstEntry(&mapIter); !mappingTable.PastEnd(&mapIter); mappingTable.GetNextEntry(&mapIter))\r
-    {\r
-    SPointerMapping ptrMapping = mapIter.GetData();\r
-    DPF(0, "string: 0x%x : 0x%x  %s", (UINT_PTR)ptrMapping.pOld, (UINT_PTR)ptrMapping.pNew, (char*)ptrMapping.pNew );\r
-    }*/\r
-\r
-lExit:\r
-    return hr;\r
-}\r
-\r
-// Used in cloning, copy the unoptimized type pool from pEffectSource to this and build mappingTableTypes\r
-// for use in RemapType.  mappingTableStrings is the mapping table previously filled when copying strings.\r
-HRESULT CEffect::CopyTypePool( CEffect* pEffectSource, CPointerMappingTable& mappingTableTypes, CPointerMappingTable& mappingTableStrings )\r
-{\r
-    HRESULT hr = S_OK;\r
-    D3DXASSERT( m_pPooledHeap != NULL );\r
-    VN( m_pTypePool = NEW CEffect::CTypeHashTable );\r
-    m_pTypePool->SetPrivateHeap(m_pPooledHeap);\r
-    VH( m_pTypePool->AutoGrow() );\r
-\r
-    CTypeHashTable::CIterator typeIter;\r
-    CPointerMappingTable::CIterator mapIter;\r
-\r
-    // first pass: move types over, build mapping table\r
-    for (pEffectSource->m_pTypePool->GetFirstEntry(&typeIter); !pEffectSource->m_pTypePool->PastEnd(&typeIter); pEffectSource->m_pTypePool->GetNextEntry(&typeIter))\r
-    {\r
-        SPointerMapping ptrMapping;\r
-        SType *pType;\r
-\r
-        ptrMapping.pOld = typeIter.GetData();\r
-        UINT hash = ptrMapping.Hash();\r
-        VN( (ptrMapping.pNew) = new(*m_pPooledHeap) SType );\r
-        memcpy(ptrMapping.pNew, ptrMapping.pOld, sizeof(SType));\r
-\r
-        pType = (SType *) ptrMapping.pNew;\r
-\r
-        // if this is a struct, move its members to the newly allocated space\r
-        if (EVT_Struct == pType->VarType)\r
-        {\r
-            SVariable* pOldMembers = pType->StructType.pMembers;\r
-            VN( pType->StructType.pMembers = new(*m_pPooledHeap) SVariable[pType->StructType.Members] );\r
-            memcpy(pType->StructType.pMembers, pOldMembers, pType->StructType.Members * sizeof(SVariable));\r
-        }\r
-\r
-        VH( m_pTypePool->AddValueWithHash(pType, hash) );\r
-        VH( mappingTableTypes.AddValueWithHash(ptrMapping, hash) );\r
-    }\r
-\r
-    // second pass: fixup structure member & name pointers\r
-    for (mappingTableTypes.GetFirstEntry(&mapIter); !mappingTableTypes.PastEnd(&mapIter); mappingTableTypes.GetNextEntry(&mapIter))\r
-    {\r
-        SPointerMapping ptrMapping = mapIter.GetData();\r
-\r
-        // Uncomment to print type mapping\r
-        //DPF(0, "type: 0x%x : 0x%x", (UINT_PTR)ptrMapping.pOld, (UINT_PTR)ptrMapping.pNew );\r
-\r
-        SType *pType = (SType *) ptrMapping.pNew;\r
-\r
-        if( pType->pTypeName )\r
-        {\r
-            VH( RemapString(&pType->pTypeName, &mappingTableStrings) );\r
-        }\r
-\r
-        // if this is a struct, fix up its members' pointers\r
-        if (EVT_Struct == pType->VarType)\r
-        {\r
-            for (UINT i = 0; i < pType->StructType.Members; ++ i)\r
-            {\r
-                VH( RemapType((SType**)&pType->StructType.pMembers[i].pType, &mappingTableTypes) );\r
-                if( pType->StructType.pMembers[i].pName )\r
-                {\r
-                    VH( RemapString(&pType->StructType.pMembers[i].pName, &mappingTableStrings) );\r
-                }\r
-                if( pType->StructType.pMembers[i].pSemantic )\r
-                {\r
-                    VH( RemapString(&pType->StructType.pMembers[i].pSemantic, &mappingTableStrings) );\r
-                }\r
-            }\r
-        }\r
-    } \r
-\r
-lExit:\r
-    return hr;\r
-}\r
-\r
-// Used in cloning, copy the unoptimized type pool from pEffectSource to this and build mappingTableTypes\r
-// for use in RemapType.  mappingTableStrings is the mapping table previously filled when copying strings.\r
-HRESULT CEffect::CopyOptimizedTypePool( CEffect* pEffectSource, CPointerMappingTable& mappingTableTypes )\r
-{\r
-    HRESULT hr = S_OK;\r
-    CEffectHeap* pOptimizedTypeHeap = NULL;\r
-\r
-    D3DXASSERT( pEffectSource->m_pOptimizedTypeHeap != NULL );\r
-    D3DXASSERT( m_pTypePool == NULL );\r
-    D3DXASSERT( m_pStringPool == NULL );\r
-    D3DXASSERT( m_pPooledHeap == NULL );\r
-\r
-    VN( pOptimizedTypeHeap = NEW CEffectHeap );\r
-    VH( pOptimizedTypeHeap->ReserveMemory( pEffectSource->m_pOptimizedTypeHeap->GetSize() ) );\r
-    CPointerMappingTable::CIterator mapIter;\r
-\r
-    // first pass: move types over, build mapping table\r
-    BYTE* pReadTypes = pEffectSource->m_pOptimizedTypeHeap->GetDataStart();\r
-    while( pEffectSource->m_pOptimizedTypeHeap->IsInHeap( pReadTypes ) )\r
-    {\r
-        SPointerMapping ptrMapping;\r
-        SType *pType;\r
-        UINT moveSize;\r
-\r
-        ptrMapping.pOld = ptrMapping.pNew = pReadTypes;\r
-        moveSize = sizeof(SType);\r
-        VH( pOptimizedTypeHeap->MoveData(&ptrMapping.pNew, moveSize) );\r
-        pReadTypes += moveSize;\r
-\r
-        pType = (SType *) ptrMapping.pNew;\r
-\r
-        // if this is a struct, move its members to the newly allocated space\r
-        if (EVT_Struct == pType->VarType)\r
-        {\r
-            moveSize = pType->StructType.Members * sizeof(SVariable);\r
-            VH( pOptimizedTypeHeap->MoveData((void **)&pType->StructType.pMembers, moveSize) );\r
-            pReadTypes += moveSize;\r
-        }\r
-\r
-        VH( mappingTableTypes.AddValueWithHash(ptrMapping, ptrMapping.Hash()) );\r
-    }\r
-\r
-    // second pass: fixup structure member & name pointers\r
-    for (mappingTableTypes.GetFirstEntry(&mapIter); !mappingTableTypes.PastEnd(&mapIter); mappingTableTypes.GetNextEntry(&mapIter))\r
-    {\r
-        SPointerMapping ptrMapping = mapIter.GetData();\r
-\r
-        // Uncomment to print type mapping\r
-        //DPF(0, "type: 0x%x : 0x%x", (UINT_PTR)ptrMapping.pOld, (UINT_PTR)ptrMapping.pNew );\r
-\r
-        SType *pType = (SType *) ptrMapping.pNew;\r
-\r
-        // if this is a struct, fix up its members' pointers\r
-        if (EVT_Struct == pType->VarType)\r
-        {\r
-            for (UINT i = 0; i < pType->StructType.Members; ++ i)\r
-            {\r
-                VH( RemapType((SType**)&pType->StructType.pMembers[i].pType, &mappingTableTypes) );\r
-            }\r
-        }\r
-    }  \r
-\r
-lExit:\r
-    return hr;\r
-}\r
-\r
-// Used in cloning, create new ID3D11ConstantBuffers for each non-single CB\r
-HRESULT CEffect::RecreateCBs()\r
-{\r
-    HRESULT hr = S_OK;\r
-    UINT i; // after a failure, this holds the failing index\r
-\r
-    for (i = 0; i < m_CBCount; ++ i)\r
-    {\r
-        SConstantBuffer* pCB = &m_pCBs[i];\r
-\r
-        pCB->IsNonUpdatable = pCB->IsUserManaged || pCB->ClonedSingle();\r
-\r
-        if( pCB->Size > 0 && !pCB->ClonedSingle() )\r
-        {\r
-            ID3D11Buffer** ppOriginalBuffer;\r
-            ID3D11ShaderResourceView** ppOriginalTBufferView;\r
-\r
-            if( pCB->IsUserManaged )\r
-            {\r
-                ppOriginalBuffer = &pCB->pMemberData[0].Data.pD3DEffectsManagedConstantBuffer;\r
-                ppOriginalTBufferView = &pCB->pMemberData[1].Data.pD3DEffectsManagedTextureBuffer;\r
-            }\r
-            else\r
-            {\r
-                ppOriginalBuffer = &pCB->pD3DObject;\r
-                ppOriginalTBufferView = &pCB->TBuffer.pShaderResource;\r
-            }\r
-\r
-            VN( *ppOriginalBuffer );\r
-            D3D11_BUFFER_DESC bufDesc;\r
-            (*ppOriginalBuffer)->GetDesc( &bufDesc );\r
-            ID3D11Buffer* pNewBuffer = NULL;\r
-            VH( m_pDevice->CreateBuffer( &bufDesc, NULL, &pNewBuffer ) );\r
-            (*ppOriginalBuffer)->Release();\r
-            (*ppOriginalBuffer) = pNewBuffer;\r
-            pNewBuffer = NULL;\r
-\r
-            if( pCB->IsTBuffer )\r
-            {\r
-                VN( *ppOriginalTBufferView );\r
-                D3D11_SHADER_RESOURCE_VIEW_DESC viewDesc;\r
-                (*ppOriginalTBufferView)->GetDesc( &viewDesc );\r
-                ID3D11ShaderResourceView* pNewView = NULL;\r
-                VH( m_pDevice->CreateShaderResourceView( (*ppOriginalBuffer), &viewDesc, &pNewView) );\r
-                (*ppOriginalTBufferView)->Release();\r
-                (*ppOriginalTBufferView) = pNewView;\r
-                pNewView = NULL;\r
-            }\r
-            else\r
-            {\r
-                D3DXASSERT( *ppOriginalTBufferView == NULL );\r
-                ReplaceCBReference( pCB, (*ppOriginalBuffer) );\r
-            }\r
-\r
-            pCB->IsDirty = TRUE;\r
-        }\r
-    }\r
-\r
-lExit:\r
-    return hr;\r
-}\r
-\r
-// Move Name and Semantic strings using mappingTableStrings\r
-HRESULT CEffect::FixupMemberInterface( SMember* pMember, CEffect* pEffectSource, CPointerMappingTable& mappingTableStrings )\r
-{\r
-    HRESULT hr = S_OK;\r
-\r
-    if( pMember->pName )\r
-    {\r
-        if( pEffectSource->m_pReflection && pEffectSource->m_pReflection->m_Heap.IsInHeap(pMember->pName) )\r
-        {\r
-            pMember->pName = (char*)((UINT_PTR)pMember->pName - (UINT_PTR)pEffectSource->m_pReflection->m_Heap.GetDataStart() + (UINT_PTR)m_pReflection->m_Heap.GetDataStart());\r
-        }\r
-        else\r
-        {\r
-            VH( RemapString(&pMember->pName, &mappingTableStrings) );\r
-        }\r
-    }\r
-    if( pMember->pSemantic )\r
-    {\r
-        if( pEffectSource->m_pReflection && pEffectSource->m_pReflection->m_Heap.IsInHeap(pMember->pSemantic) )\r
-        {\r
-            pMember->pSemantic = (char*)((UINT_PTR)pMember->pSemantic - (UINT_PTR)pEffectSource->m_pReflection->m_Heap.GetDataStart() + (UINT_PTR)m_pReflection->m_Heap.GetDataStart());\r
-        }\r
-        else\r
-        {\r
-            VH( RemapString(&pMember->pSemantic, &mappingTableStrings) );\r
-        }\r
-    }\r
-\r
-lExit:\r
-    return hr;\r
-}\r
-\r
-//////////////////////////////////////////////////////////////////////////\r
-// Public API to create a copy of this effect\r
-HRESULT CEffect::CloneEffect(UINT Flags, ID3DX11Effect** ppClonedEffect )\r
-{\r
-    HRESULT hr = S_OK;\r
-    CPointerMappingTable mappingTableTypes;\r
-    CPointerMappingTable mappingTableStrings;\r
-\r
-    CEffectLoader loader;\r
-    CEffect* pNewEffect = NULL;    \r
-    CDataBlockStore* pTempHeap = NULL;\r
-\r
-\r
-    VN( pNewEffect = NEW CEffect( m_Flags ) );\r
-    if( Flags & D3DX11_EFFECT_CLONE_FORCE_NONSINGLE )\r
-    {\r
-        // The effect is cloned as if there was no original, so don't mark it as cloned\r
-        pNewEffect->m_Flags &= ~(UINT)D3DX11_EFFECT_CLONE;\r
-    }\r
-    else\r
-    {\r
-        pNewEffect->m_Flags |= D3DX11_EFFECT_CLONE;\r
-    }\r
-\r
-    pNewEffect->m_VariableCount = m_VariableCount;\r
-    pNewEffect->m_pVariables = m_pVariables;\r
-    pNewEffect->m_AnonymousShaderCount = m_AnonymousShaderCount;\r
-    pNewEffect->m_pAnonymousShaders = m_pAnonymousShaders;\r
-    pNewEffect->m_TechniqueCount = m_TechniqueCount;\r
-    pNewEffect->m_GroupCount = m_GroupCount;\r
-    pNewEffect->m_pGroups = m_pGroups;\r
-    pNewEffect->m_pNullGroup = m_pNullGroup;\r
-    pNewEffect->m_ShaderBlockCount = m_ShaderBlockCount;\r
-    pNewEffect->m_pShaderBlocks = m_pShaderBlocks;\r
-    pNewEffect->m_DepthStencilBlockCount = m_DepthStencilBlockCount;\r
-    pNewEffect->m_pDepthStencilBlocks = m_pDepthStencilBlocks;\r
-    pNewEffect->m_BlendBlockCount = m_BlendBlockCount;\r
-    pNewEffect->m_pBlendBlocks = m_pBlendBlocks;\r
-    pNewEffect->m_RasterizerBlockCount = m_RasterizerBlockCount;\r
-    pNewEffect->m_pRasterizerBlocks = m_pRasterizerBlocks;\r
-    pNewEffect->m_SamplerBlockCount = m_SamplerBlockCount;\r
-    pNewEffect->m_pSamplerBlocks = m_pSamplerBlocks;\r
-    pNewEffect->m_MemberDataCount = m_MemberDataCount;\r
-    pNewEffect->m_pMemberDataBlocks = m_pMemberDataBlocks;\r
-    pNewEffect->m_InterfaceCount = m_InterfaceCount;\r
-    pNewEffect->m_pInterfaces = m_pInterfaces;\r
-    pNewEffect->m_CBCount = m_CBCount;\r
-    pNewEffect->m_pCBs = m_pCBs;\r
-    pNewEffect->m_StringCount = m_StringCount;\r
-    pNewEffect->m_pStrings = m_pStrings;\r
-    pNewEffect->m_ShaderResourceCount = m_ShaderResourceCount;\r
-    pNewEffect->m_pShaderResources = m_pShaderResources;\r
-    pNewEffect->m_UnorderedAccessViewCount = m_UnorderedAccessViewCount;\r
-    pNewEffect->m_pUnorderedAccessViews = m_pUnorderedAccessViews;\r
-    pNewEffect->m_RenderTargetViewCount = m_RenderTargetViewCount;\r
-    pNewEffect->m_pRenderTargetViews = m_pRenderTargetViews;\r
-    pNewEffect->m_DepthStencilViewCount = m_DepthStencilViewCount;\r
-    pNewEffect->m_pDepthStencilViews = m_pDepthStencilViews; \r
-    pNewEffect->m_LocalTimer = m_LocalTimer;\r
-    pNewEffect->m_FXLIndex = m_FXLIndex;\r
-    pNewEffect->m_pDevice = m_pDevice;\r
-    pNewEffect->m_pClassLinkage = m_pClassLinkage;\r
-\r
-    pNewEffect->AddRefAllForCloning( this );\r
-\r
-\r
-    // m_pMemberInterfaces is a vector of cbuffer members that were created when the user called GetMemberBy* or GetElement\r
-    // or during Effect loading when an interface is initialized to a global class variable elment.\r
-    VH( pNewEffect->CopyMemberInterfaces( this ) );\r
-\r
-    loader.m_pvOldMemberInterfaces = &m_pMemberInterfaces;\r
-    loader.m_pEffect = pNewEffect;\r
-    loader.m_EffectMemory = loader.m_ReflectionMemory = 0;\r
-\r
-\r
-    // Move data from current effect to new effect\r
-    if( !IsOptimized() )\r
-    {\r
-        VN( pNewEffect->m_pReflection = NEW CEffectReflection() );\r
-        loader.m_pReflection = pNewEffect->m_pReflection;\r
-\r
-        // make sure strings are moved before ReallocateEffectData\r
-        VH( loader.InitializeReflectionDataAndMoveStrings( m_pReflection->m_Heap.GetSize() ) );\r
-    }\r
-    VH( loader.ReallocateEffectData( true ) );\r
-    if( !IsOptimized() )\r
-    {\r
-        VH( loader.ReallocateReflectionData( true ) );\r
-    }\r
-\r
-\r
-    // Data structures for remapping type pointers and string pointers\r
-    VN( pTempHeap = NEW CDataBlockStore );\r
-    pTempHeap->EnableAlignment();\r
-    mappingTableTypes.SetPrivateHeap(pTempHeap);\r
-    mappingTableStrings.SetPrivateHeap(pTempHeap);\r
-    VH( mappingTableTypes.AutoGrow() );\r
-    VH( mappingTableStrings.AutoGrow() );\r
-\r
-    if( !IsOptimized() )\r
-    {\r
-        // Let's re-create the type pool and string pool\r
-        VN( pNewEffect->m_pPooledHeap = NEW CDataBlockStore );\r
-        pNewEffect->m_pPooledHeap->EnableAlignment();\r
-\r
-        VH( pNewEffect->CopyStringPool( this, mappingTableStrings ) );\r
-        VH( pNewEffect->CopyTypePool( this, mappingTableTypes, mappingTableStrings ) );\r
-    }\r
-    else\r
-    {\r
-        // There's no string pool after optimizing.  Let's re-create the type pool\r
-        VH( pNewEffect->CopyOptimizedTypePool( this, mappingTableTypes ) );\r
-    }\r
-\r
-    // fixup this effect's variable's types\r
-    VH( pNewEffect->OptimizeTypes(&mappingTableTypes, true) );\r
-    VH( pNewEffect->RecreateCBs() );\r
-\r
-\r
-    for (UINT i = 0; i < pNewEffect->m_pMemberInterfaces.GetSize(); ++ i)\r
-    {\r
-        SMember* pMember = pNewEffect->m_pMemberInterfaces[i];\r
-        VH( pNewEffect->FixupMemberInterface( pMember, this, mappingTableStrings ) );\r
-    }\r
-\r
-\r
-lExit:\r
-    SAFE_DELETE( pTempHeap );\r
-    if( FAILED( hr ) )\r
-    {\r
-        SAFE_DELETE( pNewEffect );\r
-    }\r
-    *ppClonedEffect = pNewEffect;\r
-    return hr;\r
-}\r
-\r
-// Move all type pointers using pMappingTable.\r
-// This is called after creating the optimized type pool or during cloning.\r
-HRESULT CEffect::OptimizeTypes(CPointerMappingTable *pMappingTable, bool Cloning)\r
-{\r
-    HRESULT hr = S_OK;\r
-    UINT  i;\r
-\r
-    // find all child types, point them to the new location\r
-    for (i = 0; i < m_VariableCount; ++ i)\r
-    {\r
-        VH( RemapType((SType**)&m_pVariables[i].pType, pMappingTable) );\r
-    }\r
-\r
-    UINT Members = m_pMemberInterfaces.GetSize();\r
-    for( i=0; i < Members; i++ )\r
-    {\r
-        if( m_pMemberInterfaces[i] != NULL )\r
-        {\r
-            VH( RemapType((SType**)&m_pMemberInterfaces[i]->pType, pMappingTable) );\r
-        }\r
-    }\r
-\r
-    // when cloning, there may be annotations\r
-    if( Cloning )\r
-    {\r
-        for (UINT iVar = 0; iVar < m_VariableCount; ++ iVar)\r
-        {\r
-            for(i = 0; i < m_pVariables[iVar].AnnotationCount; ++ i )\r
-            {\r
-                VH( RemapType((SType**)&m_pVariables[iVar].pAnnotations[i].pType, pMappingTable) );\r
-            }\r
-        }\r
-        for (UINT iCB = 0; iCB < m_CBCount; ++ iCB)\r
-        {\r
-            for(i = 0; i < m_pCBs[iCB].AnnotationCount; ++ i )\r
-            {\r
-                VH( RemapType((SType**)&m_pCBs[iCB].pAnnotations[i].pType, pMappingTable) );\r
-            }\r
-        }\r
-        for (UINT iGroup = 0; iGroup < m_GroupCount; ++ iGroup)\r
-        {\r
-            for(i = 0; i < m_pGroups[iGroup].AnnotationCount; ++ i )\r
-            {\r
-                VH( RemapType((SType**)&m_pGroups[iGroup].pAnnotations[i].pType, pMappingTable) );\r
-            }\r
-            for(UINT iTech = 0; iTech < m_pGroups[iGroup].TechniqueCount; ++ iTech )\r
-            {\r
-                for(i = 0; i < m_pGroups[iGroup].pTechniques[iTech].AnnotationCount; ++ i )\r
-                {\r
-                    VH( RemapType((SType**)&m_pGroups[iGroup].pTechniques[iTech].pAnnotations[i].pType, pMappingTable) );\r
-                }\r
-                for(UINT iPass = 0; iPass < m_pGroups[iGroup].pTechniques[iTech].PassCount; ++ iPass )\r
-                {\r
-                    for(i = 0; i < m_pGroups[iGroup].pTechniques[iTech].pPasses[iPass].AnnotationCount; ++ i )\r
-                    {\r
-                        VH( RemapType((SType**)&m_pGroups[iGroup].pTechniques[iTech].pPasses[iPass].pAnnotations[i].pType, pMappingTable) );\r
-                    }\r
-                }\r
-            }\r
-        }\r
-    }\r
-lExit:\r
-    return hr;\r
-}\r
-\r
-//////////////////////////////////////////////////////////////////////////\r
-// Public API to shed this effect of its reflection data\r
-HRESULT CEffect::Optimize()\r
-{\r
-    HRESULT hr = S_OK;\r
-    UINT  i, j, k;\r
-    CEffectHeap *pOptimizedTypeHeap = NULL;\r
-    \r
-    if (IsOptimized())\r
-    {\r
-        DPF(0, "ID3DX11Effect::Optimize: Effect has already been Optimize()'ed");\r
-        return S_OK;\r
-    }\r
-\r
-    // Delete annotations, names, semantics, and string data on variables\r
-    \r
-    for (i = 0; i < m_VariableCount; ++ i)\r
-    {\r
-        m_pVariables[i].AnnotationCount = 0;\r
-        m_pVariables[i].pAnnotations = NULL;\r
-        m_pVariables[i].pName = NULL;\r
-        m_pVariables[i].pSemantic = NULL;\r
-\r
-        // 2) Point string variables to NULL\r
-        if (m_pVariables[i].pType->IsObjectType(EOT_String))\r
-        {\r
-            D3DXASSERT(NULL != m_pVariables[i].Data.pString);\r
-            m_pVariables[i].Data.pString = NULL;\r
-        }\r
-    }\r
-\r
-    // Delete annotations and names on CBs\r
-\r
-    for (i = 0; i < m_CBCount; ++ i)\r
-    {\r
-        m_pCBs[i].AnnotationCount = 0;\r
-        m_pCBs[i].pAnnotations = NULL;\r
-        m_pCBs[i].pName = NULL;\r
-        m_pCBs[i].IsEffectOptimized = TRUE;\r
-    }\r
-\r
-    // Delete annotations and names on techniques and passes\r
-\r
-    for (i = 0; i < m_GroupCount; ++ i)\r
-    {\r
-        m_pGroups[i].AnnotationCount = 0;\r
-        m_pGroups[i].pAnnotations = NULL;\r
-        m_pGroups[i].pName = NULL;\r
-\r
-        for (j = 0; j < m_pGroups[i].TechniqueCount; ++ j)\r
-        {\r
-            m_pGroups[i].pTechniques[j].AnnotationCount = 0;\r
-            m_pGroups[i].pTechniques[j].pAnnotations = NULL;\r
-            m_pGroups[i].pTechniques[j].pName = NULL;\r
-\r
-            for (k = 0; k < m_pGroups[i].pTechniques[j].PassCount; ++ k)\r
-            {\r
-                m_pGroups[i].pTechniques[j].pPasses[k].AnnotationCount = 0;\r
-                m_pGroups[i].pTechniques[j].pPasses[k].pAnnotations = NULL;\r
-                m_pGroups[i].pTechniques[j].pPasses[k].pName = NULL;\r
-            }\r
-        }\r
-    };\r
-\r
-    // 2) Remove shader bytecode & stream out decls\r
-    //    (all are contained within pReflectionData)\r
-\r
-    for (i = 0; i < m_ShaderBlockCount; ++ i)\r
-    {\r
-        if( m_pShaderBlocks[i].pReflectionData )\r
-        {\r
-            // pReflection was not created with PRIVATENEW\r
-            SAFE_RELEASE( m_pShaderBlocks[i].pReflectionData->pReflection );\r
-\r
-            m_pShaderBlocks[i].pReflectionData = NULL;\r
-        }\r
-    }\r
-\r
-    UINT Members = m_pMemberInterfaces.GetSize();\r
-    for( i=0; i < Members; i++ )\r
-    {\r
-        D3DXASSERT( m_pMemberInterfaces[i] != NULL );\r
-        if( IsReflectionData(m_pMemberInterfaces[i]->pTopLevelEntity) )\r
-        {\r
-            D3DXASSERT( IsReflectionData(m_pMemberInterfaces[i]->Data.pGeneric) );\r
-\r
-            // This is checked when cloning (so we don't clone Optimized-out member variables)\r
-            m_pMemberInterfaces[i] = NULL;\r
-        }\r
-        else\r
-        {\r
-            m_pMemberInterfaces[i]->pName = NULL;\r
-            m_pMemberInterfaces[i]->pSemantic = NULL;\r
-        }\r
-    }\r
-\r
-\r
-\r
-    // get rid of the name/type hash tables and string data, \r
-    // then reallocate the type data and fix up this effect\r
-    CPointerMappingTable mappingTable;\r
-    CTypeHashTable::CIterator typeIter;\r
-    CPointerMappingTable::CIterator mapIter;\r
-    CCheckedDword chkSpaceNeeded = 0;\r
-    UINT  spaceNeeded;\r
-\r
-    // first pass: compute needed space\r
-    for (m_pTypePool->GetFirstEntry(&typeIter); !m_pTypePool->PastEnd(&typeIter); m_pTypePool->GetNextEntry(&typeIter))\r
-    {\r
-        SType *pType = typeIter.GetData();\r
-        \r
-        chkSpaceNeeded += AlignToPowerOf2(sizeof(SType), c_DataAlignment);\r
-\r
-        // if this is a struct, allocate room for its members\r
-        if (EVT_Struct == pType->VarType)\r
-        {\r
-            chkSpaceNeeded += AlignToPowerOf2(pType->StructType.Members * sizeof(SVariable), c_DataAlignment);\r
-        }\r
-    }\r
-\r
-    VH( chkSpaceNeeded.GetValue(&spaceNeeded) );\r
-\r
-    D3DXASSERT(NULL == m_pOptimizedTypeHeap);\r
-    VN( pOptimizedTypeHeap = NEW CEffectHeap );\r
-    VH( pOptimizedTypeHeap->ReserveMemory(spaceNeeded));\r
-\r
-    // use the private heap that we're about to destroy as scratch space for the mapping table\r
-    mappingTable.SetPrivateHeap(m_pPooledHeap);\r
-    VH( mappingTable.AutoGrow() );\r
-\r
-    // second pass: move types over, build mapping table\r
-    for (m_pTypePool->GetFirstEntry(&typeIter); !m_pTypePool->PastEnd(&typeIter); m_pTypePool->GetNextEntry(&typeIter))\r
-    {\r
-        SPointerMapping ptrMapping;\r
-        SType *pType;\r
-\r
-        ptrMapping.pOld = ptrMapping.pNew = typeIter.GetData();\r
-        VH( pOptimizedTypeHeap->MoveData(&ptrMapping.pNew, sizeof(SType)) );\r
-\r
-        pType = (SType *) ptrMapping.pNew;\r
-\r
-        // if this is a struct, move its members to the newly allocated space\r
-        if (EVT_Struct == pType->VarType)\r
-        {\r
-            VH( pOptimizedTypeHeap->MoveData((void **)&pType->StructType.pMembers, pType->StructType.Members * sizeof(SVariable)) );\r
-        }\r
-\r
-        VH( mappingTable.AddValueWithHash(ptrMapping, ptrMapping.Hash()) );\r
-    }\r
-    \r
-    // third pass: fixup structure member & name pointers\r
-    for (mappingTable.GetFirstEntry(&mapIter); !mappingTable.PastEnd(&mapIter); mappingTable.GetNextEntry(&mapIter))\r
-    {\r
-        SPointerMapping ptrMapping = mapIter.GetData();\r
-        SType *pType = (SType *) ptrMapping.pNew;\r
-\r
-        pType->pTypeName = NULL;\r
-\r
-        // if this is a struct, fix up its members' pointers\r
-        if (EVT_Struct == pType->VarType)\r
-        {\r
-            for (i = 0; i < pType->StructType.Members; ++ i)\r
-            {\r
-                VH( RemapType((SType**)&pType->StructType.pMembers[i].pType, &mappingTable) );\r
-                pType->StructType.pMembers[i].pName = NULL;\r
-                pType->StructType.pMembers[i].pSemantic = NULL;\r
-            }\r
-        }\r
-    }        \r
-\r
-    // fixup this effect's variable's types\r
-    VH( OptimizeTypes(&mappingTable) );\r
-\r
-    m_pOptimizedTypeHeap = pOptimizedTypeHeap;\r
-    pOptimizedTypeHeap = NULL;\r
-\r
-#ifdef D3DX11_FX_PRINT_HASH_STATS\r
-    DPF(0, "Compiler string pool hash table statistics:");\r
-    m_pTypePool->PrintHashTableStats();\r
-    DPF(0, "Compiler type pool hash table statistics:");\r
-    m_pStringPool->PrintHashTableStats();\r
-#endif // D3DX11_FX_PRINT_HASH_STATS\r
-\r
-    SAFE_DELETE(m_pTypePool);\r
-    SAFE_DELETE(m_pStringPool);\r
-    SAFE_DELETE(m_pPooledHeap);\r
-\r
-    DPF(0, "ID3DX11Effect::Optimize: %d bytes of reflection data freed.", m_pReflection->m_Heap.GetSize());\r
-    SAFE_DELETE(m_pReflection);\r
-    m_Flags |= D3DX11_EFFECT_OPTIMIZED;\r
-\r
-lExit:\r
-    SAFE_DELETE(pOptimizedTypeHeap);\r
-    return hr;\r
-}\r
-\r
-SMember * CreateNewMember(SType *pType, BOOL IsAnnotation)\r
-{\r
-    switch (pType->VarType)\r
-    {\r
-    case EVT_Struct:\r
-        if (IsAnnotation)\r
-        {\r
-            D3DXASSERT(sizeof(SNumericAnnotationMember) == sizeof(SMember));\r
-            return (SMember*) NEW SNumericAnnotationMember;\r
-        }\r
-        else if (pType->StructType.ImplementsInterface)\r
-        {\r
-            D3DXASSERT(sizeof(SClassInstanceGlobalVariableMember) == sizeof(SMember));\r
-            return (SMember*) NEW SClassInstanceGlobalVariableMember;\r
-        }\r
-        else\r
-        {\r
-            D3DXASSERT(sizeof(SNumericGlobalVariableMember) == sizeof(SMember));\r
-            return (SMember*) NEW SNumericGlobalVariableMember;\r
-        }\r
-        break;\r
-    case EVT_Interface:\r
-        D3DXASSERT(sizeof(SInterfaceGlobalVariableMember) == sizeof(SMember));\r
-        return (SMember*) NEW SInterfaceGlobalVariableMember;\r
-        break;\r
-    case EVT_Object:\r
-        switch (pType->ObjectType)\r
-        {\r
-        case EOT_String:\r
-            if (IsAnnotation)\r
-            {\r
-                D3DXASSERT(sizeof(SStringAnnotationMember) == sizeof(SMember));\r
-                return (SMember*) NEW SStringAnnotationMember;\r
-            }\r
-            else\r
-            {\r
-                D3DXASSERT(sizeof(SStringGlobalVariableMember) == sizeof(SMember));\r
-                return (SMember*) NEW SStringGlobalVariableMember;\r
-            }\r
-\r
-            break;\r
-        case EOT_Texture:\r
-        case EOT_Texture1D:\r
-        case EOT_Texture1DArray:\r
-        case EOT_Texture2D:\r
-        case EOT_Texture2DArray:\r
-        case EOT_Texture2DMS:\r
-        case EOT_Texture2DMSArray:\r
-        case EOT_Texture3D:\r
-        case EOT_TextureCube:\r
-        case EOT_TextureCubeArray:\r
-        case EOT_Buffer:\r
-        case EOT_ByteAddressBuffer:\r
-        case EOT_StructuredBuffer:\r
-            D3DXASSERT(!IsAnnotation);\r
-            D3DXASSERT(sizeof(SShaderResourceGlobalVariableMember) == sizeof(SMember));\r
-            return (SMember*) NEW SShaderResourceGlobalVariableMember;\r
-            break;\r
-        case EOT_RWTexture1D:\r
-        case EOT_RWTexture1DArray:\r
-        case EOT_RWTexture2D:\r
-        case EOT_RWTexture2DArray:\r
-        case EOT_RWTexture3D:\r
-        case EOT_RWBuffer:\r
-        case EOT_RWByteAddressBuffer:\r
-        case EOT_RWStructuredBuffer:\r
-        case EOT_RWStructuredBufferAlloc:\r
-        case EOT_RWStructuredBufferConsume:\r
-        case EOT_AppendStructuredBuffer:\r
-        case EOT_ConsumeStructuredBuffer:\r
-            D3DXASSERT(!IsAnnotation);\r
-            D3DXASSERT(sizeof(SUnorderedAccessViewGlobalVariableMember) == sizeof(SMember));\r
-            return (SMember*) NEW SUnorderedAccessViewGlobalVariableMember;\r
-            break;\r
-        case EOT_VertexShader:\r
-        case EOT_VertexShader5:\r
-        case EOT_GeometryShader:\r
-        case EOT_GeometryShaderSO:\r
-        case EOT_GeometryShader5:\r
-        case EOT_PixelShader:\r
-        case EOT_PixelShader5:\r
-        case EOT_HullShader5:\r
-        case EOT_DomainShader5:\r
-        case EOT_ComputeShader5:\r
-            D3DXASSERT(!IsAnnotation);\r
-            D3DXASSERT(sizeof(SShaderGlobalVariableMember) == sizeof(SMember));\r
-            return (SMember*) NEW SShaderGlobalVariableMember;\r
-            break;\r
-        case EOT_Blend:\r
-            D3DXASSERT(!IsAnnotation);\r
-            D3DXASSERT(sizeof(SBlendGlobalVariableMember) == sizeof(SMember));\r
-            return (SMember*) NEW SBlendGlobalVariableMember;\r
-            break;\r
-        case EOT_Rasterizer:\r
-            D3DXASSERT(!IsAnnotation);\r
-            D3DXASSERT(sizeof(SRasterizerGlobalVariableMember) == sizeof(SMember));\r
-            return (SMember*) NEW SRasterizerGlobalVariableMember;\r
-            break;\r
-        case EOT_DepthStencil:\r
-            D3DXASSERT(!IsAnnotation);\r
-            D3DXASSERT(sizeof(SDepthStencilGlobalVariableMember) == sizeof(SMember));\r
-            return (SMember*) NEW SDepthStencilGlobalVariableMember;\r
-            break;\r
-        case EOT_Sampler:\r
-            D3DXASSERT(!IsAnnotation);\r
-            D3DXASSERT(sizeof(SSamplerGlobalVariableMember) == sizeof(SMember));\r
-            return (SMember*) NEW SSamplerGlobalVariableMember;\r
-            break;\r
-        case EOT_DepthStencilView:\r
-            D3DXASSERT(!IsAnnotation);\r
-            D3DXASSERT(sizeof(SDepthStencilViewGlobalVariableMember) == sizeof(SMember));\r
-            return (SMember*) NEW SDepthStencilViewGlobalVariableMember;\r
-            break;\r
-        case EOT_RenderTargetView:\r
-            D3DXASSERT(!IsAnnotation);\r
-            D3DXASSERT(sizeof(SRenderTargetViewGlobalVariableMember) == sizeof(SMember));\r
-            return (SMember*) NEW SRenderTargetViewGlobalVariableMember;\r
-            break;\r
-        default:\r
-            D3DXASSERT(0);\r
-            DPF( 0, "Internal error: invalid object type." );\r
-            return NULL;\r
-            break;\r
-        }\r
-        break;\r
-    case EVT_Numeric:\r
-        switch (pType->NumericType.NumericLayout)\r
-        {\r
-        case ENL_Matrix:\r
-            if (IsAnnotation)\r
-            {\r
-                D3DXASSERT(sizeof(SMatrixAnnotationMember) == sizeof(SMember));\r
-                return (SMember*) NEW SMatrixAnnotationMember;\r
-            }\r
-            else\r
-            {\r
-                D3DXASSERT(sizeof(SMatrixGlobalVariableMember) == sizeof(SMember));\r
-                D3DXASSERT(sizeof(SMatrix4x4ColumnMajorGlobalVariableMember) == sizeof(SMember));\r
-                D3DXASSERT(sizeof(SMatrix4x4RowMajorGlobalVariableMember) == sizeof(SMember));\r
-\r
-                if (pType->NumericType.Rows == 4 && pType->NumericType.Columns == 4)\r
-                {\r
-                    if (pType->NumericType.IsColumnMajor)\r
-                    {\r
-                        return (SMember*) NEW SMatrix4x4ColumnMajorGlobalVariableMember;\r
-                    }\r
-                    else\r
-                    {\r
-                        return (SMember*) NEW SMatrix4x4RowMajorGlobalVariableMember;\r
-                    }\r
-                }\r
-                else\r
-                {\r
-                    return (SMember*) NEW SMatrixGlobalVariableMember;\r
-                }\r
-            }\r
-            break;\r
-        case ENL_Vector:\r
-            switch (pType->NumericType.ScalarType)\r
-            {\r
-            case EST_Float:\r
-                if (IsAnnotation)\r
-                {\r
-                    D3DXASSERT(sizeof(SFloatVectorAnnotationMember) == sizeof(SMember));\r
-                    return (SMember*) NEW SFloatVectorAnnotationMember;\r
-                }\r
-                else\r
-                {\r
-                    D3DXASSERT(sizeof(SFloatVectorGlobalVariableMember) == sizeof(SMember));\r
-                    D3DXASSERT(sizeof(SFloatVector4GlobalVariableMember) == sizeof(SMember));\r
-\r
-                    if (pType->NumericType.Columns == 4)\r
-                    {\r
-                        return (SMember*) NEW SFloatVector4GlobalVariableMember;\r
-                    }\r
-                    else\r
-                    {\r
-                        return (SMember*) NEW SFloatVectorGlobalVariableMember;\r
-                    }\r
-                }\r
-                break;\r
-            case EST_Bool:\r
-                if (IsAnnotation)\r
-                {\r
-                    D3DXASSERT(sizeof(SBoolVectorAnnotationMember) == sizeof(SMember));\r
-                    return (SMember*) NEW SBoolVectorAnnotationMember;\r
-                }\r
-                else\r
-                {\r
-                    D3DXASSERT(sizeof(SBoolVectorGlobalVariableMember) == sizeof(SMember));\r
-                    return (SMember*) NEW SBoolVectorGlobalVariableMember;\r
-                }\r
-                break;\r
-            case EST_UInt:\r
-            case EST_Int:\r
-                if (IsAnnotation)\r
-                {\r
-                    D3DXASSERT(sizeof(SIntVectorAnnotationMember) == sizeof(SMember));\r
-                    return (SMember*) NEW SIntVectorAnnotationMember;\r
-                }\r
-                else\r
-                {\r
-                    D3DXASSERT(sizeof(SIntVectorGlobalVariableMember) == sizeof(SMember));\r
-                    return (SMember*) NEW SIntVectorGlobalVariableMember;\r
-                }\r
-                break;\r
-            default:\r
-                D3DXASSERT(0);\r
-                DPF( 0, "Internal loading error: invalid vector type." );\r
-                break;\r
-            }\r
-            break;\r
-        case ENL_Scalar:\r
-            switch (pType->NumericType.ScalarType)\r
-            {\r
-            case EST_Float:\r
-                if (IsAnnotation)\r
-                {\r
-                    D3DXASSERT(sizeof(SFloatScalarAnnotationMember) == sizeof(SMember));\r
-                    return (SMember*) NEW SFloatScalarAnnotationMember;\r
-                }\r
-                else\r
-                {\r
-                    D3DXASSERT(sizeof(SFloatScalarGlobalVariableMember) == sizeof(SMember));\r
-                    return (SMember*) NEW SFloatScalarGlobalVariableMember;\r
-                }\r
-                break;\r
-            case EST_UInt:\r
-            case EST_Int:\r
-                if (IsAnnotation)\r
-                {\r
-                    D3DXASSERT(sizeof(SIntScalarAnnotationMember) == sizeof(SMember));\r
-                    return (SMember*) NEW SIntScalarAnnotationMember;\r
-                }\r
-                else\r
-                {\r
-                    D3DXASSERT(sizeof(SIntScalarGlobalVariableMember) == sizeof(SMember));\r
-                    return (SMember*) NEW SIntScalarGlobalVariableMember;\r
-                }\r
-                break;\r
-            case EST_Bool:\r
-                if (IsAnnotation)\r
-                {\r
-                    D3DXASSERT(sizeof(SBoolScalarAnnotationMember) == sizeof(SMember));\r
-                    return (SMember*) NEW SBoolScalarAnnotationMember;\r
-                }\r
-                else\r
-                {\r
-                    D3DXASSERT(sizeof(SBoolScalarGlobalVariableMember) == sizeof(SMember));\r
-                    return (SMember*) NEW SBoolScalarGlobalVariableMember;\r
-                }\r
-                break;\r
-            default:\r
-                DPF( 0, "Internal loading error: invalid scalar type." );\r
-                D3DXASSERT(0);\r
-                break;\r
-            }            \r
-            break;\r
-        default:\r
-            D3DXASSERT(0);\r
-            DPF( 0, "Internal loading error: invalid numeric type." );\r
-            break;\r
-        }\r
-        break;\r
-    default:\r
-        D3DXASSERT(0);\r
-        DPF( 0, "Internal loading error: invalid variable type." );\r
-        break;\r
-    }\r
-    return NULL;\r
-}\r
-\r
-// Global variables are created in place because storage for them was allocated during LoadEffect\r
-HRESULT PlacementNewVariable(void *pVar, SType *pType, BOOL IsAnnotation)\r
-{\r
-    switch (pType->VarType)\r
-    {\r
-    case EVT_Struct:\r
-        if (IsAnnotation)\r
-        {\r
-            D3DXASSERT(sizeof(SNumericAnnotation) == sizeof(SAnnotation));\r
-            new(pVar) SNumericAnnotation();\r
-        }\r
-        else if (pType->StructType.ImplementsInterface)\r
-        {\r
-            D3DXASSERT(sizeof(SClassInstanceGlobalVariable) == sizeof(SGlobalVariable));\r
-            new(pVar) SClassInstanceGlobalVariable;\r
-        }\r
-        else \r
-        {\r
-            D3DXASSERT(sizeof(SNumericGlobalVariable) == sizeof(SGlobalVariable));\r
-            new(pVar) SNumericGlobalVariable;\r
-        }\r
-        break;\r
-    case EVT_Interface:\r
-        D3DXASSERT(sizeof(SInterfaceGlobalVariable) == sizeof(SGlobalVariable));\r
-        new(pVar) SInterfaceGlobalVariable;\r
-        break;\r
-    case EVT_Object:\r
-        switch (pType->ObjectType)\r
-        {\r
-        case EOT_String:\r
-            if (IsAnnotation)\r
-            {\r
-                D3DXASSERT(sizeof(SStringAnnotation) == sizeof(SAnnotation));\r
-                new(pVar) SStringAnnotation;\r
-            }\r
-            else\r
-            {\r
-                D3DXASSERT(sizeof(SStringGlobalVariable) == sizeof(SGlobalVariable));\r
-                new(pVar) SStringGlobalVariable;\r
-            }\r
-            \r
-            break;\r
-        case EOT_Texture:\r
-        case EOT_Texture1D:\r
-        case EOT_Texture1DArray:\r
-        case EOT_Texture2D:\r
-        case EOT_Texture2DArray:\r
-        case EOT_Texture2DMS:\r
-        case EOT_Texture2DMSArray:\r
-        case EOT_Texture3D:\r
-        case EOT_TextureCube:\r
-        case EOT_TextureCubeArray:\r
-        case EOT_Buffer:\r
-        case EOT_ByteAddressBuffer:\r
-        case EOT_StructuredBuffer:\r
-            D3DXASSERT(!IsAnnotation);\r
-            D3DXASSERT(sizeof(SShaderResourceGlobalVariable) == sizeof(SGlobalVariable));\r
-            new(pVar) SShaderResourceGlobalVariable;\r
-            break;\r
-        case EOT_RWTexture1D:\r
-        case EOT_RWTexture1DArray:\r
-        case EOT_RWTexture2D:\r
-        case EOT_RWTexture2DArray:\r
-        case EOT_RWTexture3D:\r
-        case EOT_RWBuffer:\r
-        case EOT_RWByteAddressBuffer:\r
-        case EOT_RWStructuredBuffer:\r
-        case EOT_RWStructuredBufferAlloc:\r
-        case EOT_RWStructuredBufferConsume:\r
-        case EOT_AppendStructuredBuffer:\r
-        case EOT_ConsumeStructuredBuffer:\r
-            D3DXASSERT(!IsAnnotation);\r
-            D3DXASSERT(sizeof(SUnorderedAccessViewGlobalVariable) == sizeof(SGlobalVariable));\r
-            new(pVar) SUnorderedAccessViewGlobalVariable;\r
-            break;\r
-        case EOT_VertexShader:\r
-        case EOT_VertexShader5:\r
-        case EOT_GeometryShader:\r
-        case EOT_GeometryShaderSO:\r
-        case EOT_GeometryShader5:\r
-        case EOT_PixelShader:\r
-        case EOT_PixelShader5:\r
-        case EOT_HullShader5:\r
-        case EOT_DomainShader5:\r
-        case EOT_ComputeShader5:\r
-            D3DXASSERT(!IsAnnotation);\r
-            D3DXASSERT(sizeof(SShaderGlobalVariable) == sizeof(SGlobalVariable));\r
-            new(pVar) SShaderGlobalVariable;\r
-            break;\r
-        case EOT_Blend:\r
-            D3DXASSERT(!IsAnnotation);\r
-            D3DXASSERT(sizeof(SBlendGlobalVariable) == sizeof(SGlobalVariable));\r
-            new(pVar) SBlendGlobalVariable;\r
-            break;\r
-        case EOT_Rasterizer:\r
-            D3DXASSERT(!IsAnnotation);\r
-            D3DXASSERT(sizeof(SRasterizerGlobalVariable) == sizeof(SGlobalVariable));\r
-            new(pVar) SRasterizerGlobalVariable;\r
-            break;\r
-        case EOT_DepthStencil:\r
-            D3DXASSERT(!IsAnnotation);\r
-            D3DXASSERT(sizeof(SDepthStencilGlobalVariable) == sizeof(SGlobalVariable));\r
-            new(pVar) SDepthStencilGlobalVariable;\r
-            break;\r
-        case EOT_Sampler:\r
-            D3DXASSERT(!IsAnnotation);\r
-            D3DXASSERT(sizeof(SSamplerGlobalVariable) == sizeof(SGlobalVariable));\r
-            new(pVar) SSamplerGlobalVariable;\r
-            break;\r
-        case EOT_RenderTargetView:\r
-            D3DXASSERT(!IsAnnotation);\r
-            D3DXASSERT(sizeof(SRenderTargetViewGlobalVariable) == sizeof(SGlobalVariable));\r
-            new(pVar) SRenderTargetViewGlobalVariable;\r
-            break;\r
-        case EOT_DepthStencilView:\r
-            D3DXASSERT(!IsAnnotation);\r
-            D3DXASSERT(sizeof(SDepthStencilViewGlobalVariable) == sizeof(SGlobalVariable));\r
-            new(pVar) SDepthStencilViewGlobalVariable;\r
-            break;\r
-        default:\r
-            D3DXASSERT(0);\r
-            DPF( 0, "Internal loading error: invalid object type." );\r
-            return E_FAIL;\r
-            break;\r
-        }\r
-        break;\r
-    case EVT_Numeric:\r
-        switch (pType->NumericType.NumericLayout)\r
-        {\r
-        case ENL_Matrix:\r
-            if (IsAnnotation)\r
-            {\r
-                D3DXASSERT(sizeof(SMatrixAnnotation) == sizeof(SAnnotation));\r
-                new(pVar) SMatrixAnnotation;\r
-            }\r
-            else\r
-            {\r
-                D3DXASSERT(sizeof(SMatrixGlobalVariable) == sizeof(SGlobalVariable));\r
-                D3DXASSERT(sizeof(SMatrix4x4ColumnMajorGlobalVariable) == sizeof(SGlobalVariable));\r
-                D3DXASSERT(sizeof(SMatrix4x4RowMajorGlobalVariable) == sizeof(SGlobalVariable));\r
-                \r
-                if (pType->NumericType.Rows == 4 && pType->NumericType.Columns == 4)\r
-                {\r
-                    if (pType->NumericType.IsColumnMajor)\r
-                    {\r
-                        new(pVar) SMatrix4x4ColumnMajorGlobalVariable;\r
-                    }\r
-                    else\r
-                    {\r
-                        new(pVar) SMatrix4x4RowMajorGlobalVariable;\r
-                    }\r
-                }\r
-                else\r
-                {\r
-                    new(pVar) SMatrixGlobalVariable;\r
-                }\r
-            }\r
-            break;\r
-        case ENL_Vector:\r
-            switch (pType->NumericType.ScalarType)\r
-            {\r
-            case EST_Float:\r
-                if (IsAnnotation)\r
-                {\r
-                    D3DXASSERT(sizeof(SFloatVectorAnnotation) == sizeof(SAnnotation));\r
-                    new(pVar) SFloatVectorAnnotation;\r
-                }\r
-                else\r
-                {\r
-                    D3DXASSERT(sizeof(SFloatVectorGlobalVariable) == sizeof(SGlobalVariable));\r
-                    D3DXASSERT(sizeof(SFloatVector4GlobalVariable) == sizeof(SGlobalVariable));\r
-\r
-                    if (pType->NumericType.Columns == 4)\r
-                    {\r
-                        new(pVar) SFloatVector4GlobalVariable;\r
-                    }\r
-                    else\r
-                    {\r
-                        new(pVar) SFloatVectorGlobalVariable;\r
-                    }\r
-                }\r
-                break;\r
-            case EST_Bool:\r
-                if (IsAnnotation)\r
-                {\r
-                    D3DXASSERT(sizeof(SBoolVectorAnnotation) == sizeof(SAnnotation));\r
-                    new(pVar) SBoolVectorAnnotation;\r
-                }\r
-                else\r
-                {\r
-                    D3DXASSERT(sizeof(SBoolVectorGlobalVariable) == sizeof(SGlobalVariable));\r
-                    new(pVar) SBoolVectorGlobalVariable;\r
-                }\r
-                break;\r
-            case EST_UInt:\r
-            case EST_Int:\r
-                if (IsAnnotation)\r
-                {\r
-                    D3DXASSERT(sizeof(SIntVectorAnnotation) == sizeof(SAnnotation));\r
-                    new(pVar) SIntVectorAnnotation;\r
-                }\r
-                else\r
-                {\r
-                    D3DXASSERT(sizeof(SIntVectorGlobalVariable) == sizeof(SGlobalVariable));\r
-                    new(pVar) SIntVectorGlobalVariable;\r
-                }\r
-                break;\r
-            }\r
-            break;\r
-        case ENL_Scalar:\r
-            switch (pType->NumericType.ScalarType)\r
-            {\r
-            case EST_Float:\r
-                if (IsAnnotation)\r
-                {\r
-                    D3DXASSERT(sizeof(SFloatScalarAnnotation) == sizeof(SAnnotation));\r
-                    new(pVar) SFloatScalarAnnotation;\r
-                }\r
-                else\r
-                {\r
-                    D3DXASSERT(sizeof(SFloatScalarGlobalVariable) == sizeof(SGlobalVariable));\r
-                    new(pVar) SFloatScalarGlobalVariable;\r
-                }\r
-                break;\r
-            case EST_UInt:\r
-            case EST_Int:\r
-                if (IsAnnotation)\r
-                {\r
-                    D3DXASSERT(sizeof(SIntScalarAnnotation) == sizeof(SAnnotation));\r
-                    new(pVar) SIntScalarAnnotation;\r
-                }\r
-                else\r
-                {\r
-                    D3DXASSERT(sizeof(SIntScalarGlobalVariable) == sizeof(SGlobalVariable));\r
-                    new(pVar) SIntScalarGlobalVariable;\r
-                }\r
-                break;\r
-            case EST_Bool:\r
-                if (IsAnnotation)\r
-                {\r
-                    D3DXASSERT(sizeof(SBoolScalarAnnotation) == sizeof(SAnnotation));\r
-                    new(pVar) SBoolScalarAnnotation;\r
-                }\r
-                else\r
-                {\r
-                    D3DXASSERT(sizeof(SBoolScalarGlobalVariable) == sizeof(SGlobalVariable));\r
-                    new(pVar) SBoolScalarGlobalVariable;\r
-                }\r
-                break;\r
-            default:\r
-                D3DXASSERT(0);\r
-                DPF( 0, "Internal loading error: invalid scalar type." );\r
-                return E_FAIL;\r
-                break;\r
-            }            \r
-            break;\r
-        default:\r
-            D3DXASSERT(0);\r
-            DPF( 0, "Internal loading error: invalid numeric type." );\r
-            return E_FAIL;\r
-            break;\r
-        }\r
-        break;\r
-    default:\r
-        D3DXASSERT(0);\r
-        DPF( 0, "Internal loading error: invalid variable type." );\r
-        return E_FAIL;\r
-        break;\r
-    }\r
-    return S_OK;\r
-}\r
-\r
-}\r