1 //////////////////////////////////////////////////////////////////////////////
\r
3 // Copyright (C) Microsoft Corporation. All Rights Reserved.
\r
5 // File: EffectNonRuntime.cpp
\r
6 // Content: D3DX11 Effect low-frequency utility functions
\r
7 // These functions are not intended to be called regularly. They
\r
8 // are typically called when creating, cloning, or optimizing an
\r
9 // Effect, or reflecting a variable.
\r
11 //////////////////////////////////////////////////////////////////////////////
\r
14 #include "SOParser.h"
\r
16 namespace D3DX11Effects
\r
19 extern SUnorderedAccessView g_NullUnorderedAccessView;
\r
21 SBaseBlock::SBaseBlock()
\r
22 : BlockType(EBT_Invalid)
\r
23 , IsUserManaged(FALSE)
\r
24 , AssignmentCount(0)
\r
25 , pAssignments(NULL)
\r
30 SPassBlock::SPassBlock()
\r
33 AnnotationCount = 0;
\r
34 pAnnotations = NULL;
\r
35 InitiallyValid = TRUE;
\r
36 HasDependencies = FALSE;
\r
37 ZeroMemory(&BackingStore, sizeof(BackingStore));
\r
40 STechnique::STechnique()
\r
44 , AnnotationCount(0)
\r
45 , pAnnotations(NULL)
\r
46 , InitiallyValid( TRUE )
\r
47 , HasDependencies( FALSE )
\r
55 , AnnotationCount(0)
\r
56 , pAnnotations(NULL)
\r
57 , InitiallyValid( TRUE )
\r
58 , HasDependencies( FALSE )
\r
62 SDepthStencilBlock::SDepthStencilBlock()
\r
65 ZeroMemory(&BackingStore, sizeof(BackingStore));
\r
68 BackingStore.BackFace.StencilFailOp = D3D11_STENCIL_OP_KEEP;
\r
69 BackingStore.BackFace.StencilFunc = D3D11_COMPARISON_ALWAYS;
\r
70 BackingStore.BackFace.StencilPassOp = D3D11_STENCIL_OP_KEEP;
\r
71 BackingStore.BackFace.StencilDepthFailOp = D3D11_STENCIL_OP_KEEP;
\r
72 BackingStore.DepthEnable = TRUE;
\r
73 BackingStore.DepthFunc = D3D11_COMPARISON_LESS;
\r
74 BackingStore.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL;
\r
75 BackingStore.FrontFace.StencilFailOp = D3D11_STENCIL_OP_KEEP;
\r
76 BackingStore.FrontFace.StencilFunc = D3D11_COMPARISON_ALWAYS;
\r
77 BackingStore.FrontFace.StencilPassOp = D3D11_STENCIL_OP_KEEP;
\r
78 BackingStore.FrontFace.StencilDepthFailOp = D3D11_STENCIL_OP_KEEP;
\r
79 BackingStore.StencilEnable = FALSE;
\r
80 BackingStore.StencilReadMask = D3D11_DEFAULT_STENCIL_READ_MASK;
\r
81 BackingStore.StencilWriteMask = D3D11_DEFAULT_STENCIL_WRITE_MASK;
\r
84 SBlendBlock::SBlendBlock()
\r
86 pBlendObject = NULL;
\r
87 ZeroMemory(&BackingStore, sizeof(BackingStore));
\r
90 BackingStore.AlphaToCoverageEnable = FALSE;
\r
91 BackingStore.IndependentBlendEnable = TRUE;
\r
92 for( UINT i=0; i < D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT; i++ )
\r
94 BackingStore.RenderTarget[i].SrcBlend = D3D11_BLEND_ONE;
\r
95 BackingStore.RenderTarget[i].DestBlend = D3D11_BLEND_ZERO;
\r
96 BackingStore.RenderTarget[i].BlendOp = D3D11_BLEND_OP_ADD;
\r
97 BackingStore.RenderTarget[i].SrcBlendAlpha = D3D11_BLEND_ONE;
\r
98 BackingStore.RenderTarget[i].DestBlendAlpha = D3D11_BLEND_ZERO;
\r
99 BackingStore.RenderTarget[i].BlendOpAlpha = D3D11_BLEND_OP_ADD;
\r
100 memset(&BackingStore.RenderTarget[i].RenderTargetWriteMask, 0x0F, sizeof(BackingStore.RenderTarget[i].RenderTargetWriteMask));
\r
104 SRasterizerBlock::SRasterizerBlock()
\r
106 pRasterizerObject = NULL;
\r
107 ZeroMemory(&BackingStore, sizeof(BackingStore));
\r
110 BackingStore.AntialiasedLineEnable = FALSE;
\r
111 BackingStore.CullMode = D3D11_CULL_BACK;
\r
112 BackingStore.DepthBias = D3D11_DEFAULT_DEPTH_BIAS;
\r
113 BackingStore.DepthBiasClamp = D3D11_DEFAULT_DEPTH_BIAS_CLAMP;
\r
114 BackingStore.FillMode = D3D11_FILL_SOLID;
\r
115 BackingStore.FrontCounterClockwise = FALSE;
\r
116 BackingStore.MultisampleEnable = FALSE;
\r
117 BackingStore.ScissorEnable = FALSE;
\r
118 BackingStore.SlopeScaledDepthBias = D3D11_DEFAULT_SLOPE_SCALED_DEPTH_BIAS;
\r
119 BackingStore.DepthClipEnable = TRUE;
\r
122 SSamplerBlock::SSamplerBlock()
\r
125 ZeroMemory(&BackingStore, sizeof(BackingStore));
\r
127 BackingStore.SamplerDesc.AddressU = D3D11_TEXTURE_ADDRESS_CLAMP;
\r
128 BackingStore.SamplerDesc.AddressV = D3D11_TEXTURE_ADDRESS_CLAMP;
\r
129 BackingStore.SamplerDesc.AddressW = D3D11_TEXTURE_ADDRESS_CLAMP;
\r
130 BackingStore.SamplerDesc.BorderColor[3] = D3D11_DEFAULT_BORDER_COLOR_COMPONENT;
\r
131 BackingStore.SamplerDesc.BorderColor[2] = D3D11_DEFAULT_BORDER_COLOR_COMPONENT;
\r
132 BackingStore.SamplerDesc.BorderColor[1] = D3D11_DEFAULT_BORDER_COLOR_COMPONENT;
\r
133 BackingStore.SamplerDesc.BorderColor[0] = D3D11_DEFAULT_BORDER_COLOR_COMPONENT;
\r
134 BackingStore.SamplerDesc.ComparisonFunc = D3D11_COMPARISON_NEVER;
\r
135 BackingStore.SamplerDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR;
\r
136 BackingStore.SamplerDesc.MaxAnisotropy = (UINT32) D3D11_DEFAULT_MAX_ANISOTROPY;
\r
137 BackingStore.SamplerDesc.MipLODBias = D3D11_DEFAULT_MIP_LOD_BIAS;
\r
138 BackingStore.SamplerDesc.MinLOD = -FLT_MAX;
\r
139 BackingStore.SamplerDesc.MaxLOD = FLT_MAX;
\r
142 SShaderBlock::SShaderBlock(SD3DShaderVTable *pVirtualTable)
\r
146 pVT = pVirtualTable;
\r
148 pReflectionData = NULL;
\r
158 InterfaceDepCount = 0;
\r
159 pInterfaceDeps = NULL;
\r
161 ResourceDepCount = 0;
\r
162 pResourceDeps = NULL;
\r
167 TBufferDepCount = 0;
\r
170 pInputSignatureBlob = NULL;
\r
173 HRESULT SShaderBlock::OnDeviceBind()
\r
178 // Update all CB deps
\r
179 for (i=0; i<CBDepCount; i++)
\r
181 D3DXASSERT(pCBDeps[i].Count);
\r
183 for (j=0; j<pCBDeps[i].Count; j++)
\r
185 pCBDeps[i].ppD3DObjects[j] = pCBDeps[i].ppFXPointers[j]->pD3DObject;
\r
187 if ( !pCBDeps[i].ppD3DObjects[j] )
\r
192 // Update all sampler deps
\r
193 for (i=0; i<SampDepCount; i++)
\r
195 D3DXASSERT(pSampDeps[i].Count);
\r
197 for (j=0; j<pSampDeps[i].Count; j++)
\r
199 pSampDeps[i].ppD3DObjects[j] = pSampDeps[i].ppFXPointers[j]->pD3DObject;
\r
201 if ( !pSampDeps[i].ppD3DObjects[j] )
\r
206 // Texture deps will be set automatically on use since they are initially marked dirty.
\r
212 extern SD3DShaderVTable g_vtVS;
\r
213 extern SD3DShaderVTable g_vtGS;
\r
214 extern SD3DShaderVTable g_vtPS;
\r
215 extern SD3DShaderVTable g_vtHS;
\r
216 extern SD3DShaderVTable g_vtDS;
\r
217 extern SD3DShaderVTable g_vtCS;
\r
219 EObjectType SShaderBlock::GetShaderType()
\r
221 if (&g_vtVS == pVT)
\r
222 return EOT_VertexShader;
\r
223 else if (&g_vtGS == pVT)
\r
224 return EOT_GeometryShader;
\r
225 else if (&g_vtPS == pVT)
\r
226 return EOT_PixelShader;
\r
227 else if (&g_vtHS == pVT)
\r
228 return EOT_HullShader5;
\r
229 else if (&g_vtDS == pVT)
\r
230 return EOT_DomainShader5;
\r
231 else if (&g_vtCS == pVT)
\r
232 return EOT_ComputeShader5;
\r
234 return EOT_Invalid;
\r
237 #define _SET_BIT(bytes, x) (bytes[x / 8] |= (1 << (x % 8)))
\r
239 HRESULT SShaderBlock::ComputeStateBlockMask(D3DX11_STATE_BLOCK_MASK *pStateBlockMask)
\r
243 BYTE *pSamplerMask = NULL, *pShaderResourceMask = NULL, *pConstantBufferMask = NULL, *pUnorderedAccessViewMask = NULL, *pInterfaceMask = NULL;
\r
245 switch (GetShaderType())
\r
247 case EOT_VertexShader:
\r
248 case EOT_VertexShader5:
\r
249 pStateBlockMask->VS = 1;
\r
250 pSamplerMask = pStateBlockMask->VSSamplers;
\r
251 pShaderResourceMask = pStateBlockMask->VSShaderResources;
\r
252 pConstantBufferMask = pStateBlockMask->VSConstantBuffers;
\r
253 pInterfaceMask = pStateBlockMask->VSInterfaces;
\r
254 pUnorderedAccessViewMask = NULL;
\r
257 case EOT_GeometryShader:
\r
258 case EOT_GeometryShader5:
\r
259 pStateBlockMask->GS = 1;
\r
260 pSamplerMask = pStateBlockMask->GSSamplers;
\r
261 pShaderResourceMask = pStateBlockMask->GSShaderResources;
\r
262 pConstantBufferMask = pStateBlockMask->GSConstantBuffers;
\r
263 pInterfaceMask = pStateBlockMask->GSInterfaces;
\r
264 pUnorderedAccessViewMask = NULL;
\r
267 case EOT_PixelShader:
\r
268 case EOT_PixelShader5:
\r
269 pStateBlockMask->PS = 1;
\r
270 pSamplerMask = pStateBlockMask->PSSamplers;
\r
271 pShaderResourceMask = pStateBlockMask->PSShaderResources;
\r
272 pConstantBufferMask = pStateBlockMask->PSConstantBuffers;
\r
273 pInterfaceMask = pStateBlockMask->PSInterfaces;
\r
274 pUnorderedAccessViewMask = &pStateBlockMask->PSUnorderedAccessViews;
\r
277 case EOT_HullShader5:
\r
278 pStateBlockMask->HS = 1;
\r
279 pSamplerMask = pStateBlockMask->HSSamplers;
\r
280 pShaderResourceMask = pStateBlockMask->HSShaderResources;
\r
281 pConstantBufferMask = pStateBlockMask->HSConstantBuffers;
\r
282 pInterfaceMask = pStateBlockMask->HSInterfaces;
\r
283 pUnorderedAccessViewMask = NULL;
\r
286 case EOT_DomainShader5:
\r
287 pStateBlockMask->DS = 1;
\r
288 pSamplerMask = pStateBlockMask->DSSamplers;
\r
289 pShaderResourceMask = pStateBlockMask->DSShaderResources;
\r
290 pConstantBufferMask = pStateBlockMask->DSConstantBuffers;
\r
291 pInterfaceMask = pStateBlockMask->DSInterfaces;
\r
292 pUnorderedAccessViewMask = NULL;
\r
295 case EOT_ComputeShader5:
\r
296 pStateBlockMask->CS = 1;
\r
297 pSamplerMask = pStateBlockMask->CSSamplers;
\r
298 pShaderResourceMask = pStateBlockMask->CSShaderResources;
\r
299 pConstantBufferMask = pStateBlockMask->CSConstantBuffers;
\r
300 pInterfaceMask = pStateBlockMask->CSInterfaces;
\r
301 pUnorderedAccessViewMask = &pStateBlockMask->CSUnorderedAccessViews;
\r
309 for (i = 0; i < SampDepCount; ++ i)
\r
311 for (j = 0; j < pSampDeps[i].Count; ++ j)
\r
313 _SET_BIT(pSamplerMask, (pSampDeps[i].StartIndex + j));
\r
317 for (i = 0; i < InterfaceDepCount; ++ i)
\r
319 for (j = 0; j < pInterfaceDeps[i].Count; ++ j)
\r
321 _SET_BIT(pInterfaceMask, (pInterfaceDeps[i].StartIndex + j));
\r
325 for (i = 0; i < ResourceDepCount; ++ i)
\r
327 for (j = 0; j < pResourceDeps[i].Count; ++ j)
\r
329 _SET_BIT(pShaderResourceMask, (pResourceDeps[i].StartIndex + j));
\r
333 for (i = 0; i < CBDepCount; ++ i)
\r
335 for (j = 0; j < pCBDeps[i].Count; ++ j)
\r
337 _SET_BIT(pConstantBufferMask, (pCBDeps[i].StartIndex + j));
\r
341 for (i = 0; i < UAVDepCount; ++ i)
\r
343 D3DXASSERT( pUnorderedAccessViewMask != NULL );
\r
344 for (j = 0; j < pUAVDeps[i].Count; ++ j)
\r
346 if( pUAVDeps[i].ppFXPointers[j] != &g_NullUnorderedAccessView )
\r
347 _SET_BIT(pUnorderedAccessViewMask, (pUAVDeps[i].StartIndex + j));
\r
357 HRESULT SShaderBlock::GetShaderDesc(D3DX11_EFFECT_SHADER_DESC *pDesc, BOOL IsInline)
\r
361 ZeroMemory(pDesc, sizeof(*pDesc));
\r
363 pDesc->pInputSignature = pInputSignatureBlob ? (const BYTE*)pInputSignatureBlob->GetBufferPointer() : NULL;
\r
364 pDesc->IsInline = IsInline;
\r
366 if (NULL != pReflectionData)
\r
368 // initialize these only if present; otherwise leave them NULL or 0
\r
369 pDesc->pBytecode = pReflectionData->pBytecode;
\r
370 pDesc->BytecodeLength = pReflectionData->BytecodeLength;
\r
371 for( UINT iDecl=0; iDecl < D3D11_SO_STREAM_COUNT; ++iDecl )
\r
373 pDesc->SODecls[iDecl] = pReflectionData->pStreamOutDecls[iDecl];
\r
375 pDesc->RasterizedStream = pReflectionData->RasterizedStream;
\r
377 // get # of input & output signature entries
\r
378 D3DXASSERT( pReflectionData->pReflection != NULL );
\r
380 D3D11_SHADER_DESC ShaderDesc;
\r
381 pReflectionData->pReflection->GetDesc( &ShaderDesc );
\r
382 pDesc->NumInputSignatureEntries = ShaderDesc.InputParameters;
\r
383 pDesc->NumOutputSignatureEntries = ShaderDesc.OutputParameters;
\r
384 pDesc->NumPatchConstantSignatureEntries = ShaderDesc.PatchConstantParameters;
\r
390 HRESULT SShaderBlock::GetVertexShader(ID3D11VertexShader **ppVS)
\r
392 if (EOT_VertexShader == GetShaderType() ||
\r
393 EOT_VertexShader5 == GetShaderType())
\r
395 *ppVS = (ID3D11VertexShader *) pD3DObject;
\r
396 SAFE_ADDREF(*ppVS);
\r
402 DPF(0, "ID3DX11EffectShaderVariable::GetVertexShader: This shader variable is not a vertex shader");
\r
403 return D3DERR_INVALIDCALL;
\r
407 HRESULT SShaderBlock::GetGeometryShader(ID3D11GeometryShader **ppGS)
\r
409 if (EOT_GeometryShader == GetShaderType() ||
\r
410 EOT_GeometryShaderSO == GetShaderType() ||
\r
411 EOT_GeometryShader5 == GetShaderType())
\r
413 *ppGS = (ID3D11GeometryShader *) pD3DObject;
\r
414 SAFE_ADDREF(*ppGS);
\r
420 DPF(0, "ID3DX11EffectShaderVariable::GetGeometryShader: This shader variable is not a geometry shader");
\r
421 return D3DERR_INVALIDCALL;
\r
425 HRESULT SShaderBlock::GetPixelShader(ID3D11PixelShader **ppPS)
\r
427 if (EOT_PixelShader == GetShaderType() ||
\r
428 EOT_PixelShader5 == GetShaderType())
\r
430 *ppPS = (ID3D11PixelShader *) pD3DObject;
\r
431 SAFE_ADDREF(*ppPS);
\r
437 DPF(0, "ID3DX11EffectShaderVariable::GetPixelShader: This shader variable is not a pixel shader");
\r
438 return D3DERR_INVALIDCALL;
\r
442 HRESULT SShaderBlock::GetHullShader(ID3D11HullShader **ppHS)
\r
444 if (EOT_HullShader5 == GetShaderType())
\r
446 *ppHS = (ID3D11HullShader *) pD3DObject;
\r
447 SAFE_ADDREF(*ppHS);
\r
453 DPF(0, "ID3DX11EffectShaderVariable::GetHullShader: This shader variable is not a hull shader");
\r
454 return D3DERR_INVALIDCALL;
\r
458 HRESULT SShaderBlock::GetDomainShader(ID3D11DomainShader **ppDS)
\r
460 if (EOT_DomainShader5 == GetShaderType())
\r
462 *ppDS = (ID3D11DomainShader *) pD3DObject;
\r
463 SAFE_ADDREF(*ppDS);
\r
469 DPF(0, "ID3DX11EffectShaderVariable::GetDomainShader: This shader variable is not a domain shader");
\r
470 return D3DERR_INVALIDCALL;
\r
474 HRESULT SShaderBlock::GetComputeShader(ID3D11ComputeShader **ppCS)
\r
476 if (EOT_ComputeShader5 == GetShaderType())
\r
478 *ppCS = (ID3D11ComputeShader *) pD3DObject;
\r
479 SAFE_ADDREF(*ppCS);
\r
485 DPF(0, "ID3DX11EffectShaderVariable::GetComputeShader: This shader variable is not a compute shader");
\r
486 return D3DERR_INVALIDCALL;
\r
490 HRESULT SShaderBlock::GetSignatureElementDesc(ESigType SigType, UINT Element, D3D11_SIGNATURE_PARAMETER_DESC *pDesc)
\r
497 #pragma prefast(suppress:__WARNING_UNUSED_POINTER_ASSIGNMENT, "pFuncName used in DPF")
\r
498 pFuncName = "ID3DX11EffectShaderVariable::GetInputSignatureElementDesc";
\r
501 #pragma prefast(suppress:__WARNING_UNUSED_POINTER_ASSIGNMENT, "pFuncName used in DPF")
\r
502 pFuncName = "ID3DX11EffectShaderVariable::GetOutputSignatureElementDesc";
\r
504 case ST_PatchConstant:
\r
505 #pragma prefast(suppress:__WARNING_UNUSED_POINTER_ASSIGNMENT, "pFuncName used in DPF")
\r
506 pFuncName = "ID3DX11EffectShaderVariable::GetPatchConstantSignatureElementDesc";
\r
509 D3DXASSERT( false );
\r
513 if (NULL != pReflectionData)
\r
515 // get # of signature entries
\r
516 D3DXASSERT( pReflectionData->pReflection != NULL );
\r
518 D3D11_SHADER_DESC ShaderDesc;
\r
519 VH( pReflectionData->pReflection->GetDesc( &ShaderDesc ) );
\r
521 D3D11_SIGNATURE_PARAMETER_DESC ParamDesc;
\r
522 if( pReflectionData->IsNullGS )
\r
527 // The input signature for a null-GS is the output signature of the previous VS
\r
528 SigType = ST_Output;
\r
530 case ST_PatchConstant:
\r
531 // GeometryShaders cannot have patch constant signatures
\r
532 return E_INVALIDARG;
\r
539 if( Element >= ShaderDesc.InputParameters )
\r
541 DPF( 0, "%s: Invalid Element index (%d) specified", pFuncName, Element );
\r
542 VH( E_INVALIDARG );
\r
544 VH( pReflectionData->pReflection->GetInputParameterDesc( Element, &ParamDesc ) );
\r
547 if( Element >= ShaderDesc.OutputParameters )
\r
549 DPF( 0, "%s: Invalid Element index (%d) specified", pFuncName, Element );
\r
550 VH( E_INVALIDARG );
\r
552 VH( pReflectionData->pReflection->GetOutputParameterDesc( Element, &ParamDesc ) );
\r
554 case ST_PatchConstant:
\r
555 if( Element >= ShaderDesc.PatchConstantParameters )
\r
557 DPF( 0, "%s: Invalid Element index (%d) specified", pFuncName, Element );
\r
558 VH( E_INVALIDARG );
\r
560 VH( pReflectionData->pReflection->GetPatchConstantParameterDesc( Element, &ParamDesc ) );
\r
564 pDesc->SemanticName = ParamDesc.SemanticName;
\r
565 pDesc->SystemValueType = ParamDesc.SystemValueType;
\r
567 // Pixel shaders need to be special-cased as they don't technically output SVs
\r
568 if( pDesc->SystemValueType == D3D10_NAME_UNDEFINED && GetShaderType() == EOT_PixelShader )
\r
570 if( _stricmp(pDesc->SemanticName, "SV_TARGET") == 0 )
\r
572 pDesc->SystemValueType = D3D10_NAME_TARGET;
\r
574 else if( _stricmp(pDesc->SemanticName, "SV_DEPTH") == 0 )
\r
576 pDesc->SystemValueType = D3D10_NAME_DEPTH;
\r
578 else if( _stricmp(pDesc->SemanticName, "SV_COVERAGE") == 0 )
\r
580 pDesc->SystemValueType = D3D10_NAME_COVERAGE;
\r
584 pDesc->SemanticIndex = ParamDesc.SemanticIndex;
\r
585 pDesc->Register = ParamDesc.Register;
\r
586 pDesc->Mask = ParamDesc.Mask;
\r
587 pDesc->ComponentType = ParamDesc.ComponentType;
\r
588 pDesc->ReadWriteMask = ParamDesc.ReadWriteMask;
\r
592 DPF(0, "%s: Cannot get signatures; shader bytecode is not present", pFuncName);
\r
593 VH( D3DERR_INVALIDCALL );
\r
605 SRenderTargetView::SRenderTargetView()
\r
607 pRenderTargetView = NULL;
\r
610 SDepthStencilView::SDepthStencilView()
\r
612 pDepthStencilView = NULL;
\r
615 void * GetBlockByIndex(EVarType VarType, EObjectType ObjectType, void *pBaseBlock, UINT Index)
\r
619 case EVT_Interface:
\r
620 return (SInterface *)pBaseBlock + Index;
\r
622 switch (ObjectType)
\r
625 return (SBlendBlock *)pBaseBlock + Index;
\r
626 case EOT_DepthStencil:
\r
627 return (SDepthStencilBlock *)pBaseBlock + Index;
\r
628 case EOT_Rasterizer:
\r
629 return (SRasterizerBlock *)pBaseBlock + Index;
\r
630 case EOT_PixelShader:
\r
631 case EOT_PixelShader5:
\r
632 case EOT_GeometryShader:
\r
633 case EOT_GeometryShaderSO:
\r
634 case EOT_GeometryShader5:
\r
635 case EOT_VertexShader:
\r
636 case EOT_VertexShader5:
\r
637 case EOT_HullShader5:
\r
638 case EOT_DomainShader5:
\r
639 case EOT_ComputeShader5:
\r
640 return (SShaderBlock *)pBaseBlock + Index;
\r
642 return (SString *)pBaseBlock + Index;
\r
644 return (SSamplerBlock *)pBaseBlock + Index;
\r
647 case EOT_Texture1D:
\r
648 case EOT_Texture1DArray:
\r
649 case EOT_Texture2D:
\r
650 case EOT_Texture2DArray:
\r
651 case EOT_Texture2DMS:
\r
652 case EOT_Texture2DMSArray:
\r
653 case EOT_Texture3D:
\r
654 case EOT_TextureCube:
\r
655 case EOT_TextureCubeArray:
\r
656 case EOT_ByteAddressBuffer:
\r
657 case EOT_StructuredBuffer:
\r
658 return (SShaderResource *)pBaseBlock + Index;
\r
659 case EOT_DepthStencilView:
\r
660 return (SDepthStencilView *)pBaseBlock + Index;
\r
661 case EOT_RenderTargetView:
\r
662 return (SRenderTargetView *)pBaseBlock + Index;
\r
663 case EOT_RWTexture1D:
\r
664 case EOT_RWTexture1DArray:
\r
665 case EOT_RWTexture2D:
\r
666 case EOT_RWTexture2DArray:
\r
667 case EOT_RWTexture3D:
\r
669 case EOT_RWByteAddressBuffer:
\r
670 case EOT_RWStructuredBuffer:
\r
671 case EOT_RWStructuredBufferAlloc:
\r
672 case EOT_RWStructuredBufferConsume:
\r
673 case EOT_AppendStructuredBuffer:
\r
674 case EOT_ConsumeStructuredBuffer:
\r
675 return (SUnorderedAccessView *)pBaseBlock + Index;
\r
686 CEffect::CEffect( UINT Flags )
\r
690 m_pVariables = NULL;
\r
691 m_pAnonymousShaders = NULL;
\r
693 m_pNullGroup = NULL;
\r
694 m_pShaderBlocks = NULL;
\r
695 m_pDepthStencilBlocks = NULL;
\r
696 m_pBlendBlocks = NULL;
\r
697 m_pRasterizerBlocks = NULL;
\r
698 m_pSamplerBlocks = NULL;
\r
701 m_pMemberDataBlocks = NULL;
\r
702 m_pInterfaces = NULL;
\r
703 m_pShaderResources = NULL;
\r
704 m_pUnorderedAccessViews = NULL;
\r
705 m_pRenderTargetViews = NULL;
\r
706 m_pDepthStencilViews = NULL;
\r
708 m_pClassLinkage = NULL;
\r
711 m_VariableCount = 0;
\r
712 m_AnonymousShaderCount = 0;
\r
713 m_ShaderBlockCount = 0;
\r
714 m_DepthStencilBlockCount = 0;
\r
715 m_BlendBlockCount = 0;
\r
716 m_RasterizerBlockCount = 0;
\r
717 m_SamplerBlockCount = 0;
\r
719 m_MemberDataCount = 0;
\r
720 m_InterfaceCount = 0;
\r
721 m_ShaderResourceCount = 0;
\r
722 m_UnorderedAccessViewCount = 0;
\r
723 m_RenderTargetViewCount = 0;
\r
724 m_DepthStencilViewCount = 0;
\r
726 m_TechniqueCount = 0;
\r
729 m_pReflection = NULL;
\r
734 m_pTypePool = NULL;
\r
735 m_pStringPool = NULL;
\r
736 m_pPooledHeap = NULL;
\r
737 m_pOptimizedTypeHeap = NULL;
\r
740 void CEffect::ReleaseShaderRefection()
\r
742 for( UINT i = 0; i < m_ShaderBlockCount; ++ i )
\r
744 SAFE_RELEASE( m_pShaderBlocks[i].pInputSignatureBlob );
\r
745 if( m_pShaderBlocks[i].pReflectionData )
\r
747 SAFE_RELEASE( m_pShaderBlocks[i].pReflectionData->pReflection );
\r
752 CEffect::~CEffect()
\r
754 ID3D11InfoQueue *pInfoQueue = NULL;
\r
758 m_pDevice->QueryInterface(__uuidof(ID3D11InfoQueue), (void**) &pInfoQueue);
\r
762 D3D11_INFO_QUEUE_FILTER filter;
\r
763 D3D11_MESSAGE_CATEGORY messageCategory = D3D11_MESSAGE_CATEGORY_STATE_SETTING;
\r
764 ZeroMemory(&filter, sizeof(filter));
\r
766 filter.DenyList.NumCategories = 1;
\r
767 filter.DenyList.pCategoryList = &messageCategory;
\r
768 pInfoQueue->PushStorageFilter(&filter);
\r
773 if( NULL != m_pDevice )
\r
775 // if m_pDevice == NULL, then we failed LoadEffect(), which means ReleaseShaderReflection was already called.
\r
777 // Release the shader reflection info, as it was not created on the private heap
\r
778 // This must be called before we delete m_pReflection
\r
779 ReleaseShaderRefection();
\r
782 SAFE_DELETE( m_pReflection );
\r
783 SAFE_DELETE( m_pTypePool );
\r
784 SAFE_DELETE( m_pStringPool );
\r
785 SAFE_DELETE( m_pPooledHeap );
\r
786 SAFE_DELETE( m_pOptimizedTypeHeap );
\r
788 // this code assumes the effect has been loaded & relocated,
\r
789 // so check for that before freeing the resources
\r
791 if (NULL != m_pDevice)
\r
793 // Keep the following in line with AddRefAllForCloning
\r
795 D3DXASSERT(NULL == m_pRasterizerBlocks || m_Heap.IsInHeap(m_pRasterizerBlocks));
\r
796 for (i = 0; i < m_RasterizerBlockCount; ++ i)
\r
798 SAFE_RELEASE(m_pRasterizerBlocks[i].pRasterizerObject);
\r
801 D3DXASSERT(NULL == m_pBlendBlocks || m_Heap.IsInHeap(m_pBlendBlocks));
\r
802 for (i = 0; i < m_BlendBlockCount; ++ i)
\r
804 SAFE_RELEASE(m_pBlendBlocks[i].pBlendObject);
\r
807 D3DXASSERT(NULL == m_pDepthStencilBlocks || m_Heap.IsInHeap(m_pDepthStencilBlocks));
\r
808 for (i = 0; i < m_DepthStencilBlockCount; ++ i)
\r
810 SAFE_RELEASE(m_pDepthStencilBlocks[i].pDSObject);
\r
813 D3DXASSERT(NULL == m_pSamplerBlocks || m_Heap.IsInHeap(m_pSamplerBlocks));
\r
814 for (i = 0; i < m_SamplerBlockCount; ++ i)
\r
816 SAFE_RELEASE(m_pSamplerBlocks[i].pD3DObject);
\r
819 D3DXASSERT(NULL == m_pShaderResources || m_Heap.IsInHeap(m_pShaderResources));
\r
820 for (i = 0; i < m_ShaderResourceCount; ++ i)
\r
822 SAFE_RELEASE(m_pShaderResources[i].pShaderResource);
\r
825 D3DXASSERT(NULL == m_pUnorderedAccessViews || m_Heap.IsInHeap(m_pUnorderedAccessViews));
\r
826 for (i = 0; i < m_UnorderedAccessViewCount; ++ i)
\r
828 SAFE_RELEASE(m_pUnorderedAccessViews[i].pUnorderedAccessView);
\r
831 D3DXASSERT(NULL == m_pRenderTargetViews || m_Heap.IsInHeap(m_pRenderTargetViews));
\r
832 for (i = 0; i < m_RenderTargetViewCount; ++ i)
\r
834 SAFE_RELEASE(m_pRenderTargetViews[i].pRenderTargetView);
\r
837 D3DXASSERT(NULL == m_pDepthStencilViews || m_Heap.IsInHeap(m_pDepthStencilViews));
\r
838 for (i = 0; i < m_DepthStencilViewCount; ++ i)
\r
840 SAFE_RELEASE(m_pDepthStencilViews[i].pDepthStencilView);
\r
843 D3DXASSERT(NULL == m_pMemberDataBlocks || m_Heap.IsInHeap(m_pMemberDataBlocks));
\r
844 for (i = 0; i < m_MemberDataCount; ++ i)
\r
846 switch( m_pMemberDataBlocks[i].Type )
\r
848 case MDT_ClassInstance:
\r
849 SAFE_RELEASE(m_pMemberDataBlocks[i].Data.pD3DClassInstance);
\r
851 case MDT_BlendState:
\r
852 SAFE_RELEASE(m_pMemberDataBlocks[i].Data.pD3DEffectsManagedBlendState);
\r
854 case MDT_DepthStencilState:
\r
855 SAFE_RELEASE(m_pMemberDataBlocks[i].Data.pD3DEffectsManagedDepthStencilState);
\r
857 case MDT_RasterizerState:
\r
858 SAFE_RELEASE(m_pMemberDataBlocks[i].Data.pD3DEffectsManagedRasterizerState);
\r
860 case MDT_SamplerState:
\r
861 SAFE_RELEASE(m_pMemberDataBlocks[i].Data.pD3DEffectsManagedSamplerState);
\r
864 SAFE_RELEASE(m_pMemberDataBlocks[i].Data.pD3DEffectsManagedConstantBuffer);
\r
866 case MDT_ShaderResourceView:
\r
867 SAFE_RELEASE(m_pMemberDataBlocks[i].Data.pD3DEffectsManagedTextureBuffer);
\r
870 D3DXASSERT( false );
\r
874 D3DXASSERT(NULL == m_pCBs || m_Heap.IsInHeap(m_pCBs));
\r
875 for (i = 0; i < m_CBCount; ++ i)
\r
877 SAFE_RELEASE(m_pCBs[i].TBuffer.pShaderResource);
\r
878 SAFE_RELEASE(m_pCBs[i].pD3DObject);
\r
881 D3DXASSERT(NULL == m_pShaderBlocks || m_Heap.IsInHeap(m_pShaderBlocks));
\r
882 for (i = 0; i < m_ShaderBlockCount; ++ i)
\r
884 SAFE_RELEASE(m_pShaderBlocks[i].pD3DObject);
\r
887 SAFE_RELEASE( m_pDevice );
\r
889 SAFE_RELEASE( m_pClassLinkage );
\r
890 D3DXASSERT( m_pContext == NULL );
\r
892 // Restore debug spew
\r
895 pInfoQueue->PopStorageFilter();
\r
896 SAFE_RELEASE(pInfoQueue);
\r
900 // AddRef all D3D object when cloning
\r
901 void CEffect::AddRefAllForCloning( CEffect* pEffectSource )
\r
905 // Keep the following in line with ~CEffect
\r
907 D3DXASSERT( m_pDevice != NULL );
\r
909 for( UINT i = 0; i < m_ShaderBlockCount; ++ i )
\r
911 SAFE_ADDREF( m_pShaderBlocks[i].pInputSignatureBlob );
\r
912 if( m_pShaderBlocks[i].pReflectionData )
\r
914 SAFE_ADDREF( m_pShaderBlocks[i].pReflectionData->pReflection );
\r
918 D3DXASSERT(NULL == m_pRasterizerBlocks || pEffectSource->m_Heap.IsInHeap(m_pRasterizerBlocks));
\r
919 for (i = 0; i < m_RasterizerBlockCount; ++ i)
\r
921 SAFE_ADDREF(m_pRasterizerBlocks[i].pRasterizerObject);
\r
924 D3DXASSERT(NULL == m_pBlendBlocks || pEffectSource->m_Heap.IsInHeap(m_pBlendBlocks));
\r
925 for (i = 0; i < m_BlendBlockCount; ++ i)
\r
927 SAFE_ADDREF(m_pBlendBlocks[i].pBlendObject);
\r
930 D3DXASSERT(NULL == m_pDepthStencilBlocks || pEffectSource->m_Heap.IsInHeap(m_pDepthStencilBlocks));
\r
931 for (i = 0; i < m_DepthStencilBlockCount; ++ i)
\r
933 SAFE_ADDREF(m_pDepthStencilBlocks[i].pDSObject);
\r
936 D3DXASSERT(NULL == m_pSamplerBlocks || pEffectSource->m_Heap.IsInHeap(m_pSamplerBlocks));
\r
937 for (i = 0; i < m_SamplerBlockCount; ++ i)
\r
939 SAFE_ADDREF(m_pSamplerBlocks[i].pD3DObject);
\r
942 D3DXASSERT(NULL == m_pShaderResources || pEffectSource->m_Heap.IsInHeap(m_pShaderResources));
\r
943 for (i = 0; i < m_ShaderResourceCount; ++ i)
\r
945 SAFE_ADDREF(m_pShaderResources[i].pShaderResource);
\r
948 D3DXASSERT(NULL == m_pUnorderedAccessViews || pEffectSource->m_Heap.IsInHeap(m_pUnorderedAccessViews));
\r
949 for (i = 0; i < m_UnorderedAccessViewCount; ++ i)
\r
951 SAFE_ADDREF(m_pUnorderedAccessViews[i].pUnorderedAccessView);
\r
954 D3DXASSERT(NULL == m_pRenderTargetViews || pEffectSource->m_Heap.IsInHeap(m_pRenderTargetViews));
\r
955 for (i = 0; i < m_RenderTargetViewCount; ++ i)
\r
957 SAFE_ADDREF(m_pRenderTargetViews[i].pRenderTargetView);
\r
960 D3DXASSERT(NULL == m_pDepthStencilViews || pEffectSource->m_Heap.IsInHeap(m_pDepthStencilViews));
\r
961 for (i = 0; i < m_DepthStencilViewCount; ++ i)
\r
963 SAFE_ADDREF(m_pDepthStencilViews[i].pDepthStencilView);
\r
966 D3DXASSERT(NULL == m_pMemberDataBlocks || pEffectSource->m_Heap.IsInHeap(m_pMemberDataBlocks));
\r
967 for (i = 0; i < m_MemberDataCount; ++ i)
\r
969 switch( m_pMemberDataBlocks[i].Type )
\r
971 case MDT_ClassInstance:
\r
972 SAFE_ADDREF(m_pMemberDataBlocks[i].Data.pD3DClassInstance);
\r
974 case MDT_BlendState:
\r
975 SAFE_ADDREF(m_pMemberDataBlocks[i].Data.pD3DEffectsManagedBlendState);
\r
977 case MDT_DepthStencilState:
\r
978 SAFE_ADDREF(m_pMemberDataBlocks[i].Data.pD3DEffectsManagedDepthStencilState);
\r
980 case MDT_RasterizerState:
\r
981 SAFE_ADDREF(m_pMemberDataBlocks[i].Data.pD3DEffectsManagedRasterizerState);
\r
983 case MDT_SamplerState:
\r
984 SAFE_ADDREF(m_pMemberDataBlocks[i].Data.pD3DEffectsManagedSamplerState);
\r
987 SAFE_ADDREF(m_pMemberDataBlocks[i].Data.pD3DEffectsManagedConstantBuffer);
\r
989 case MDT_ShaderResourceView:
\r
990 SAFE_ADDREF(m_pMemberDataBlocks[i].Data.pD3DEffectsManagedTextureBuffer);
\r
993 D3DXASSERT( false );
\r
997 // There's no need to AddRef CBs, since they are recreated
\r
998 D3DXASSERT(NULL == m_pCBs || pEffectSource->m_Heap.IsInHeap(m_pCBs));
\r
999 for (i = 0; i < m_CBCount; ++ i)
\r
1001 SAFE_ADDREF(m_pCBs[i].TBuffer.pShaderResource);
\r
1002 SAFE_ADDREF(m_pCBs[i].pD3DObject);
\r
1005 D3DXASSERT(NULL == m_pShaderBlocks || pEffectSource->m_Heap.IsInHeap(m_pShaderBlocks));
\r
1006 for (i = 0; i < m_ShaderBlockCount; ++ i)
\r
1008 SAFE_ADDREF(m_pShaderBlocks[i].pD3DObject);
\r
1011 SAFE_ADDREF( m_pDevice );
\r
1013 SAFE_ADDREF( m_pClassLinkage );
\r
1014 D3DXASSERT( m_pContext == NULL );
\r
1017 HRESULT CEffect::QueryInterface(REFIID iid, LPVOID *ppv)
\r
1019 HRESULT hr = S_OK;
\r
1023 DPF(0, "ID3DX11Effect::QueryInterface: NULL parameter");
\r
1024 hr = E_INVALIDARG;
\r
1029 if(IsEqualIID(iid, IID_IUnknown))
\r
1031 *ppv = (IUnknown *) this;
\r
1033 else if(IsEqualIID(iid, IID_ID3DX11Effect))
\r
1035 *ppv = (ID3DX11Effect *) this;
\r
1039 return E_NOINTERFACE;
\r
1048 ULONG CEffect::AddRef()
\r
1050 return ++ m_RefCount;
\r
1053 ULONG CEffect::Release()
\r
1055 if (-- m_RefCount > 0)
\r
1057 return m_RefCount;
\r
1067 // In all shaders, replace pOldBufferBlock with pNewBuffer, if pOldBufferBlock is a dependency
\r
1068 void CEffect::ReplaceCBReference(SConstantBuffer *pOldBufferBlock, ID3D11Buffer *pNewBuffer)
\r
1070 UINT iShaderBlock;
\r
1072 for (iShaderBlock=0; iShaderBlock<m_ShaderBlockCount; iShaderBlock++)
\r
1074 for (UINT iCBDep = 0; iCBDep < m_pShaderBlocks[iShaderBlock].CBDepCount; iCBDep++)
\r
1076 for (UINT iCB = 0; iCB < m_pShaderBlocks[iShaderBlock].pCBDeps[iCBDep].Count; iCB++)
\r
1078 if (m_pShaderBlocks[iShaderBlock].pCBDeps[iCBDep].ppFXPointers[iCB] == pOldBufferBlock)
\r
1079 m_pShaderBlocks[iShaderBlock].pCBDeps[iCBDep].ppD3DObjects[iCB] = pNewBuffer;
\r
1085 // In all shaders, replace pOldSamplerBlock with pNewSampler, if pOldSamplerBlock is a dependency
\r
1086 void CEffect::ReplaceSamplerReference(SSamplerBlock *pOldSamplerBlock, ID3D11SamplerState *pNewSampler)
\r
1088 UINT iShaderBlock;
\r
1090 for (iShaderBlock=0; iShaderBlock<m_ShaderBlockCount; iShaderBlock++)
\r
1092 for (UINT iSamplerDep = 0; iSamplerDep < m_pShaderBlocks[iShaderBlock].SampDepCount; iSamplerDep++)
\r
1094 for (UINT iSampler = 0; iSampler < m_pShaderBlocks[iShaderBlock].pSampDeps[iSamplerDep].Count; iSampler++)
\r
1096 if (m_pShaderBlocks[iShaderBlock].pSampDeps[iSamplerDep].ppFXPointers[iSampler] == pOldSamplerBlock)
\r
1097 m_pShaderBlocks[iShaderBlock].pSampDeps[iSamplerDep].ppD3DObjects[iSampler] = pNewSampler;
\r
1103 // Call BindToDevice after the effect has been fully loaded.
\r
1104 // BindToDevice will release all D3D11 objects and create new ones on the new device
\r
1105 HRESULT CEffect::BindToDevice(ID3D11Device *pDevice)
\r
1107 HRESULT hr = S_OK;
\r
1110 if (pDevice == NULL)
\r
1112 DPF(0, "ID3DX11Effect: pDevice must point to a valid D3D11 device");
\r
1113 return D3DERR_INVALIDCALL;
\r
1116 if (m_pDevice != NULL)
\r
1118 DPF(0, "ID3DX11Effect: Internal error, rebinding effects to a new device is not supported");
\r
1119 return D3DERR_INVALIDCALL;
\r
1122 bool featureLevelGE11 = ( pDevice->GetFeatureLevel() >= D3D_FEATURE_LEVEL_11_0 );
\r
1124 pDevice->AddRef();
\r
1125 SAFE_RELEASE(m_pDevice);
\r
1126 m_pDevice = pDevice;
\r
1127 VH( m_pDevice->CreateClassLinkage( &m_pClassLinkage ) );
\r
1129 // Create all constant buffers
\r
1130 SConstantBuffer *pCB = m_pCBs;
\r
1131 SConstantBuffer *pCBLast = m_pCBs + m_CBCount;
\r
1132 for(; pCB != pCBLast; pCB++)
\r
1134 SAFE_RELEASE(pCB->pD3DObject);
\r
1135 SAFE_RELEASE(pCB->TBuffer.pShaderResource);
\r
1137 // This is a CBuffer
\r
1138 if (pCB->Size > 0)
\r
1140 if (pCB->IsTBuffer)
\r
1142 D3D11_BUFFER_DESC bufDesc;
\r
1143 // size is always register aligned
\r
1144 bufDesc.ByteWidth = pCB->Size;
\r
1145 bufDesc.Usage = D3D11_USAGE_DEFAULT;
\r
1146 bufDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
\r
1147 bufDesc.CPUAccessFlags = 0;
\r
1148 bufDesc.MiscFlags = 0;
\r
1150 VH( pDevice->CreateBuffer( &bufDesc, NULL, &pCB->pD3DObject) );
\r
1152 D3D11_SHADER_RESOURCE_VIEW_DESC viewDesc;
\r
1153 viewDesc.Format = DXGI_FORMAT_R32G32B32A32_UINT;
\r
1154 viewDesc.ViewDimension = D3D11_SRV_DIMENSION_BUFFER;
\r
1155 viewDesc.Buffer.ElementOffset = 0;
\r
1156 viewDesc.Buffer.ElementWidth = pCB->Size / SType::c_RegisterSize;
\r
1158 VH( pDevice->CreateShaderResourceView( pCB->pD3DObject, &viewDesc, &pCB->TBuffer.pShaderResource) );
\r
1162 D3D11_BUFFER_DESC bufDesc;
\r
1163 // size is always register aligned
\r
1164 bufDesc.ByteWidth = pCB->Size;
\r
1165 bufDesc.Usage = D3D11_USAGE_DEFAULT;
\r
1166 bufDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
\r
1167 bufDesc.CPUAccessFlags = 0;
\r
1168 bufDesc.MiscFlags = 0;
\r
1170 VH( pDevice->CreateBuffer( &bufDesc, NULL, &pCB->pD3DObject) );
\r
1171 pCB->TBuffer.pShaderResource = NULL;
\r
1174 pCB->IsDirty = TRUE;
\r
1178 pCB->IsDirty = FALSE;
\r
1182 // Create all RasterizerStates
\r
1183 SRasterizerBlock *pRB = m_pRasterizerBlocks;
\r
1184 SRasterizerBlock *pRBLast = m_pRasterizerBlocks + m_RasterizerBlockCount;
\r
1185 for(; pRB != pRBLast; pRB++)
\r
1187 SAFE_RELEASE(pRB->pRasterizerObject);
\r
1188 if( SUCCEEDED( m_pDevice->CreateRasterizerState( &pRB->BackingStore, &pRB->pRasterizerObject) ) )
\r
1189 pRB->IsValid = TRUE;
\r
1191 pRB->IsValid = FALSE;
\r
1194 // Create all DepthStencils
\r
1195 SDepthStencilBlock *pDS = m_pDepthStencilBlocks;
\r
1196 SDepthStencilBlock *pDSLast = m_pDepthStencilBlocks + m_DepthStencilBlockCount;
\r
1197 for(; pDS != pDSLast; pDS++)
\r
1199 SAFE_RELEASE(pDS->pDSObject);
\r
1200 if( SUCCEEDED( m_pDevice->CreateDepthStencilState( &pDS->BackingStore, &pDS->pDSObject) ) )
\r
1201 pDS->IsValid = TRUE;
\r
1203 pDS->IsValid = FALSE;
\r
1206 // Create all BlendStates
\r
1207 SBlendBlock *pBlend = m_pBlendBlocks;
\r
1208 SBlendBlock *pBlendLast = m_pBlendBlocks + m_BlendBlockCount;
\r
1209 for(; pBlend != pBlendLast; pBlend++)
\r
1211 SAFE_RELEASE(pBlend->pBlendObject);
\r
1212 if( SUCCEEDED( m_pDevice->CreateBlendState( &pBlend->BackingStore, &pBlend->pBlendObject ) ) )
\r
1213 pBlend->IsValid = TRUE;
\r
1215 pBlend->IsValid = FALSE;
\r
1218 // Create all Samplers
\r
1219 SSamplerBlock *pSampler = m_pSamplerBlocks;
\r
1220 SSamplerBlock *pSamplerLast = m_pSamplerBlocks + m_SamplerBlockCount;
\r
1221 for(; pSampler != pSamplerLast; pSampler++)
\r
1223 SAFE_RELEASE(pSampler->pD3DObject);
\r
1225 VH( m_pDevice->CreateSamplerState( &pSampler->BackingStore.SamplerDesc, &pSampler->pD3DObject) );
\r
1228 // Create all shaders
\r
1229 ID3D11ClassLinkage* neededClassLinkage = featureLevelGE11 ? m_pClassLinkage : NULL;
\r
1230 SShaderBlock *pShader = m_pShaderBlocks;
\r
1231 SShaderBlock *pShaderLast = m_pShaderBlocks + m_ShaderBlockCount;
\r
1232 for(; pShader != pShaderLast; pShader++)
\r
1234 SAFE_RELEASE(pShader->pD3DObject);
\r
1236 if (NULL == pShader->pReflectionData)
\r
1238 // NULL shader. It's one of these:
\r
1239 // PixelShader ps;
\r
1241 // SetPixelShader( NULL );
\r
1245 if (pShader->pReflectionData->pStreamOutDecls[0] || pShader->pReflectionData->pStreamOutDecls[1] ||
\r
1246 pShader->pReflectionData->pStreamOutDecls[2] || pShader->pReflectionData->pStreamOutDecls[3] )
\r
1248 // This is a geometry shader, process it's data
\r
1249 CSOParser soParser;
\r
1250 VH( soParser.Parse(pShader->pReflectionData->pStreamOutDecls) );
\r
1252 soParser.GetStrides( strides );
\r
1253 hr = m_pDevice->CreateGeometryShaderWithStreamOutput((UINT*) pShader->pReflectionData->pBytecode,
\r
1254 pShader->pReflectionData->BytecodeLength,
\r
1255 soParser.GetDeclArray(),
\r
1256 soParser.GetDeclCount(),
\r
1258 featureLevelGE11 ? 4 : 1,
\r
1259 pShader->pReflectionData->RasterizedStream,
\r
1260 neededClassLinkage,
\r
1261 (ID3D11GeometryShader**) &pShader->pD3DObject);
\r
1264 DPF(1, "ID3DX11Effect::Load - failed to create GeometryShader with StreamOutput decl: \"%s\"", soParser.GetErrorString() );
\r
1265 pShader->IsValid = FALSE;
\r
1271 // This is a regular shader
\r
1272 if( pShader->pReflectionData->RasterizedStream == D3D11_SO_NO_RASTERIZED_STREAM )
\r
1273 pShader->IsValid = FALSE;
\r
1276 if( FAILED( (m_pDevice->*(pShader->pVT->pCreateShader))( (UINT *) pShader->pReflectionData->pBytecode, pShader->pReflectionData->BytecodeLength, neededClassLinkage, &pShader->pD3DObject) ) )
\r
1278 DPF(1, "ID3DX11Effect::Load - failed to create shader" );
\r
1279 pShader->IsValid = FALSE;
\r
1284 // Update all dependency pointers
\r
1285 VH( pShader->OnDeviceBind() );
\r
1288 // Initialize the member data pointers for all variables
\r
1289 UINT CurMemberData = 0;
\r
1290 for (UINT i = 0; i < m_VariableCount; ++ i)
\r
1292 if( m_pVariables[i].pMemberData )
\r
1294 if( m_pVariables[i].pType->IsClassInstance() )
\r
1296 for (UINT j = 0; j < max(m_pVariables[i].pType->Elements,1); ++j)
\r
1298 D3DXASSERT( CurMemberData < m_MemberDataCount );
\r
1299 ID3D11ClassInstance** ppCI = &(m_pVariables[i].pMemberData + j)->Data.pD3DClassInstance;
\r
1300 (m_pVariables[i].pMemberData + j)->Type = MDT_ClassInstance;
\r
1301 (m_pVariables[i].pMemberData + j)->Data.pD3DClassInstance = NULL;
\r
1302 if( m_pVariables[i].pType->TotalSize > 0 )
\r
1304 // ignore failures in GetClassInstance;
\r
1305 m_pClassLinkage->GetClassInstance( m_pVariables[i].pName, j, ppCI );
\r
1309 // The HLSL compiler optimizes out zero-sized classes, so we have to create class instances from scratch
\r
1310 if( FAILED( m_pClassLinkage->CreateClassInstance( m_pVariables[i].pType->pTypeName, 0, 0, 0, 0, ppCI ) ) )
\r
1312 DPF(0, "ID3DX11Effect: Out of memory while trying to create new class instance interface");
\r
1318 else if( m_pVariables[i].pType->IsStateBlockObject() )
\r
1320 for (UINT j = 0; j < max(m_pVariables[i].pType->Elements,1); ++j)
\r
1322 switch( m_pVariables[i].pType->ObjectType )
\r
1325 (m_pVariables[i].pMemberData + j)->Type = MDT_BlendState;
\r
1326 (m_pVariables[i].pMemberData + j)->Data.pD3DEffectsManagedBlendState = NULL;
\r
1328 case EOT_Rasterizer:
\r
1329 (m_pVariables[i].pMemberData + j)->Type = MDT_RasterizerState;
\r
1330 (m_pVariables[i].pMemberData + j)->Data.pD3DEffectsManagedRasterizerState = NULL;
\r
1332 case EOT_DepthStencil:
\r
1333 (m_pVariables[i].pMemberData + j)->Type = MDT_DepthStencilState;
\r
1334 (m_pVariables[i].pMemberData + j)->Data.pD3DEffectsManagedDepthStencilState = NULL;
\r
1337 (m_pVariables[i].pMemberData + j)->Type = MDT_SamplerState;
\r
1338 (m_pVariables[i].pMemberData + j)->Data.pD3DEffectsManagedSamplerState = NULL;
\r
1352 for(pCB = m_pCBs; pCB != pCBLast; pCB++)
\r
1354 (pCB->pMemberData + 0)->Type = MDT_Buffer;
\r
1355 (pCB->pMemberData + 0)->Data.pD3DEffectsManagedConstantBuffer = NULL;
\r
1357 (pCB->pMemberData + 1)->Type = MDT_ShaderResourceView;
\r
1358 (pCB->pMemberData + 1)->Data.pD3DEffectsManagedTextureBuffer = NULL;
\r
1363 // Determine which techniques and passes are known to be invalid
\r
1364 for( UINT iGroup=0; iGroup < m_GroupCount; iGroup++ )
\r
1366 SGroup* pGroup = &m_pGroups[iGroup];
\r
1367 pGroup->InitiallyValid = TRUE;
\r
1369 for( UINT iTech=0; iTech < pGroup->TechniqueCount; iTech++ )
\r
1371 STechnique* pTechnique = &pGroup->pTechniques[iTech];
\r
1372 pTechnique->InitiallyValid = TRUE;
\r
1374 for( UINT iPass = 0; iPass < pTechnique->PassCount; iPass++ )
\r
1376 SPassBlock* pPass = &pTechnique->pPasses[iPass];
\r
1377 pPass->InitiallyValid = TRUE;
\r
1379 if( pPass->BackingStore.pBlendBlock != NULL && !pPass->BackingStore.pBlendBlock->IsValid )
\r
1380 pPass->InitiallyValid = FALSE;
\r
1381 if( pPass->BackingStore.pDepthStencilBlock != NULL && !pPass->BackingStore.pDepthStencilBlock->IsValid )
\r
1382 pPass->InitiallyValid = FALSE;
\r
1383 if( pPass->BackingStore.pRasterizerBlock != NULL && !pPass->BackingStore.pRasterizerBlock->IsValid )
\r
1384 pPass->InitiallyValid = FALSE;
\r
1385 if( pPass->BackingStore.pVertexShaderBlock != NULL && !pPass->BackingStore.pVertexShaderBlock->IsValid )
\r
1386 pPass->InitiallyValid = FALSE;
\r
1387 if( pPass->BackingStore.pPixelShaderBlock != NULL && !pPass->BackingStore.pPixelShaderBlock->IsValid )
\r
1388 pPass->InitiallyValid = FALSE;
\r
1389 if( pPass->BackingStore.pGeometryShaderBlock != NULL && !pPass->BackingStore.pGeometryShaderBlock->IsValid )
\r
1390 pPass->InitiallyValid = FALSE;
\r
1391 if( pPass->BackingStore.pHullShaderBlock != NULL && !pPass->BackingStore.pHullShaderBlock->IsValid )
\r
1392 pPass->InitiallyValid = FALSE;
\r
1393 if( pPass->BackingStore.pDomainShaderBlock != NULL && !pPass->BackingStore.pDomainShaderBlock->IsValid )
\r
1394 pPass->InitiallyValid = FALSE;
\r
1395 if( pPass->BackingStore.pComputeShaderBlock != NULL && !pPass->BackingStore.pComputeShaderBlock->IsValid )
\r
1396 pPass->InitiallyValid = FALSE;
\r
1398 pTechnique->InitiallyValid &= pPass->InitiallyValid;
\r
1400 pGroup->InitiallyValid &= pTechnique->InitiallyValid;
\r
1408 // FindVariableByName, plus an understanding of literal indices
\r
1409 // This code handles A[i].
\r
1410 // It does not handle anything else, like A.B, A[B[i]], A[B]
\r
1411 SVariable * CEffect::FindVariableByNameWithParsing(LPCSTR pName)
\r
1413 SGlobalVariable *pVariable;
\r
1414 const UINT MAX_PARSABLE_NAME_LENGTH = 256;
\r
1415 char pScratchString[MAX_PARSABLE_NAME_LENGTH];
\r
1417 const char* pSource = pName;
\r
1418 char* pDest = pScratchString;
\r
1419 char* pEnd = pScratchString + MAX_PARSABLE_NAME_LENGTH;
\r
1423 while( *pSource != 0 )
\r
1425 if( pDest == pEnd )
\r
1427 pVariable = FindLocalVariableByName(pName);
\r
1428 if( pVariable == NULL )
\r
1430 DPF( 0, "Name %s is too long to parse", &pName );
\r
1435 if( *pSource == '[' )
\r
1437 // parse previous variable name
\r
1439 D3DXASSERT( pVariable == NULL );
\r
1440 pVariable = FindLocalVariableByName(pScratchString);
\r
1441 if( pVariable == NULL )
\r
1445 pDest = pScratchString;
\r
1447 else if( *pSource == ']' )
\r
1451 UINT index = atoi(pScratchString);
\r
1452 D3DXASSERT( pVariable != NULL );
\r
1453 pVariable = (SGlobalVariable*)pVariable->GetElement(index);
\r
1454 if( pVariable && !pVariable->IsValid() )
\r
1463 *pDest = *pSource;
\r
1469 if( pDest != pScratchString )
\r
1471 // parse the variable name (there was no [i])
\r
1473 D3DXASSERT( pVariable == NULL );
\r
1474 pVariable = FindLocalVariableByName(pScratchString);
\r
1480 SGlobalVariable * CEffect::FindVariableByName(LPCSTR pName)
\r
1482 SGlobalVariable *pVariable;
\r
1484 pVariable = FindLocalVariableByName(pName);
\r
1489 SGlobalVariable * CEffect::FindLocalVariableByName(LPCSTR pName)
\r
1491 SGlobalVariable *pVariable, *pVariableEnd;
\r
1493 pVariableEnd = m_pVariables + m_VariableCount;
\r
1494 for (pVariable = m_pVariables; pVariable != pVariableEnd; pVariable++)
\r
1496 if (strcmp( pVariable->pName, pName) == 0)
\r
1507 // Checks to see if two types are equivalent (either at runtime
\r
1508 // or during the type-pooling load process)
\r
1510 // Major assumption: if both types are structures, then their
\r
1511 // member types & names should already have been added to the pool,
\r
1512 // in which case their member type & name pointers should be equal.
\r
1514 // This is true because complex data types (structures) have all
\r
1515 // sub-types translated before the containing type is translated,
\r
1516 // which means that simple sub-types (numeric types) have already
\r
1519 BOOL SType::IsEqual(SType *pOtherType) CONST
\r
1521 if (VarType != pOtherType->VarType || Elements != pOtherType->Elements
\r
1522 || strcmp(pTypeName, pOtherType->pTypeName) != 0)
\r
1531 if (StructType.Members != pOtherType->StructType.Members)
\r
1535 D3DXASSERT(StructType.pMembers != NULL && pOtherType->StructType.pMembers != NULL);
\r
1538 for (i = 0; i < StructType.Members; ++ i)
\r
1540 // names for types must exist (not true for semantics)
\r
1541 D3DXASSERT(StructType.pMembers[i].pName != NULL && pOtherType->StructType.pMembers[i].pName != NULL);
\r
1543 if (StructType.pMembers[i].pType != pOtherType->StructType.pMembers[i].pType ||
\r
1544 StructType.pMembers[i].Data.Offset != pOtherType->StructType.pMembers[i].Data.Offset ||
\r
1545 StructType.pMembers[i].pName != pOtherType->StructType.pMembers[i].pName ||
\r
1546 StructType.pMembers[i].pSemantic != pOtherType->StructType.pMembers[i].pSemantic)
\r
1556 if (ObjectType != pOtherType->ObjectType)
\r
1565 if (NumericType.Rows != pOtherType->NumericType.Rows ||
\r
1566 NumericType.Columns != pOtherType->NumericType.Columns ||
\r
1567 NumericType.ScalarType != pOtherType->NumericType.ScalarType ||
\r
1568 NumericType.NumericLayout != pOtherType->NumericType.NumericLayout ||
\r
1569 NumericType.IsColumnMajor != pOtherType->NumericType.IsColumnMajor ||
\r
1570 NumericType.IsPackedArray != pOtherType->NumericType.IsPackedArray)
\r
1577 case EVT_Interface:
\r
1579 // VarType and pTypeName handled above
\r
1591 D3DXASSERT(TotalSize == pOtherType->TotalSize && Stride == pOtherType->Stride && PackedSize == pOtherType->PackedSize);
\r
1596 UINT SType::GetTotalUnpackedSize(BOOL IsSingleElement) CONST
\r
1598 if (VarType == EVT_Object)
\r
1602 else if (VarType == EVT_Interface)
\r
1606 else if (Elements > 0 && IsSingleElement)
\r
1608 D3DXASSERT( ( TotalSize == 0 && Stride == 0 ) ||
\r
1609 ( (TotalSize > (Stride * (Elements - 1))) && (TotalSize <= (Stride * Elements)) ) );
\r
1610 return TotalSize - Stride * (Elements - 1);
\r
1618 UINT SType::GetTotalPackedSize(BOOL IsSingleElement) CONST
\r
1620 if (Elements > 0 && IsSingleElement)
\r
1622 D3DXASSERT(PackedSize % Elements == 0);
\r
1623 return PackedSize / Elements;
\r
1627 return PackedSize;
\r
1631 SConstantBuffer *CEffect::FindCB(LPCSTR pName)
\r
1635 for (i=0; i<m_CBCount; i++)
\r
1637 if (!strcmp(m_pCBs[i].pName, pName))
\r
1639 return &m_pCBs[i];
\r
1646 inline UINT PtrToDword(void *pPtr)
\r
1648 return (UINT)(UINT_PTR) pPtr;
\r
1651 BOOL CEffect::IsOptimized()
\r
1653 if ((m_Flags & D3DX11_EFFECT_OPTIMIZED) != 0)
\r
1655 D3DXASSERT(NULL == m_pReflection);
\r
1660 D3DXASSERT(NULL != m_pReflection);
\r
1665 // Replace *ppType with the corresponding value in pMappingTable
\r
1666 // pMappingTable table describes how to map old type pointers to new type pointers
\r
1667 static HRESULT RemapType(SType **ppType, CPointerMappingTable *pMappingTable)
\r
1669 HRESULT hr = S_OK;
\r
1671 SPointerMapping ptrMapping;
\r
1672 CPointerMappingTable::CIterator iter;
\r
1673 ptrMapping.pOld = *ppType;
\r
1674 VH( pMappingTable->FindValueWithHash(ptrMapping, ptrMapping.Hash(), &iter) );
\r
1675 *ppType = (SType *) iter.GetData().pNew;
\r
1681 // Replace *ppString with the corresponding value in pMappingTable
\r
1682 // pMappingTable table describes how to map old string pointers to new string pointers
\r
1683 static HRESULT RemapString(__in char **ppString, CPointerMappingTable *pMappingTable)
\r
1685 HRESULT hr = S_OK;
\r
1687 SPointerMapping ptrMapping;
\r
1688 CPointerMappingTable::CIterator iter;
\r
1689 ptrMapping.pOld = *ppString;
\r
1690 VH( pMappingTable->FindValueWithHash(ptrMapping, ptrMapping.Hash(), &iter) );
\r
1691 *ppString = (char *) iter.GetData().pNew;
\r
1697 // Used in cloning, copy m_pMemberInterfaces from pEffectSource to this
\r
1698 HRESULT CEffect::CopyMemberInterfaces( CEffect* pEffectSource )
\r
1700 HRESULT hr = S_OK;
\r
1701 UINT i; // after a failure, this holds the failing index
\r
1703 UINT Members = pEffectSource->m_pMemberInterfaces.GetSize();
\r
1704 m_pMemberInterfaces.AddRange(Members);
\r
1705 for( i=0; i < Members; i++ )
\r
1707 SMember* pOldMember = pEffectSource->m_pMemberInterfaces[i];
\r
1708 if( pOldMember == NULL )
\r
1710 // During Optimization, m_pMemberInterfaces[i] was set to NULL because it was an annotation
\r
1711 m_pMemberInterfaces[i] = NULL;
\r
1715 SMember *pNewMember;
\r
1716 D3DXASSERT( pOldMember->pTopLevelEntity != NULL );
\r
1718 if (NULL == (pNewMember = CreateNewMember((SType*)pOldMember->pType, FALSE)))
\r
1720 DPF(0, "ID3DX11Effect: Out of memory while trying to create new member variable interface");
\r
1724 pNewMember->pType = pOldMember->pType;
\r
1725 pNewMember->pName = pOldMember->pName;
\r
1726 pNewMember->pSemantic = pOldMember->pSemantic;
\r
1727 pNewMember->Data.pGeneric = pOldMember->Data.pGeneric;
\r
1728 pNewMember->IsSingleElement = pOldMember->IsSingleElement;
\r
1729 pNewMember->pTopLevelEntity = pOldMember->pTopLevelEntity;
\r
1730 pNewMember->pMemberData = pOldMember->pMemberData;
\r
1732 m_pMemberInterfaces[i] = pNewMember;
\r
1738 D3DXASSERT( i < Members );
\r
1739 ZeroMemory( &m_pMemberInterfaces[i], sizeof(SMember) * ( Members - i ) );
\r
1744 // Used in cloning, copy the string pool from pEffectSource to this and build mappingTable
\r
1745 // for use in RemapString
\r
1746 HRESULT CEffect::CopyStringPool( CEffect* pEffectSource, CPointerMappingTable& mappingTable )
\r
1748 HRESULT hr = S_OK;
\r
1749 D3DXASSERT( m_pPooledHeap != NULL );
\r
1750 VN( m_pStringPool = NEW CEffect::CStringHashTable );
\r
1751 m_pStringPool->SetPrivateHeap(m_pPooledHeap);
\r
1752 VH( m_pStringPool->AutoGrow() );
\r
1754 CStringHashTable::CIterator stringIter;
\r
1756 // move strings over, build mapping table
\r
1757 for (pEffectSource->m_pStringPool->GetFirstEntry(&stringIter); !pEffectSource->m_pStringPool->PastEnd(&stringIter); pEffectSource->m_pStringPool->GetNextEntry(&stringIter))
\r
1759 SPointerMapping ptrMapping;
\r
1762 const char* pOldString = stringIter.GetData();
\r
1763 ptrMapping.pOld = (void*)pOldString;
\r
1764 UINT len = (UINT)strlen(pOldString);
\r
1765 UINT hash = ptrMapping.Hash();
\r
1766 VN( pString = new(*m_pPooledHeap) char[len + 1] );
\r
1767 ptrMapping.pNew = (void*)pString;
\r
1768 memcpy(ptrMapping.pNew, ptrMapping.pOld, len + 1);
\r
1769 VH( m_pStringPool->AddValueWithHash(pString, hash) );
\r
1771 VH( mappingTable.AddValueWithHash(ptrMapping, hash) );
\r
1774 // Uncomment to print string mapping
\r
1776 CPointerMappingTable::CIterator mapIter;
\r
1777 for (mappingTable.GetFirstEntry(&mapIter); !mappingTable.PastEnd(&mapIter); mappingTable.GetNextEntry(&mapIter))
\r
1779 SPointerMapping ptrMapping = mapIter.GetData();
\r
1780 DPF(0, "string: 0x%x : 0x%x %s", (UINT_PTR)ptrMapping.pOld, (UINT_PTR)ptrMapping.pNew, (char*)ptrMapping.pNew );
\r
1787 // Used in cloning, copy the unoptimized type pool from pEffectSource to this and build mappingTableTypes
\r
1788 // for use in RemapType. mappingTableStrings is the mapping table previously filled when copying strings.
\r
1789 HRESULT CEffect::CopyTypePool( CEffect* pEffectSource, CPointerMappingTable& mappingTableTypes, CPointerMappingTable& mappingTableStrings )
\r
1791 HRESULT hr = S_OK;
\r
1792 D3DXASSERT( m_pPooledHeap != NULL );
\r
1793 VN( m_pTypePool = NEW CEffect::CTypeHashTable );
\r
1794 m_pTypePool->SetPrivateHeap(m_pPooledHeap);
\r
1795 VH( m_pTypePool->AutoGrow() );
\r
1797 CTypeHashTable::CIterator typeIter;
\r
1798 CPointerMappingTable::CIterator mapIter;
\r
1800 // first pass: move types over, build mapping table
\r
1801 for (pEffectSource->m_pTypePool->GetFirstEntry(&typeIter); !pEffectSource->m_pTypePool->PastEnd(&typeIter); pEffectSource->m_pTypePool->GetNextEntry(&typeIter))
\r
1803 SPointerMapping ptrMapping;
\r
1806 ptrMapping.pOld = typeIter.GetData();
\r
1807 UINT hash = ptrMapping.Hash();
\r
1808 VN( (ptrMapping.pNew) = new(*m_pPooledHeap) SType );
\r
1809 memcpy(ptrMapping.pNew, ptrMapping.pOld, sizeof(SType));
\r
1811 pType = (SType *) ptrMapping.pNew;
\r
1813 // if this is a struct, move its members to the newly allocated space
\r
1814 if (EVT_Struct == pType->VarType)
\r
1816 SVariable* pOldMembers = pType->StructType.pMembers;
\r
1817 VN( pType->StructType.pMembers = new(*m_pPooledHeap) SVariable[pType->StructType.Members] );
\r
1818 memcpy(pType->StructType.pMembers, pOldMembers, pType->StructType.Members * sizeof(SVariable));
\r
1821 VH( m_pTypePool->AddValueWithHash(pType, hash) );
\r
1822 VH( mappingTableTypes.AddValueWithHash(ptrMapping, hash) );
\r
1825 // second pass: fixup structure member & name pointers
\r
1826 for (mappingTableTypes.GetFirstEntry(&mapIter); !mappingTableTypes.PastEnd(&mapIter); mappingTableTypes.GetNextEntry(&mapIter))
\r
1828 SPointerMapping ptrMapping = mapIter.GetData();
\r
1830 // Uncomment to print type mapping
\r
1831 //DPF(0, "type: 0x%x : 0x%x", (UINT_PTR)ptrMapping.pOld, (UINT_PTR)ptrMapping.pNew );
\r
1833 SType *pType = (SType *) ptrMapping.pNew;
\r
1835 if( pType->pTypeName )
\r
1837 VH( RemapString(&pType->pTypeName, &mappingTableStrings) );
\r
1840 // if this is a struct, fix up its members' pointers
\r
1841 if (EVT_Struct == pType->VarType)
\r
1843 for (UINT i = 0; i < pType->StructType.Members; ++ i)
\r
1845 VH( RemapType((SType**)&pType->StructType.pMembers[i].pType, &mappingTableTypes) );
\r
1846 if( pType->StructType.pMembers[i].pName )
\r
1848 VH( RemapString(&pType->StructType.pMembers[i].pName, &mappingTableStrings) );
\r
1850 if( pType->StructType.pMembers[i].pSemantic )
\r
1852 VH( RemapString(&pType->StructType.pMembers[i].pSemantic, &mappingTableStrings) );
\r
1862 // Used in cloning, copy the unoptimized type pool from pEffectSource to this and build mappingTableTypes
\r
1863 // for use in RemapType. mappingTableStrings is the mapping table previously filled when copying strings.
\r
1864 HRESULT CEffect::CopyOptimizedTypePool( CEffect* pEffectSource, CPointerMappingTable& mappingTableTypes )
\r
1866 HRESULT hr = S_OK;
\r
1867 CEffectHeap* pOptimizedTypeHeap = NULL;
\r
1869 D3DXASSERT( pEffectSource->m_pOptimizedTypeHeap != NULL );
\r
1870 D3DXASSERT( m_pTypePool == NULL );
\r
1871 D3DXASSERT( m_pStringPool == NULL );
\r
1872 D3DXASSERT( m_pPooledHeap == NULL );
\r
1874 VN( pOptimizedTypeHeap = NEW CEffectHeap );
\r
1875 VH( pOptimizedTypeHeap->ReserveMemory( pEffectSource->m_pOptimizedTypeHeap->GetSize() ) );
\r
1876 CPointerMappingTable::CIterator mapIter;
\r
1878 // first pass: move types over, build mapping table
\r
1879 BYTE* pReadTypes = pEffectSource->m_pOptimizedTypeHeap->GetDataStart();
\r
1880 while( pEffectSource->m_pOptimizedTypeHeap->IsInHeap( pReadTypes ) )
\r
1882 SPointerMapping ptrMapping;
\r
1886 ptrMapping.pOld = ptrMapping.pNew = pReadTypes;
\r
1887 moveSize = sizeof(SType);
\r
1888 VH( pOptimizedTypeHeap->MoveData(&ptrMapping.pNew, moveSize) );
\r
1889 pReadTypes += moveSize;
\r
1891 pType = (SType *) ptrMapping.pNew;
\r
1893 // if this is a struct, move its members to the newly allocated space
\r
1894 if (EVT_Struct == pType->VarType)
\r
1896 moveSize = pType->StructType.Members * sizeof(SVariable);
\r
1897 VH( pOptimizedTypeHeap->MoveData((void **)&pType->StructType.pMembers, moveSize) );
\r
1898 pReadTypes += moveSize;
\r
1901 VH( mappingTableTypes.AddValueWithHash(ptrMapping, ptrMapping.Hash()) );
\r
1904 // second pass: fixup structure member & name pointers
\r
1905 for (mappingTableTypes.GetFirstEntry(&mapIter); !mappingTableTypes.PastEnd(&mapIter); mappingTableTypes.GetNextEntry(&mapIter))
\r
1907 SPointerMapping ptrMapping = mapIter.GetData();
\r
1909 // Uncomment to print type mapping
\r
1910 //DPF(0, "type: 0x%x : 0x%x", (UINT_PTR)ptrMapping.pOld, (UINT_PTR)ptrMapping.pNew );
\r
1912 SType *pType = (SType *) ptrMapping.pNew;
\r
1914 // if this is a struct, fix up its members' pointers
\r
1915 if (EVT_Struct == pType->VarType)
\r
1917 for (UINT i = 0; i < pType->StructType.Members; ++ i)
\r
1919 VH( RemapType((SType**)&pType->StructType.pMembers[i].pType, &mappingTableTypes) );
\r
1928 // Used in cloning, create new ID3D11ConstantBuffers for each non-single CB
\r
1929 HRESULT CEffect::RecreateCBs()
\r
1931 HRESULT hr = S_OK;
\r
1932 UINT i; // after a failure, this holds the failing index
\r
1934 for (i = 0; i < m_CBCount; ++ i)
\r
1936 SConstantBuffer* pCB = &m_pCBs[i];
\r
1938 pCB->IsNonUpdatable = pCB->IsUserManaged || pCB->ClonedSingle();
\r
1940 if( pCB->Size > 0 && !pCB->ClonedSingle() )
\r
1942 ID3D11Buffer** ppOriginalBuffer;
\r
1943 ID3D11ShaderResourceView** ppOriginalTBufferView;
\r
1945 if( pCB->IsUserManaged )
\r
1947 ppOriginalBuffer = &pCB->pMemberData[0].Data.pD3DEffectsManagedConstantBuffer;
\r
1948 ppOriginalTBufferView = &pCB->pMemberData[1].Data.pD3DEffectsManagedTextureBuffer;
\r
1952 ppOriginalBuffer = &pCB->pD3DObject;
\r
1953 ppOriginalTBufferView = &pCB->TBuffer.pShaderResource;
\r
1956 VN( *ppOriginalBuffer );
\r
1957 D3D11_BUFFER_DESC bufDesc;
\r
1958 (*ppOriginalBuffer)->GetDesc( &bufDesc );
\r
1959 ID3D11Buffer* pNewBuffer = NULL;
\r
1960 VH( m_pDevice->CreateBuffer( &bufDesc, NULL, &pNewBuffer ) );
\r
1961 (*ppOriginalBuffer)->Release();
\r
1962 (*ppOriginalBuffer) = pNewBuffer;
\r
1963 pNewBuffer = NULL;
\r
1965 if( pCB->IsTBuffer )
\r
1967 VN( *ppOriginalTBufferView );
\r
1968 D3D11_SHADER_RESOURCE_VIEW_DESC viewDesc;
\r
1969 (*ppOriginalTBufferView)->GetDesc( &viewDesc );
\r
1970 ID3D11ShaderResourceView* pNewView = NULL;
\r
1971 VH( m_pDevice->CreateShaderResourceView( (*ppOriginalBuffer), &viewDesc, &pNewView) );
\r
1972 (*ppOriginalTBufferView)->Release();
\r
1973 (*ppOriginalTBufferView) = pNewView;
\r
1978 D3DXASSERT( *ppOriginalTBufferView == NULL );
\r
1979 ReplaceCBReference( pCB, (*ppOriginalBuffer) );
\r
1982 pCB->IsDirty = TRUE;
\r
1990 // Move Name and Semantic strings using mappingTableStrings
\r
1991 HRESULT CEffect::FixupMemberInterface( SMember* pMember, CEffect* pEffectSource, CPointerMappingTable& mappingTableStrings )
\r
1993 HRESULT hr = S_OK;
\r
1995 if( pMember->pName )
\r
1997 if( pEffectSource->m_pReflection && pEffectSource->m_pReflection->m_Heap.IsInHeap(pMember->pName) )
\r
1999 pMember->pName = (char*)((UINT_PTR)pMember->pName - (UINT_PTR)pEffectSource->m_pReflection->m_Heap.GetDataStart() + (UINT_PTR)m_pReflection->m_Heap.GetDataStart());
\r
2003 VH( RemapString(&pMember->pName, &mappingTableStrings) );
\r
2006 if( pMember->pSemantic )
\r
2008 if( pEffectSource->m_pReflection && pEffectSource->m_pReflection->m_Heap.IsInHeap(pMember->pSemantic) )
\r
2010 pMember->pSemantic = (char*)((UINT_PTR)pMember->pSemantic - (UINT_PTR)pEffectSource->m_pReflection->m_Heap.GetDataStart() + (UINT_PTR)m_pReflection->m_Heap.GetDataStart());
\r
2014 VH( RemapString(&pMember->pSemantic, &mappingTableStrings) );
\r
2022 //////////////////////////////////////////////////////////////////////////
\r
2023 // Public API to create a copy of this effect
\r
2024 HRESULT CEffect::CloneEffect(UINT Flags, ID3DX11Effect** ppClonedEffect )
\r
2026 HRESULT hr = S_OK;
\r
2027 CPointerMappingTable mappingTableTypes;
\r
2028 CPointerMappingTable mappingTableStrings;
\r
2030 CEffectLoader loader;
\r
2031 CEffect* pNewEffect = NULL;
\r
2032 CDataBlockStore* pTempHeap = NULL;
\r
2035 VN( pNewEffect = NEW CEffect( m_Flags ) );
\r
2036 if( Flags & D3DX11_EFFECT_CLONE_FORCE_NONSINGLE )
\r
2038 // The effect is cloned as if there was no original, so don't mark it as cloned
\r
2039 pNewEffect->m_Flags &= ~(UINT)D3DX11_EFFECT_CLONE;
\r
2043 pNewEffect->m_Flags |= D3DX11_EFFECT_CLONE;
\r
2046 pNewEffect->m_VariableCount = m_VariableCount;
\r
2047 pNewEffect->m_pVariables = m_pVariables;
\r
2048 pNewEffect->m_AnonymousShaderCount = m_AnonymousShaderCount;
\r
2049 pNewEffect->m_pAnonymousShaders = m_pAnonymousShaders;
\r
2050 pNewEffect->m_TechniqueCount = m_TechniqueCount;
\r
2051 pNewEffect->m_GroupCount = m_GroupCount;
\r
2052 pNewEffect->m_pGroups = m_pGroups;
\r
2053 pNewEffect->m_pNullGroup = m_pNullGroup;
\r
2054 pNewEffect->m_ShaderBlockCount = m_ShaderBlockCount;
\r
2055 pNewEffect->m_pShaderBlocks = m_pShaderBlocks;
\r
2056 pNewEffect->m_DepthStencilBlockCount = m_DepthStencilBlockCount;
\r
2057 pNewEffect->m_pDepthStencilBlocks = m_pDepthStencilBlocks;
\r
2058 pNewEffect->m_BlendBlockCount = m_BlendBlockCount;
\r
2059 pNewEffect->m_pBlendBlocks = m_pBlendBlocks;
\r
2060 pNewEffect->m_RasterizerBlockCount = m_RasterizerBlockCount;
\r
2061 pNewEffect->m_pRasterizerBlocks = m_pRasterizerBlocks;
\r
2062 pNewEffect->m_SamplerBlockCount = m_SamplerBlockCount;
\r
2063 pNewEffect->m_pSamplerBlocks = m_pSamplerBlocks;
\r
2064 pNewEffect->m_MemberDataCount = m_MemberDataCount;
\r
2065 pNewEffect->m_pMemberDataBlocks = m_pMemberDataBlocks;
\r
2066 pNewEffect->m_InterfaceCount = m_InterfaceCount;
\r
2067 pNewEffect->m_pInterfaces = m_pInterfaces;
\r
2068 pNewEffect->m_CBCount = m_CBCount;
\r
2069 pNewEffect->m_pCBs = m_pCBs;
\r
2070 pNewEffect->m_StringCount = m_StringCount;
\r
2071 pNewEffect->m_pStrings = m_pStrings;
\r
2072 pNewEffect->m_ShaderResourceCount = m_ShaderResourceCount;
\r
2073 pNewEffect->m_pShaderResources = m_pShaderResources;
\r
2074 pNewEffect->m_UnorderedAccessViewCount = m_UnorderedAccessViewCount;
\r
2075 pNewEffect->m_pUnorderedAccessViews = m_pUnorderedAccessViews;
\r
2076 pNewEffect->m_RenderTargetViewCount = m_RenderTargetViewCount;
\r
2077 pNewEffect->m_pRenderTargetViews = m_pRenderTargetViews;
\r
2078 pNewEffect->m_DepthStencilViewCount = m_DepthStencilViewCount;
\r
2079 pNewEffect->m_pDepthStencilViews = m_pDepthStencilViews;
\r
2080 pNewEffect->m_LocalTimer = m_LocalTimer;
\r
2081 pNewEffect->m_FXLIndex = m_FXLIndex;
\r
2082 pNewEffect->m_pDevice = m_pDevice;
\r
2083 pNewEffect->m_pClassLinkage = m_pClassLinkage;
\r
2085 pNewEffect->AddRefAllForCloning( this );
\r
2088 // m_pMemberInterfaces is a vector of cbuffer members that were created when the user called GetMemberBy* or GetElement
\r
2089 // or during Effect loading when an interface is initialized to a global class variable elment.
\r
2090 VH( pNewEffect->CopyMemberInterfaces( this ) );
\r
2092 loader.m_pvOldMemberInterfaces = &m_pMemberInterfaces;
\r
2093 loader.m_pEffect = pNewEffect;
\r
2094 loader.m_EffectMemory = loader.m_ReflectionMemory = 0;
\r
2097 // Move data from current effect to new effect
\r
2098 if( !IsOptimized() )
\r
2100 VN( pNewEffect->m_pReflection = NEW CEffectReflection() );
\r
2101 loader.m_pReflection = pNewEffect->m_pReflection;
\r
2103 // make sure strings are moved before ReallocateEffectData
\r
2104 VH( loader.InitializeReflectionDataAndMoveStrings( m_pReflection->m_Heap.GetSize() ) );
\r
2106 VH( loader.ReallocateEffectData( true ) );
\r
2107 if( !IsOptimized() )
\r
2109 VH( loader.ReallocateReflectionData( true ) );
\r
2113 // Data structures for remapping type pointers and string pointers
\r
2114 VN( pTempHeap = NEW CDataBlockStore );
\r
2115 pTempHeap->EnableAlignment();
\r
2116 mappingTableTypes.SetPrivateHeap(pTempHeap);
\r
2117 mappingTableStrings.SetPrivateHeap(pTempHeap);
\r
2118 VH( mappingTableTypes.AutoGrow() );
\r
2119 VH( mappingTableStrings.AutoGrow() );
\r
2121 if( !IsOptimized() )
\r
2123 // Let's re-create the type pool and string pool
\r
2124 VN( pNewEffect->m_pPooledHeap = NEW CDataBlockStore );
\r
2125 pNewEffect->m_pPooledHeap->EnableAlignment();
\r
2127 VH( pNewEffect->CopyStringPool( this, mappingTableStrings ) );
\r
2128 VH( pNewEffect->CopyTypePool( this, mappingTableTypes, mappingTableStrings ) );
\r
2132 // There's no string pool after optimizing. Let's re-create the type pool
\r
2133 VH( pNewEffect->CopyOptimizedTypePool( this, mappingTableTypes ) );
\r
2136 // fixup this effect's variable's types
\r
2137 VH( pNewEffect->OptimizeTypes(&mappingTableTypes, true) );
\r
2138 VH( pNewEffect->RecreateCBs() );
\r
2141 for (UINT i = 0; i < pNewEffect->m_pMemberInterfaces.GetSize(); ++ i)
\r
2143 SMember* pMember = pNewEffect->m_pMemberInterfaces[i];
\r
2144 VH( pNewEffect->FixupMemberInterface( pMember, this, mappingTableStrings ) );
\r
2149 SAFE_DELETE( pTempHeap );
\r
2150 if( FAILED( hr ) )
\r
2152 SAFE_DELETE( pNewEffect );
\r
2154 *ppClonedEffect = pNewEffect;
\r
2158 // Move all type pointers using pMappingTable.
\r
2159 // This is called after creating the optimized type pool or during cloning.
\r
2160 HRESULT CEffect::OptimizeTypes(CPointerMappingTable *pMappingTable, bool Cloning)
\r
2162 HRESULT hr = S_OK;
\r
2165 // find all child types, point them to the new location
\r
2166 for (i = 0; i < m_VariableCount; ++ i)
\r
2168 VH( RemapType((SType**)&m_pVariables[i].pType, pMappingTable) );
\r
2171 UINT Members = m_pMemberInterfaces.GetSize();
\r
2172 for( i=0; i < Members; i++ )
\r
2174 if( m_pMemberInterfaces[i] != NULL )
\r
2176 VH( RemapType((SType**)&m_pMemberInterfaces[i]->pType, pMappingTable) );
\r
2180 // when cloning, there may be annotations
\r
2183 for (UINT iVar = 0; iVar < m_VariableCount; ++ iVar)
\r
2185 for(i = 0; i < m_pVariables[iVar].AnnotationCount; ++ i )
\r
2187 VH( RemapType((SType**)&m_pVariables[iVar].pAnnotations[i].pType, pMappingTable) );
\r
2190 for (UINT iCB = 0; iCB < m_CBCount; ++ iCB)
\r
2192 for(i = 0; i < m_pCBs[iCB].AnnotationCount; ++ i )
\r
2194 VH( RemapType((SType**)&m_pCBs[iCB].pAnnotations[i].pType, pMappingTable) );
\r
2197 for (UINT iGroup = 0; iGroup < m_GroupCount; ++ iGroup)
\r
2199 for(i = 0; i < m_pGroups[iGroup].AnnotationCount; ++ i )
\r
2201 VH( RemapType((SType**)&m_pGroups[iGroup].pAnnotations[i].pType, pMappingTable) );
\r
2203 for(UINT iTech = 0; iTech < m_pGroups[iGroup].TechniqueCount; ++ iTech )
\r
2205 for(i = 0; i < m_pGroups[iGroup].pTechniques[iTech].AnnotationCount; ++ i )
\r
2207 VH( RemapType((SType**)&m_pGroups[iGroup].pTechniques[iTech].pAnnotations[i].pType, pMappingTable) );
\r
2209 for(UINT iPass = 0; iPass < m_pGroups[iGroup].pTechniques[iTech].PassCount; ++ iPass )
\r
2211 for(i = 0; i < m_pGroups[iGroup].pTechniques[iTech].pPasses[iPass].AnnotationCount; ++ i )
\r
2213 VH( RemapType((SType**)&m_pGroups[iGroup].pTechniques[iTech].pPasses[iPass].pAnnotations[i].pType, pMappingTable) );
\r
2223 //////////////////////////////////////////////////////////////////////////
\r
2224 // Public API to shed this effect of its reflection data
\r
2225 HRESULT CEffect::Optimize()
\r
2227 HRESULT hr = S_OK;
\r
2229 CEffectHeap *pOptimizedTypeHeap = NULL;
\r
2231 if (IsOptimized())
\r
2233 DPF(0, "ID3DX11Effect::Optimize: Effect has already been Optimize()'ed");
\r
2237 // Delete annotations, names, semantics, and string data on variables
\r
2239 for (i = 0; i < m_VariableCount; ++ i)
\r
2241 m_pVariables[i].AnnotationCount = 0;
\r
2242 m_pVariables[i].pAnnotations = NULL;
\r
2243 m_pVariables[i].pName = NULL;
\r
2244 m_pVariables[i].pSemantic = NULL;
\r
2246 // 2) Point string variables to NULL
\r
2247 if (m_pVariables[i].pType->IsObjectType(EOT_String))
\r
2249 D3DXASSERT(NULL != m_pVariables[i].Data.pString);
\r
2250 m_pVariables[i].Data.pString = NULL;
\r
2254 // Delete annotations and names on CBs
\r
2256 for (i = 0; i < m_CBCount; ++ i)
\r
2258 m_pCBs[i].AnnotationCount = 0;
\r
2259 m_pCBs[i].pAnnotations = NULL;
\r
2260 m_pCBs[i].pName = NULL;
\r
2261 m_pCBs[i].IsEffectOptimized = TRUE;
\r
2264 // Delete annotations and names on techniques and passes
\r
2266 for (i = 0; i < m_GroupCount; ++ i)
\r
2268 m_pGroups[i].AnnotationCount = 0;
\r
2269 m_pGroups[i].pAnnotations = NULL;
\r
2270 m_pGroups[i].pName = NULL;
\r
2272 for (j = 0; j < m_pGroups[i].TechniqueCount; ++ j)
\r
2274 m_pGroups[i].pTechniques[j].AnnotationCount = 0;
\r
2275 m_pGroups[i].pTechniques[j].pAnnotations = NULL;
\r
2276 m_pGroups[i].pTechniques[j].pName = NULL;
\r
2278 for (k = 0; k < m_pGroups[i].pTechniques[j].PassCount; ++ k)
\r
2280 m_pGroups[i].pTechniques[j].pPasses[k].AnnotationCount = 0;
\r
2281 m_pGroups[i].pTechniques[j].pPasses[k].pAnnotations = NULL;
\r
2282 m_pGroups[i].pTechniques[j].pPasses[k].pName = NULL;
\r
2287 // 2) Remove shader bytecode & stream out decls
\r
2288 // (all are contained within pReflectionData)
\r
2290 for (i = 0; i < m_ShaderBlockCount; ++ i)
\r
2292 if( m_pShaderBlocks[i].pReflectionData )
\r
2294 // pReflection was not created with PRIVATENEW
\r
2295 SAFE_RELEASE( m_pShaderBlocks[i].pReflectionData->pReflection );
\r
2297 m_pShaderBlocks[i].pReflectionData = NULL;
\r
2301 UINT Members = m_pMemberInterfaces.GetSize();
\r
2302 for( i=0; i < Members; i++ )
\r
2304 D3DXASSERT( m_pMemberInterfaces[i] != NULL );
\r
2305 if( IsReflectionData(m_pMemberInterfaces[i]->pTopLevelEntity) )
\r
2307 D3DXASSERT( IsReflectionData(m_pMemberInterfaces[i]->Data.pGeneric) );
\r
2309 // This is checked when cloning (so we don't clone Optimized-out member variables)
\r
2310 m_pMemberInterfaces[i] = NULL;
\r
2314 m_pMemberInterfaces[i]->pName = NULL;
\r
2315 m_pMemberInterfaces[i]->pSemantic = NULL;
\r
2321 // get rid of the name/type hash tables and string data,
\r
2322 // then reallocate the type data and fix up this effect
\r
2323 CPointerMappingTable mappingTable;
\r
2324 CTypeHashTable::CIterator typeIter;
\r
2325 CPointerMappingTable::CIterator mapIter;
\r
2326 CCheckedDword chkSpaceNeeded = 0;
\r
2329 // first pass: compute needed space
\r
2330 for (m_pTypePool->GetFirstEntry(&typeIter); !m_pTypePool->PastEnd(&typeIter); m_pTypePool->GetNextEntry(&typeIter))
\r
2332 SType *pType = typeIter.GetData();
\r
2334 chkSpaceNeeded += AlignToPowerOf2(sizeof(SType), c_DataAlignment);
\r
2336 // if this is a struct, allocate room for its members
\r
2337 if (EVT_Struct == pType->VarType)
\r
2339 chkSpaceNeeded += AlignToPowerOf2(pType->StructType.Members * sizeof(SVariable), c_DataAlignment);
\r
2343 VH( chkSpaceNeeded.GetValue(&spaceNeeded) );
\r
2345 D3DXASSERT(NULL == m_pOptimizedTypeHeap);
\r
2346 VN( pOptimizedTypeHeap = NEW CEffectHeap );
\r
2347 VH( pOptimizedTypeHeap->ReserveMemory(spaceNeeded));
\r
2349 // use the private heap that we're about to destroy as scratch space for the mapping table
\r
2350 mappingTable.SetPrivateHeap(m_pPooledHeap);
\r
2351 VH( mappingTable.AutoGrow() );
\r
2353 // second pass: move types over, build mapping table
\r
2354 for (m_pTypePool->GetFirstEntry(&typeIter); !m_pTypePool->PastEnd(&typeIter); m_pTypePool->GetNextEntry(&typeIter))
\r
2356 SPointerMapping ptrMapping;
\r
2359 ptrMapping.pOld = ptrMapping.pNew = typeIter.GetData();
\r
2360 VH( pOptimizedTypeHeap->MoveData(&ptrMapping.pNew, sizeof(SType)) );
\r
2362 pType = (SType *) ptrMapping.pNew;
\r
2364 // if this is a struct, move its members to the newly allocated space
\r
2365 if (EVT_Struct == pType->VarType)
\r
2367 VH( pOptimizedTypeHeap->MoveData((void **)&pType->StructType.pMembers, pType->StructType.Members * sizeof(SVariable)) );
\r
2370 VH( mappingTable.AddValueWithHash(ptrMapping, ptrMapping.Hash()) );
\r
2373 // third pass: fixup structure member & name pointers
\r
2374 for (mappingTable.GetFirstEntry(&mapIter); !mappingTable.PastEnd(&mapIter); mappingTable.GetNextEntry(&mapIter))
\r
2376 SPointerMapping ptrMapping = mapIter.GetData();
\r
2377 SType *pType = (SType *) ptrMapping.pNew;
\r
2379 pType->pTypeName = NULL;
\r
2381 // if this is a struct, fix up its members' pointers
\r
2382 if (EVT_Struct == pType->VarType)
\r
2384 for (i = 0; i < pType->StructType.Members; ++ i)
\r
2386 VH( RemapType((SType**)&pType->StructType.pMembers[i].pType, &mappingTable) );
\r
2387 pType->StructType.pMembers[i].pName = NULL;
\r
2388 pType->StructType.pMembers[i].pSemantic = NULL;
\r
2393 // fixup this effect's variable's types
\r
2394 VH( OptimizeTypes(&mappingTable) );
\r
2396 m_pOptimizedTypeHeap = pOptimizedTypeHeap;
\r
2397 pOptimizedTypeHeap = NULL;
\r
2399 #ifdef D3DX11_FX_PRINT_HASH_STATS
\r
2400 DPF(0, "Compiler string pool hash table statistics:");
\r
2401 m_pTypePool->PrintHashTableStats();
\r
2402 DPF(0, "Compiler type pool hash table statistics:");
\r
2403 m_pStringPool->PrintHashTableStats();
\r
2404 #endif // D3DX11_FX_PRINT_HASH_STATS
\r
2406 SAFE_DELETE(m_pTypePool);
\r
2407 SAFE_DELETE(m_pStringPool);
\r
2408 SAFE_DELETE(m_pPooledHeap);
\r
2410 DPF(0, "ID3DX11Effect::Optimize: %d bytes of reflection data freed.", m_pReflection->m_Heap.GetSize());
\r
2411 SAFE_DELETE(m_pReflection);
\r
2412 m_Flags |= D3DX11_EFFECT_OPTIMIZED;
\r
2415 SAFE_DELETE(pOptimizedTypeHeap);
\r
2419 SMember * CreateNewMember(SType *pType, BOOL IsAnnotation)
\r
2421 switch (pType->VarType)
\r
2426 D3DXASSERT(sizeof(SNumericAnnotationMember) == sizeof(SMember));
\r
2427 return (SMember*) NEW SNumericAnnotationMember;
\r
2429 else if (pType->StructType.ImplementsInterface)
\r
2431 D3DXASSERT(sizeof(SClassInstanceGlobalVariableMember) == sizeof(SMember));
\r
2432 return (SMember*) NEW SClassInstanceGlobalVariableMember;
\r
2436 D3DXASSERT(sizeof(SNumericGlobalVariableMember) == sizeof(SMember));
\r
2437 return (SMember*) NEW SNumericGlobalVariableMember;
\r
2440 case EVT_Interface:
\r
2441 D3DXASSERT(sizeof(SInterfaceGlobalVariableMember) == sizeof(SMember));
\r
2442 return (SMember*) NEW SInterfaceGlobalVariableMember;
\r
2445 switch (pType->ObjectType)
\r
2450 D3DXASSERT(sizeof(SStringAnnotationMember) == sizeof(SMember));
\r
2451 return (SMember*) NEW SStringAnnotationMember;
\r
2455 D3DXASSERT(sizeof(SStringGlobalVariableMember) == sizeof(SMember));
\r
2456 return (SMember*) NEW SStringGlobalVariableMember;
\r
2461 case EOT_Texture1D:
\r
2462 case EOT_Texture1DArray:
\r
2463 case EOT_Texture2D:
\r
2464 case EOT_Texture2DArray:
\r
2465 case EOT_Texture2DMS:
\r
2466 case EOT_Texture2DMSArray:
\r
2467 case EOT_Texture3D:
\r
2468 case EOT_TextureCube:
\r
2469 case EOT_TextureCubeArray:
\r
2471 case EOT_ByteAddressBuffer:
\r
2472 case EOT_StructuredBuffer:
\r
2473 D3DXASSERT(!IsAnnotation);
\r
2474 D3DXASSERT(sizeof(SShaderResourceGlobalVariableMember) == sizeof(SMember));
\r
2475 return (SMember*) NEW SShaderResourceGlobalVariableMember;
\r
2477 case EOT_RWTexture1D:
\r
2478 case EOT_RWTexture1DArray:
\r
2479 case EOT_RWTexture2D:
\r
2480 case EOT_RWTexture2DArray:
\r
2481 case EOT_RWTexture3D:
\r
2482 case EOT_RWBuffer:
\r
2483 case EOT_RWByteAddressBuffer:
\r
2484 case EOT_RWStructuredBuffer:
\r
2485 case EOT_RWStructuredBufferAlloc:
\r
2486 case EOT_RWStructuredBufferConsume:
\r
2487 case EOT_AppendStructuredBuffer:
\r
2488 case EOT_ConsumeStructuredBuffer:
\r
2489 D3DXASSERT(!IsAnnotation);
\r
2490 D3DXASSERT(sizeof(SUnorderedAccessViewGlobalVariableMember) == sizeof(SMember));
\r
2491 return (SMember*) NEW SUnorderedAccessViewGlobalVariableMember;
\r
2493 case EOT_VertexShader:
\r
2494 case EOT_VertexShader5:
\r
2495 case EOT_GeometryShader:
\r
2496 case EOT_GeometryShaderSO:
\r
2497 case EOT_GeometryShader5:
\r
2498 case EOT_PixelShader:
\r
2499 case EOT_PixelShader5:
\r
2500 case EOT_HullShader5:
\r
2501 case EOT_DomainShader5:
\r
2502 case EOT_ComputeShader5:
\r
2503 D3DXASSERT(!IsAnnotation);
\r
2504 D3DXASSERT(sizeof(SShaderGlobalVariableMember) == sizeof(SMember));
\r
2505 return (SMember*) NEW SShaderGlobalVariableMember;
\r
2508 D3DXASSERT(!IsAnnotation);
\r
2509 D3DXASSERT(sizeof(SBlendGlobalVariableMember) == sizeof(SMember));
\r
2510 return (SMember*) NEW SBlendGlobalVariableMember;
\r
2512 case EOT_Rasterizer:
\r
2513 D3DXASSERT(!IsAnnotation);
\r
2514 D3DXASSERT(sizeof(SRasterizerGlobalVariableMember) == sizeof(SMember));
\r
2515 return (SMember*) NEW SRasterizerGlobalVariableMember;
\r
2517 case EOT_DepthStencil:
\r
2518 D3DXASSERT(!IsAnnotation);
\r
2519 D3DXASSERT(sizeof(SDepthStencilGlobalVariableMember) == sizeof(SMember));
\r
2520 return (SMember*) NEW SDepthStencilGlobalVariableMember;
\r
2523 D3DXASSERT(!IsAnnotation);
\r
2524 D3DXASSERT(sizeof(SSamplerGlobalVariableMember) == sizeof(SMember));
\r
2525 return (SMember*) NEW SSamplerGlobalVariableMember;
\r
2527 case EOT_DepthStencilView:
\r
2528 D3DXASSERT(!IsAnnotation);
\r
2529 D3DXASSERT(sizeof(SDepthStencilViewGlobalVariableMember) == sizeof(SMember));
\r
2530 return (SMember*) NEW SDepthStencilViewGlobalVariableMember;
\r
2532 case EOT_RenderTargetView:
\r
2533 D3DXASSERT(!IsAnnotation);
\r
2534 D3DXASSERT(sizeof(SRenderTargetViewGlobalVariableMember) == sizeof(SMember));
\r
2535 return (SMember*) NEW SRenderTargetViewGlobalVariableMember;
\r
2539 DPF( 0, "Internal error: invalid object type." );
\r
2545 switch (pType->NumericType.NumericLayout)
\r
2550 D3DXASSERT(sizeof(SMatrixAnnotationMember) == sizeof(SMember));
\r
2551 return (SMember*) NEW SMatrixAnnotationMember;
\r
2555 D3DXASSERT(sizeof(SMatrixGlobalVariableMember) == sizeof(SMember));
\r
2556 D3DXASSERT(sizeof(SMatrix4x4ColumnMajorGlobalVariableMember) == sizeof(SMember));
\r
2557 D3DXASSERT(sizeof(SMatrix4x4RowMajorGlobalVariableMember) == sizeof(SMember));
\r
2559 if (pType->NumericType.Rows == 4 && pType->NumericType.Columns == 4)
\r
2561 if (pType->NumericType.IsColumnMajor)
\r
2563 return (SMember*) NEW SMatrix4x4ColumnMajorGlobalVariableMember;
\r
2567 return (SMember*) NEW SMatrix4x4RowMajorGlobalVariableMember;
\r
2572 return (SMember*) NEW SMatrixGlobalVariableMember;
\r
2577 switch (pType->NumericType.ScalarType)
\r
2582 D3DXASSERT(sizeof(SFloatVectorAnnotationMember) == sizeof(SMember));
\r
2583 return (SMember*) NEW SFloatVectorAnnotationMember;
\r
2587 D3DXASSERT(sizeof(SFloatVectorGlobalVariableMember) == sizeof(SMember));
\r
2588 D3DXASSERT(sizeof(SFloatVector4GlobalVariableMember) == sizeof(SMember));
\r
2590 if (pType->NumericType.Columns == 4)
\r
2592 return (SMember*) NEW SFloatVector4GlobalVariableMember;
\r
2596 return (SMember*) NEW SFloatVectorGlobalVariableMember;
\r
2603 D3DXASSERT(sizeof(SBoolVectorAnnotationMember) == sizeof(SMember));
\r
2604 return (SMember*) NEW SBoolVectorAnnotationMember;
\r
2608 D3DXASSERT(sizeof(SBoolVectorGlobalVariableMember) == sizeof(SMember));
\r
2609 return (SMember*) NEW SBoolVectorGlobalVariableMember;
\r
2616 D3DXASSERT(sizeof(SIntVectorAnnotationMember) == sizeof(SMember));
\r
2617 return (SMember*) NEW SIntVectorAnnotationMember;
\r
2621 D3DXASSERT(sizeof(SIntVectorGlobalVariableMember) == sizeof(SMember));
\r
2622 return (SMember*) NEW SIntVectorGlobalVariableMember;
\r
2627 DPF( 0, "Internal loading error: invalid vector type." );
\r
2632 switch (pType->NumericType.ScalarType)
\r
2637 D3DXASSERT(sizeof(SFloatScalarAnnotationMember) == sizeof(SMember));
\r
2638 return (SMember*) NEW SFloatScalarAnnotationMember;
\r
2642 D3DXASSERT(sizeof(SFloatScalarGlobalVariableMember) == sizeof(SMember));
\r
2643 return (SMember*) NEW SFloatScalarGlobalVariableMember;
\r
2650 D3DXASSERT(sizeof(SIntScalarAnnotationMember) == sizeof(SMember));
\r
2651 return (SMember*) NEW SIntScalarAnnotationMember;
\r
2655 D3DXASSERT(sizeof(SIntScalarGlobalVariableMember) == sizeof(SMember));
\r
2656 return (SMember*) NEW SIntScalarGlobalVariableMember;
\r
2662 D3DXASSERT(sizeof(SBoolScalarAnnotationMember) == sizeof(SMember));
\r
2663 return (SMember*) NEW SBoolScalarAnnotationMember;
\r
2667 D3DXASSERT(sizeof(SBoolScalarGlobalVariableMember) == sizeof(SMember));
\r
2668 return (SMember*) NEW SBoolScalarGlobalVariableMember;
\r
2672 DPF( 0, "Internal loading error: invalid scalar type." );
\r
2679 DPF( 0, "Internal loading error: invalid numeric type." );
\r
2685 DPF( 0, "Internal loading error: invalid variable type." );
\r
2691 // Global variables are created in place because storage for them was allocated during LoadEffect
\r
2692 HRESULT PlacementNewVariable(void *pVar, SType *pType, BOOL IsAnnotation)
\r
2694 switch (pType->VarType)
\r
2699 D3DXASSERT(sizeof(SNumericAnnotation) == sizeof(SAnnotation));
\r
2700 new(pVar) SNumericAnnotation();
\r
2702 else if (pType->StructType.ImplementsInterface)
\r
2704 D3DXASSERT(sizeof(SClassInstanceGlobalVariable) == sizeof(SGlobalVariable));
\r
2705 new(pVar) SClassInstanceGlobalVariable;
\r
2709 D3DXASSERT(sizeof(SNumericGlobalVariable) == sizeof(SGlobalVariable));
\r
2710 new(pVar) SNumericGlobalVariable;
\r
2713 case EVT_Interface:
\r
2714 D3DXASSERT(sizeof(SInterfaceGlobalVariable) == sizeof(SGlobalVariable));
\r
2715 new(pVar) SInterfaceGlobalVariable;
\r
2718 switch (pType->ObjectType)
\r
2723 D3DXASSERT(sizeof(SStringAnnotation) == sizeof(SAnnotation));
\r
2724 new(pVar) SStringAnnotation;
\r
2728 D3DXASSERT(sizeof(SStringGlobalVariable) == sizeof(SGlobalVariable));
\r
2729 new(pVar) SStringGlobalVariable;
\r
2734 case EOT_Texture1D:
\r
2735 case EOT_Texture1DArray:
\r
2736 case EOT_Texture2D:
\r
2737 case EOT_Texture2DArray:
\r
2738 case EOT_Texture2DMS:
\r
2739 case EOT_Texture2DMSArray:
\r
2740 case EOT_Texture3D:
\r
2741 case EOT_TextureCube:
\r
2742 case EOT_TextureCubeArray:
\r
2744 case EOT_ByteAddressBuffer:
\r
2745 case EOT_StructuredBuffer:
\r
2746 D3DXASSERT(!IsAnnotation);
\r
2747 D3DXASSERT(sizeof(SShaderResourceGlobalVariable) == sizeof(SGlobalVariable));
\r
2748 new(pVar) SShaderResourceGlobalVariable;
\r
2750 case EOT_RWTexture1D:
\r
2751 case EOT_RWTexture1DArray:
\r
2752 case EOT_RWTexture2D:
\r
2753 case EOT_RWTexture2DArray:
\r
2754 case EOT_RWTexture3D:
\r
2755 case EOT_RWBuffer:
\r
2756 case EOT_RWByteAddressBuffer:
\r
2757 case EOT_RWStructuredBuffer:
\r
2758 case EOT_RWStructuredBufferAlloc:
\r
2759 case EOT_RWStructuredBufferConsume:
\r
2760 case EOT_AppendStructuredBuffer:
\r
2761 case EOT_ConsumeStructuredBuffer:
\r
2762 D3DXASSERT(!IsAnnotation);
\r
2763 D3DXASSERT(sizeof(SUnorderedAccessViewGlobalVariable) == sizeof(SGlobalVariable));
\r
2764 new(pVar) SUnorderedAccessViewGlobalVariable;
\r
2766 case EOT_VertexShader:
\r
2767 case EOT_VertexShader5:
\r
2768 case EOT_GeometryShader:
\r
2769 case EOT_GeometryShaderSO:
\r
2770 case EOT_GeometryShader5:
\r
2771 case EOT_PixelShader:
\r
2772 case EOT_PixelShader5:
\r
2773 case EOT_HullShader5:
\r
2774 case EOT_DomainShader5:
\r
2775 case EOT_ComputeShader5:
\r
2776 D3DXASSERT(!IsAnnotation);
\r
2777 D3DXASSERT(sizeof(SShaderGlobalVariable) == sizeof(SGlobalVariable));
\r
2778 new(pVar) SShaderGlobalVariable;
\r
2781 D3DXASSERT(!IsAnnotation);
\r
2782 D3DXASSERT(sizeof(SBlendGlobalVariable) == sizeof(SGlobalVariable));
\r
2783 new(pVar) SBlendGlobalVariable;
\r
2785 case EOT_Rasterizer:
\r
2786 D3DXASSERT(!IsAnnotation);
\r
2787 D3DXASSERT(sizeof(SRasterizerGlobalVariable) == sizeof(SGlobalVariable));
\r
2788 new(pVar) SRasterizerGlobalVariable;
\r
2790 case EOT_DepthStencil:
\r
2791 D3DXASSERT(!IsAnnotation);
\r
2792 D3DXASSERT(sizeof(SDepthStencilGlobalVariable) == sizeof(SGlobalVariable));
\r
2793 new(pVar) SDepthStencilGlobalVariable;
\r
2796 D3DXASSERT(!IsAnnotation);
\r
2797 D3DXASSERT(sizeof(SSamplerGlobalVariable) == sizeof(SGlobalVariable));
\r
2798 new(pVar) SSamplerGlobalVariable;
\r
2800 case EOT_RenderTargetView:
\r
2801 D3DXASSERT(!IsAnnotation);
\r
2802 D3DXASSERT(sizeof(SRenderTargetViewGlobalVariable) == sizeof(SGlobalVariable));
\r
2803 new(pVar) SRenderTargetViewGlobalVariable;
\r
2805 case EOT_DepthStencilView:
\r
2806 D3DXASSERT(!IsAnnotation);
\r
2807 D3DXASSERT(sizeof(SDepthStencilViewGlobalVariable) == sizeof(SGlobalVariable));
\r
2808 new(pVar) SDepthStencilViewGlobalVariable;
\r
2812 DPF( 0, "Internal loading error: invalid object type." );
\r
2818 switch (pType->NumericType.NumericLayout)
\r
2823 D3DXASSERT(sizeof(SMatrixAnnotation) == sizeof(SAnnotation));
\r
2824 new(pVar) SMatrixAnnotation;
\r
2828 D3DXASSERT(sizeof(SMatrixGlobalVariable) == sizeof(SGlobalVariable));
\r
2829 D3DXASSERT(sizeof(SMatrix4x4ColumnMajorGlobalVariable) == sizeof(SGlobalVariable));
\r
2830 D3DXASSERT(sizeof(SMatrix4x4RowMajorGlobalVariable) == sizeof(SGlobalVariable));
\r
2832 if (pType->NumericType.Rows == 4 && pType->NumericType.Columns == 4)
\r
2834 if (pType->NumericType.IsColumnMajor)
\r
2836 new(pVar) SMatrix4x4ColumnMajorGlobalVariable;
\r
2840 new(pVar) SMatrix4x4RowMajorGlobalVariable;
\r
2845 new(pVar) SMatrixGlobalVariable;
\r
2850 switch (pType->NumericType.ScalarType)
\r
2855 D3DXASSERT(sizeof(SFloatVectorAnnotation) == sizeof(SAnnotation));
\r
2856 new(pVar) SFloatVectorAnnotation;
\r
2860 D3DXASSERT(sizeof(SFloatVectorGlobalVariable) == sizeof(SGlobalVariable));
\r
2861 D3DXASSERT(sizeof(SFloatVector4GlobalVariable) == sizeof(SGlobalVariable));
\r
2863 if (pType->NumericType.Columns == 4)
\r
2865 new(pVar) SFloatVector4GlobalVariable;
\r
2869 new(pVar) SFloatVectorGlobalVariable;
\r
2876 D3DXASSERT(sizeof(SBoolVectorAnnotation) == sizeof(SAnnotation));
\r
2877 new(pVar) SBoolVectorAnnotation;
\r
2881 D3DXASSERT(sizeof(SBoolVectorGlobalVariable) == sizeof(SGlobalVariable));
\r
2882 new(pVar) SBoolVectorGlobalVariable;
\r
2889 D3DXASSERT(sizeof(SIntVectorAnnotation) == sizeof(SAnnotation));
\r
2890 new(pVar) SIntVectorAnnotation;
\r
2894 D3DXASSERT(sizeof(SIntVectorGlobalVariable) == sizeof(SGlobalVariable));
\r
2895 new(pVar) SIntVectorGlobalVariable;
\r
2901 switch (pType->NumericType.ScalarType)
\r
2906 D3DXASSERT(sizeof(SFloatScalarAnnotation) == sizeof(SAnnotation));
\r
2907 new(pVar) SFloatScalarAnnotation;
\r
2911 D3DXASSERT(sizeof(SFloatScalarGlobalVariable) == sizeof(SGlobalVariable));
\r
2912 new(pVar) SFloatScalarGlobalVariable;
\r
2919 D3DXASSERT(sizeof(SIntScalarAnnotation) == sizeof(SAnnotation));
\r
2920 new(pVar) SIntScalarAnnotation;
\r
2924 D3DXASSERT(sizeof(SIntScalarGlobalVariable) == sizeof(SGlobalVariable));
\r
2925 new(pVar) SIntScalarGlobalVariable;
\r
2931 D3DXASSERT(sizeof(SBoolScalarAnnotation) == sizeof(SAnnotation));
\r
2932 new(pVar) SBoolScalarAnnotation;
\r
2936 D3DXASSERT(sizeof(SBoolScalarGlobalVariable) == sizeof(SGlobalVariable));
\r
2937 new(pVar) SBoolScalarGlobalVariable;
\r
2942 DPF( 0, "Internal loading error: invalid scalar type." );
\r
2949 DPF( 0, "Internal loading error: invalid numeric type." );
\r
2956 DPF( 0, "Internal loading error: invalid variable type." );
\r