summaryrefslogtreecommitdiff
path: root/sample/d3d11/Effects11
diff options
context:
space:
mode:
authorJason Maskell <[email protected]>2016-05-12 10:58:15 +0200
committerJason Maskell <[email protected]>2016-05-12 10:58:15 +0200
commit72b21c69e32c73abf3a18b0e962746e64faebba4 (patch)
treecd22b1b298bc865c3ae6037e8eb89a64a94203ea /sample/d3d11/Effects11
parentMerge branch 'master' of https://github.com/NVIDIAGameWorks/WaveWorks (diff)
downloadwaveworks_archive-72b21c69e32c73abf3a18b0e962746e64faebba4.tar.xz
waveworks_archive-72b21c69e32c73abf3a18b0e962746e64faebba4.zip
Restructuring starts. Got some initial CMake problems sorted. Need to extend.
Diffstat (limited to 'sample/d3d11/Effects11')
-rw-r--r--sample/d3d11/Effects11/Binary/EffectBinaryFormat.h666
-rw-r--r--sample/d3d11/Effects11/Binary/EffectStateBase11.h49
-rw-r--r--sample/d3d11/Effects11/Binary/EffectStates11.h236
-rw-r--r--sample/d3d11/Effects11/Binary/SOParser.h311
-rw-r--r--sample/d3d11/Effects11/Effect.h1226
-rw-r--r--sample/d3d11/Effects11/EffectAPI.cpp29
-rw-r--r--sample/d3d11/Effects11/EffectLoad.cpp3982
-rw-r--r--sample/d3d11/Effects11/EffectLoad.h149
-rw-r--r--sample/d3d11/Effects11/EffectNonRuntime.cpp2963
-rw-r--r--sample/d3d11/Effects11/EffectReflection.cpp2151
-rw-r--r--sample/d3d11/Effects11/EffectRuntime.cpp694
-rw-r--r--sample/d3d11/Effects11/EffectVariable.inl4573
-rw-r--r--sample/d3d11/Effects11/Inc/d3dx11dbg.h66
-rw-r--r--sample/d3d11/Effects11/Inc/d3dx11effect.h1566
-rw-r--r--sample/d3d11/Effects11/Inc/d3dxGlobal.h1337
-rw-r--r--sample/d3d11/Effects11/d3dx11dbg.cpp62
-rw-r--r--sample/d3d11/Effects11/d3dxGlobal.cpp351
-rw-r--r--sample/d3d11/Effects11/pchfx.h44
18 files changed, 0 insertions, 20455 deletions
diff --git a/sample/d3d11/Effects11/Binary/EffectBinaryFormat.h b/sample/d3d11/Effects11/Binary/EffectBinaryFormat.h
deleted file mode 100644
index 50c5ce3..0000000
--- a/sample/d3d11/Effects11/Binary/EffectBinaryFormat.h
+++ /dev/null
@@ -1,666 +0,0 @@
-//////////////////////////////////////////////////////////////////////////////
-//
-// Copyright (C) Microsoft Corporation. All Rights Reserved.
-//
-// File: Effect.h
-// Content: D3DX11 Effects Binary Format
-// This is the binary file interface shared between the Effects
-// compiler and runtime.
-//
-//////////////////////////////////////////////////////////////////////////////
-
-#pragma once
-
-namespace D3DX11Effects
-{
-
-
-//////////////////////////////////////////////////////////////////////////
-// Version Control
-//////////////////////////////////////////////////////////////////////////
-
-#define D3D10_FXL_VERSION(_Major,_Minor) (('F' << 24) | ('X' << 16) | ((_Major) << 8) | (_Minor))
-
-struct EVersionTag
-{
- const char* m_pName;
- DWORD m_Version;
- UINT m_Tag;
-};
-
-// versions must be listed in ascending order
-static CONST EVersionTag g_EffectVersions[] =
-{
- { "fx_4_0", D3D10_FXL_VERSION(4,0), 0xFEFF1001 },
- { "fx_4_1", D3D10_FXL_VERSION(4,1), 0xFEFF1011 },
- { "fx_5_0", D3D10_FXL_VERSION(5,0), 0xFEFF2001 },
-};
-#define NUM_EFFECT10_VERSIONS ( sizeof(g_EffectVersions) / sizeof(EVersionTag) )
-
-
-//////////////////////////////////////////////////////////////////////////
-// Reflection & Type structures
-//////////////////////////////////////////////////////////////////////////
-
-// Enumeration of the possible left-hand side values of an assignment,
-// divided up categorically by the type of block they may appear in
-enum ELhsType
-{
- ELHS_Invalid,
-
- // Pass block assignment types
-
- ELHS_PixelShaderBlock, // SBlock *pValue points to the block to apply
- ELHS_VertexShaderBlock,
- ELHS_GeometryShaderBlock,
- ELHS_RenderTargetView,
- ELHS_DepthStencilView,
-
- ELHS_RasterizerBlock,
- ELHS_DepthStencilBlock,
- ELHS_BlendBlock,
-
- ELHS_GenerateMips, // This is really a call to D3D::GenerateMips
-
- // Various SAssignment.Value.*
-
- ELHS_DS_StencilRef, // SAssignment.Value.pdValue
- ELHS_B_BlendFactor, // D3D10_BLEND_CONFIG.BlendFactor, points to a float4
- ELHS_B_SampleMask, // D3D10_BLEND_CONFIG.SampleMask
-
- ELHS_GeometryShaderSO, // When setting SO assignments, GeometryShaderSO precedes the actual GeometryShader assn
-
- ELHS_ComputeShaderBlock,
- ELHS_HullShaderBlock,
- ELHS_DomainShaderBlock,
-
- // Rasterizer
-
- ELHS_FillMode = 0x20000,
- ELHS_CullMode,
- ELHS_FrontCC,
- ELHS_DepthBias,
- ELHS_DepthBiasClamp,
- ELHS_SlopeScaledDepthBias,
- ELHS_DepthClipEnable,
- ELHS_ScissorEnable,
- ELHS_MultisampleEnable,
- ELHS_AntialiasedLineEnable,
-
- // Sampler
-
- ELHS_Filter = 0x30000,
- ELHS_AddressU,
- ELHS_AddressV,
- ELHS_AddressW,
- ELHS_MipLODBias,
- ELHS_MaxAnisotropy,
- ELHS_ComparisonFunc,
- ELHS_BorderColor,
- ELHS_MinLOD,
- ELHS_MaxLOD,
- ELHS_Texture,
-
- // DepthStencil
-
- ELHS_DepthEnable = 0x40000,
- ELHS_DepthWriteMask,
- ELHS_DepthFunc,
- ELHS_StencilEnable,
- ELHS_StencilReadMask,
- ELHS_StencilWriteMask,
- ELHS_FrontFaceStencilFailOp,
- ELHS_FrontFaceStencilDepthFailOp,
- ELHS_FrontFaceStencilPassOp,
- ELHS_FrontFaceStencilFunc,
- ELHS_BackFaceStencilFailOp,
- ELHS_BackFaceStencilDepthFailOp,
- ELHS_BackFaceStencilPassOp,
- ELHS_BackFaceStencilFunc,
-
- // BlendState
-
- ELHS_AlphaToCoverage = 0x50000,
- ELHS_BlendEnable,
- ELHS_SrcBlend,
- ELHS_DestBlend,
- ELHS_BlendOp,
- ELHS_SrcBlendAlpha,
- ELHS_DestBlendAlpha,
- ELHS_BlendOpAlpha,
- ELHS_RenderTargetWriteMask,
-};
-
-
-
-enum EBlockType
-{
- EBT_Invalid,
- EBT_DepthStencil,
- EBT_Blend,
- EBT_Rasterizer,
- EBT_Sampler,
- EBT_Pass
-};
-
-enum EVarType
-{
- EVT_Invalid,
- EVT_Numeric,
- EVT_Object,
- EVT_Struct,
- EVT_Interface,
-};
-
-enum EScalarType
-{
- EST_Invalid,
- EST_Float,
- EST_Int,
- EST_UInt,
- EST_Bool,
- EST_Count
-};
-
-enum ENumericLayout
-{
- ENL_Invalid,
- ENL_Scalar,
- ENL_Vector,
- ENL_Matrix,
- ENL_Count
-};
-
-enum EObjectType
-{
- EOT_Invalid,
- EOT_String,
- EOT_Blend,
- EOT_DepthStencil,
- EOT_Rasterizer,
- EOT_PixelShader,
- EOT_VertexShader,
- EOT_GeometryShader, // Regular geometry shader
- EOT_GeometryShaderSO, // Geometry shader with a attached StreamOut decl
- EOT_Texture,
- EOT_Texture1D,
- EOT_Texture1DArray,
- EOT_Texture2D,
- EOT_Texture2DArray,
- EOT_Texture2DMS,
- EOT_Texture2DMSArray,
- EOT_Texture3D,
- EOT_TextureCube,
- EOT_ConstantBuffer,
- EOT_RenderTargetView,
- EOT_DepthStencilView,
- EOT_Sampler,
- EOT_Buffer,
- EOT_TextureCubeArray,
- EOT_Count,
- EOT_PixelShader5,
- EOT_VertexShader5,
- EOT_GeometryShader5,
- EOT_ComputeShader5,
- EOT_HullShader5,
- EOT_DomainShader5,
- EOT_RWTexture1D,
- EOT_RWTexture1DArray,
- EOT_RWTexture2D,
- EOT_RWTexture2DArray,
- EOT_RWTexture3D,
- EOT_RWBuffer,
- EOT_ByteAddressBuffer,
- EOT_RWByteAddressBuffer,
- EOT_StructuredBuffer,
- EOT_RWStructuredBuffer,
- EOT_RWStructuredBufferAlloc,
- EOT_RWStructuredBufferConsume,
- EOT_AppendStructuredBuffer,
- EOT_ConsumeStructuredBuffer,
-};
-
-D3DX11INLINE BOOL IsObjectTypeHelper(EVarType InVarType,
- EObjectType InObjType,
- EObjectType TargetObjType)
-{
- return (InVarType == EVT_Object) && (InObjType == TargetObjType);
-}
-
-D3DX11INLINE BOOL IsSamplerHelper(EVarType InVarType,
- EObjectType InObjType)
-{
- return (InVarType == EVT_Object) && (InObjType == EOT_Sampler);
-}
-
-D3DX11INLINE BOOL IsStateBlockObjectHelper(EVarType InVarType,
- EObjectType InObjType)
-{
- return (InVarType == EVT_Object) && ((InObjType == EOT_Blend) || (InObjType == EOT_DepthStencil) || (InObjType == EOT_Rasterizer) || IsSamplerHelper(InVarType, InObjType));
-}
-
-D3DX11INLINE BOOL IsShaderHelper(EVarType InVarType,
- EObjectType InObjType)
-{
- return (InVarType == EVT_Object) && ((InObjType == EOT_VertexShader) ||
- (InObjType == EOT_VertexShader5) ||
- (InObjType == EOT_HullShader5) ||
- (InObjType == EOT_DomainShader5) ||
- (InObjType == EOT_ComputeShader5) ||
- (InObjType == EOT_GeometryShader) ||
- (InObjType == EOT_GeometryShaderSO) ||
- (InObjType == EOT_GeometryShader5) ||
- (InObjType == EOT_PixelShader) ||
- (InObjType == EOT_PixelShader5));
-}
-
-D3DX11INLINE BOOL IsShader5Helper(EVarType InVarType,
- EObjectType InObjType)
-{
- return (InVarType == EVT_Object) && ((InObjType == EOT_VertexShader5) ||
- (InObjType == EOT_HullShader5) ||
- (InObjType == EOT_DomainShader5) ||
- (InObjType == EOT_ComputeShader5) ||
- (InObjType == EOT_GeometryShader5) ||
- (InObjType == EOT_PixelShader5));
-}
-
-D3DX11INLINE BOOL IsInterfaceHelper(EVarType InVarType,
- EObjectType InObjType)
-{
- return (InVarType == EVT_Interface);
-}
-
-D3DX11INLINE BOOL IsShaderResourceHelper(EVarType InVarType,
- EObjectType InObjType)
-{
- return (InVarType == EVT_Object) && ((InObjType == EOT_Texture) ||
- (InObjType == EOT_Texture1D) ||
- (InObjType == EOT_Texture1DArray) ||
- (InObjType == EOT_Texture2D) ||
- (InObjType == EOT_Texture2DArray) ||
- (InObjType == EOT_Texture2DMS) ||
- (InObjType == EOT_Texture2DMSArray) ||
- (InObjType == EOT_Texture3D) ||
- (InObjType == EOT_TextureCube) ||
- (InObjType == EOT_TextureCubeArray) ||
- (InObjType == EOT_Buffer) ||
- (InObjType == EOT_StructuredBuffer) ||
- (InObjType == EOT_ByteAddressBuffer));
-}
-
-D3DX11INLINE BOOL IsUnorderedAccessViewHelper(EVarType InVarType,
- EObjectType InObjType)
-{
- return (InVarType == EVT_Object) &&
- ((InObjType == EOT_RWTexture1D) ||
- (InObjType == EOT_RWTexture1DArray) ||
- (InObjType == EOT_RWTexture2D) ||
- (InObjType == EOT_RWTexture2DArray) ||
- (InObjType == EOT_RWTexture3D) ||
- (InObjType == EOT_RWBuffer) ||
- (InObjType == EOT_RWByteAddressBuffer) ||
- (InObjType == EOT_RWStructuredBuffer) ||
- (InObjType == EOT_RWStructuredBufferAlloc) ||
- (InObjType == EOT_RWStructuredBufferConsume) ||
- (InObjType == EOT_AppendStructuredBuffer) ||
- (InObjType == EOT_ConsumeStructuredBuffer));
-}
-
-D3DX11INLINE BOOL IsRenderTargetViewHelper(EVarType InVarType,
- EObjectType InObjType)
-{
- return (InVarType == EVT_Object) && (InObjType == EOT_RenderTargetView);
-}
-
-D3DX11INLINE BOOL IsDepthStencilViewHelper(EVarType InVarType,
- EObjectType InObjType)
-{
- return (InVarType == EVT_Object) && (InObjType == EOT_DepthStencilView);
-}
-
-D3DX11INLINE BOOL IsObjectAssignmentHelper(ELhsType LhsType)
-{
- switch(LhsType)
- {
- case ELHS_VertexShaderBlock:
- case ELHS_HullShaderBlock:
- case ELHS_DepthStencilView:
- case ELHS_GeometryShaderBlock:
- case ELHS_PixelShaderBlock:
- case ELHS_ComputeShaderBlock:
- case ELHS_DepthStencilBlock:
- case ELHS_RasterizerBlock:
- case ELHS_BlendBlock:
- case ELHS_Texture:
- case ELHS_RenderTargetView:
- case ELHS_DomainShaderBlock:
- return TRUE;
- }
- return FALSE;
-}
-
-
-
-
-// Effect file format structures /////////////////////////////////////////////
-// File format:
-// File header (SBinaryHeader Header)
-// Unstructured data block (BYTE[Header.cbUnstructured))
-// Structured data block
-// ConstantBuffer (SBinaryConstantBuffer CB) * Header.Effect.cCBs
-// UINT NumAnnotations
-// Annotation data (SBinaryAnnotation) * (NumAnnotations) *this structure is variable sized
-// Variable data (SBinaryNumericVariable Var) * (CB.cVariables)
-// UINT NumAnnotations
-// Annotation data (SBinaryAnnotation) * (NumAnnotations) *this structure is variable sized
-// Object variables (SBinaryObjectVariable Var) * (Header.cObjectVariables) *this structure is variable sized
-// UINT NumAnnotations
-// Annotation data (SBinaryAnnotation) * (NumAnnotations) *this structure is variable sized
-// Interface variables (SBinaryInterfaceVariable Var) * (Header.cInterfaceVariables) *this structure is variable sized
-// UINT NumAnnotations
-// Annotation data (SBinaryAnnotation) * (NumAnnotations) *this structure is variable sized
-// Groups (SBinaryGroup Group) * Header.cGroups
-// UINT NumAnnotations
-// Annotation data (SBinaryAnnotation) * (NumAnnotations) *this structure is variable sized
-// Techniques (SBinaryTechnique Technique) * Group.cTechniques
-// UINT NumAnnotations
-// Annotation data (SBinaryAnnotation) * (NumAnnotations) *this structure is variable sized
-// Pass (SBinaryPass Pass) * Technique.cPasses
-// UINT NumAnnotations
-// Annotation data (SBinaryAnnotation) * (NumAnnotations) *this structure is variable sized
-// Pass assignments (SBinaryAssignment) * Pass.cAssignments
-
-struct SBinaryHeader
-{
- struct SVarCounts
- {
- UINT cCBs;
- UINT cNumericVariables;
- UINT cObjectVariables;
- };
-
- UINT Tag; // should be equal to c_EffectFileTag
- // this is used to identify ASCII vs Binary files
-
- SVarCounts Effect;
- SVarCounts Pool;
-
- UINT cTechniques;
- UINT cbUnstructured;
-
- UINT cStrings;
- UINT cShaderResources;
-
- UINT cDepthStencilBlocks;
- UINT cBlendStateBlocks;
- UINT cRasterizerStateBlocks;
- UINT cSamplers;
- UINT cRenderTargetViews;
- UINT cDepthStencilViews;
-
- UINT cTotalShaders;
- UINT cInlineShaders; // of the aforementioned shaders, the number that are defined inline within pass blocks
-
- D3DX11INLINE bool RequiresPool() const
- {
- return (Pool.cCBs != 0) ||
- (Pool.cNumericVariables != 0) ||
- (Pool.cObjectVariables != 0);
- }
-};
-
-struct SBinaryHeader5 : public SBinaryHeader
-{
- UINT cGroups;
- UINT cUnorderedAccessViews;
- UINT cInterfaceVariables;
- UINT cInterfaceVariableElements;
- UINT cClassInstanceElements;
-};
-
-// Constant buffer definition
-struct SBinaryConstantBuffer
-{
- // private flags
- static const UINT c_IsTBuffer = (1 << 0);
- static const UINT c_IsSingle = (1 << 1);
-
- UINT oName; // Offset to constant buffer name
- UINT Size; // Size, in bytes
- UINT Flags;
- UINT cVariables; // # of variables inside this buffer
- UINT ExplicitBindPoint; // Defined if the effect file specifies a bind point using the register keyword
- // otherwise, -1
-};
-
-struct SBinaryAnnotation
-{
- UINT oName; // Offset to variable name
- UINT oType; // Offset to type information (SBinaryType)
-
- // For numeric annotations:
- // UINT oDefaultValue; // Offset to default initializer value
- //
- // For string annotations:
- // UINT oStringOffsets[Elements]; // Elements comes from the type data at oType
-};
-
-struct SBinaryNumericVariable
-{
- UINT oName; // Offset to variable name
- UINT oType; // Offset to type information (SBinaryType)
- UINT oSemantic; // Offset to semantic information
- UINT Offset; // Offset in parent constant buffer
- UINT oDefaultValue; // Offset to default initializer value
- UINT Flags; // Explicit bind point
-};
-
-struct SBinaryInterfaceVariable
-{
- UINT oName; // Offset to variable name
- UINT oType; // Offset to type information (SBinaryType)
- UINT oDefaultValue; // Offset to default initializer array (SBinaryInterfaceInitializer[Elements])
- UINT Flags;
-};
-
-struct SBinaryInterfaceInitializer
-{
- UINT oInstanceName;
- UINT ArrayIndex;
-};
-
-struct SBinaryObjectVariable
-{
- UINT oName; // Offset to variable name
- UINT oType; // Offset to type information (SBinaryType)
- UINT oSemantic; // Offset to semantic information
- UINT ExplicitBindPoint; // Used when a variable has been explicitly bound (register(XX)). -1 if not
-
- // Initializer data:
- //
- // The type structure pointed to by oType gives you Elements,
- // VarType (must be EVT_Object), and ObjectType
- //
- // For ObjectType == EOT_Blend, EOT_DepthStencil, EOT_Rasterizer, EOT_Sampler
- // struct
- // {
- // UINT cAssignments;
- // SBinaryAssignment Assignments[cAssignments];
- // } Blocks[Elements]
- //
- // For EObjectType == EOT_Texture*, EOT_Buffer
- // <nothing>
- //
- // For EObjectType == EOT_*Shader, EOT_String
- // UINT oData[Elements]; // offsets to a shader data block or a NULL-terminated string
- //
- // For EObjectType == EOT_GeometryShaderSO
- // SBinaryGSSOInitializer[Elements]
- //
- // For EObjectType == EOT_*Shader5
- // SBinaryShaderData5[Elements]
-};
-
-struct SBinaryGSSOInitializer
-{
- UINT oShader; // Offset to shader bytecode data block
- UINT oSODecl; // Offset to StreamOutput decl string
-};
-
-struct SBinaryShaderData5
-{
- UINT oShader; // Offset to shader bytecode data block
- UINT oSODecls[4]; // Offset to StreamOutput decl strings
- UINT cSODecls; // Count of valid oSODecls entries.
- UINT RasterizedStream; // Which stream is used for rasterization
- UINT cInterfaceBindings; // Count of interface bindings.
- UINT oInterfaceBindings; // Offset to SBinaryInterfaceInitializer[cInterfaceBindings].
-};
-
-struct SBinaryType
-{
- UINT oTypeName; // Offset to friendly type name ("float4", "VS_OUTPUT")
- EVarType VarType; // Numeric, Object, or Struct
- UINT Elements; // # of array elements (0 for non-arrays)
- UINT TotalSize; // Size in bytes; not necessarily Stride * Elements for arrays
- // because of possible gap left in final register
- UINT Stride; // If an array, this is the spacing between elements.
- // For unpacked arrays, always divisible by 16-bytes (1 register).
- // No support for packed arrays
- UINT PackedSize; // Size, in bytes, of this data typed when fully packed
-
- struct SBinaryMember
- {
- UINT oName; // Offset to structure member name ("m_pFoo")
- UINT oSemantic; // Offset to semantic ("POSITION0")
- UINT Offset; // Offset, in bytes, relative to start of parent structure
- UINT oType; // Offset to member's type descriptor
- };
-
- // the data that follows depends on the VarType:
- // Numeric: SType::SNumericType
- // Object: EObjectType
- // Struct:
- // struct
- // {
- // UINT cMembers;
- // SBinaryMembers Members[cMembers];
- // } MemberInfo
- // struct
- // {
- // UINT oBaseClassType; // Offset to type information (SBinaryType)
- // UINT cInterfaces;
- // UINT oInterfaceTypes[cInterfaces];
- // } SBinaryTypeInheritance
- // Interface: (nothing)
-};
-
-struct SBinaryNumericType
-{
- ENumericLayout NumericLayout : 3; // scalar (1x1), vector (1xN), matrix (NxN)
- EScalarType ScalarType : 5; // float32, int32, int8, etc.
- UINT Rows : 3; // 1 <= Rows <= 4
- UINT Columns : 3; // 1 <= Columns <= 4
- UINT IsColumnMajor : 1; // applies only to matrices
- UINT IsPackedArray : 1; // if this is an array, indicates whether elements should be greedily packed
-};
-
-struct SBinaryTypeInheritance
-{
- UINT oBaseClass; // Offset to base class type info or 0 if no base class.
- UINT cInterfaces;
-
- // Followed by UINT[cInterfaces] with offsets to the type
- // info of each interface.
-};
-
-struct SBinaryGroup
-{
- UINT oName;
- UINT cTechniques;
-};
-
-struct SBinaryTechnique
-{
- UINT oName;
- UINT cPasses;
-};
-
-struct SBinaryPass
-{
- UINT oName;
- UINT cAssignments;
-};
-
-enum ECompilerAssignmentType
-{
- ECAT_Invalid, // Assignment-specific data (always in the unstructured blob)
- ECAT_Constant, // -N SConstant structures
- ECAT_Variable, // -NULL terminated string with variable name ("foo")
- ECAT_ConstIndex, // -SConstantIndex structure
- ECAT_VariableIndex, // -SVariableIndex structure
- ECAT_ExpressionIndex, // -SIndexedObjectExpression structure
- ECAT_Expression, // -Data block containing FXLVM code
- ECAT_InlineShader, // -Data block containing shader
- ECAT_InlineShader5, // -Data block containing shader with extended 5.0 data (SBinaryShaderData5)
-};
-
-struct SBinaryAssignment
-{
- UINT iState; // index into g_lvGeneral
- UINT Index; // the particular index to assign to (see g_lvGeneral to find the # of valid indices)
- ECompilerAssignmentType AssignmentType;
- UINT oInitializer; // Offset of assignment-specific data
-
- //struct SConstantAssignment
- //{
- // UINT NumConstants; // number of constants to follow
- // SCompilerConstant Constants[NumConstants];
- //};
-
- struct SConstantIndex
- {
- UINT oArrayName;
- UINT Index;
- };
-
- struct SVariableIndex
- {
- UINT oArrayName;
- UINT oIndexVarName;
- };
-
- struct SIndexedObjectExpression
- {
- UINT oArrayName;
- UINT oCode;
- };
-
- struct SInlineShader
- {
- UINT oShader;
- UINT oSODecl;
- };
-
- //struct SExpression or SInlineShader
- //{
- // UINT DataSize;
- // BYTE Data[DataSize];
- //}
-
-};
-
-struct SBinaryConstant
-{
- EScalarType Type;
- union
- {
- BOOL bValue;
- INT iValue;
- float fValue;
- };
-};
-
-
-} // end namespace D3DX11Effects
diff --git a/sample/d3d11/Effects11/Binary/EffectStateBase11.h b/sample/d3d11/Effects11/Binary/EffectStateBase11.h
deleted file mode 100644
index 3727da2..0000000
--- a/sample/d3d11/Effects11/Binary/EffectStateBase11.h
+++ /dev/null
@@ -1,49 +0,0 @@
-//////////////////////////////////////////////////////////////////////////////
-//
-// Copyright (C) Microsoft Corporation. All Rights Reserved.
-//
-// File: EffectStateBase11.h
-// Content: D3DX11 Effects States Header
-//
-//////////////////////////////////////////////////////////////////////////////
-
-#pragma once
-
-namespace D3DX11Effects
-{
-
-//////////////////////////////////////////////////////////////////////////
-// Effect HLSL states and late resolve lists
-//////////////////////////////////////////////////////////////////////////
-
-struct RValue
-{
- const char *m_pName;
- UINT m_Value;
-};
-
-#define RVALUE_END() { NULL, 0U }
-#define RVALUE_ENTRY(prefix, x) { #x, (UINT)prefix##x }
-
-enum ELhsType;
-
-struct LValue
-{
- const char *m_pName; // name of the LHS side of expression
- EBlockType m_BlockType; // type of block it can appear in
- D3D10_SHADER_VARIABLE_TYPE m_Type; // data type allows
- UINT m_Cols; // number of [m_Type]'s required (1 for a scalar, 4 for a vector)
- UINT m_Indices; // max index allowable (if LHS is an array; otherwise this is 1)
- BOOL m_VectorScalar; // can be both vector and scalar (setting as a scalar sets all m_Indices values simultaneously)
- CONST RValue *m_pRValue; // pointer to table of allowable RHS "late resolve" values
- ELhsType m_LhsType; // ELHS_* enum value that corresponds to this entry
- UINT m_Offset; // offset into the given block type where this value should be written
- UINT m_Stride; // for vectors, byte stride between two consecutive values. if 0, m_Type's size is used
-};
-
-#define LVALUE_END() { NULL, D3D10_SVT_UINT, 0, 0, 0, NULL }
-
-extern CONST LValue g_lvGeneral[];
-extern CONST UINT g_lvGeneralCount;
-
-} // end namespace D3DX11Effects
diff --git a/sample/d3d11/Effects11/Binary/EffectStates11.h b/sample/d3d11/Effects11/Binary/EffectStates11.h
deleted file mode 100644
index 3bb3087..0000000
--- a/sample/d3d11/Effects11/Binary/EffectStates11.h
+++ /dev/null
@@ -1,236 +0,0 @@
-//////////////////////////////////////////////////////////////////////////////
-//
-// Copyright (C) Microsoft Corporation. All Rights Reserved.
-//
-// File: EffectStates11.h
-// Content: D3DX11 Effects States Header
-// This file defines properties of states which can appear in
-// state blocks and pass blocks.
-//
-//////////////////////////////////////////////////////////////////////////////
-
-#pragma once
-
-#include <EffectStateBase11.h>
-
-namespace D3DX11Effects
-{
-
-//////////////////////////////////////////////////////////////////////////
-// Effect HLSL late resolve lists (state values)
-//////////////////////////////////////////////////////////////////////////
-
-static CONST RValue g_rvNULL[] =
-{
- { "NULL", 0 },
- RVALUE_END()
-};
-
-
-static CONST RValue g_rvBOOL[] =
-{
- { "FALSE", 0 },
- { "TRUE", 1 },
- RVALUE_END()
-};
-
-static CONST RValue g_rvDEPTH_WRITE_MASK[] =
-{
- { "ZERO", D3D10_DEPTH_WRITE_MASK_ZERO },
- { "ALL", D3D10_DEPTH_WRITE_MASK_ALL },
- RVALUE_END()
-};
-
-static CONST RValue g_rvFILL[] =
-{
- { "WIREFRAME", D3D10_FILL_WIREFRAME },
- { "SOLID", D3D10_FILL_SOLID },
- RVALUE_END()
-};
-
-static CONST RValue g_rvFILTER[] =
-{
- RVALUE_ENTRY(D3D10_FILTER_, MIN_MAG_MIP_POINT ),
- RVALUE_ENTRY(D3D10_FILTER_, MIN_MAG_POINT_MIP_LINEAR ),
- RVALUE_ENTRY(D3D10_FILTER_, MIN_POINT_MAG_LINEAR_MIP_POINT ),
- RVALUE_ENTRY(D3D10_FILTER_, MIN_POINT_MAG_MIP_LINEAR ),
- RVALUE_ENTRY(D3D10_FILTER_, MIN_LINEAR_MAG_MIP_POINT ),
- RVALUE_ENTRY(D3D10_FILTER_, MIN_LINEAR_MAG_POINT_MIP_LINEAR ),
- RVALUE_ENTRY(D3D10_FILTER_, MIN_MAG_LINEAR_MIP_POINT ),
- RVALUE_ENTRY(D3D10_FILTER_, MIN_MAG_MIP_LINEAR ),
- RVALUE_ENTRY(D3D10_FILTER_, ANISOTROPIC ),
- RVALUE_ENTRY(D3D10_FILTER_, COMPARISON_MIN_MAG_MIP_POINT ),
- RVALUE_ENTRY(D3D10_FILTER_, COMPARISON_MIN_MAG_POINT_MIP_LINEAR ),
- RVALUE_ENTRY(D3D10_FILTER_, COMPARISON_MIN_POINT_MAG_LINEAR_MIP_POINT ),
- RVALUE_ENTRY(D3D10_FILTER_, COMPARISON_MIN_POINT_MAG_MIP_LINEAR ),
- RVALUE_ENTRY(D3D10_FILTER_, COMPARISON_MIN_LINEAR_MAG_MIP_POINT ),
- RVALUE_ENTRY(D3D10_FILTER_, COMPARISON_MIN_LINEAR_MAG_POINT_MIP_LINEAR ),
- RVALUE_ENTRY(D3D10_FILTER_, COMPARISON_MIN_MAG_LINEAR_MIP_POINT ),
- RVALUE_ENTRY(D3D10_FILTER_, COMPARISON_MIN_MAG_MIP_LINEAR ),
- RVALUE_ENTRY(D3D10_FILTER_, COMPARISON_ANISOTROPIC ),
- RVALUE_ENTRY(D3D10_FILTER_, TEXT_1BIT ),
- RVALUE_END()
-};
-
-static CONST RValue g_rvBLEND[] =
-{
- { "ZERO", D3D10_BLEND_ZERO },
- { "ONE", D3D10_BLEND_ONE },
- { "SRC_COLOR", D3D10_BLEND_SRC_COLOR },
- { "INV_SRC_COLOR", D3D10_BLEND_INV_SRC_COLOR },
- { "SRC_ALPHA", D3D10_BLEND_SRC_ALPHA },
- { "INV_SRC_ALPHA", D3D10_BLEND_INV_SRC_ALPHA },
- { "DEST_ALPHA", D3D10_BLEND_DEST_ALPHA },
- { "INV_DEST_ALPHA", D3D10_BLEND_INV_DEST_ALPHA },
- { "DEST_COLOR", D3D10_BLEND_DEST_COLOR },
- { "INV_DEST_COLOR", D3D10_BLEND_INV_DEST_COLOR },
- { "SRC_ALPHA_SAT", D3D10_BLEND_SRC_ALPHA_SAT },
- { "BLEND_FACTOR", D3D10_BLEND_BLEND_FACTOR },
- { "INV_BLEND_FACTOR", D3D10_BLEND_INV_BLEND_FACTOR },
- { "SRC1_COLOR", D3D10_BLEND_SRC1_COLOR },
- { "INV_SRC1_COLOR", D3D10_BLEND_INV_SRC1_COLOR },
- { "SRC1_ALPHA", D3D10_BLEND_SRC1_ALPHA },
- { "INV_SRC1_ALPHA", D3D10_BLEND_INV_SRC1_ALPHA },
-
- RVALUE_END()
-};
-
-static CONST RValue g_rvTADDRESS[] =
-{
- { "CLAMP", D3D10_TEXTURE_ADDRESS_CLAMP },
- { "WRAP", D3D10_TEXTURE_ADDRESS_WRAP },
- { "MIRROR", D3D10_TEXTURE_ADDRESS_MIRROR },
- { "BORDER", D3D10_TEXTURE_ADDRESS_BORDER },
- { "MIRROR_ONCE", D3D10_TEXTURE_ADDRESS_MIRROR_ONCE },
- RVALUE_END()
-};
-
-static CONST RValue g_rvCULL[] =
-{
- { "NONE", D3D10_CULL_NONE },
- { "FRONT", D3D10_CULL_FRONT },
- { "BACK", D3D10_CULL_BACK },
- RVALUE_END()
-};
-
-static CONST RValue g_rvCMP[] =
-{
- { "NEVER", D3D10_COMPARISON_NEVER },
- { "LESS", D3D10_COMPARISON_LESS },
- { "EQUAL", D3D10_COMPARISON_EQUAL },
- { "LESS_EQUAL", D3D10_COMPARISON_LESS_EQUAL },
- { "GREATER", D3D10_COMPARISON_GREATER },
- { "NOT_EQUAL", D3D10_COMPARISON_NOT_EQUAL },
- { "GREATER_EQUAL", D3D10_COMPARISON_GREATER_EQUAL },
- { "ALWAYS", D3D10_COMPARISON_ALWAYS },
- RVALUE_END()
-};
-
-static CONST RValue g_rvSTENCILOP[] =
-{
- { "KEEP", D3D10_STENCIL_OP_KEEP },
- { "ZERO", D3D10_STENCIL_OP_ZERO },
- { "REPLACE", D3D10_STENCIL_OP_REPLACE },
- { "INCR_SAT", D3D10_STENCIL_OP_INCR_SAT },
- { "DECR_SAT", D3D10_STENCIL_OP_DECR_SAT },
- { "INVERT", D3D10_STENCIL_OP_INVERT },
- { "INCR", D3D10_STENCIL_OP_INCR },
- { "DECR", D3D10_STENCIL_OP_DECR },
- RVALUE_END()
-};
-
-static CONST RValue g_rvBLENDOP[] =
-{
- { "ADD", D3D10_BLEND_OP_ADD },
- { "SUBTRACT", D3D10_BLEND_OP_SUBTRACT },
- { "REV_SUBTRACT", D3D10_BLEND_OP_REV_SUBTRACT },
- { "MIN", D3D10_BLEND_OP_MIN },
- { "MAX", D3D10_BLEND_OP_MAX },
- RVALUE_END()
-};
-
-
-//////////////////////////////////////////////////////////////////////////
-// Effect HLSL states
-//////////////////////////////////////////////////////////////////////////
-
-#define strideof( s, m ) offsetof_fx(s,m[1]) - offsetof_fx(s,m[0])
-
-CONST LValue g_lvGeneral[] =
-{
- // RObjects
- { "RasterizerState", EBT_Pass, D3D10_SVT_RASTERIZER, 1, 1, FALSE, NULL, ELHS_RasterizerBlock, offsetof_fx(SPassBlock, BackingStore.pRasterizerBlock), 0 },
- { "DepthStencilState", EBT_Pass, D3D10_SVT_DEPTHSTENCIL, 1, 1, FALSE, NULL, ELHS_DepthStencilBlock, offsetof_fx(SPassBlock, BackingStore.pDepthStencilBlock), 0 },
- { "BlendState", EBT_Pass, D3D10_SVT_BLEND, 1, 1, FALSE, NULL, ELHS_BlendBlock, offsetof_fx(SPassBlock, BackingStore.pBlendBlock), 0 },
- { "RenderTargetView", EBT_Pass, D3D10_SVT_RENDERTARGETVIEW, 1, 8, FALSE, NULL, ELHS_RenderTargetView, offsetof_fx(SPassBlock, BackingStore.pRenderTargetViews), 0 },
- { "DepthStencilView", EBT_Pass, D3D10_SVT_DEPTHSTENCILVIEW, 1, 8, FALSE, NULL, ELHS_DepthStencilView, offsetof_fx(SPassBlock, BackingStore.pDepthStencilView), 0 },
- { "GenerateMips", EBT_Pass, D3D10_SVT_TEXTURE, 1, 1, FALSE, NULL, ELHS_GenerateMips, 0, 0 },
- // Shaders
- { "VertexShader", EBT_Pass, D3D10_SVT_VERTEXSHADER, 1, 1, FALSE, g_rvNULL, ELHS_VertexShaderBlock, offsetof_fx(SPassBlock, BackingStore.pVertexShaderBlock), 0 },
- { "PixelShader", EBT_Pass, D3D10_SVT_PIXELSHADER, 1, 1, FALSE, g_rvNULL, ELHS_PixelShaderBlock, offsetof_fx(SPassBlock, BackingStore.pPixelShaderBlock), 0 },
- { "GeometryShader", EBT_Pass, D3D10_SVT_GEOMETRYSHADER, 1, 1, FALSE, g_rvNULL, ELHS_GeometryShaderBlock, offsetof_fx(SPassBlock, BackingStore.pGeometryShaderBlock), 0 },
- // RObject config assignments
- { "DS_StencilRef", EBT_Pass, D3D10_SVT_UINT, 1, 1, FALSE, NULL, ELHS_DS_StencilRef, offsetof_fx(SPassBlock, BackingStore.StencilRef), 0 },
- { "AB_BlendFactor", EBT_Pass, D3D10_SVT_FLOAT, 4, 1, FALSE, NULL, ELHS_B_BlendFactor, offsetof_fx(SPassBlock, BackingStore.BlendFactor), 0 },
- { "AB_SampleMask", EBT_Pass, D3D10_SVT_UINT, 1, 1, FALSE, NULL, ELHS_B_SampleMask, offsetof_fx(SPassBlock, BackingStore.SampleMask), 0 },
-
- { "FillMode", EBT_Rasterizer, D3D10_SVT_UINT, 1, 1, FALSE, g_rvFILL, ELHS_FillMode, offsetof_fx(SRasterizerBlock, BackingStore.FillMode), 0 },
- { "CullMode", EBT_Rasterizer, D3D10_SVT_UINT, 1, 1, FALSE, g_rvCULL, ELHS_CullMode, offsetof_fx(SRasterizerBlock, BackingStore.CullMode), 0 },
- { "FrontCounterClockwise", EBT_Rasterizer, D3D10_SVT_BOOL, 1, 1, FALSE, g_rvBOOL, ELHS_FrontCC, offsetof_fx(SRasterizerBlock, BackingStore.FrontCounterClockwise), 0 },
- { "DepthBias", EBT_Rasterizer, D3D10_SVT_UINT, 1, 1, FALSE, NULL, ELHS_DepthBias, offsetof_fx(SRasterizerBlock, BackingStore.DepthBias), 0 },
- { "DepthBiasClamp", EBT_Rasterizer, D3D10_SVT_FLOAT, 1, 1, FALSE, NULL, ELHS_DepthBiasClamp, offsetof_fx(SRasterizerBlock, BackingStore.DepthBiasClamp), 0 },
- { "SlopeScaledDepthBias", EBT_Rasterizer, D3D10_SVT_FLOAT, 1, 1, FALSE, NULL, ELHS_SlopeScaledDepthBias, offsetof_fx(SRasterizerBlock, BackingStore.SlopeScaledDepthBias), 0 },
- { "DepthClipEnable", EBT_Rasterizer, D3D10_SVT_BOOL, 1, 1, FALSE, g_rvBOOL, ELHS_DepthClipEnable, offsetof_fx(SRasterizerBlock, BackingStore.DepthClipEnable), 0 },
- { "ScissorEnable", EBT_Rasterizer, D3D10_SVT_BOOL, 1, 1, FALSE, g_rvBOOL, ELHS_ScissorEnable, offsetof_fx(SRasterizerBlock, BackingStore.ScissorEnable), 0 },
- { "MultisampleEnable", EBT_Rasterizer, D3D10_SVT_BOOL, 1, 1, FALSE, g_rvBOOL, ELHS_MultisampleEnable, offsetof_fx(SRasterizerBlock, BackingStore.MultisampleEnable), 0 },
- { "AntialiasedLineEnable", EBT_Rasterizer, D3D10_SVT_BOOL, 1, 1, FALSE, g_rvBOOL, ELHS_AntialiasedLineEnable, offsetof_fx(SRasterizerBlock, BackingStore.AntialiasedLineEnable), 0 },
-
- { "DepthEnable", EBT_DepthStencil, D3D10_SVT_BOOL, 1, 1, FALSE, g_rvBOOL, ELHS_DepthEnable, offsetof_fx(SDepthStencilBlock, BackingStore.DepthEnable), 0 },
- { "DepthWriteMask", EBT_DepthStencil, D3D10_SVT_UINT, 1, 1, FALSE, g_rvDEPTH_WRITE_MASK, ELHS_DepthWriteMask, offsetof_fx(SDepthStencilBlock, BackingStore.DepthWriteMask), 0 },
- { "DepthFunc", EBT_DepthStencil, D3D10_SVT_UINT, 1, 1, FALSE, g_rvCMP, ELHS_DepthFunc, offsetof_fx(SDepthStencilBlock, BackingStore.DepthFunc), 0 },
- { "StencilEnable", EBT_DepthStencil, D3D10_SVT_BOOL, 1, 1, FALSE, g_rvBOOL, ELHS_StencilEnable, offsetof_fx(SDepthStencilBlock, BackingStore.StencilEnable), 0 },
- { "StencilReadMask", EBT_DepthStencil, D3D10_SVT_UINT8, 1, 1, FALSE, NULL, ELHS_StencilReadMask, offsetof_fx(SDepthStencilBlock, BackingStore.StencilReadMask), 0 },
- { "StencilWriteMask", EBT_DepthStencil, D3D10_SVT_UINT8, 1, 1, FALSE, NULL, ELHS_StencilWriteMask, offsetof_fx(SDepthStencilBlock, BackingStore.StencilWriteMask), 0 },
- { "FrontFaceStencilFail", EBT_DepthStencil, D3D10_SVT_UINT, 1, 1, FALSE, g_rvSTENCILOP, ELHS_FrontFaceStencilFailOp, offsetof_fx(SDepthStencilBlock, BackingStore.FrontFace.StencilFailOp), 0 },
- { "FrontFaceStencilDepthFail", EBT_DepthStencil, D3D10_SVT_UINT, 1, 1, FALSE, g_rvSTENCILOP, ELHS_FrontFaceStencilDepthFailOp,offsetof_fx(SDepthStencilBlock, BackingStore.FrontFace.StencilDepthFailOp), 0 },
- { "FrontFaceStencilPass", EBT_DepthStencil, D3D10_SVT_UINT, 1, 1, FALSE, g_rvSTENCILOP, ELHS_FrontFaceStencilPassOp, offsetof_fx(SDepthStencilBlock, BackingStore.FrontFace.StencilPassOp), 0 },
- { "FrontFaceStencilFunc", EBT_DepthStencil, D3D10_SVT_UINT, 1, 1, FALSE, g_rvCMP, ELHS_FrontFaceStencilFunc, offsetof_fx(SDepthStencilBlock, BackingStore.FrontFace.StencilFunc), 0 },
- { "BackFaceStencilFail", EBT_DepthStencil, D3D10_SVT_UINT, 1, 1, FALSE, g_rvSTENCILOP, ELHS_BackFaceStencilFailOp, offsetof_fx(SDepthStencilBlock, BackingStore.BackFace.StencilFailOp), 0 },
- { "BackFaceStencilDepthFail", EBT_DepthStencil, D3D10_SVT_UINT, 1, 1, FALSE, g_rvSTENCILOP, ELHS_BackFaceStencilDepthFailOp,offsetof_fx(SDepthStencilBlock, BackingStore.BackFace.StencilDepthFailOp), 0 },
- { "BackFaceStencilPass", EBT_DepthStencil, D3D10_SVT_UINT, 1, 1, FALSE, g_rvSTENCILOP, ELHS_BackFaceStencilPassOp, offsetof_fx(SDepthStencilBlock, BackingStore.BackFace.StencilPassOp), 0 },
- { "BackFaceStencilFunc", EBT_DepthStencil, D3D10_SVT_UINT, 1, 1, FALSE, g_rvCMP, ELHS_BackFaceStencilFunc, offsetof_fx(SDepthStencilBlock, BackingStore.BackFace.StencilFunc), 0 },
-
- { "AlphaToCoverageEnable", EBT_Blend, D3D10_SVT_BOOL, 1, 1, FALSE, g_rvBOOL, ELHS_AlphaToCoverage, offsetof_fx(SBlendBlock, BackingStore.AlphaToCoverageEnable), 0 },
- { "BlendEnable", EBT_Blend, D3D10_SVT_BOOL, 1, 8, FALSE, g_rvBOOL, ELHS_BlendEnable, offsetof_fx(SBlendBlock, BackingStore.RenderTarget[0].BlendEnable), strideof(SBlendBlock, BackingStore.RenderTarget) },
- { "SrcBlend", EBT_Blend, D3D10_SVT_UINT, 1, 8, TRUE, g_rvBLEND, ELHS_SrcBlend, offsetof_fx(SBlendBlock, BackingStore.RenderTarget[0].SrcBlend), strideof(SBlendBlock, BackingStore.RenderTarget) },
- { "DestBlend", EBT_Blend, D3D10_SVT_UINT, 1, 8, TRUE, g_rvBLEND, ELHS_DestBlend, offsetof_fx(SBlendBlock, BackingStore.RenderTarget[0].DestBlend), strideof(SBlendBlock, BackingStore.RenderTarget) },
- { "BlendOp", EBT_Blend, D3D10_SVT_UINT, 1, 8, TRUE, g_rvBLENDOP, ELHS_BlendOp, offsetof_fx(SBlendBlock, BackingStore.RenderTarget[0].BlendOp), strideof(SBlendBlock, BackingStore.RenderTarget) },
- { "SrcBlendAlpha", EBT_Blend, D3D10_SVT_UINT, 1, 8, TRUE, g_rvBLEND, ELHS_SrcBlendAlpha, offsetof_fx(SBlendBlock, BackingStore.RenderTarget[0].SrcBlendAlpha), strideof(SBlendBlock, BackingStore.RenderTarget) },
- { "DestBlendAlpha", EBT_Blend, D3D10_SVT_UINT, 1, 8, TRUE, g_rvBLEND, ELHS_DestBlendAlpha, offsetof_fx(SBlendBlock, BackingStore.RenderTarget[0].DestBlendAlpha), strideof(SBlendBlock, BackingStore.RenderTarget) },
- { "BlendOpAlpha", EBT_Blend, D3D10_SVT_UINT, 1, 8, TRUE, g_rvBLENDOP, ELHS_BlendOpAlpha, offsetof_fx(SBlendBlock, BackingStore.RenderTarget[0].BlendOpAlpha), strideof(SBlendBlock, BackingStore.RenderTarget) },
- { "RenderTargetWriteMask", EBT_Blend, D3D10_SVT_UINT8, 1, 8, FALSE, NULL, ELHS_RenderTargetWriteMask, offsetof_fx(SBlendBlock, BackingStore.RenderTarget[0].RenderTargetWriteMask), strideof(SBlendBlock, BackingStore.RenderTarget) },
-
- { "Filter", EBT_Sampler, D3D10_SVT_UINT, 1, 1, FALSE, g_rvFILTER, ELHS_Filter, offsetof_fx(SSamplerBlock, BackingStore.SamplerDesc.Filter), 0 },
- { "AddressU", EBT_Sampler, D3D10_SVT_UINT, 1, 1, FALSE, g_rvTADDRESS, ELHS_AddressU, offsetof_fx(SSamplerBlock, BackingStore.SamplerDesc.AddressU), 0 },
- { "AddressV", EBT_Sampler, D3D10_SVT_UINT, 1, 1, FALSE, g_rvTADDRESS, ELHS_AddressV, offsetof_fx(SSamplerBlock, BackingStore.SamplerDesc.AddressV), 0 },
- { "AddressW", EBT_Sampler, D3D10_SVT_UINT, 1, 1, FALSE, g_rvTADDRESS, ELHS_AddressW, offsetof_fx(SSamplerBlock, BackingStore.SamplerDesc.AddressW), 0 },
- { "MipLODBias", EBT_Sampler, D3D10_SVT_FLOAT, 1, 1, FALSE, NULL, ELHS_MipLODBias, offsetof_fx(SSamplerBlock, BackingStore.SamplerDesc.MipLODBias), 0 },
- { "MaxAnisotropy", EBT_Sampler, D3D10_SVT_UINT, 1, 1, FALSE, NULL, ELHS_MaxAnisotropy, offsetof_fx(SSamplerBlock, BackingStore.SamplerDesc.MaxAnisotropy), 0 },
- { "ComparisonFunc", EBT_Sampler, D3D10_SVT_UINT, 1, 1, FALSE, g_rvCMP, ELHS_ComparisonFunc, offsetof_fx(SSamplerBlock, BackingStore.SamplerDesc.ComparisonFunc), 0 },
- { "BorderColor", EBT_Sampler, D3D10_SVT_FLOAT, 4, 1, FALSE, NULL, ELHS_BorderColor, offsetof_fx(SSamplerBlock, BackingStore.SamplerDesc.BorderColor), 0 },
- { "MinLOD", EBT_Sampler, D3D10_SVT_FLOAT, 1, 1, FALSE, NULL, ELHS_MinLOD, offsetof_fx(SSamplerBlock, BackingStore.SamplerDesc.MinLOD), 0 },
- { "MaxLOD", EBT_Sampler, D3D10_SVT_FLOAT, 1, 1, FALSE, NULL, ELHS_MaxLOD, offsetof_fx(SSamplerBlock, BackingStore.SamplerDesc.MaxLOD), 0 },
- { "Texture", EBT_Sampler, D3D10_SVT_TEXTURE, 1, 1, FALSE, g_rvNULL, ELHS_Texture, offsetof_fx(SSamplerBlock, BackingStore.pTexture), 0 },
-
- // D3D11
- { "HullShader", EBT_Pass, D3D11_SVT_HULLSHADER, 1, 1, FALSE, g_rvNULL, ELHS_HullShaderBlock, offsetof_fx(SPassBlock, BackingStore.pHullShaderBlock), 0 },
- { "DomainShader", EBT_Pass, D3D11_SVT_DOMAINSHADER, 1, 1, FALSE, g_rvNULL, ELHS_DomainShaderBlock, offsetof_fx(SPassBlock, BackingStore.pDomainShaderBlock), 0 },
- { "ComputeShader", EBT_Pass, D3D11_SVT_COMPUTESHADER, 1, 1, FALSE, g_rvNULL, ELHS_ComputeShaderBlock, offsetof_fx(SPassBlock, BackingStore.pComputeShaderBlock), 0 },
-};
-
-#define NUM_STATES (sizeof(g_lvGeneral) / sizeof(LValue))
-#define MAX_VECTOR_SCALAR_INDEX 8
-
-CONST UINT g_lvGeneralCount = NUM_STATES;
-
-} // end namespace D3DX11Effects
diff --git a/sample/d3d11/Effects11/Binary/SOParser.h b/sample/d3d11/Effects11/Binary/SOParser.h
deleted file mode 100644
index 1fb95a9..0000000
--- a/sample/d3d11/Effects11/Binary/SOParser.h
+++ /dev/null
@@ -1,311 +0,0 @@
-//////////////////////////////////////////////////////////////////////////////
-//
-// Copyright (C) Microsoft Corporation. All Rights Reserved.
-//
-// File: SOParser.h
-// Content: D3DX11 Effects Stream Out Decl Parser
-//
-//////////////////////////////////////////////////////////////////////////////
-
-#pragma once
-
-namespace D3DX11Effects
-{
-
-
-//////////////////////////////////////////////////////////////////////////
-// CSOParser
-//////////////////////////////////////////////////////////////////////////
-
-class CSOParser
-{
-
- CEffectVector<D3D11_SO_DECLARATION_ENTRY> m_vDecls; // Set of parsed decl entries
- D3D11_SO_DECLARATION_ENTRY m_newEntry; // Currently parsing entry
- LPSTR m_SemanticString[D3D11_SO_BUFFER_SLOT_COUNT]; // Copy of strings
-
- static const UINT MAX_ERROR_SIZE = 254;
- char m_pError[ MAX_ERROR_SIZE + 1 ]; // Error buffer
-
-public:
- CSOParser()
- {
- ZeroMemory(&m_newEntry, sizeof(m_newEntry));
- ZeroMemory(m_SemanticString, sizeof(m_SemanticString));
- m_pError[0] = 0;
- }
-
- ~CSOParser()
- {
- for( UINT Stream = 0; Stream < D3D11_SO_STREAM_COUNT; Stream++ )
- {
- SAFE_DELETE_ARRAY( m_SemanticString[Stream] );
- }
- }
-
- // Parse a single string, assuming stream 0
- HRESULT Parse( __in_z LPCSTR pString )
- {
- m_vDecls.Clear();
- return Parse( 0, pString );
- }
-
- // Parse all 4 streams
- HRESULT Parse( __in_z LPSTR pStreams[D3D11_SO_STREAM_COUNT] )
- {
- HRESULT hr = S_OK;
- m_vDecls.Clear();
- for( UINT iDecl=0; iDecl < D3D11_SO_STREAM_COUNT; ++iDecl )
- {
- hr = Parse( iDecl, pStreams[iDecl] );
- if( FAILED(hr) )
- {
- char pStream[16];
- StringCchPrintfA( pStream, 16, " in stream %d.", iDecl );
- pStream[15] = 0;
- StringCchCatA( m_pError, MAX_ERROR_SIZE, pStream );
- return hr;
- }
- }
- return hr;
- }
-
- // Return resulting declarations
- D3D11_SO_DECLARATION_ENTRY *GetDeclArray()
- {
- return &m_vDecls[0];
- }
-
- char* GetErrorString()
- {
- return m_pError;
- }
-
- UINT GetDeclCount() const
- {
- return m_vDecls.GetSize();
- }
-
- // Return resulting buffer strides
- void GetStrides( UINT strides[4] )
- {
- UINT len = GetDeclCount();
- strides[0] = strides[1] = strides[2] = strides[3] = 0;
-
- for( UINT i=0; i < len; i++ )
- {
- strides[m_vDecls[i].OutputSlot] += m_vDecls[i].ComponentCount * sizeof(float);
- }
- }
-
-protected:
-
- // Parse a single string "[<slot> :] <semantic>[<index>][.<mask>]; [[<slot> :] <semantic>[<index>][.<mask>][;]]"
- HRESULT Parse( UINT Stream, __in_z LPCSTR pString )
- {
- HRESULT hr = S_OK;
-
- m_pError[0] = 0;
-
- if( pString == NULL )
- return S_OK;
-
- UINT len = (UINT)strlen( pString );
- if( len == 0 )
- return S_OK;
-
- SAFE_DELETE_ARRAY( m_SemanticString[Stream] );
- VN( m_SemanticString[Stream] = NEW char[len + 1] );
- StringCchCopyA( m_SemanticString[Stream], len + 1, pString );
-
- LPSTR pSemantic = m_SemanticString[Stream];
-
- while( TRUE )
- {
- // Each decl entry is delimited by a semi-colon
- LPSTR pSemi = strchr( pSemantic, ';' );
-
- // strip leading and trailing spaces
- LPSTR pEnd;
- if( pSemi != NULL )
- {
- *pSemi = '\0';
- pEnd = pSemi - 1;
- }
- else
- {
- pEnd = pSemantic + strlen( pSemantic );
- }
- while( isspace( (unsigned char)*pSemantic ) )
- pSemantic++;
- while( pEnd > pSemantic && isspace( (unsigned char)*pEnd ) )
- {
- *pEnd = '\0';
- pEnd--;
- }
-
- if( *pSemantic != '\0' )
- {
- VH( AddSemantic( pSemantic ) );
- m_newEntry.Stream = Stream;
-
- VH( m_vDecls.Add( m_newEntry ) );
- }
- if( pSemi == NULL )
- break;
- pSemantic = pSemi + 1;
- }
-
-lExit:
- return hr;
- }
-
- // Parse a single decl "[<slot> :] <semantic>[<index>][.<mask>]"
- HRESULT AddSemantic( __inout_z LPSTR pSemantic )
- {
- HRESULT hr = S_OK;
-
- D3DXASSERT( pSemantic );
-
- ZeroMemory( &m_newEntry, sizeof(m_newEntry) );
- VH( ConsumeOutputSlot( &pSemantic ) );
- VH( ConsumeRegisterMask( pSemantic ) );
- VH( ConsumeSemanticIndex( pSemantic ) );
-
- // pSenantic now contains only the SemanticName (all other fields were consumed)
- if( strcmp( "$SKIP", pSemantic ) != 0 )
- {
- m_newEntry.SemanticName = pSemantic;
- }
-
-lExit:
- return hr;
- }
-
- // Parse optional mask "[.<mask>]"
- HRESULT ConsumeRegisterMask( __inout_z LPSTR pSemantic )
- {
- HRESULT hr = S_OK;
- const char *pFullMask1 = "xyzw";
- const char *pFullMask2 = "rgba";
- SIZE_T stringLength;
- SIZE_T startComponent = 0;
- LPCSTR p;
-
- D3DXASSERT( pSemantic );
-
- pSemantic = strchr( pSemantic, '.' );
-
- if( pSemantic == NULL )
- {
- m_newEntry.ComponentCount = 4;
- return S_OK;
- }
-
- *pSemantic = '\0';
- pSemantic++;
-
- stringLength = strlen( pSemantic );
- p = strstr(pFullMask1, pSemantic );
- if( p )
- {
- startComponent = (UINT)( p - pFullMask1 );
- }
- else
- {
- p = strstr( pFullMask2, pSemantic );
- if( p )
- startComponent = (UINT)( p - pFullMask2 );
- else
- {
- StringCchPrintfA( m_pError, MAX_ERROR_SIZE, "ID3D11Effect::ParseSODecl - invalid mask declaration '%s'", pSemantic );
- VH( E_FAIL );
- }
-
- }
-
- if( stringLength == 0 )
- stringLength = 4;
-
- m_newEntry.StartComponent = (BYTE)startComponent;
- m_newEntry.ComponentCount = (BYTE)stringLength;
-
-lExit:
- return hr;
- }
-
- // Parse optional output slot "[<slot> :]"
- HRESULT ConsumeOutputSlot( __deref_inout_z LPSTR* ppSemantic )
- {
- D3DXASSERT( ppSemantic && *ppSemantic );
-
- HRESULT hr = S_OK;
- LPSTR pColon = strchr( *ppSemantic, ':' );
-
- if( pColon == NULL )
- return S_OK;
-
- if( pColon == *ppSemantic )
- {
- StringCchCopyA( m_pError, MAX_ERROR_SIZE,
- "ID3D11Effect::ParseSODecl - Invalid output slot" );
- VH( E_FAIL );
- }
-
- *pColon = '\0';
- int outputSlot = atoi( *ppSemantic );
- if( outputSlot < 0 || outputSlot > 255 )
- {
- StringCchCopyA( m_pError, MAX_ERROR_SIZE,
- "ID3D11Effect::ParseSODecl - Invalid output slot" );
- VH( E_FAIL );
- }
- m_newEntry.OutputSlot = (BYTE)outputSlot;
-
- while( *ppSemantic < pColon )
- {
- if( !isdigit( (unsigned char)**ppSemantic ) )
- {
- StringCchPrintfA( m_pError, MAX_ERROR_SIZE, "ID3D11Effect::ParseSODecl - Non-digit '%c' in output slot", **ppSemantic );
- VH( E_FAIL );
- }
- (*ppSemantic)++;
- }
-
- // skip the colon (which is now '\0')
- (*ppSemantic)++;
-
- while( isspace( (unsigned char)**ppSemantic ) )
- (*ppSemantic)++;
-
-lExit:
- return hr;
- }
-
- // Parse optional index "[<index>]"
- HRESULT ConsumeSemanticIndex( __inout_z LPSTR pSemantic )
- {
- D3DXASSERT( pSemantic );
-
- UINT uLen = (UINT)strlen( pSemantic );
-
- // Grab semantic index
- while( uLen > 0 && isdigit( (unsigned char)pSemantic[uLen - 1] ) )
- uLen--;
-
- if( isdigit( (unsigned char)pSemantic[uLen] ) )
- {
- m_newEntry.SemanticIndex = atoi( pSemantic + uLen );
- pSemantic[uLen] = '\0';
- }
- else
- {
- m_newEntry.SemanticIndex = 0;
- }
-
- return S_OK;
- }
-};
-
-
-} // end namespace D3DX11Effects
diff --git a/sample/d3d11/Effects11/Effect.h b/sample/d3d11/Effects11/Effect.h
deleted file mode 100644
index ec0dafa..0000000
--- a/sample/d3d11/Effects11/Effect.h
+++ /dev/null
@@ -1,1226 +0,0 @@
-//////////////////////////////////////////////////////////////////////////////
-//
-// Copyright (C) Microsoft Corporation. All Rights Reserved.
-//
-// File: Effect.h
-// Content: D3DX11 Effects Header for ID3DX11Effect Implementation
-//
-//////////////////////////////////////////////////////////////////////////////
-
-#pragma once
-
-#include "EffectBinaryFormat.h"
-
-using namespace D3DX11Core;
-
-namespace D3DX11Effects
-{
-
-//////////////////////////////////////////////////////////////////////////
-// Forward defines
-//////////////////////////////////////////////////////////////////////////
-
-struct SBaseBlock;
-struct SShaderBlock;
-struct SPassBlock;
-struct SClassInstance;
-struct SInterface;
-struct SShaderResource;
-struct SUnorderedAccessView;
-struct SRenderTargetView;
-struct SDepthStencilView;
-struct SSamplerBlock;
-struct SDepthStencilBlock;
-struct SBlendBlock;
-struct SRasterizerBlock;
-struct SString;
-struct SD3DShaderVTable;
-struct SClassInstanceGlobalVariable;
-
-struct SAssignment;
-struct SVariable;
-struct SGlobalVariable;
-struct SAnnotation;
-struct SConstantBuffer;
-
-class CEffect;
-class CEffectLoader;
-
-enum ELhsType;
-
-// Allows the use of 32-bit and 64-bit timers depending on platform type
-typedef SIZE_T Timer;
-
-//////////////////////////////////////////////////////////////////////////
-// Reflection & Type structures
-//////////////////////////////////////////////////////////////////////////
-
-// CEffectMatrix is used internally instead of float arrays
-struct CEffectMatrix
-{
- union
- {
- struct
- {
- float _11, _12, _13, _14;
- float _21, _22, _23, _24;
- float _31, _32, _33, _34;
- float _41, _42, _43, _44;
-
- };
- float m[4][4];
- };
-};
-
-struct CEffectVector4
-{
- float x;
- float y;
- float z;
- float w;
-};
-
-union UDataPointer
-{
- void *pGeneric;
- BYTE *pNumeric;
- float *pNumericFloat;
- UINT *pNumericDword;
- int *pNumericInt;
- BOOL *pNumericBool;
- SString *pString;
- SShaderBlock *pShader;
- SBaseBlock *pBlock;
- SBlendBlock *pBlend;
- SDepthStencilBlock *pDepthStencil;
- SRasterizerBlock *pRasterizer;
- SInterface *pInterface;
- SShaderResource *pShaderResource;
- SUnorderedAccessView *pUnorderedAccessView;
- SRenderTargetView *pRenderTargetView;
- SDepthStencilView *pDepthStencilView;
- SSamplerBlock *pSampler;
- CEffectVector4 *pVector;
- CEffectMatrix *pMatrix;
- UINT_PTR Offset;
-};
-
-enum EMemberDataType
-{
- MDT_ClassInstance,
- MDT_BlendState,
- MDT_DepthStencilState,
- MDT_RasterizerState,
- MDT_SamplerState,
- MDT_Buffer,
- MDT_ShaderResourceView,
-};
-
-struct SMemberDataPointer
-{
- EMemberDataType Type;
- union
- {
- IUnknown *pGeneric;
- ID3D11ClassInstance *pD3DClassInstance;
- ID3D11BlendState *pD3DEffectsManagedBlendState;
- ID3D11DepthStencilState *pD3DEffectsManagedDepthStencilState;
- ID3D11RasterizerState *pD3DEffectsManagedRasterizerState;
- ID3D11SamplerState *pD3DEffectsManagedSamplerState;
- ID3D11Buffer *pD3DEffectsManagedConstantBuffer;
- ID3D11ShaderResourceView*pD3DEffectsManagedTextureBuffer;
- } Data;
-};
-
-struct SType : public ID3DX11EffectType
-{
- static const UINT_PTR c_InvalidIndex = (UINT) -1;
- static const UINT c_ScalarSize = sizeof(UINT);
-
- // packing rule constants
- static const UINT c_ScalarsPerRegister = 4;
- static const UINT c_RegisterSize = c_ScalarsPerRegister * c_ScalarSize; // must be a power of 2!!
-
- EVarType VarType; // numeric, object, struct
- UINT Elements; // # of array elements (0 for non-arrays)
- char *pTypeName; // friendly name of the type: "VS_OUTPUT", "float4", etc.
-
- // *Size and stride values are always 0 for object types
- // *Annotations adhere to packing rules (even though they do not reside in constant buffers)
- // for consistency's sake
- //
- // Packing rules:
- // *Structures and array elements are always register aligned
- // *Single-row values (or, for column major matrices, single-column) are greedily
- // packed unless doing so would span a register boundary, in which case they are
- // register aligned
-
- UINT TotalSize; // Total size of this data type in a constant buffer from
- // start to finish (padding in between elements is included,
- // but padding at the end is not since that would require
- // knowledge of the following data type).
-
- UINT Stride; // Number of bytes to advance between elements.
- // Typically a multiple of 16 for arrays, vectors, matrices.
- // For scalars and small vectors/matrices, this can be 4 or 8.
-
- UINT PackedSize; // Size, in bytes, of this data typed when fully packed
-
- union
- {
- SBinaryNumericType NumericType;
- EObjectType ObjectType; // not all values of EObjectType are valid here (e.g. constant buffer)
- struct
- {
- SVariable *pMembers; // array of type instances describing structure members
- UINT Members;
- bool ImplementsInterface; // true if this type implements an interface
- bool HasSuperClass; // true if this type has a parent class
- } StructType;
- void* InterfaceType; // nothing for interfaces
- };
-
-
- SType() :
- VarType(EVT_Invalid),
- Elements(0),
- pTypeName(NULL),
- TotalSize(0),
- Stride(0),
- PackedSize(0)
- {
- C_ASSERT( sizeof(NumericType) <= sizeof(StructType) );
- C_ASSERT( sizeof(ObjectType) <= sizeof(StructType) );
- C_ASSERT( sizeof(InterfaceType) <= sizeof(StructType) );
- ZeroMemory( &StructType, sizeof(StructType) );
- }
-
- BOOL IsEqual(SType *pOtherType) const;
-
- BOOL IsObjectType(EObjectType ObjType) const
- {
- return IsObjectTypeHelper(VarType, ObjectType, ObjType);
- }
- BOOL IsShader() const
- {
- return IsShaderHelper(VarType, ObjectType);
- }
- BOOL BelongsInConstantBuffer() const
- {
- return (VarType == EVT_Numeric) || (VarType == EVT_Struct);
- }
- BOOL IsStateBlockObject() const
- {
- return IsStateBlockObjectHelper(VarType, ObjectType);
- }
- BOOL IsClassInstance() const
- {
- return (VarType == EVT_Struct) && StructType.ImplementsInterface;
- }
- BOOL IsInterface() const
- {
- return IsInterfaceHelper(VarType, ObjectType);
- }
- BOOL IsShaderResource() const
- {
- return IsShaderResourceHelper(VarType, ObjectType);
- }
- BOOL IsUnorderedAccessView() const
- {
- return IsUnorderedAccessViewHelper(VarType, ObjectType);
- }
- BOOL IsSampler() const
- {
- return IsSamplerHelper(VarType, ObjectType);
- }
- BOOL IsRenderTargetView() const
- {
- return IsRenderTargetViewHelper(VarType, ObjectType);
- }
- BOOL IsDepthStencilView() const
- {
- return IsDepthStencilViewHelper(VarType, ObjectType);
- }
-
- UINT GetTotalUnpackedSize(BOOL IsSingleElement) const;
- UINT GetTotalPackedSize(BOOL IsSingleElement) const;
- HRESULT GetDescHelper(D3DX11_EFFECT_TYPE_DESC *pDesc, BOOL IsSingleElement) const;
-
- STDMETHOD_(BOOL, IsValid)() { return TRUE; }
- STDMETHOD(GetDesc)(D3DX11_EFFECT_TYPE_DESC *pDesc) { return GetDescHelper(pDesc, FALSE); }
- STDMETHOD_(ID3DX11EffectType*, GetMemberTypeByIndex)(UINT Index);
- STDMETHOD_(ID3DX11EffectType*, GetMemberTypeByName)(LPCSTR Name);
- STDMETHOD_(ID3DX11EffectType*, GetMemberTypeBySemantic)(LPCSTR Semantic);
- STDMETHOD_(LPCSTR, GetMemberName)(UINT Index);
- STDMETHOD_(LPCSTR, GetMemberSemantic)(UINT Index);
-};
-
-// Represents a type structure for a single element.
-// It seems pretty trivial, but it has a different virtual table which enables
-// us to accurately represent a type that consists of a single element
-struct SSingleElementType : public ID3DX11EffectType
-{
- SType *pType;
-
- STDMETHOD_(BOOL, IsValid)() { return TRUE; }
- STDMETHOD(GetDesc)(D3DX11_EFFECT_TYPE_DESC *pDesc) { return ((SType*)pType)->GetDescHelper(pDesc, TRUE); }
- STDMETHOD_(ID3DX11EffectType*, GetMemberTypeByIndex)(UINT Index) { return ((SType*)pType)->GetMemberTypeByIndex(Index); }
- STDMETHOD_(ID3DX11EffectType*, GetMemberTypeByName)(LPCSTR Name) { return ((SType*)pType)->GetMemberTypeByName(Name); }
- STDMETHOD_(ID3DX11EffectType*, GetMemberTypeBySemantic)(LPCSTR Semantic) { return ((SType*)pType)->GetMemberTypeBySemantic(Semantic); }
- STDMETHOD_(LPCSTR, GetMemberName)(UINT Index) { return ((SType*)pType)->GetMemberName(Index); }
- STDMETHOD_(LPCSTR, GetMemberSemantic)(UINT Index) { return ((SType*)pType)->GetMemberSemantic(Index); }
-};
-
-//////////////////////////////////////////////////////////////////////////
-// Block definitions
-//////////////////////////////////////////////////////////////////////////
-
-void * GetBlockByIndex(EVarType VarType, EObjectType ObjectType, void *pBaseBlock, UINT Index);
-
-struct SBaseBlock
-{
- EBlockType BlockType;
-
- BOOL IsUserManaged:1;
-
- UINT AssignmentCount;
- SAssignment *pAssignments;
-
- SBaseBlock();
-
- BOOL ApplyAssignments(CEffect *pEffect);
-
- D3DX11INLINE SSamplerBlock *AsSampler() const
- {
- D3DXASSERT( BlockType == EBT_Sampler );
- return (SSamplerBlock*) this;
- }
-
- D3DX11INLINE SDepthStencilBlock *AsDepthStencil() const
- {
- D3DXASSERT( BlockType == EBT_DepthStencil );
- return (SDepthStencilBlock*) this;
- }
-
- D3DX11INLINE SBlendBlock *AsBlend() const
- {
- D3DXASSERT( BlockType == EBT_Blend );
- return (SBlendBlock*) this;
- }
-
- D3DX11INLINE SRasterizerBlock *AsRasterizer() const
- {
- D3DXASSERT( BlockType == EBT_Rasterizer );
- return (SRasterizerBlock*) this;
- }
-
- D3DX11INLINE SPassBlock *AsPass() const
- {
- D3DXASSERT( BlockType == EBT_Pass );
- return (SPassBlock*) this;
- }
-};
-
-struct STechnique : public ID3DX11EffectTechnique
-{
- char *pName;
-
- UINT PassCount;
- SPassBlock *pPasses;
-
- UINT AnnotationCount;
- SAnnotation *pAnnotations;
-
- BOOL InitiallyValid;
- BOOL HasDependencies;
-
- STechnique();
-
- STDMETHOD_(BOOL, IsValid)();
- STDMETHOD(GetDesc)(D3DX11_TECHNIQUE_DESC *pDesc);
-
- STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByIndex)(UINT Index);
- STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByName)(LPCSTR Name);
-
- STDMETHOD_(ID3DX11EffectPass*, GetPassByIndex)(UINT Index);
- STDMETHOD_(ID3DX11EffectPass*, GetPassByName)(LPCSTR Name);
-
- STDMETHOD(ComputeStateBlockMask)(D3DX11_STATE_BLOCK_MASK *pStateBlockMask);
-};
-
-struct SGroup : public ID3DX11EffectGroup
-{
- char *pName;
-
- UINT TechniqueCount;
- STechnique *pTechniques;
-
- UINT AnnotationCount;
- SAnnotation *pAnnotations;
-
- BOOL InitiallyValid;
- BOOL HasDependencies;
-
- SGroup();
-
- STDMETHOD_(BOOL, IsValid)();
- STDMETHOD(GetDesc)(D3DX11_GROUP_DESC *pDesc);
-
- STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByIndex)(UINT Index);
- STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByName)(LPCSTR Name);
-
- STDMETHOD_(ID3DX11EffectTechnique*, GetTechniqueByIndex)(UINT Index);
- STDMETHOD_(ID3DX11EffectTechnique*, GetTechniqueByName)(LPCSTR Name);
-};
-
-struct SPassBlock : SBaseBlock, public ID3DX11EffectPass
-{
- struct
- {
- ID3D11BlendState* pBlendState;
- FLOAT BlendFactor[4];
- UINT SampleMask;
- ID3D11DepthStencilState *pDepthStencilState;
- UINT StencilRef;
- union
- {
- D3D11_SO_DECLARATION_ENTRY *pEntry;
- char *pEntryDesc;
- } GSSODesc;
-
- // Pass assignments can write directly into these
- SBlendBlock *pBlendBlock;
- SDepthStencilBlock *pDepthStencilBlock;
- SRasterizerBlock *pRasterizerBlock;
- UINT RenderTargetViewCount;
- SRenderTargetView *pRenderTargetViews[D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT];
- SDepthStencilView *pDepthStencilView;
- SShaderBlock *pVertexShaderBlock;
- SShaderBlock *pPixelShaderBlock;
- SShaderBlock *pGeometryShaderBlock;
- SShaderBlock *pComputeShaderBlock;
- SShaderBlock *pDomainShaderBlock;
- SShaderBlock *pHullShaderBlock;
- } BackingStore;
-
- char *pName;
-
- UINT AnnotationCount;
- SAnnotation *pAnnotations;
-
- CEffect *pEffect;
-
- BOOL InitiallyValid; // validity of all state objects and shaders in pass upon BindToDevice
- BOOL HasDependencies; // if pass expressions or pass state blocks have dependencies on variables (if true, IsValid != InitiallyValid possibly)
-
- SPassBlock();
-
- void ApplyPassAssignments();
- BOOL CheckShaderDependencies( SShaderBlock* pBlock );
- BOOL CheckDependencies();
-
- template<EObjectType EShaderType>
- HRESULT GetShaderDescHelper(D3DX11_PASS_SHADER_DESC *pDesc);
-
- STDMETHOD_(BOOL, IsValid)();
- STDMETHOD(GetDesc)(D3DX11_PASS_DESC *pDesc);
-
- STDMETHOD(GetVertexShaderDesc)(D3DX11_PASS_SHADER_DESC *pDesc);
- STDMETHOD(GetGeometryShaderDesc)(D3DX11_PASS_SHADER_DESC *pDesc);
- STDMETHOD(GetPixelShaderDesc)(D3DX11_PASS_SHADER_DESC *pDesc);
- STDMETHOD(GetHullShaderDesc)(D3DX11_PASS_SHADER_DESC *pDesc);
- STDMETHOD(GetDomainShaderDesc)(D3DX11_PASS_SHADER_DESC *pDesc);
- STDMETHOD(GetComputeShaderDesc)(D3DX11_PASS_SHADER_DESC *pDesc);
-
- STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByIndex)(UINT Index);
- STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByName)(LPCSTR Name);
-
- STDMETHOD(Apply)(UINT Flags, ID3D11DeviceContext* pContext);
-
- STDMETHOD(ComputeStateBlockMask)(D3DX11_STATE_BLOCK_MASK *pStateBlockMask);
-};
-
-struct SDepthStencilBlock : SBaseBlock
-{
- ID3D11DepthStencilState *pDSObject;
- D3D11_DEPTH_STENCIL_DESC BackingStore;
- BOOL IsValid;
-
- SDepthStencilBlock();
-};
-
-struct SBlendBlock : SBaseBlock
-{
- ID3D11BlendState *pBlendObject;
- D3D11_BLEND_DESC BackingStore;
- BOOL IsValid;
-
- SBlendBlock();
-};
-
-struct SRasterizerBlock : SBaseBlock
-{
- ID3D11RasterizerState *pRasterizerObject;
- D3D11_RASTERIZER_DESC BackingStore;
- BOOL IsValid;
-
- SRasterizerBlock();
-};
-
-struct SSamplerBlock : SBaseBlock
-{
- ID3D11SamplerState *pD3DObject;
- struct
- {
- D3D11_SAMPLER_DESC SamplerDesc;
- // Sampler "TEXTURE" assignments can write directly into this
- SShaderResource *pTexture;
- } BackingStore;
-
- SSamplerBlock();
-};
-
-struct SInterface
-{
- SClassInstanceGlobalVariable* pClassInstance;
-
- SInterface()
- {
- pClassInstance = NULL;
- }
-};
-
-struct SShaderResource
-{
- ID3D11ShaderResourceView *pShaderResource;
-
- SShaderResource()
- {
- pShaderResource = NULL;
- }
-
-};
-
-struct SUnorderedAccessView
-{
- ID3D11UnorderedAccessView *pUnorderedAccessView;
-
- SUnorderedAccessView()
- {
- pUnorderedAccessView = NULL;
- }
-
-};
-
-struct SRenderTargetView
-{
- ID3D11RenderTargetView *pRenderTargetView;
-
- SRenderTargetView();
-};
-
-struct SDepthStencilView
-{
- ID3D11DepthStencilView *pDepthStencilView;
-
- SDepthStencilView();
-};
-
-
-template<class T, class D3DTYPE> struct SShaderDependency
-{
- UINT StartIndex;
- UINT Count;
-
- T *ppFXPointers; // Array of ptrs to FX objects (CBs, SShaderResources, etc)
- D3DTYPE *ppD3DObjects; // Array of ptrs to matching D3D objects
-
- SShaderDependency()
- {
- StartIndex = Count = 0;
-
- ppD3DObjects = NULL;
- ppFXPointers = NULL;
- }
-};
-
-typedef SShaderDependency<SConstantBuffer*, ID3D11Buffer*> SShaderCBDependency;
-typedef SShaderDependency<SSamplerBlock*, ID3D11SamplerState*> SShaderSamplerDependency;
-typedef SShaderDependency<SShaderResource*, ID3D11ShaderResourceView*> SShaderResourceDependency;
-typedef SShaderDependency<SUnorderedAccessView*, ID3D11UnorderedAccessView*> SUnorderedAccessViewDependency;
-typedef SShaderDependency<SInterface*, ID3D11ClassInstance*> SInterfaceDependency;
-
-// Shader VTables are used to eliminate branching in ApplyShaderBlock.
-// The effect owns three D3DShaderVTables, one for PS, one for VS, and one for GS.
-struct SD3DShaderVTable
-{
- void ( __stdcall ID3D11DeviceContext::*pSetShader)(ID3D11DeviceChild* pShader, ID3D11ClassInstance*const* ppClassInstances, UINT NumClassInstances);
- void ( __stdcall ID3D11DeviceContext::*pSetConstantBuffers)(UINT StartConstantSlot, UINT NumBuffers, ID3D11Buffer *const *pBuffers);
- void ( __stdcall ID3D11DeviceContext::*pSetSamplers)(UINT Offset, UINT NumSamplers, ID3D11SamplerState*const* pSamplers);
- void ( __stdcall ID3D11DeviceContext::*pSetShaderResources)(UINT Offset, UINT NumResources, ID3D11ShaderResourceView *const *pResources);
- HRESULT ( __stdcall ID3D11Device::*pCreateShader)(const void *pShaderBlob, SIZE_T ShaderBlobSize, ID3D11ClassLinkage* pClassLinkage, ID3D11DeviceChild **ppShader);
-};
-
-
-struct SShaderBlock
-{
- enum ESigType
- {
- ST_Input,
- ST_Output,
- ST_PatchConstant,
- };
-
- struct SInterfaceParameter
- {
- char *pName;
- UINT Index;
- };
-
- // this data is classified as reflection-only and will all be discarded at runtime
- struct SReflectionData
- {
- BYTE *pBytecode;
- UINT BytecodeLength;
- char *pStreamOutDecls[4]; // set with ConstructGSWithSO
- UINT RasterizedStream; // set with ConstructGSWithSO
- BOOL IsNullGS;
- ID3D11ShaderReflection *pReflection;
- UINT InterfaceParameterCount; // set with BindInterfaces (used for function interface parameters)
- SInterfaceParameter *pInterfaceParameters; // set with BindInterfaces (used for function interface parameters)
- };
-
- BOOL IsValid;
- SD3DShaderVTable *pVT;
-
- // This value is NULL if the shader is NULL or was never initialized
- SReflectionData *pReflectionData;
-
- ID3D11DeviceChild *pD3DObject;
-
- UINT CBDepCount;
- SShaderCBDependency *pCBDeps;
-
- UINT SampDepCount;
- SShaderSamplerDependency *pSampDeps;
-
- UINT InterfaceDepCount;
- SInterfaceDependency *pInterfaceDeps;
-
- UINT ResourceDepCount;
- SShaderResourceDependency *pResourceDeps;
-
- UINT UAVDepCount;
- SUnorderedAccessViewDependency *pUAVDeps;
-
- UINT TBufferDepCount;
- SConstantBuffer **ppTbufDeps;
-
- ID3DBlob *pInputSignatureBlob; // The input signature is separated from the bytecode because it
- // is always available, even after Optimize() has been called.
-
- SShaderBlock(SD3DShaderVTable *pVirtualTable = NULL);
-
- EObjectType GetShaderType();
-
- HRESULT OnDeviceBind();
-
- // Public API helpers
- HRESULT ComputeStateBlockMask(D3DX11_STATE_BLOCK_MASK *pStateBlockMask);
-
- HRESULT GetShaderDesc(D3DX11_EFFECT_SHADER_DESC *pDesc, BOOL IsInline);
-
- HRESULT GetVertexShader(ID3D11VertexShader **ppVS);
- HRESULT GetGeometryShader(ID3D11GeometryShader **ppGS);
- HRESULT GetPixelShader(ID3D11PixelShader **ppPS);
- HRESULT GetHullShader(ID3D11HullShader **ppPS);
- HRESULT GetDomainShader(ID3D11DomainShader **ppPS);
- HRESULT GetComputeShader(ID3D11ComputeShader **ppPS);
-
- HRESULT GetSignatureElementDesc(ESigType SigType, UINT Element, D3D11_SIGNATURE_PARAMETER_DESC *pDesc);
-};
-
-
-
-struct SString
-{
- char *pString;
-
- SString();
-};
-
-
-
-//////////////////////////////////////////////////////////////////////////
-// Global Variable & Annotation structure/interface definitions
-//////////////////////////////////////////////////////////////////////////
-
-//
-// This is a general structure that can describe
-// annotations, variables, and structure members
-//
-struct SVariable
-{
- // For annotations/variables/variable members:
- // 1) If numeric, pointer to data (for variables: points into backing store,
- // for annotations, points into reflection heap)
- // OR
- // 2) If object, pointer to the block. If object array, subsequent array elements are found in
- // contiguous blocks; the Nth block is found by ((<SpecificBlockType> *) pBlock) + N
- // (this is because variables that are arrays of objects have their blocks allocated contiguously)
- //
- // For structure members:
- // Offset of this member (in bytes) from parent structure (structure members must be numeric/struct)
- UDataPointer Data;
- union
- {
- UINT MemberDataOffsetPlus4; // 4 added so that 0 == NULL can represent "unused"
- SMemberDataPointer *pMemberData;
- };
-
- SType *pType;
- char *pName;
- char *pSemantic;
- UINT ExplicitBindPoint;
-
- SVariable()
- {
- ZeroMemory(this, sizeof(*this));
- ExplicitBindPoint = -1;
- }
-};
-
-// Template definitions for all of the various ID3DX11EffectVariable specializations
-#include "EffectVariable.inl"
-
-
-////////////////////////////////////////////////////////////////////////////////
-// ID3DX11EffectShaderVariable (SAnonymousShader implementation)
-////////////////////////////////////////////////////////////////////////////////
-
-struct SAnonymousShader : public TUncastableVariable<ID3DX11EffectShaderVariable>, public ID3DX11EffectType
-{
- SShaderBlock *pShaderBlock;
-
- SAnonymousShader(SShaderBlock *pBlock = NULL);
-
- // ID3DX11EffectShaderVariable interface
- STDMETHOD_(BOOL, IsValid)();
- STDMETHOD_(ID3DX11EffectType*, GetType)();
- STDMETHOD(GetDesc)(D3DX11_EFFECT_VARIABLE_DESC *pDesc);
-
- STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByIndex)(UINT Index);
- STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByName)(LPCSTR Name);
-
- STDMETHOD_(ID3DX11EffectVariable*, GetMemberByIndex)(UINT Index);
- STDMETHOD_(ID3DX11EffectVariable*, GetMemberByName)(LPCSTR Name);
- STDMETHOD_(ID3DX11EffectVariable*, GetMemberBySemantic)(LPCSTR Semantic);
-
- STDMETHOD_(ID3DX11EffectVariable*, GetElement)(UINT Index);
-
- STDMETHOD_(ID3DX11EffectConstantBuffer*, GetParentConstantBuffer)();
-
- // other casts are handled by TUncastableVariable
- STDMETHOD_(ID3DX11EffectShaderVariable*, AsShader)();
-
- STDMETHOD(SetRawValue)(CONST void *pData, UINT Offset, UINT Count);
- STDMETHOD(GetRawValue)(__out_bcount(Count) void *pData, UINT Offset, UINT Count);
-
- STDMETHOD(GetShaderDesc)(UINT ShaderIndex, D3DX11_EFFECT_SHADER_DESC *pDesc);
-
- STDMETHOD(GetVertexShader)(UINT ShaderIndex, ID3D11VertexShader **ppVS);
- STDMETHOD(GetGeometryShader)(UINT ShaderIndex, ID3D11GeometryShader **ppGS);
- STDMETHOD(GetPixelShader)(UINT ShaderIndex, ID3D11PixelShader **ppPS);
- STDMETHOD(GetHullShader)(UINT ShaderIndex, ID3D11HullShader **ppPS);
- STDMETHOD(GetDomainShader)(UINT ShaderIndex, ID3D11DomainShader **ppPS);
- STDMETHOD(GetComputeShader)(UINT ShaderIndex, ID3D11ComputeShader **ppPS);
-
- STDMETHOD(GetInputSignatureElementDesc)(UINT ShaderIndex, UINT Element, D3D11_SIGNATURE_PARAMETER_DESC *pDesc);
- STDMETHOD(GetOutputSignatureElementDesc)(UINT ShaderIndex, UINT Element, D3D11_SIGNATURE_PARAMETER_DESC *pDesc);
- STDMETHOD(GetPatchConstantSignatureElementDesc)(UINT ShaderIndex, UINT Element, D3D11_SIGNATURE_PARAMETER_DESC *pDesc);
-
- // ID3DX11EffectType interface
- STDMETHOD(GetDesc)(D3DX11_EFFECT_TYPE_DESC *pDesc);
- STDMETHOD_(ID3DX11EffectType*, GetMemberTypeByIndex)(UINT Index);
- STDMETHOD_(ID3DX11EffectType*, GetMemberTypeByName)(LPCSTR Name);
- STDMETHOD_(ID3DX11EffectType*, GetMemberTypeBySemantic)(LPCSTR Semantic);
-
- STDMETHOD_(LPCSTR, GetMemberName)(UINT Index);
- STDMETHOD_(LPCSTR, GetMemberSemantic)(UINT Index);
-};
-
-////////////////////////////////////////////////////////////////////////////////
-// ID3DX11EffectConstantBuffer (SConstantBuffer implementation)
-////////////////////////////////////////////////////////////////////////////////
-
-struct SConstantBuffer : public TUncastableVariable<ID3DX11EffectConstantBuffer>, public ID3DX11EffectType
-{
- ID3D11Buffer *pD3DObject;
- SShaderResource TBuffer; // NULL iff IsTbuffer == FALSE
-
- BYTE *pBackingStore;
- UINT Size; // in bytes
-
- char *pName;
-
- UINT AnnotationCount;
- SAnnotation *pAnnotations;
-
- UINT VariableCount; // # of variables contained in this cbuffer
- SGlobalVariable *pVariables; // array of size [VariableCount], points into effect's contiguous variable list
- UINT ExplicitBindPoint; // Used when a CB has been explicitly bound (register(bXX)). -1 if not
-
- BOOL IsDirty:1; // Set when any member is updated; cleared on CB apply
- BOOL IsTBuffer:1; // TRUE iff TBuffer.pShaderResource != NULL
- BOOL IsUserManaged:1; // Set if you don't want effects to update this buffer
- BOOL IsEffectOptimized:1;// Set if the effect has been optimized
- BOOL IsUsedByExpression:1;// Set if used by any expressions
- BOOL IsUserPacked:1; // Set if the elements have user-specified offsets
- BOOL IsSingle:1; // Set to true if you want to share this CB with cloned Effects
- BOOL IsNonUpdatable:1; // Set to true if you want to share this CB with cloned Effects
-
- union
- {
- // These are used to store the original ID3D11Buffer* for use in UndoSetConstantBuffer
- UINT MemberDataOffsetPlus4; // 4 added so that 0 == NULL can represent "unused"
- SMemberDataPointer *pMemberData;
- };
-
- CEffect *pEffect;
-
- SConstantBuffer()
- {
- pD3DObject = NULL;
- ZeroMemory(&TBuffer, sizeof(TBuffer));
- ExplicitBindPoint = -1;
- pBackingStore = NULL;
- Size = 0;
- pName = NULL;
- VariableCount = 0;
- pVariables = NULL;
- AnnotationCount = 0;
- pAnnotations = NULL;
- IsDirty = FALSE;
- IsTBuffer = FALSE;
- IsUserManaged = FALSE;
- IsEffectOptimized = FALSE;
- IsUsedByExpression = FALSE;
- IsUserPacked = FALSE;
- IsSingle = FALSE;
- IsNonUpdatable = FALSE;
- pEffect = NULL;
- }
-
- bool ClonedSingle() const;
-
- // ID3DX11EffectConstantBuffer interface
- STDMETHOD_(BOOL, IsValid)();
- STDMETHOD_(ID3DX11EffectType*, GetType)();
- STDMETHOD(GetDesc)(D3DX11_EFFECT_VARIABLE_DESC *pDesc);
-
- STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByIndex)(UINT Index);
- STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByName)(LPCSTR Name);
-
- STDMETHOD_(ID3DX11EffectVariable*, GetMemberByIndex)(UINT Index);
- STDMETHOD_(ID3DX11EffectVariable*, GetMemberByName)(LPCSTR Name);
- STDMETHOD_(ID3DX11EffectVariable*, GetMemberBySemantic)(LPCSTR Semantic);
-
- STDMETHOD_(ID3DX11EffectVariable*, GetElement)(UINT Index);
-
- STDMETHOD_(ID3DX11EffectConstantBuffer*, GetParentConstantBuffer)();
-
- // other casts are handled by TUncastableVariable
- STDMETHOD_(ID3DX11EffectConstantBuffer*, AsConstantBuffer)();
-
- STDMETHOD(SetRawValue)(CONST void *pData, UINT Offset, UINT Count);
- STDMETHOD(GetRawValue)(__out_bcount(Count) void *pData, UINT Offset, UINT Count);
-
- STDMETHOD(SetConstantBuffer)(ID3D11Buffer *pConstantBuffer);
- STDMETHOD(GetConstantBuffer)(ID3D11Buffer **ppConstantBuffer);
- STDMETHOD(UndoSetConstantBuffer)();
-
- STDMETHOD(SetTextureBuffer)(ID3D11ShaderResourceView *pTextureBuffer);
- STDMETHOD(GetTextureBuffer)(ID3D11ShaderResourceView **ppTextureBuffer);
- STDMETHOD(UndoSetTextureBuffer)();
-
- // ID3DX11EffectType interface
- STDMETHOD(GetDesc)(D3DX11_EFFECT_TYPE_DESC *pDesc);
- STDMETHOD_(ID3DX11EffectType*, GetMemberTypeByIndex)(UINT Index);
- STDMETHOD_(ID3DX11EffectType*, GetMemberTypeByName)(LPCSTR Name);
- STDMETHOD_(ID3DX11EffectType*, GetMemberTypeBySemantic)(LPCSTR Semantic);
-
- STDMETHOD_(LPCSTR, GetMemberName)(UINT Index);
- STDMETHOD_(LPCSTR, GetMemberSemantic)(UINT Index);
-};
-
-
-//////////////////////////////////////////////////////////////////////////
-// Assignments
-//////////////////////////////////////////////////////////////////////////
-
-enum ERuntimeAssignmentType
-{
- ERAT_Invalid,
- // [Destination] refers to the destination location, which is always the backing store of the pass/state block.
- // [Source] refers to the current source of data, always coming from either a constant buffer's
- // backing store (for numeric assignments), an object variable's block array, or an anonymous (unowned) block
-
- // Numeric variables:
- ERAT_Constant, // Source is unused.
- // No dependencies; this assignment can be safely removed after load.
- ERAT_NumericVariable, // Source points to the CB's backing store where the value lives.
- // 1 dependency: the variable itself.
- ERAT_NumericConstIndex, // Source points to the CB's backing store where the value lives, offset by N.
- // 1 dependency: the variable array being indexed.
- ERAT_NumericVariableIndex, // Source points to the last used element of the variable in the CB's backing store.
- // 2 dependencies: the index variable followed by the array variable.
-
- // Object variables:
- ERAT_ObjectInlineShader, // An anonymous, immutable shader block pointer is copied to the destination immediately.
- // No dependencies; this assignment can be safely removed after load.
- ERAT_ObjectVariable, // A pointer to the block owned by the object variable is copied to the destination immediately.
- // No dependencies; this assignment can be safely removed after load.
- ERAT_ObjectConstIndex, // A pointer to the Nth block owned by an object variable is copied to the destination immediately.
- // No dependencies; this assignment can be safely removed after load.
- ERAT_ObjectVariableIndex, // Source points to the first block owned by an object variable array
- // (the offset from this, N, is taken from another variable).
- // 1 dependency: the variable being used to index the array.
-};
-
-struct SAssignment
-{
- struct SDependency
- {
- SGlobalVariable *pVariable;
-
- SDependency()
- {
- pVariable = NULL;
- }
- };
-
- ELhsType LhsType; // PS, VS, DepthStencil etc.
-
- // The value of SAssignment.AssignmentType determines how the other fields behave
- // (DependencyCount, pDependencies, Destination, and Source)
- ERuntimeAssignmentType AssignmentType;
-
- Timer LastRecomputedTime;
-
- // see comments in ERuntimeAssignmentType for how dependencies and data pointers are handled
- UINT DependencyCount;
- SDependency *pDependencies;
-
- UDataPointer Destination; // This value never changes after load, and always refers to the backing store
- UDataPointer Source; // This value, on the other hand, can change if variable- or expression- driven
-
- UINT DataSize : 16; // Size of the data element to be copied in bytes (if numeric) or
- // stride of the block type (if object)
- UINT MaxElements : 16; // Max allowable index (needed because we don't store object arrays as dependencies,
- // and therefore have no way of getting their Element count)
-
- BOOL IsObjectAssignment() // True for Shader and RObject assignments (the type that appear in pass blocks)
- {
- return IsObjectAssignmentHelper(LhsType);
- }
-
- SAssignment()
- {
- LhsType = ELHS_Invalid;
- AssignmentType = ERAT_Invalid;
-
- Destination.pGeneric = NULL;
- Source.pGeneric = NULL;
-
- LastRecomputedTime = 0;
- DependencyCount = 0;
- pDependencies = NULL;
-
- DataSize = 0;
- }
-};
-
-//////////////////////////////////////////////////////////////////////////
-// Private effect heaps
-//////////////////////////////////////////////////////////////////////////
-
-// Used to efficiently reallocate data
-// 1) For every piece of data that needs reallocation, move it to its new location
-// and add an entry into the table
-// 2) For everyone that references one of these data blocks, do a quick table lookup
-// to find the old pointer and then replace it with the new one
-struct SPointerMapping
-{
- void *pOld;
- void *pNew;
-
- static BOOL AreMappingsEqual(const SPointerMapping &pMap1, const SPointerMapping &pMap2)
- {
- return (pMap1.pOld == pMap2.pOld);
- }
-
- UINT Hash()
- {
- // hash the pointer itself
- // (using the pointer as a hash would be very bad)
- return ComputeHash((BYTE*)&pOld, sizeof(pOld));
- }
-};
-
-typedef CEffectHashTableWithPrivateHeap<SPointerMapping, SPointerMapping::AreMappingsEqual> CPointerMappingTable;
-
-// Assist adding data to a block of memory
-class CEffectHeap
-{
-protected:
- BYTE *m_pData;
- UINT m_dwBufferSize;
- UINT m_dwSize;
-
- template <bool bCopyData>
- HRESULT AddDataInternal(const void *pData, UINT dwSize, void **ppPointer);
-
-public:
- HRESULT ReserveMemory(UINT dwSize);
- UINT GetSize();
- BYTE* GetDataStart() { return m_pData; }
-
- // AddData and AddString append existing data to the buffer - they change m_dwSize. Users are
- // not expected to modify the data pointed to by the return pointer
- HRESULT AddString(const char *pString, __deref_out_z char **ppPointer);
- HRESULT AddData(const void *pData, UINT dwSize, void **ppPointer);
-
- // Allocate behaves like a standard new - it will allocate memory, move m_dwSize. The caller is
- // expected to use the returned pointer
- void* Allocate(UINT dwSize);
-
- // Move data from the general heap and optional free memory
- HRESULT MoveData(void **ppData, UINT size);
- HRESULT MoveString(__deref_inout_z char **ppStringData);
- HRESULT MoveInterfaceParameters(UINT InterfaceCount, __in_ecount(1) SShaderBlock::SInterfaceParameter **ppInterfaces);
- HRESULT MoveEmptyDataBlock(void **ppData, UINT size);
-
- BOOL IsInHeap(void *pData) const
- {
- return (pData >= m_pData && pData < (m_pData + m_dwBufferSize));
- }
-
- CEffectHeap();
- ~CEffectHeap();
-};
-
-class CEffectReflection
-{
-public:
- // Single memory block support
- CEffectHeap m_Heap;
-};
-
-
-class CEffect : public ID3DX11Effect
-{
- friend struct SBaseBlock;
- friend struct SPassBlock;
- friend class CEffectLoader;
- friend struct SConstantBuffer;
- friend struct TSamplerVariable<TGlobalVariable<ID3DX11EffectSamplerVariable>>;
- friend struct TSamplerVariable<TVariable<TMember<ID3DX11EffectSamplerVariable>>>;
-
-protected:
-
- UINT m_RefCount;
- UINT m_Flags;
-
- // Private heap - all pointers should point into here
- CEffectHeap m_Heap;
-
- // Reflection object
- CEffectReflection *m_pReflection;
-
- // global variables in the effect (aka parameters)
- UINT m_VariableCount;
- SGlobalVariable *m_pVariables;
-
- // anonymous shader variables (one for every inline shader assignment)
- UINT m_AnonymousShaderCount;
- SAnonymousShader *m_pAnonymousShaders;
-
- // techniques within this effect (the actual data is located in each group)
- UINT m_TechniqueCount;
-
- // groups within this effect
- UINT m_GroupCount;
- SGroup *m_pGroups;
- SGroup *m_pNullGroup;
-
- UINT m_ShaderBlockCount;
- SShaderBlock *m_pShaderBlocks;
-
- UINT m_DepthStencilBlockCount;
- SDepthStencilBlock *m_pDepthStencilBlocks;
-
- UINT m_BlendBlockCount;
- SBlendBlock *m_pBlendBlocks;
-
- UINT m_RasterizerBlockCount;
- SRasterizerBlock *m_pRasterizerBlocks;
-
- UINT m_SamplerBlockCount;
- SSamplerBlock *m_pSamplerBlocks;
-
- UINT m_MemberDataCount;
- SMemberDataPointer *m_pMemberDataBlocks;
-
- UINT m_InterfaceCount;
- SInterface *m_pInterfaces;
-
- UINT m_CBCount;
- SConstantBuffer *m_pCBs;
-
- UINT m_StringCount;
- SString *m_pStrings;
-
- UINT m_ShaderResourceCount;
- SShaderResource *m_pShaderResources;
-
- UINT m_UnorderedAccessViewCount;
- SUnorderedAccessView *m_pUnorderedAccessViews;
-
- UINT m_RenderTargetViewCount;
- SRenderTargetView *m_pRenderTargetViews;
-
- UINT m_DepthStencilViewCount;
- SDepthStencilView *m_pDepthStencilViews;
-
- Timer m_LocalTimer;
-
- // temporary index variable for assignment evaluation
- UINT m_FXLIndex;
-
- ID3D11Device *m_pDevice;
- ID3D11DeviceContext *m_pContext;
- ID3D11ClassLinkage *m_pClassLinkage;
-
- // Master lists of reflection interfaces
- CEffectVectorOwner<SSingleElementType> m_pTypeInterfaces;
- CEffectVectorOwner<SMember> m_pMemberInterfaces;
-
- //////////////////////////////////////////////////////////////////////////
- // String & Type pooling
-
- typedef SType *LPSRUNTIMETYPE;
- static BOOL AreTypesEqual(const LPSRUNTIMETYPE &pType1, const LPSRUNTIMETYPE &pType2) { return (pType1->IsEqual(pType2)); }
- static BOOL AreStringsEqual(__in const LPCSTR &pStr1, __in const LPCSTR &pStr2) { return strcmp(pStr1, pStr2) == 0; }
-
- typedef CEffectHashTableWithPrivateHeap<SType *, AreTypesEqual> CTypeHashTable;
- typedef CEffectHashTableWithPrivateHeap<LPCSTR, AreStringsEqual> CStringHashTable;
-
- // These are used to pool types & type-related strings
- // until Optimize() is called
- CTypeHashTable *m_pTypePool;
- CStringHashTable *m_pStringPool;
- CDataBlockStore *m_pPooledHeap;
- // After Optimize() is called, the type/string pools should be deleted and all
- // remaining data should be migrated into the optimized type heap
- CEffectHeap *m_pOptimizedTypeHeap;
-
- // Pools a string or type and modifies the pointer
- void AddStringToPool(const char **ppString);
- void AddTypeToPool(SType **ppType);
-
- HRESULT OptimizeTypes(CPointerMappingTable *pMappingTable, bool Cloning = false);
-
-
- //////////////////////////////////////////////////////////////////////////
- // Runtime (performance critical)
-
- void ApplyShaderBlock(SShaderBlock *pBlock);
- BOOL ApplyRenderStateBlock(SBaseBlock *pBlock);
- BOOL ApplySamplerBlock(SSamplerBlock *pBlock);
- void ApplyPassBlock(SPassBlock *pBlock);
- BOOL EvaluateAssignment(SAssignment *pAssignment);
- BOOL ValidateShaderBlock( SShaderBlock* pBlock );
- BOOL ValidatePassBlock( SPassBlock* pBlock );
-
- //////////////////////////////////////////////////////////////////////////
- // Non-runtime functions (not performance critical)
-
- SGlobalVariable *FindLocalVariableByName(LPCSTR pVarName); // Looks in the current effect only
- SGlobalVariable *FindVariableByName(LPCSTR pVarName);
- SVariable *FindVariableByNameWithParsing(LPCSTR pVarName);
- SConstantBuffer *FindCB(LPCSTR pName);
- void ReplaceCBReference(SConstantBuffer *pOldBufferBlock, ID3D11Buffer *pNewBuffer); // Used by user-managed CBs
- void ReplaceSamplerReference(SSamplerBlock *pOldSamplerBlock, ID3D11SamplerState *pNewSampler);
- void AddRefAllForCloning( CEffect* pEffectSource );
- HRESULT CopyMemberInterfaces( CEffect* pEffectSource );
- HRESULT CopyStringPool( CEffect* pEffectSource, CPointerMappingTable& mappingTable );
- HRESULT CopyTypePool( CEffect* pEffectSource, CPointerMappingTable& mappingTableTypes, CPointerMappingTable& mappingTableStrings );
- HRESULT CopyOptimizedTypePool( CEffect* pEffectSource, CPointerMappingTable& mappingTableTypes );
- HRESULT RecreateCBs();
- HRESULT FixupMemberInterface( SMember* pMember, CEffect* pEffectSource, CPointerMappingTable& mappingTableStrings );
-
- void ValidateIndex(UINT Elements);
-
- void IncrementTimer();
- void HandleLocalTimerRollover();
-
- friend struct SConstantBuffer;
-
-public:
- CEffect( UINT Flags = 0 );
- virtual ~CEffect();
- void ReleaseShaderRefection();
-
- // Initialize must be called after the effect is created
- HRESULT LoadEffect(CONST void *pEffectBuffer, UINT cbEffectBuffer);
-
- // Once the effect is fully loaded, call BindToDevice to attach it to a device
- HRESULT BindToDevice(ID3D11Device *pDevice);
-
- Timer GetCurrentTime() const { return m_LocalTimer; }
-
- BOOL IsReflectionData(void *pData) const { return m_pReflection->m_Heap.IsInHeap(pData); }
- BOOL IsRuntimeData(void *pData) const { return m_Heap.IsInHeap(pData); }
-
- //////////////////////////////////////////////////////////////////////////
- // Public interface
-
- // IUnknown
- STDMETHOD(QueryInterface)(REFIID iid, LPVOID *ppv);
- STDMETHOD_(ULONG, AddRef)();
- STDMETHOD_(ULONG, Release)();
-
- STDMETHOD_(BOOL, IsValid)() { return TRUE; }
-
- STDMETHOD(GetDevice)(ID3D11Device** ppDevice);
-
- STDMETHOD(GetDesc)(D3DX11_EFFECT_DESC *pDesc);
-
- STDMETHOD_(ID3DX11EffectConstantBuffer*, GetConstantBufferByIndex)(UINT Index);
- STDMETHOD_(ID3DX11EffectConstantBuffer*, GetConstantBufferByName)(LPCSTR Name);
-
- STDMETHOD_(ID3DX11EffectVariable*, GetVariableByIndex)(UINT Index);
- STDMETHOD_(ID3DX11EffectVariable*, GetVariableByName)(LPCSTR Name);
- STDMETHOD_(ID3DX11EffectVariable*, GetVariableBySemantic)(LPCSTR Semantic);
-
- STDMETHOD_(ID3DX11EffectTechnique*, GetTechniqueByIndex)(UINT Index);
- STDMETHOD_(ID3DX11EffectTechnique*, GetTechniqueByName)(LPCSTR Name);
-
- STDMETHOD_(ID3DX11EffectGroup*, GetGroupByIndex)(UINT Index);
- STDMETHOD_(ID3DX11EffectGroup*, GetGroupByName)(LPCSTR Name);
-
- STDMETHOD_(ID3D11ClassLinkage*, GetClassLinkage)();
-
- STDMETHOD(CloneEffect)(UINT Flags, ID3DX11Effect** ppClonedEffect);
- STDMETHOD(Optimize)();
- STDMETHOD_(BOOL, IsOptimized)();
-
- //////////////////////////////////////////////////////////////////////////
- // New reflection helpers
-
- ID3DX11EffectType * CreatePooledSingleElementTypeInterface(SType *pType);
- ID3DX11EffectVariable * CreatePooledVariableMemberInterface(TTopLevelVariable<ID3DX11EffectVariable> *pTopLevelEntity, SVariable *pMember, UDataPointer Data, BOOL IsSingleElement, UINT Index);
-
-};
-
-}
diff --git a/sample/d3d11/Effects11/EffectAPI.cpp b/sample/d3d11/Effects11/EffectAPI.cpp
deleted file mode 100644
index e373e51..0000000
--- a/sample/d3d11/Effects11/EffectAPI.cpp
+++ /dev/null
@@ -1,29 +0,0 @@
-//////////////////////////////////////////////////////////////////////////////
-//
-// Copyright (C) Microsoft Corporation. All Rights Reserved.
-//
-// File: EffectAPI.cpp
-// Content: D3DX11 Effect DLL entry points
-//
-//////////////////////////////////////////////////////////////////////////////
-
-#include "pchfx.h"
-
-using namespace D3DX11Effects;
-
-HRESULT WINAPI D3DX11CreateEffectFromMemory(CONST void *pData, SIZE_T DataLength, UINT FXFlags, ID3D11Device *pDevice, ID3DX11Effect **ppEffect)
-{
- HRESULT hr = S_OK;
-
- // Note that pData must point to a compiled effect, not HLSL
- VN( *ppEffect = NEW CEffect( FXFlags & D3DX11_EFFECT_RUNTIME_VALID_FLAGS) );
- VH( ((CEffect*)(*ppEffect))->LoadEffect(pData, static_cast<UINT>(DataLength)) );
- VH( ((CEffect*)(*ppEffect))->BindToDevice(pDevice) );
-
-lExit:
- if (FAILED(hr))
- {
- SAFE_RELEASE(*ppEffect);
- }
- return hr;
-}
diff --git a/sample/d3d11/Effects11/EffectLoad.cpp b/sample/d3d11/Effects11/EffectLoad.cpp
deleted file mode 100644
index 0e1cf32..0000000
--- a/sample/d3d11/Effects11/EffectLoad.cpp
+++ /dev/null
@@ -1,3982 +0,0 @@
-//////////////////////////////////////////////////////////////////////////////
-//
-// Copyright (C) Microsoft Corporation. All Rights Reserved.
-//
-// File: EffectLoad.cpp
-// Content: D3DX11 Effects file loading code
-//
-//////////////////////////////////////////////////////////////////////////////
-
-#include "pchfx.h"
-
-#include <EffectStates11.h>
-
-#define PRIVATENEW new(m_BulkHeap)
-
-namespace D3DX11Effects
-{
-
-LPCSTR g_szEffectLoadArea = "D3D11EffectLoader";
-
-SRasterizerBlock g_NullRasterizer;
-SDepthStencilBlock g_NullDepthStencil;
-SBlendBlock g_NullBlend;
-SShaderResource g_NullTexture;
-SInterface g_NullInterface;
-SUnorderedAccessView g_NullUnorderedAccessView;
-SRenderTargetView g_NullRenderTargetView;
-SDepthStencilView g_NullDepthStencilView;
-
-// these VTables must be setup in the proper order:
-// 1) SetShader
-// 2) SetConstantBuffers
-// 3) SetSamplers
-// 4) SetShaderResources
-// 5) CreateShader
-SD3DShaderVTable g_vtPS = {
- (void (__stdcall ID3D11DeviceContext::*)(ID3D11DeviceChild*, ID3D11ClassInstance*const*, UINT)) &ID3D11DeviceContext::PSSetShader,
- &ID3D11DeviceContext::PSSetConstantBuffers,
- &ID3D11DeviceContext::PSSetSamplers,
- &ID3D11DeviceContext::PSSetShaderResources,
- (HRESULT (__stdcall ID3D11Device::*)(const void *, SIZE_T, ID3D11ClassLinkage*, ID3D11DeviceChild **)) &ID3D11Device::CreatePixelShader
-};
-
-SD3DShaderVTable g_vtVS = {
- (void (__stdcall ID3D11DeviceContext::*)(ID3D11DeviceChild*, ID3D11ClassInstance*const*, UINT)) &ID3D11DeviceContext::VSSetShader,
- &ID3D11DeviceContext::VSSetConstantBuffers,
- &ID3D11DeviceContext::VSSetSamplers,
- &ID3D11DeviceContext::VSSetShaderResources,
- (HRESULT (__stdcall ID3D11Device::*)(const void *, SIZE_T, ID3D11ClassLinkage*, ID3D11DeviceChild **)) &ID3D11Device::CreateVertexShader
-};
-
-SD3DShaderVTable g_vtGS = {
- (void (__stdcall ID3D11DeviceContext::*)(ID3D11DeviceChild*, ID3D11ClassInstance*const*, UINT)) &ID3D11DeviceContext::GSSetShader,
- &ID3D11DeviceContext::GSSetConstantBuffers,
- &ID3D11DeviceContext::GSSetSamplers,
- &ID3D11DeviceContext::GSSetShaderResources,
- (HRESULT (__stdcall ID3D11Device::*)(const void *, SIZE_T, ID3D11ClassLinkage*, ID3D11DeviceChild **)) &ID3D11Device::CreateGeometryShader
-};
-
-SD3DShaderVTable g_vtHS = {
- (void (__stdcall ID3D11DeviceContext::*)(ID3D11DeviceChild*, ID3D11ClassInstance*const*, UINT)) &ID3D11DeviceContext::HSSetShader,
- &ID3D11DeviceContext::HSSetConstantBuffers,
- &ID3D11DeviceContext::HSSetSamplers,
- &ID3D11DeviceContext::HSSetShaderResources,
- (HRESULT (__stdcall ID3D11Device::*)(const void *, SIZE_T, ID3D11ClassLinkage*, ID3D11DeviceChild **)) &ID3D11Device::CreateHullShader
-};
-
-SD3DShaderVTable g_vtDS = {
- (void (__stdcall ID3D11DeviceContext::*)(ID3D11DeviceChild*, ID3D11ClassInstance*const*, UINT)) &ID3D11DeviceContext::DSSetShader,
- &ID3D11DeviceContext::DSSetConstantBuffers,
- &ID3D11DeviceContext::DSSetSamplers,
- &ID3D11DeviceContext::DSSetShaderResources,
- (HRESULT (__stdcall ID3D11Device::*)(const void *, SIZE_T, ID3D11ClassLinkage*, ID3D11DeviceChild **)) &ID3D11Device::CreateDomainShader
-};
-
-SD3DShaderVTable g_vtCS = {
- (void (__stdcall ID3D11DeviceContext::*)(ID3D11DeviceChild*, ID3D11ClassInstance*const*, UINT)) &ID3D11DeviceContext::CSSetShader,
- &ID3D11DeviceContext::CSSetConstantBuffers,
- &ID3D11DeviceContext::CSSetSamplers,
- &ID3D11DeviceContext::CSSetShaderResources,
- (HRESULT (__stdcall ID3D11Device::*)(const void *, SIZE_T, ID3D11ClassLinkage*, ID3D11DeviceChild **)) &ID3D11Device::CreateComputeShader
-};
-
-SShaderBlock g_NullVS(&g_vtVS);
-SShaderBlock g_NullGS(&g_vtGS);
-SShaderBlock g_NullPS(&g_vtPS);
-SShaderBlock g_NullHS(&g_vtHS);
-SShaderBlock g_NullDS(&g_vtDS);
-SShaderBlock g_NullCS(&g_vtCS);
-
-D3D10_SHADER_VARIABLE_TYPE GetSimpleParameterTypeFromObjectType(EObjectType ObjectType)
-{
- switch (ObjectType)
- {
- case EOT_String:
- return D3D10_SVT_STRING;
- case EOT_Blend:
- return D3D10_SVT_BLEND;
- case EOT_DepthStencil:
- return D3D10_SVT_DEPTHSTENCIL;
- case EOT_Rasterizer:
- return D3D10_SVT_RASTERIZER;
- case EOT_PixelShader:
- case EOT_PixelShader5:
- return D3D10_SVT_PIXELSHADER;
- case EOT_VertexShader:
- case EOT_VertexShader5:
- return D3D10_SVT_VERTEXSHADER;
- case EOT_GeometryShader:
- case EOT_GeometryShaderSO:
- case EOT_GeometryShader5:
- return D3D10_SVT_GEOMETRYSHADER;
- case EOT_HullShader5:
- return D3D11_SVT_HULLSHADER;
- case EOT_DomainShader5:
- return D3D11_SVT_DOMAINSHADER;
- case EOT_ComputeShader5:
- return D3D11_SVT_COMPUTESHADER;
- case EOT_RenderTargetView:
- return D3D10_SVT_RENDERTARGETVIEW;
- case EOT_DepthStencilView:
- return D3D10_SVT_DEPTHSTENCILVIEW;
- case EOT_Texture:
- case EOT_Texture1D:
- case EOT_Texture1DArray:
- case EOT_Texture2D:
- case EOT_Texture2DArray:
- case EOT_Texture2DMS:
- case EOT_Texture2DMSArray:
- case EOT_Texture3D:
- case EOT_TextureCube:
- case EOT_TextureCubeArray:
- return D3D10_SVT_TEXTURE;
- case EOT_Buffer:
- return D3D10_SVT_BUFFER;
- case EOT_Sampler:
- return D3D10_SVT_SAMPLER;
- case EOT_ByteAddressBuffer:
- return D3D11_SVT_BYTEADDRESS_BUFFER;
- case EOT_StructuredBuffer:
- return D3D11_SVT_STRUCTURED_BUFFER;
- case EOT_RWTexture1D:
- return D3D11_SVT_RWTEXTURE1D;
- case EOT_RWTexture1DArray:
- return D3D11_SVT_RWTEXTURE1DARRAY;
- case EOT_RWTexture2D:
- return D3D11_SVT_RWTEXTURE2D;
- case EOT_RWTexture2DArray:
- return D3D11_SVT_RWTEXTURE2DARRAY;
- case EOT_RWTexture3D:
- return D3D11_SVT_RWTEXTURE3D;
- case EOT_RWBuffer:
- return D3D11_SVT_RWBUFFER;
- case EOT_RWByteAddressBuffer:
- return D3D11_SVT_RWBYTEADDRESS_BUFFER;
- case EOT_RWStructuredBuffer:
- case EOT_RWStructuredBufferAlloc:
- case EOT_RWStructuredBufferConsume:
- return D3D11_SVT_RWSTRUCTURED_BUFFER;
- case EOT_AppendStructuredBuffer:
- return D3D11_SVT_APPEND_STRUCTURED_BUFFER;
- case EOT_ConsumeStructuredBuffer:
- return D3D11_SVT_CONSUME_STRUCTURED_BUFFER;
- default:
- D3DXASSERT(0);
- }
- return D3D10_SVT_VOID;
-}
-
-inline HRESULT VerifyPointer(UINT oBase, UINT dwSize, UINT dwMaxSize)
-{
- UINT dwAdd = oBase + dwSize;
- if (dwAdd < oBase || dwAdd > dwMaxSize)
- return E_FAIL;
- return S_OK;
-}
-
-//////////////////////////////////////////////////////////////////////////
-// EffectHeap
-// A simple class which assists in adding data to a block of memory
-//////////////////////////////////////////////////////////////////////////
-
-CEffectHeap::CEffectHeap()
-{
- m_pData = NULL;
- m_dwSize = m_dwBufferSize = 0;
-}
-
-CEffectHeap::~CEffectHeap()
-{
- SAFE_DELETE_ARRAY(m_pData);
-}
-
-UINT CEffectHeap::GetSize()
-{
- return m_dwSize;
-}
-
-HRESULT CEffectHeap::ReserveMemory(UINT dwSize)
-{
- HRESULT hr = S_OK;
-
- D3DXASSERT(!m_pData);
- D3DXASSERT(dwSize == AlignToPowerOf2(dwSize, c_DataAlignment));
-
- m_dwBufferSize = dwSize;
-
- VN( m_pData = NEW BYTE[m_dwBufferSize] );
-
- // make sure that we have machine word alignment
- D3DXASSERT(m_pData == AlignToPowerOf2(m_pData, c_DataAlignment));
-
-lExit:
- return hr;
-}
-
-HRESULT CEffectHeap::AddString(const char *pString, __deref_out_z char **ppPointer)
-{
- size_t size = strlen(pString) + 1;
- D3DXASSERT( size <= 0xffffffff );
- return AddData(pString, (UINT)size, (void**) ppPointer);
-}
-
-// This data is forcibly aligned, so make sure you account for that in calculating heap size
-template <bool bCopyData>
-HRESULT CEffectHeap::AddDataInternal(const void *pData, UINT dwSize, void **ppPointer)
-{
- CCheckedDword chkFinalSize( m_dwSize );
- UINT finalSize;
- HRESULT hr = S_OK;
-
- chkFinalSize += dwSize;
- chkFinalSize += c_DataAlignment; // account for alignment
-
- VHD( chkFinalSize.GetValue(&finalSize), "Overflow while adding data to Effect heap." );
-
- // align original value
- finalSize = AlignToPowerOf2(finalSize - c_DataAlignment, c_DataAlignment);
- VBD( finalSize <= m_dwBufferSize, "Overflow adding data to Effect heap." );
-
- *ppPointer = m_pData + m_dwSize;
- D3DXASSERT(*ppPointer == AlignToPowerOf2(*ppPointer, c_DataAlignment));
-
- if( bCopyData )
- {
- memcpy(*ppPointer, pData, dwSize);
- }
- m_dwSize = finalSize;
-
-lExit:
- if (FAILED(hr))
- *ppPointer = NULL;
-
- return hr;
-}
-
-HRESULT CEffectHeap::AddData(const void *pData, UINT dwSize, void **ppPointer)
-{
- return AddDataInternal<true>( pData, dwSize, ppPointer );
-}
-
-// Moves a string from the general heap to the private heap and modifies the pointer to
-// point to the new memory block.
-// The general heap is freed as a whole, so we don't worry about leaking the given string pointer.
-// This data is forcibly aligned, so make sure you account for that in calculating heap size
-HRESULT CEffectHeap::MoveString(__deref_inout_z char **ppString)
-{
- HRESULT hr;
- char *pNewPointer;
-
- if (*ppString == NULL)
- return S_OK;
-
- hr = AddString(*ppString, &pNewPointer);
- *ppString = pNewPointer;
-
- return hr;
-}
-
-// Allocates space but does not move data
-// The general heap is freed as a whole, so we don't worry about leaking the given string pointer.
-// This data is forcibly aligned, so make sure you account for that in calculating heap size
-HRESULT CEffectHeap::MoveEmptyDataBlock(void **ppData, UINT size)
-{
- HRESULT hr;
- void *pNewPointer;
-
- hr = AddDataInternal<false>(*ppData, size, &pNewPointer);
-
- *ppData = pNewPointer;
- if (size == 0)
- {
- // To help catch bugs, set zero-byte blocks to null. There's no real reason to do this
- *ppData = NULL;
- }
-
- return hr;
-}
-
-// Moves an array of SInterfaceParameters from the general heap to the private heap and modifies the pointer to
-// point to the new memory block.
-// The general heap is freed as a whole, so we don't worry about leaking the given string pointer.
-// This data is forcibly aligned, so make sure you account for that in calculating heap size
-HRESULT CEffectHeap::MoveInterfaceParameters(UINT InterfaceCount, __in_ecount(1) SShaderBlock::SInterfaceParameter **ppInterfaces)
-{
- HRESULT hr;
- SShaderBlock::SInterfaceParameter *pNewPointer;
-
- if (*ppInterfaces == NULL)
- return S_OK;
-
- VBD( InterfaceCount <= D3D11_SHADER_MAX_INTERFACES, "Internal loading error: InterfaceCount > D3D11_SHADER_MAX_INTERFACES." );
- VH( AddData(*ppInterfaces, InterfaceCount * sizeof(SShaderBlock::SInterfaceParameter), (void**)&pNewPointer) );
-
- for( UINT i=0; i < InterfaceCount; i++ )
- {
- VH( MoveString( &pNewPointer[i].pName ) );
- }
-
- *ppInterfaces = pNewPointer;
-
-lExit:
- return hr;
-}
-
-
-// Moves data from the general heap to the private heap and modifies the pointer to
-// point to the new memory block
-// The general heap is freed as a whole, so we don't worry about leaking the given pointer.
-// This data is forcibly aligned, so make sure you account for that in calculating heap size
-HRESULT CEffectHeap::MoveData(void **ppData, UINT size)
-{
- HRESULT hr;
- void *pNewPointer;
-
- hr = AddData(*ppData, size, &pNewPointer);
-
- *ppData = pNewPointer;
- if (size == 0)
- {
- // To help catch bugs, set zero-byte blocks to null. There's no real reason to do this
- *ppData = NULL;
- }
-
- return hr;
-}
-
-
-//////////////////////////////////////////////////////////////////////////
-// Load API
-//////////////////////////////////////////////////////////////////////////
-
-HRESULT CEffect::LoadEffect(CONST void *pEffectBuffer, UINT cbEffectBuffer)
-{
- HRESULT hr = S_OK;
- CEffectLoader loader;
-
- if (!pEffectBuffer)
- {
- DPF(0, "%s: pEffectBuffer is NULL.", g_szEffectLoadArea);
- VH( E_INVALIDARG );
- }
-
- VH( loader.LoadEffect(this, pEffectBuffer, cbEffectBuffer) );
-
-lExit:
- if( FAILED( hr ) )
- {
- // Release here because m_pShaderBlocks may still be in loader.m_BulkHeap if loading failed before we reallocated the memory
- ReleaseShaderRefection();
- }
- return hr;
-}
-
-//////////////////////////////////////////////////////////////////////////
-// CEffectLoader
-// A helper class which loads an effect
-//////////////////////////////////////////////////////////////////////////
-
-HRESULT CEffectLoader::GetUnstructuredDataBlock(UINT offset, UINT *pdwSize, void **ppData)
-{
- HRESULT hr = S_OK;
- UINT *pBlockSize;
-
- VH( m_msUnstructured.ReadAtOffset(offset, sizeof(*pBlockSize), (void**) &pBlockSize ) );
- *pdwSize = *pBlockSize;
-
- VH( m_msUnstructured.Read(ppData, *pdwSize) );
-
-lExit:
- return hr;
-}
-
-// position in buffer is lost on error
-//
-// This function should be used in 1:1 conjunction with CEffectHeap::MoveString;
-// that is, any string added to the reflection heap with this function
-// must be relocated with MoveString at some point later on.
-HRESULT CEffectLoader::GetStringAndAddToReflection(UINT offset, __out_ecount_full(1) char **ppString)
-{
- HRESULT hr = S_OK;
- LPCSTR pName;
- SIZE_T oldPos;
-
- if (offset == 0)
- {
- *ppString = NULL;
- goto lExit;
- }
-
- oldPos = m_msUnstructured.GetPosition();
-
- VH( m_msUnstructured.ReadAtOffset(offset, &pName) );
- m_ReflectionMemory += AlignToPowerOf2( (UINT)strlen(pName) + 1, c_DataAlignment);
- *ppString = const_cast<char*>(pName);
-
- m_msUnstructured.Seek(oldPos);
-
-lExit:
- return hr;
-}
-
-// position in buffer is lost on error
-//
-// This function should be used in 1:1 conjunction with CEffectHeap::MoveInterfaceParameters;
-// that is, any array of parameters added to the reflection heap with this function
-// must be relocated with MoveInterfaceParameters at some point later on.
-HRESULT CEffectLoader::GetInterfaceParametersAndAddToReflection( UINT InterfaceCount, UINT offset, __out_ecount_full(1) SShaderBlock::SInterfaceParameter **ppInterfaces )
-{
- HRESULT hr = S_OK;
- SBinaryInterfaceInitializer* pInterfaceInitializer;
- SIZE_T oldPos;
-
- if (offset == 0)
- {
- *ppInterfaces = NULL;
- goto lExit;
- }
-
- oldPos = m_msUnstructured.GetPosition();
-
- VBD( InterfaceCount <= D3D11_SHADER_MAX_INTERFACES, "Internal loading error: InterfaceCount > D3D11_SHADER_MAX_INTERFACES." );
- m_ReflectionMemory += AlignToPowerOf2(InterfaceCount * sizeof(SShaderBlock::SInterfaceParameter), c_DataAlignment);
- D3DXASSERT( ppInterfaces );
- (*ppInterfaces) = PRIVATENEW SShaderBlock::SInterfaceParameter[InterfaceCount];
- VN( *ppInterfaces );
-
- VHD( m_msUnstructured.ReadAtOffset(offset, sizeof(SBinaryInterfaceInitializer) * InterfaceCount, (void**)&pInterfaceInitializer),
- "Invalid pEffectBuffer: cannot read interface initializer." );
-
- for( UINT i=0; i < InterfaceCount; i++ )
- {
- (*ppInterfaces)[i].Index = pInterfaceInitializer[i].ArrayIndex;
- VHD( m_msUnstructured.ReadAtOffset(pInterfaceInitializer[i].oInstanceName, const_cast<LPCSTR*>(&(*ppInterfaces)[i].pName)),
- "Invalid pEffectBuffer: cannot read interface initializer." );
- m_ReflectionMemory += AlignToPowerOf2( (UINT)strlen((*ppInterfaces)[i].pName) + 1, c_DataAlignment);
- }
-
- m_msUnstructured.Seek(oldPos);
-
-lExit:
- return hr;
-}
-
-HRESULT CEffectLoader::FixupCBPointer(SConstantBuffer **ppCB)
-{
- HRESULT hr = S_OK;
-
- SIZE_T index = (SConstantBuffer*)*ppCB - m_pOldCBs;
- D3DXASSERT( index * sizeof(SConstantBuffer) == ((size_t)(SConstantBuffer*)*ppCB - (size_t)m_pOldCBs) );
- VBD( index < m_pEffect->m_CBCount, "Internal loading error: invalid constant buffer index." );
- *ppCB = (SConstantBuffer*)(m_pEffect->m_pCBs + index);
-
-lExit:
- return hr;
-}
-
-HRESULT CEffectLoader::FixupShaderPointer(SShaderBlock **ppShaderBlock)
-{
- HRESULT hr = S_OK;
- if (*ppShaderBlock != &g_NullVS && *ppShaderBlock != &g_NullGS && *ppShaderBlock != &g_NullPS &&
- *ppShaderBlock != &g_NullHS && *ppShaderBlock != &g_NullDS && *ppShaderBlock != &g_NullCS &&
- *ppShaderBlock != NULL)
- {
- SIZE_T index = *ppShaderBlock - m_pOldShaders;
- D3DXASSERT( index * sizeof(SShaderBlock) == ((size_t)*ppShaderBlock - (size_t)m_pOldShaders) );
- VBD( index < m_pEffect->m_ShaderBlockCount, "Internal loading error: invalid shader index." );
- *ppShaderBlock = m_pEffect->m_pShaderBlocks + index;
- }
-lExit:
- return hr;
-}
-
-HRESULT CEffectLoader::FixupDSPointer(SDepthStencilBlock **ppDSBlock)
-{
- HRESULT hr = S_OK;
- if (*ppDSBlock != &g_NullDepthStencil && *ppDSBlock != NULL)
- {
- SIZE_T index = *ppDSBlock - m_pOldDS;
- D3DXASSERT( index * sizeof(SDepthStencilBlock) == ((size_t)*ppDSBlock - (size_t)m_pOldDS) );
- VBD( index < m_pEffect->m_DepthStencilBlockCount, "Internal loading error: invalid depth-stencil state index." );
- *ppDSBlock = m_pEffect->m_pDepthStencilBlocks + index;
- }
-lExit:
- return hr;
-}
-
-HRESULT CEffectLoader::FixupABPointer(SBlendBlock **ppABBlock)
-{
- HRESULT hr = S_OK;
- if (*ppABBlock != &g_NullBlend && *ppABBlock != NULL)
- {
- SIZE_T index = *ppABBlock - m_pOldAB;
- D3DXASSERT( index * sizeof(SBlendBlock) == ((size_t)*ppABBlock - (size_t)m_pOldAB) );
- VBD( index < m_pEffect->m_BlendBlockCount, "Internal loading error: invalid blend state index." );
- *ppABBlock = m_pEffect->m_pBlendBlocks + index;
- }
-lExit:
- return hr;
-}
-
-HRESULT CEffectLoader::FixupRSPointer(SRasterizerBlock **ppRSBlock)
-{
- HRESULT hr = S_OK;
- if (*ppRSBlock != &g_NullRasterizer && *ppRSBlock != NULL)
- {
- SIZE_T index = *ppRSBlock - m_pOldRS;
- D3DXASSERT( index * sizeof(SRasterizerBlock) == ((size_t)*ppRSBlock - (size_t)m_pOldRS) );
- VBD( index < m_pEffect->m_RasterizerBlockCount, "Internal loading error: invalid rasterizer state index." );
- *ppRSBlock = m_pEffect->m_pRasterizerBlocks + index;
- }
-lExit:
- return hr;
-}
-
-HRESULT CEffectLoader::FixupSamplerPointer(SSamplerBlock **ppSampler)
-{
- HRESULT hr = S_OK;
- SIZE_T index = *ppSampler - m_pOldSamplers;
- D3DXASSERT( index * sizeof(SSamplerBlock) == ((size_t)*ppSampler - (size_t)m_pOldSamplers) );
- VBD( index < m_pEffect->m_SamplerBlockCount, "Internal loading error: invalid sampler index." );
- *ppSampler = m_pEffect->m_pSamplerBlocks + index;
-
-lExit:
- return hr;
-}
-
-HRESULT CEffectLoader::FixupInterfacePointer(SInterface **ppInterface, bool CheckBackgroundInterfaces)
-{
- HRESULT hr = S_OK;
- if (*ppInterface != &g_NullInterface && *ppInterface != NULL)
- {
- SIZE_T index = *ppInterface - m_pOldInterfaces;
- if(index < m_OldInterfaceCount)
- {
- D3DXASSERT( index * sizeof(SInterface) == ((size_t)*ppInterface - (size_t)m_pOldInterfaces) );
- *ppInterface = m_pEffect->m_pInterfaces + index;
- }
- else
- {
- VBD( CheckBackgroundInterfaces, "Internal loading error: invalid interface pointer." );
- for( index=0; index < m_BackgroundInterfaces.GetSize(); index++ )
- {
- if( *ppInterface == m_BackgroundInterfaces[ (UINT)index ] )
- {
- // The interfaces m_BackgroundInterfaces were concatenated to the original ones in m_pEffect->m_pInterfaces
- *ppInterface = m_pEffect->m_pInterfaces + (m_OldInterfaceCount + index);
- break;
- }
- }
- VBD( index < m_BackgroundInterfaces.GetSize(), "Internal loading error: invalid interface pointer." );
- }
- }
-
-lExit:
- return hr;
-}
-
-HRESULT CEffectLoader::FixupShaderResourcePointer(SShaderResource **ppResource)
-{
- HRESULT hr = S_OK;
- if (*ppResource != &g_NullTexture && *ppResource != NULL)
- {
- SIZE_T index = *ppResource - m_pOldShaderResources;
- D3DXASSERT( index * sizeof(SShaderResource) == ((size_t)*ppResource - (size_t)m_pOldShaderResources) );
-
- // could be a TBuffer or a texture; better check first
- if (index < m_pEffect->m_ShaderResourceCount)
- {
- *ppResource = m_pEffect->m_pShaderResources + index;
- }
- else
- {
- // if this is a TBuffer, then the shader resource pointer
- // actually points into a SConstantBuffer's TBuffer field
- index = (SConstantBuffer*)*ppResource - (SConstantBuffer*)&m_pOldCBs->TBuffer;
- D3DXASSERT( index * sizeof(SConstantBuffer) == ((size_t)(SConstantBuffer*)*ppResource - (size_t)(SConstantBuffer*)&m_pOldCBs->TBuffer) );
- VBD( index < m_pEffect->m_CBCount, "Internal loading error: invalid SRV index." );
- *ppResource = &m_pEffect->m_pCBs[index].TBuffer;
- }
- }
-
-lExit:
- return hr;
-}
-
-HRESULT CEffectLoader::FixupUnorderedAccessViewPointer(SUnorderedAccessView **ppUnorderedAccessView)
-{
- HRESULT hr = S_OK;
- if (*ppUnorderedAccessView != &g_NullUnorderedAccessView && *ppUnorderedAccessView != NULL)
- {
- SIZE_T index = *ppUnorderedAccessView - m_pOldUnorderedAccessViews;
- D3DXASSERT( index * sizeof(SUnorderedAccessView) == ((size_t)*ppUnorderedAccessView - (size_t)m_pOldUnorderedAccessViews) );
-
- VBD( index < m_pEffect->m_UnorderedAccessViewCount, "Internal loading error: invalid UAV index." );
- *ppUnorderedAccessView = m_pEffect->m_pUnorderedAccessViews + index;
- }
-
-lExit:
- return hr;
-}
-
-HRESULT CEffectLoader::FixupRenderTargetViewPointer(SRenderTargetView **ppRenderTargetView)
-{
- HRESULT hr = S_OK;
- if (*ppRenderTargetView != &g_NullRenderTargetView && *ppRenderTargetView != NULL)
- {
- SIZE_T index = *ppRenderTargetView - m_pOldRenderTargetViews;
- D3DXASSERT( index * sizeof(SRenderTargetView) == ((size_t)*ppRenderTargetView - (size_t)m_pOldRenderTargetViews) );
- VBD( index < m_pEffect->m_RenderTargetViewCount, "Internal loading error: invalid RTV index." );
- *ppRenderTargetView = m_pEffect->m_pRenderTargetViews + index;
- }
-
-lExit:
- return hr;
-}
-
-HRESULT CEffectLoader::FixupDepthStencilViewPointer(SDepthStencilView **ppDepthStencilView)
-{
- HRESULT hr = S_OK;
- if (*ppDepthStencilView != &g_NullDepthStencilView && *ppDepthStencilView != NULL)
- {
- SIZE_T index = *ppDepthStencilView - m_pOldDepthStencilViews;
- D3DXASSERT( index * sizeof(SDepthStencilView) == ((size_t)*ppDepthStencilView - (size_t)m_pOldDepthStencilViews) );
- VBD( index < m_pEffect->m_DepthStencilViewCount, "Internal loading error: invalid DSV index." );
- *ppDepthStencilView = m_pEffect->m_pDepthStencilViews + index;
- }
-
-lExit:
- return hr;
-}
-
-HRESULT CEffectLoader::FixupStringPointer(SString **ppString)
-{
- HRESULT hr = S_OK;
- SIZE_T index = *ppString - m_pOldStrings;
- D3DXASSERT( index * sizeof(SString) == ((size_t)*ppString - (size_t)m_pOldStrings) );
- VBD(index < m_pEffect->m_StringCount, "Internal loading error: invalid string index." );
- *ppString = m_pEffect->m_pStrings + index;
-lExit:
- return hr;
-}
-
-HRESULT CEffectLoader::FixupMemberDataPointer(SMemberDataPointer **ppMemberData)
-{
- HRESULT hr = S_OK;
- SIZE_T index = *ppMemberData - m_pOldMemberDataBlocks;
- D3DXASSERT( index * sizeof(SMemberDataPointer) == ((size_t)*ppMemberData - (size_t)m_pOldMemberDataBlocks) );
- VBD( index < m_pEffect->m_MemberDataCount, "Internal loading error: invalid member block index." );
- *ppMemberData = m_pEffect->m_pMemberDataBlocks + index;
-lExit:
- return hr;
-}
-
-HRESULT CEffectLoader::FixupVariablePointer(SGlobalVariable **ppVar)
-{
- HRESULT hr = S_OK;
- SIZE_T index = *ppVar - m_pOldVars;
-
- if( index < m_pEffect->m_VariableCount )
- {
- D3DXASSERT( index * sizeof(SGlobalVariable) == ((size_t)*ppVar - (size_t)m_pOldVars) );
- *ppVar = m_pEffect->m_pVariables + index;
- }
- else if( m_pvOldMemberInterfaces )
- {
- // When cloning, m_pvOldMemberInterfaces may be non-NULL, and *ppVar may point to a variable in it.
- const SIZE_T Members = m_pvOldMemberInterfaces->GetSize();
- for( index=0; index < Members; index++ )
- {
- if( (ID3DX11EffectVariable*)(*m_pvOldMemberInterfaces)[ (UINT)index] == (ID3DX11EffectVariable*)*ppVar )
- {
- break;
- }
- }
- VBD( index < Members, "Internal loading error: invalid member pointer." );
- *ppVar = (SGlobalVariable*)m_pEffect->m_pMemberInterfaces[ (UINT)index];
- }
-lExit:
- return hr;
-}
-
-HRESULT CEffectLoader::FixupGroupPointer(SGroup **ppGroup)
-{
- HRESULT hr = S_OK;
- if( *ppGroup != NULL )
- {
- SIZE_T index = *ppGroup - m_pOldGroups;
- D3DXASSERT( index * sizeof(SGroup) == ((size_t)*ppGroup - (size_t)m_pOldGroups) );
- VBD( index < m_pEffect->m_GroupCount, "Internal loading error: invalid group index." );
- *ppGroup = m_pEffect->m_pGroups + index;
- }
-lExit:
- return hr;
-}
-
-HRESULT GetEffectVersion( UINT effectFileTag, DWORD* pVersion )
-{
- D3DXASSERT( pVersion != NULL );
- if( !pVersion )
- return E_FAIL;
-
- for( UINT i = 0; i < NUM_EFFECT10_VERSIONS; i++ )
- {
- if( g_EffectVersions[i].m_Tag == effectFileTag )
- {
- *pVersion = g_EffectVersions[i].m_Version;
- return S_OK;
- }
- }
-
- return E_FAIL;
-}
-
-HRESULT CEffectLoader::LoadEffect(CEffect *pEffect, CONST void *pEffectBuffer, UINT cbEffectBuffer)
-{
- HRESULT hr = S_OK;
- UINT i, varSize, cMemberDataBlocks;
- CCheckedDword chkVariables = 0;
-
- // Used for cloning
- m_pvOldMemberInterfaces = NULL;
-
- m_BulkHeap.EnableAlignment();
-
- D3DXASSERT(pEffect && pEffectBuffer);
- m_pEffect = pEffect;
- m_EffectMemory = m_ReflectionMemory = 0;
-
- VN( m_pEffect->m_pReflection = NEW CEffectReflection() );
- m_pReflection = m_pEffect->m_pReflection;
-
- // Begin effect load
- VN( m_pEffect->m_pTypePool = NEW CEffect::CTypeHashTable );
- VN( m_pEffect->m_pStringPool = NEW CEffect::CStringHashTable );
- VN( m_pEffect->m_pPooledHeap = NEW CDataBlockStore );
- m_pEffect->m_pPooledHeap->EnableAlignment();
- m_pEffect->m_pTypePool->SetPrivateHeap(m_pEffect->m_pPooledHeap);
- m_pEffect->m_pStringPool->SetPrivateHeap(m_pEffect->m_pPooledHeap);
-
- VH( m_pEffect->m_pTypePool->AutoGrow() );
- VH( m_pEffect->m_pStringPool->AutoGrow() );
-
- // Load from blob
- m_pData = (BYTE*)pEffectBuffer;
- m_dwBufferSize = cbEffectBuffer;
-
- VH( m_msStructured.SetData(m_pData, m_dwBufferSize) );
-
- // At this point, we assume that the blob is valid
- VHD( m_msStructured.Read((void**) &m_pHeader, sizeof(*m_pHeader)), "pEffectBuffer is too small." );
-
- // Verify the version
- if( FAILED( hr = GetEffectVersion( m_pHeader->Tag, &m_Version ) ) )
- {
- DPF(0, "Effect version is unrecognized. This runtime supports fx_5_0 to %s.", g_EffectVersions[NUM_EFFECT10_VERSIONS-1].m_pName );
- VH( hr );
- }
-
- if( m_pHeader->RequiresPool() || m_pHeader->Pool.cObjectVariables > 0 || m_pHeader->Pool.cNumericVariables > 0 )
- {
- DPF(0, "Effect11 does not support EffectPools." );
- VH( E_FAIL );
- }
-
- // Get shader block count
- VBD( m_pHeader->cInlineShaders <= m_pHeader->cTotalShaders, "Invalid Effect header: cInlineShaders > cTotalShaders." );
-
- // Make sure the counts for the Effect don't overflow
- chkVariables = m_pHeader->Effect.cObjectVariables;
- chkVariables += m_pHeader->Effect.cNumericVariables;
- chkVariables += m_pHeader->cInterfaceVariables;
- chkVariables *= sizeof(SGlobalVariable);
- VH( chkVariables.GetValue(&varSize) );
-
- // Make sure the counts for the SMemberDataPointers don't overflow
- chkVariables = m_pHeader->cClassInstanceElements;
- chkVariables += m_pHeader->cBlendStateBlocks;
- chkVariables += m_pHeader->cRasterizerStateBlocks;
- chkVariables += m_pHeader->cDepthStencilBlocks;
- chkVariables += m_pHeader->cSamplers;
- chkVariables += m_pHeader->Effect.cCBs; // Buffer (for CBuffers and TBuffers)
- chkVariables += m_pHeader->Effect.cCBs; // SRV (for TBuffers)
- VHD( chkVariables.GetValue(&cMemberDataBlocks), "Overflow: too many Effect variables." );
-
- // Allocate effect resources
- VN( m_pEffect->m_pCBs = PRIVATENEW SConstantBuffer[m_pHeader->Effect.cCBs] );
- VN( m_pEffect->m_pDepthStencilBlocks = PRIVATENEW SDepthStencilBlock[m_pHeader->cDepthStencilBlocks] );
- VN( m_pEffect->m_pRasterizerBlocks = PRIVATENEW SRasterizerBlock[m_pHeader->cRasterizerStateBlocks] );
- VN( m_pEffect->m_pBlendBlocks = PRIVATENEW SBlendBlock[m_pHeader->cBlendStateBlocks] );
- VN( m_pEffect->m_pSamplerBlocks = PRIVATENEW SSamplerBlock[m_pHeader->cSamplers] );
-
- // we allocate raw bytes for variables because they are polymorphic types that need to be placement new'ed
- VN( m_pEffect->m_pVariables = (SGlobalVariable *)PRIVATENEW BYTE[varSize] );
- VN( m_pEffect->m_pAnonymousShaders = PRIVATENEW SAnonymousShader[m_pHeader->cInlineShaders] );
-
- VN( m_pEffect->m_pGroups = PRIVATENEW SGroup[m_pHeader->cGroups] );
- VN( m_pEffect->m_pShaderBlocks = PRIVATENEW SShaderBlock[m_pHeader->cTotalShaders] );
- VN( m_pEffect->m_pStrings = PRIVATENEW SString[m_pHeader->cStrings] );
- VN( m_pEffect->m_pShaderResources = PRIVATENEW SShaderResource[m_pHeader->cShaderResources] );
- VN( m_pEffect->m_pUnorderedAccessViews = PRIVATENEW SUnorderedAccessView[m_pHeader->cUnorderedAccessViews] );
- VN( m_pEffect->m_pInterfaces = PRIVATENEW SInterface[m_pHeader->cInterfaceVariableElements] );
- VN( m_pEffect->m_pMemberDataBlocks = PRIVATENEW SMemberDataPointer[cMemberDataBlocks] );
- VN( m_pEffect->m_pRenderTargetViews = PRIVATENEW SRenderTargetView[m_pHeader->cRenderTargetViews] );
- VN( m_pEffect->m_pDepthStencilViews = PRIVATENEW SDepthStencilView[m_pHeader->cDepthStencilViews] );
-
- UINT oStructured = m_pHeader->cbUnstructured + sizeof(SBinaryHeader5);
- VHD( m_msStructured.Seek(oStructured), "Invalid pEffectBuffer: Missing structured data block." );
- VH( m_msUnstructured.SetData(m_pData + sizeof(SBinaryHeader5), oStructured - sizeof(SBinaryHeader5)) );
-
- VH( LoadCBs() );
- VH( LoadObjectVariables() );
- VH( LoadInterfaceVariables() );
- VH( LoadGroups() );
-
- // Build shader dependencies
- for (i=0; i<m_pEffect->m_ShaderBlockCount; i++)
- {
- VH( BuildShaderBlock(&m_pEffect->m_pShaderBlocks[i]) );
- }
-
- for( UINT iGroup=0; iGroup<m_pHeader->cGroups; iGroup++ )
- {
- SGroup *pGroup = &m_pEffect->m_pGroups[iGroup];
- pGroup->HasDependencies = FALSE;
-
- for( UINT iTechnique=0; iTechnique < pGroup->TechniqueCount; iTechnique++ )
- {
- STechnique* pTech = &pGroup->pTechniques[iTechnique];
- pTech->HasDependencies = FALSE;
-
- for( UINT iPass=0; iPass < pTech->PassCount; iPass++ )
- {
- SPassBlock *pPass = &pTech->pPasses[iPass];
-
- pTech->HasDependencies |= pPass->CheckDependencies();
- }
- pGroup->HasDependencies |= pTech->HasDependencies;
- }
- }
-
- VH( InitializeReflectionDataAndMoveStrings() );
- VH( ReallocateReflectionData() );
- VH( ReallocateEffectData() );
-
- VB( m_pReflection->m_Heap.GetSize() == m_ReflectionMemory );
-
- // Verify that all of the various block/variable types were loaded
- VBD( m_pEffect->m_VariableCount == (m_pHeader->Effect.cObjectVariables + m_pHeader->Effect.cNumericVariables + m_pHeader->cInterfaceVariables), "Internal loading error: mismatched variable count." );
- VBD( m_pEffect->m_ShaderBlockCount == m_pHeader->cTotalShaders, "Internal loading error: mismatched shader block count." );
- VBD( m_pEffect->m_AnonymousShaderCount == m_pHeader->cInlineShaders, "Internal loading error: mismatched anonymous variable count." );
- VBD( m_pEffect->m_ShaderResourceCount == m_pHeader->cShaderResources, "Internal loading error: mismatched SRV count." );
- VBD( m_pEffect->m_InterfaceCount == m_pHeader->cInterfaceVariableElements + m_BackgroundInterfaces.GetSize(), "Internal loading error: mismatched interface count." );
- VBD( m_pEffect->m_UnorderedAccessViewCount == m_pHeader->cUnorderedAccessViews, "Internal loading error: mismatched UAV count." );
- VBD( m_pEffect->m_MemberDataCount == cMemberDataBlocks, "Internal loading error: mismatched member data block count." );
- VBD( m_pEffect->m_RenderTargetViewCount == m_pHeader->cRenderTargetViews, "Internal loading error: mismatched RTV count." );
- VBD( m_pEffect->m_DepthStencilViewCount == m_pHeader->cDepthStencilViews, "Internal loading error: mismatched DSV count." );
- VBD( m_pEffect->m_DepthStencilBlockCount == m_pHeader->cDepthStencilBlocks, "Internal loading error: mismatched depth-stencil state count." );
- VBD( m_pEffect->m_BlendBlockCount == m_pHeader->cBlendStateBlocks, "Internal loading error: mismatched blend state count." );
- VBD( m_pEffect->m_RasterizerBlockCount == m_pHeader->cRasterizerStateBlocks, "Internal loading error: mismatched rasterizer state count." );
- VBD( m_pEffect->m_SamplerBlockCount == m_pHeader->cSamplers, "Internal loading error: mismatched sampler count." );
- VBD( m_pEffect->m_StringCount == m_pHeader->cStrings, "Internal loading error: mismatched string count." );
-
- // Uncomment if you really need this information
- // DPF(0, "Effect heap size: %d, reflection heap size: %d, allocations avoided: %d", m_EffectMemory, m_ReflectionMemory, m_BulkHeap.m_cAllocations);
-
-lExit:
- return hr;
-}
-
-// position in buffer is lost on error
-HRESULT CEffectLoader::LoadStringAndAddToPool(__out_ecount_full(1) char **ppString, UINT dwOffset)
-{
- HRESULT hr = S_OK;
- char *pName;
- UINT hash;
- SIZE_T oldPos;
- CEffect::CStringHashTable::CIterator iter;
- UINT len;
-
- if (dwOffset == 0)
- {
- *ppString = NULL;
- goto lExit;
- }
-
- oldPos = m_msUnstructured.GetPosition();
-
- VHD( m_msUnstructured.ReadAtOffset(dwOffset, (LPCSTR *) &pName), "Invalid pEffectBuffer: cannot read string." );
- len = (UINT)strlen(pName);
- hash = ComputeHash((BYTE *)pName, len);
- if (FAILED(m_pEffect->m_pStringPool->FindValueWithHash(pName, hash, &iter)))
- {
- D3DXASSERT( m_pEffect->m_pPooledHeap != NULL );
- VN( (*ppString) = new(*m_pEffect->m_pPooledHeap) char[len + 1] );
- memcpy(*ppString, pName, len + 1);
- VHD( m_pEffect->m_pStringPool->AddValueWithHash(*ppString, hash), "Internal loading error: failed to add string to pool." );
- }
- else
- {
- *ppString = const_cast<LPSTR>(iter.GetData());
- }
-
- m_msUnstructured.Seek(oldPos);
-
-lExit:
- return hr;
-}
-
-HRESULT CEffectLoader::LoadTypeAndAddToPool(SType **ppType, UINT dwOffset)
-{
- HRESULT hr = S_OK;
- SBinaryType *psType;
- SBinaryNumericType *pNumericType;
- EObjectType *pObjectType;
- UINT cMembers, iMember, cInterfaces;
- UINT oBaseClassType;
- SType temporaryType;
- CEffect::CTypeHashTable::CIterator iter;
- BYTE *pHashBuffer;
- UINT hash;
- SVariable *pTempMembers = NULL;
-
- m_HashBuffer.Empty();
-
- VHD( m_msUnstructured.ReadAtOffset(dwOffset, sizeof(SBinaryType), (void**) &psType), "Invalid pEffectBuffer: cannot read type." );
- VHD( LoadStringAndAddToPool(&temporaryType.pTypeName, psType->oTypeName), "Invalid pEffectBuffer: cannot read type name." );
- temporaryType.VarType = psType->VarType;
- temporaryType.Elements = psType->Elements;
- temporaryType.TotalSize = psType->TotalSize;
- temporaryType.Stride = psType->Stride;
- temporaryType.PackedSize = psType->PackedSize;
-
- // sanity check elements, size, stride, etc.
- UINT cElements = max(1, temporaryType.Elements);
- VBD( cElements * temporaryType.Stride == AlignToPowerOf2(temporaryType.TotalSize, SType::c_RegisterSize), "Invalid pEffectBuffer: invalid type size." );
- VBD( temporaryType.Stride % SType::c_RegisterSize == 0, "Invalid pEffectBuffer: invalid type stride." );
- VBD( temporaryType.PackedSize <= temporaryType.TotalSize && temporaryType.PackedSize % cElements == 0, "Invalid pEffectBuffer: invalid type packed size." );
-
- switch(temporaryType.VarType)
- {
- case EVT_Object:
- VHD( m_msUnstructured.Read((void**) &pObjectType, sizeof(UINT)), "Invalid pEffectBuffer: cannot read object type." );
- temporaryType.ObjectType = *pObjectType;
- VBD( temporaryType.VarType > EOT_Invalid && temporaryType.VarType < EOT_Count, "Invalid pEffectBuffer: invalid object type." );
-
- VN( pHashBuffer = m_HashBuffer.AddRange(sizeof(temporaryType.VarType) + sizeof(temporaryType.Elements) +
- sizeof(temporaryType.pTypeName) + sizeof(temporaryType.ObjectType)) );
- memcpy(pHashBuffer, &temporaryType.VarType, sizeof(temporaryType.VarType));
- pHashBuffer += sizeof(temporaryType.VarType);
- memcpy(pHashBuffer, &temporaryType.Elements, sizeof(temporaryType.Elements));
- pHashBuffer += sizeof(temporaryType.Elements);
- memcpy(pHashBuffer, &temporaryType.pTypeName, sizeof(temporaryType.pTypeName));
- pHashBuffer += sizeof(temporaryType.pTypeName);
- memcpy(pHashBuffer, &temporaryType.ObjectType, sizeof(temporaryType.ObjectType));
- break;
-
- case EVT_Interface:
- temporaryType.InterfaceType = NULL;
-
- VN( pHashBuffer = m_HashBuffer.AddRange(sizeof(temporaryType.VarType) + sizeof(temporaryType.Elements) +
- sizeof(temporaryType.pTypeName) + sizeof(temporaryType.ObjectType)) );
- memcpy(pHashBuffer, &temporaryType.VarType, sizeof(temporaryType.VarType));
- pHashBuffer += sizeof(temporaryType.VarType);
- memcpy(pHashBuffer, &temporaryType.Elements, sizeof(temporaryType.Elements));
- pHashBuffer += sizeof(temporaryType.Elements);
- memcpy(pHashBuffer, &temporaryType.pTypeName, sizeof(temporaryType.pTypeName));
- pHashBuffer += sizeof(temporaryType.pTypeName);
- memcpy(pHashBuffer, &temporaryType.ObjectType, sizeof(temporaryType.ObjectType));
- break;
-
- case EVT_Numeric:
- VHD( m_msUnstructured.Read((void**) &pNumericType, sizeof(SBinaryNumericType)), "Invalid pEffectBuffer: cannot read numeric type." );
- temporaryType.NumericType = *pNumericType;
- VBD( temporaryType.NumericType.Rows >= 1 && temporaryType.NumericType.Rows <= 4 &&
- temporaryType.NumericType.Columns >= 1 && temporaryType.NumericType.Columns <= 4 &&
- temporaryType.NumericType.NumericLayout != ENL_Invalid && temporaryType.NumericType.NumericLayout < ENL_Count &&
- temporaryType.NumericType.ScalarType > EST_Invalid && temporaryType.NumericType.ScalarType < EST_Count,
- "Invalid pEffectBuffer: invalid numeric type.");
-
- if (temporaryType.NumericType.NumericLayout != ENL_Matrix)
- {
- VBD( temporaryType.NumericType.IsColumnMajor == FALSE, "Invalid pEffectBuffer: only matricies can be column major." );
- }
-
- VN( pHashBuffer = m_HashBuffer.AddRange(sizeof(temporaryType.VarType) + sizeof(temporaryType.Elements) +
- sizeof(temporaryType.pTypeName) + sizeof(temporaryType.NumericType)) );
- memcpy(pHashBuffer, &temporaryType.VarType, sizeof(temporaryType.VarType));
- pHashBuffer += sizeof(temporaryType.VarType);
- memcpy(pHashBuffer, &temporaryType.Elements, sizeof(temporaryType.Elements));
- pHashBuffer += sizeof(temporaryType.Elements);
- memcpy(pHashBuffer, &temporaryType.pTypeName, sizeof(temporaryType.pTypeName));
- pHashBuffer += sizeof(temporaryType.pTypeName);
- memcpy(pHashBuffer, &temporaryType.NumericType, sizeof(temporaryType.NumericType));
- break;
-
- case EVT_Struct:
- VHD( m_msUnstructured.Read(&cMembers), "Invalid pEffectBuffer: cannot read struct." );
-
- temporaryType.StructType.Members = cMembers;
-
- VN( pTempMembers = NEW SVariable[cMembers] );
- temporaryType.StructType.pMembers = pTempMembers;
-
- // read up all of the member descriptors at once
- SBinaryType::SBinaryMember *psMember;
- VHD( m_msUnstructured.Read((void**) &psMember, cMembers * sizeof(*psMember)), "Invalid pEffectBuffer: cannot read struct members." );
-
- {
- // Determine if this type implements an interface
- VHD( m_msUnstructured.Read(&oBaseClassType), "Invalid pEffectBuffer: cannot read base class type." );
- VHD( m_msUnstructured.Read(&cInterfaces), "Invalid pEffectBuffer: cannot read interfaces." );
- if( cInterfaces > 0 )
- {
- temporaryType.StructType.ImplementsInterface = 1;
- temporaryType.StructType.HasSuperClass = ( oBaseClassType > 0 ) ? 1 : 0;
- }
- else if( oBaseClassType > 0 )
- {
- // Get parent type and copy its ImplementsInterface
- SType* pBaseClassType;
- VH( LoadTypeAndAddToPool(&pBaseClassType, oBaseClassType) );
- temporaryType.StructType.ImplementsInterface = pBaseClassType->StructType.ImplementsInterface;
- temporaryType.StructType.HasSuperClass = 1;
- }
- // Read (and ignore) the interface types
- UINT *poInterface;
- VHD( m_msUnstructured.Read((void**) &poInterface, cInterfaces * sizeof(poInterface)), "Invalid pEffectBuffer: cannot read interface types." );
- }
-
- UINT totalSize;
- totalSize = 0;
- for (iMember=0; iMember<cMembers; iMember++)
- {
- SVariable *pMember;
-
- pMember = temporaryType.StructType.pMembers + iMember;
-
- VBD( psMember[iMember].Offset == totalSize ||
- psMember[iMember].Offset == AlignToPowerOf2(totalSize, SType::c_RegisterSize),
- "Internal loading error: invalid member offset." );
-
- pMember->Data.Offset = psMember[iMember].Offset;
-
- VH( LoadTypeAndAddToPool(&pMember->pType, psMember[iMember].oType) );
- VH( LoadStringAndAddToPool(&pMember->pName, psMember[iMember].oName) );
- VH( LoadStringAndAddToPool(&pMember->pSemantic, psMember[iMember].oSemantic) );
-
- totalSize = psMember[iMember].Offset + pMember->pType->TotalSize;
- }
- VBD( AlignToPowerOf2(totalSize, SType::c_RegisterSize) == temporaryType.Stride, "Internal loading error: invlid type size." );
-
- VN( pHashBuffer = m_HashBuffer.AddRange(sizeof(temporaryType.VarType) + sizeof(temporaryType.Elements) +
- sizeof(temporaryType.pTypeName) + sizeof(temporaryType.StructType.Members) + cMembers * sizeof(SVariable)) );
-
- memcpy(pHashBuffer, &temporaryType.VarType, sizeof(temporaryType.VarType));
- pHashBuffer += sizeof(temporaryType.VarType);
- memcpy(pHashBuffer, &temporaryType.Elements, sizeof(temporaryType.Elements));
- pHashBuffer += sizeof(temporaryType.Elements);
- memcpy(pHashBuffer, &temporaryType.pTypeName, sizeof(temporaryType.pTypeName));
- pHashBuffer += sizeof(temporaryType.pTypeName);
- memcpy(pHashBuffer, &temporaryType.StructType.Members, sizeof(temporaryType.StructType.Members));
- pHashBuffer += sizeof(temporaryType.StructType.Members);
- memcpy(pHashBuffer, temporaryType.StructType.pMembers, cMembers * sizeof(SVariable));
- break;
-
- default:
- D3DXASSERT(0);
- VHD( E_FAIL, "Internal loading error: invalid variable type." );
- }
-
- hash = ComputeHash(&m_HashBuffer[0], m_HashBuffer.GetSize());
- if (FAILED(m_pEffect->m_pTypePool->FindValueWithHash(&temporaryType, hash, &iter)))
- {
- D3DXASSERT( m_pEffect->m_pPooledHeap != NULL );
-
- // allocate real member array, if necessary
- if (temporaryType.VarType == EVT_Struct)
- {
- VN( temporaryType.StructType.pMembers = new(*m_pEffect->m_pPooledHeap) SVariable[temporaryType.StructType.Members] );
- memcpy(temporaryType.StructType.pMembers, pTempMembers, temporaryType.StructType.Members * sizeof(SVariable));
- }
-
- // allocate real type
- VN( (*ppType) = new(*m_pEffect->m_pPooledHeap) SType );
- memcpy(*ppType, &temporaryType, sizeof(temporaryType));
- ZeroMemory(&temporaryType, sizeof(temporaryType));
- VH( m_pEffect->m_pTypePool->AddValueWithHash(*ppType, hash) );
- }
- else
- {
- *ppType = iter.GetData();
- }
-
-lExit:
- SAFE_DELETE_ARRAY(pTempMembers);
- return hr;
-}
-
-// Numeric data in annotations are tightly packed (unlike in CBs which follow D3D11 packing rules). This unpacks them.
-UINT CEffectLoader::UnpackData(BYTE *pDestData, BYTE *pSrcData, UINT PackedDataSize, SType *pType, UINT *pBytesRead)
-{
- UINT bytesRead = 0;
- UINT i, j, k;
- UINT registers, entries;
- HRESULT hr = S_OK;
- UINT elementsToCopy = max(pType->Elements, 1);
-
- switch (pType->VarType)
- {
- case EVT_Struct:
- for (i = 0; i < elementsToCopy; ++ i)
- {
- for (j = 0; j < pType->StructType.Members; ++ j)
- {
- UINT br;
- D3DXASSERT((UINT_PTR)pType->StructType.pMembers[j].pType == (UINT)(UINT_PTR)pType->StructType.pMembers[j].pType);
- D3DXASSERT(PackedDataSize > bytesRead);
-
- VH( UnpackData(pDestData + pType->StructType.pMembers[j].Data.Offset,
- pSrcData + bytesRead, PackedDataSize - bytesRead,
- pType->StructType.pMembers[j].pType, &br) );
-
- bytesRead += br;
- }
- pDestData += pType->Stride;
- }
- break;
-
- case EVT_Numeric:
- if (pType->NumericType.IsPackedArray)
- {
- // No support for packed arrays
- D3DXASSERT(0);
- VHD(E_FAIL, "Internal loading error: packed arrays are not supported." );
- }
- else
- {
- UINT bytesToCopy;
-
- if (pType->NumericType.IsColumnMajor)
- {
- registers = pType->NumericType.Columns;
- entries = pType->NumericType.Rows;
- bytesToCopy = entries * registers * SType::c_ScalarSize;
-
- for (i = 0; i < elementsToCopy; ++ i)
- {
- for (j = 0; j < registers; ++ j)
- {
- for (k = 0; k < entries; ++ k)
- {
- // type cast to an arbitrary scalar
- ((UINT*)pDestData)[k] = ((UINT*)pSrcData)[k * registers + j];
- }
- pDestData += SType::c_RegisterSize; // advance to next register
- }
- pSrcData += bytesToCopy;
- bytesRead += bytesToCopy;
- }
- }
- else
- {
- registers = pType->NumericType.Rows;
- entries = pType->NumericType.Columns;
- bytesToCopy = entries * SType::c_ScalarSize;
-
- for (i = 0; i < elementsToCopy; ++ i)
- {
- for (j = 0; j < registers; ++ j)
- {
- memcpy(pDestData, pSrcData, bytesToCopy);
-
- pDestData += SType::c_RegisterSize; // advance to next register
- pSrcData += bytesToCopy;
- bytesRead += bytesToCopy;
- }
- }
- }
- }
- break;
-
- default:
- // shouldn't be called on non-struct/numeric types
- D3DXASSERT(0);
- VHD(E_FAIL, "Internal loading error: UnpackData should not be called on non-struct, non-numeric types." );
- }
-
-lExit:
- *pBytesRead = bytesRead;
- return hr;
-}
-
-// Read info from the compiled blob and initialize a numeric variable
-HRESULT CEffectLoader::LoadNumericVariable(SConstantBuffer *pParentCB)
-{
- HRESULT hr = S_OK;
- SBinaryNumericVariable *psVar;
- SGlobalVariable *pVar;
- SType *pType;
- void *pDefaultValue;
-
- // Read variable info
- VHD( m_msStructured.Read((void**) &psVar, sizeof(*psVar)), "Invalid pEffectBuffer: cannot read numeric variable." );
- VBD( m_pEffect->m_VariableCount < (m_pHeader->Effect.cObjectVariables + m_pHeader->Effect.cNumericVariables + m_pHeader->cInterfaceVariables),
- "Internal loading error: invalid variable counts.");
- pVar = &m_pEffect->m_pVariables[m_pEffect->m_VariableCount];
-
- // Get type
- VH( LoadTypeAndAddToPool(&pType, psVar->oType) );
-
- // Make sure the right polymorphic type is created
- VH( PlacementNewVariable(pVar, pType, FALSE) );
-
- if (psVar->Flags & D3DX11_EFFECT_VARIABLE_EXPLICIT_BIND_POINT)
- {
- pVar->ExplicitBindPoint = psVar->Offset;
- }
- else
- {
- pVar->ExplicitBindPoint = -1;
- }
-
- pVar->pEffect = m_pEffect;
- pVar->pType = pType;
- pVar->pCB = pParentCB;
- pVar->Data.pGeneric = pParentCB->pBackingStore + psVar->Offset;
- VBD( psVar->Offset + pVar->pType->TotalSize <= pVar->pCB->Size, "Invalid pEffectBuffer: invalid variable offset." );
-
- if (pType->VarType == EVT_Struct && pType->StructType.ImplementsInterface && !pParentCB->IsTBuffer)
- {
- pVar->MemberDataOffsetPlus4 = m_pEffect->m_MemberDataCount * sizeof(SMemberDataPointer) + 4;
- m_pEffect->m_MemberDataCount += max(pType->Elements,1);
- }
-
- // Get name & semantic
- VHD( GetStringAndAddToReflection(psVar->oName, &pVar->pName), "Invalid pEffectBuffer: cannot read variable name." );
- VHD( GetStringAndAddToReflection(psVar->oSemantic, &pVar->pSemantic), "Invalid pEffectBuffer: cannot read variable semantic." );
-
- // Ensure the variable fits in the CBuffer and doesn't overflow
- VBD( pType->TotalSize + psVar->Offset <= pParentCB->Size &&
- pType->TotalSize + psVar->Offset >= pType->TotalSize, "Invalid pEffectBuffer: variable does not fit in CB." );
-
- ZeroMemory(pVar->Data.pGeneric, pType->TotalSize);
-
- // Get default value
- if (0 != psVar->oDefaultValue)
- {
- UINT bytesUnpacked;
- VHD( m_msUnstructured.ReadAtOffset(psVar->oDefaultValue, pType->PackedSize, &pDefaultValue), "Invalid pEffectBuffer: cannot read default value." );
- VH( UnpackData((BYTE*) pVar->Data.pGeneric, (BYTE*) pDefaultValue, pType->PackedSize, pType, &bytesUnpacked) );
- VBD( bytesUnpacked == pType->PackedSize, "Invalid pEffectBuffer: invalid type packed size.");
- }
-
- // We need to use offsets until we fixup
- pVar->Data.Offset = psVar->Offset;
-
- // Read annotations
- VH( LoadAnnotations(&pVar->AnnotationCount, &pVar->pAnnotations) );
-
- m_pEffect->m_VariableCount++;
-
-lExit:
- return hr;
-}
-
-// Read info from the compiled blob and initialize a constant buffer
-HRESULT CEffectLoader::LoadCBs()
-{
- HRESULT hr = S_OK;
- UINT iCB, iVar;
-
- for (iCB=0; iCB<m_pHeader->Effect.cCBs; iCB++)
- {
- SBinaryConstantBuffer *psCB;
- SConstantBuffer *pCB;
-
- VHD( m_msStructured.Read((void**) &psCB, sizeof(*psCB)), "Invalid pEffectBuffer: cannot read CB." );
- pCB = &m_pEffect->m_pCBs[iCB];
-
- VHD( GetStringAndAddToReflection(psCB->oName, &pCB->pName), "Invalid pEffectBuffer: cannot read CB name." );
-
- pCB->IsTBuffer = (psCB->Flags & SBinaryConstantBuffer::c_IsTBuffer) != 0 ? TRUE : FALSE;
- pCB->IsSingle = (psCB->Flags & SBinaryConstantBuffer::c_IsSingle) != 0 ? TRUE : FALSE;
- pCB->Size = psCB->Size;
- pCB->ExplicitBindPoint = psCB->ExplicitBindPoint;
- VBD( pCB->Size == AlignToPowerOf2(pCB->Size, SType::c_RegisterSize), "Invalid pEffectBuffer: CB size not a power of 2." );
- VN( pCB->pBackingStore = PRIVATENEW BYTE[pCB->Size] );
-
- pCB->MemberDataOffsetPlus4 = m_pEffect->m_MemberDataCount * sizeof(SMemberDataPointer) + 4;
- m_pEffect->m_MemberDataCount += 2;
-
- // point this CB to variables that it owns
- pCB->VariableCount = psCB->cVariables;
- if (pCB->VariableCount > 0)
- {
- pCB->pVariables = &m_pEffect->m_pVariables[m_pEffect->m_VariableCount];
- }
- else
- {
- pCB->pVariables = NULL;
- }
-
- // Read annotations
- VH( LoadAnnotations(&pCB->AnnotationCount, &pCB->pAnnotations) );
-
- for (iVar=0; iVar<psCB->cVariables; iVar++)
- {
- VH( LoadNumericVariable(pCB) );
- }
- }
-
- m_pEffect->m_CBCount = m_pHeader->Effect.cCBs;
-
-lExit:
- return hr;
-}
-
-// Used by LoadAssignment to initialize members on load
-HRESULT CEffectLoader::ExecuteConstantAssignment(SBinaryConstant *pConstant, void *pLHS, D3D10_SHADER_VARIABLE_TYPE lhsType)
-{
- HRESULT hr = S_OK;
-
- switch(pConstant->Type)
- {
- case EST_UInt:
- case EST_Int:
- case EST_Bool:
- switch(lhsType)
- {
- case D3D10_SVT_BOOL:
- case D3D10_SVT_INT:
- case D3D10_SVT_UINT:
- *(UINT*) pLHS = pConstant->iValue;
- break;
-
- case D3D10_SVT_UINT8:
- *(BYTE*) pLHS = (BYTE) pConstant->iValue;
- break;
-
- case D3D10_SVT_FLOAT:
- *(float*) pLHS = (float) pConstant->iValue;
- break;
-
- default:
- VHD( E_FAIL, "Internal loading error: invalid left-hand assignment type." );
- }
- break;
-
- case EST_Float:
- switch(lhsType)
- {
- case D3D10_SVT_BOOL:
- case D3D10_SVT_INT:
- case D3D10_SVT_UINT:
- *(UINT*) pLHS = (UINT) pConstant->fValue;
- break;
-
- case D3D10_SVT_UINT8:
- *(BYTE*) pLHS = (BYTE) pConstant->fValue;
- break;
-
- case D3D10_SVT_FLOAT:
- *(float*) pLHS = pConstant->fValue;
- break;
-
- default:
- VHD( E_FAIL, "Internal loading error: invalid left-hand assignment type." );
- }
- break;
-
- default:
- VHD( E_FAIL, "Internal loading error: invalid left-hand assignment type." );
- }
-
-lExit:
- return hr;
-}
-
-
-// Read info from the compiled blob and initialize a set of assignments
-HRESULT CEffectLoader::LoadAssignments( UINT Assignments, SAssignment **ppAssignments, BYTE *pBackingStore, UINT *pRTVAssignments, UINT *pFinalAssignments )
-{
- HRESULT hr = S_OK;
- UINT i, j;
-
- SBinaryAssignment *psAssignments;
- UINT finalAssignments = 0; // the number of assignments worth keeping
- UINT renderTargetViewAssns = 0; // Number of render target view assns, used by passes since SetRTV is a vararg call
-
- *pFinalAssignments = 0;
- if (pRTVAssignments)
- *pRTVAssignments = 0;
-
- VHD( m_msStructured.Read((void**) &psAssignments, sizeof(*psAssignments) * Assignments), "Invalid pEffectBuffer: cannot read assignments." );
-
- // allocate enough room to store all of the assignments (even though some may go unused)
- VN( (*ppAssignments) = PRIVATENEW SAssignment[Assignments] )
-
- //
- // In this loop, we read assignments 1-by-1, keeping some and discarding others.
- // We write to the "next" assignment which is given by &(*ppAssignments)[finalAssignments];
- // if an assignment is worth keeping, we increment finalAssignments.
- // This means that if you want to keep an assignment, you must be careful to initialize
- // all members of SAssignment because old values from preceding discarded assignments might remain.
- //
- for (i = 0; i < Assignments; ++ i)
- {
- SGlobalVariable *pVarArray, *pVarIndex, *pVar;
- const char *pGlobalVarName;
- SAssignment *pAssignment = &(*ppAssignments)[finalAssignments];
- BYTE *pLHS;
-
- VBD( psAssignments[i].iState < NUM_STATES, "Invalid pEffectBuffer: invalid assignment state." );
- VBD( psAssignments[i].Index < g_lvGeneral[psAssignments[i].iState].m_Indices, "Invalid pEffectBuffer: invalid assignment index." );
-
- pAssignment->LhsType = g_lvGeneral[psAssignments[i].iState].m_LhsType;
-
- // Count RenderTargetView assignments
- if (pAssignment->LhsType == ELHS_RenderTargetView)
- renderTargetViewAssns++;
-
- switch (g_lvGeneral[psAssignments[i].iState].m_Type)
- {
- case D3D10_SVT_UINT8:
- D3DXASSERT(g_lvGeneral[psAssignments[i].iState].m_Cols == 1); // BYTE arrays not supported
- pAssignment->DataSize = sizeof(BYTE);
- // Store an offset for destination instead of a pointer so that it's easy to relocate it later
-
- break;
-
- case D3D10_SVT_BOOL:
- case D3D10_SVT_INT:
- case D3D10_SVT_UINT:
- case D3D10_SVT_FLOAT:
- pAssignment->DataSize = SType::c_ScalarSize * g_lvGeneral[psAssignments[i].iState].m_Cols;
- break;
-
- case D3D10_SVT_RASTERIZER:
- pAssignment->DataSize = sizeof(SRasterizerBlock);
- break;
-
- case D3D10_SVT_DEPTHSTENCIL:
- pAssignment->DataSize = sizeof(SDepthStencilBlock);
- break;
-
- case D3D10_SVT_BLEND:
- pAssignment->DataSize = sizeof(SBlendBlock);
- break;
-
- case D3D10_SVT_VERTEXSHADER:
- case D3D10_SVT_GEOMETRYSHADER:
- case D3D10_SVT_PIXELSHADER:
- case D3D11_SVT_HULLSHADER:
- case D3D11_SVT_DOMAINSHADER:
- case D3D11_SVT_COMPUTESHADER:
- pAssignment->DataSize = sizeof(SShaderBlock);
- break;
-
- case D3D10_SVT_TEXTURE:
- case D3D10_SVT_TEXTURE1D:
- case D3D10_SVT_TEXTURE2D:
- case D3D10_SVT_TEXTURE2DMS:
- case D3D10_SVT_TEXTURE3D:
- case D3D10_SVT_TEXTURECUBE:
- case D3D10_SVT_TEXTURECUBEARRAY:
- case D3D11_SVT_BYTEADDRESS_BUFFER:
- case D3D11_SVT_STRUCTURED_BUFFER:
- pAssignment->DataSize = sizeof(SShaderResource);
- break;
-
- case D3D10_SVT_RENDERTARGETVIEW:
- pAssignment->DataSize = sizeof(SRenderTargetView);
- break;
-
- case D3D10_SVT_DEPTHSTENCILVIEW:
- pAssignment->DataSize = sizeof(SDepthStencilView);
- break;
-
- case D3D11_SVT_RWTEXTURE1D:
- case D3D11_SVT_RWTEXTURE1DARRAY:
- case D3D11_SVT_RWTEXTURE2D:
- case D3D11_SVT_RWTEXTURE2DARRAY:
- case D3D11_SVT_RWTEXTURE3D:
- case D3D11_SVT_RWBUFFER:
- case D3D11_SVT_RWBYTEADDRESS_BUFFER:
- case D3D11_SVT_RWSTRUCTURED_BUFFER:
- case D3D11_SVT_APPEND_STRUCTURED_BUFFER:
- case D3D11_SVT_CONSUME_STRUCTURED_BUFFER:
- pAssignment->DataSize = sizeof(SUnorderedAccessView);
- break;
-
- case D3D11_SVT_INTERFACE_POINTER:
- pAssignment->DataSize = sizeof(SInterface);
- break;
-
- default:
- D3DXASSERT(0);
- VHD( E_FAIL, "Internal loading error: invalid assignment type.");
- }
-
- UINT lhsStride;
- if( g_lvGeneral[psAssignments[i].iState].m_Stride > 0 )
- lhsStride = g_lvGeneral[psAssignments[i].iState].m_Stride;
- else
- lhsStride = pAssignment->DataSize;
-
- // Store only the destination offset so that the backing store pointers can be easily fixed up later
- pAssignment->Destination.Offset = g_lvGeneral[psAssignments[i].iState].m_Offset + lhsStride * psAssignments[i].Index;
-
- // As a result, you should use pLHS in this function instead of the destination pointer
- pLHS = pBackingStore + pAssignment->Destination.Offset;
-
- switch (psAssignments[i].AssignmentType)
- {
- case ECAT_Constant: // e.g. LHS = 1; or LHS = NULL;
- UINT *pNumConstants;
- SBinaryConstant *pConstants;
-
- VHD( m_msUnstructured.ReadAtOffset(psAssignments[i].oInitializer, sizeof(UINT), (void**) &pNumConstants), "Invalid pEffectBuffer: cannot read NumConstants." );
- VHD( m_msUnstructured.Read((void **)&pConstants, sizeof(SBinaryConstant) * (*pNumConstants)), "Invalid pEffectBuffer: cannot read constants." );
-
- if(pAssignment->IsObjectAssignment())
- {
- // make sure this is a NULL assignment
- VBD( *pNumConstants == 1 && (pConstants[0].Type == EST_Int || pConstants[0].Type == EST_UInt) && pConstants[0].iValue == 0,
- "Invalid pEffectBuffer: non-NULL constant assignment to object.");
-
- switch (pAssignment->LhsType)
- {
- case ELHS_DepthStencilBlock:
- *((void **)pLHS) = &g_NullDepthStencil;
- break;
- case ELHS_BlendBlock:
- *((void **)pLHS) = &g_NullBlend;
- break;
- case ELHS_RasterizerBlock:
- *((void **)pLHS) = &g_NullRasterizer;
- break;
- case ELHS_VertexShaderBlock:
- *((void **)pLHS) = &g_NullVS;
- break;
- case ELHS_PixelShaderBlock:
- *((void **)pLHS) = &g_NullPS;
- break;
- case ELHS_GeometryShaderBlock:
- *((void **)pLHS) = &g_NullGS;
- break;
- case ELHS_HullShaderBlock:
- *((void **)pLHS) = &g_NullHS;
- break;
- case ELHS_DomainShaderBlock:
- *((void **)pLHS) = &g_NullDS;
- break;
- case ELHS_ComputeShaderBlock:
- *((void **)pLHS) = &g_NullCS;
- break;
- case ELHS_Texture:
- *((void **)pLHS) = &g_NullTexture;
- break;
- case ELHS_DepthStencilView:
- *((void **)pLHS) = &g_NullDepthStencilView;
- break;
- case ELHS_RenderTargetView:
- *((void **)pLHS) = &g_NullRenderTargetView;
- break;
- default:
- D3DXASSERT(0);
- }
- }
- else
- {
- VBD( *pNumConstants == g_lvGeneral[psAssignments[i].iState].m_Cols, "Internal loading error: mismatch constant count." );
- for (j = 0; j < *pNumConstants; ++ j)
- {
- VH( ExecuteConstantAssignment(pConstants + j, pLHS, g_lvGeneral[psAssignments[i].iState].m_Type) );
- pLHS += SType::c_ScalarSize; // arrays of constants will always be regular scalar sized, never byte-sized
- }
- }
-
- // Can get rid of this assignment
- break;
-
- case ECAT_Variable: // e.g. LHS = myVar;
- VHD( m_msUnstructured.ReadAtOffset(psAssignments[i].oInitializer, &pGlobalVarName), "Invalid pEffectBuffer: cannot read variable name." );
-
- VBD( pVar = m_pEffect->FindVariableByName(pGlobalVarName), "Loading error: cannot find variable name." );
-
- if (pAssignment->IsObjectAssignment())
- {
- VBD( pVar->pType->VarType == EVT_Object &&
- GetSimpleParameterTypeFromObjectType(pVar->pType->ObjectType) == g_lvGeneral[psAssignments[i].iState].m_Type,
- "Loading error: invalid variable type or object type." );
-
- // Write directly into the state block's backing store
- *((void **)pLHS) = pVar->Data.pGeneric;
-
- // Now we can get rid of this assignment
- }
- else
- {
- VBD( pVar->pType->BelongsInConstantBuffer(), "Invalid pEffectBuffer: assignment type mismatch." );
-
- pAssignment->DependencyCount = 1;
- VN( pAssignment->pDependencies = PRIVATENEW SAssignment::SDependency[pAssignment->DependencyCount] );
- pAssignment->pDependencies->pVariable = pVar;
-
- // Store an offset for numeric values instead of a pointer so that it's easy to relocate it later
- pAssignment->Source.Offset = pVar->Data.Offset;
- pAssignment->AssignmentType = ERAT_NumericVariable;
-
- // Can't get rid of this assignment
- ++ finalAssignments;
- }
- break;
-
- case ECAT_ConstIndex: // e.g. LHS = myGS[1]
- SBinaryAssignment::SConstantIndex *psConstIndex;
-
- VHD( m_msUnstructured.ReadAtOffset(psAssignments[i].oInitializer, sizeof(*psConstIndex), (void**) &psConstIndex),
- "Invalid pEffectBuffer: cannot read assignment initializer." );
- VHD( m_msUnstructured.ReadAtOffset(psConstIndex->oArrayName, &pGlobalVarName), "Invalid pEffectBuffer: cannot read array name." );
-
- VBD( pVarArray = m_pEffect->FindVariableByName(pGlobalVarName), "Loading error: cannot find array name." );
-
- if (pAssignment->IsObjectAssignment())
- {
- VBD( psConstIndex->Index < pVarArray->pType->Elements, "Invalid pEffectBuffer: out of bounds array index." );
- VBD( pVarArray->pType->VarType == EVT_Object &&
- GetSimpleParameterTypeFromObjectType(pVarArray->pType->ObjectType) == g_lvGeneral[psAssignments[i].iState].m_Type,
- "Loading error: invalid variable type or object type." );
-
- // Write directly into the state block's backing store
- *((void **)pLHS) = GetBlockByIndex(pVarArray->pType->VarType, pVarArray->pType->ObjectType, pVarArray->Data.pGeneric, psConstIndex->Index);
- VBD( NULL != *((void **)pLHS), "Internal loading error: invalid block." );
-
- // Now we can get rid of this assignment
- }
- else
- {
- VBD( pVarArray->pType->BelongsInConstantBuffer(), "Invalid pEffectBuffer: assignment type mismatch." );
-
- pAssignment->DependencyCount = 1;
- VN( pAssignment->pDependencies = PRIVATENEW SAssignment::SDependency[pAssignment->DependencyCount] );
- pAssignment->pDependencies->pVariable = pVarArray;
-
- CCheckedDword chkDataLen = psConstIndex->Index;
- UINT dataLen;
- chkDataLen *= SType::c_ScalarSize;
- chkDataLen += pAssignment->DataSize;
- VHD( chkDataLen.GetValue(&dataLen), "Overflow: assignment size." );
- VBD( dataLen <= pVarArray->pType->TotalSize, "Internal loading error: assignment size mismatch" );
-
- pAssignment->Source.Offset = pVarArray->Data.Offset + psConstIndex->Index * SType::c_ScalarSize;
-
- // _NumericConstIndex is not used here because _NumericVariable
- // does the same stuff in a more general fashion with no perf hit.
- pAssignment->AssignmentType = ERAT_NumericVariable;
-
- // Can't get rid of this assignment
- ++ finalAssignments;
- }
- break;
-
- case ECAT_VariableIndex: // e.g. LHS = myVar[numLights];
- SBinaryAssignment::SVariableIndex *psVarIndex;
-
- VHD( m_msUnstructured.ReadAtOffset(psAssignments[i].oInitializer, sizeof(*psVarIndex), (void**) &psVarIndex),
- "Invalid pEffectBuffer: cannot read assignment initializer." );
- VHD( m_msUnstructured.ReadAtOffset(psVarIndex->oArrayName, &pGlobalVarName), "Invalid pEffectBuffer: cannot read variable name." );
- VBD( pVarArray = m_pEffect->FindVariableByName(pGlobalVarName), "Loading error: cannot find variable name." );
-
- VHD( m_msUnstructured.ReadAtOffset(psVarIndex->oIndexVarName, &pGlobalVarName), "Invalid pEffectBuffer: cannot read index variable name." );
- VBD( pVarIndex = m_pEffect->FindVariableByName(pGlobalVarName), "Loading error: cannot find index variable name." );
-
- // Only support integer indices
- VBD( pVarIndex->pType->VarType == EVT_Numeric && (pVarIndex->pType->NumericType.ScalarType == EST_Int || pVarIndex->pType->NumericType.ScalarType == EST_UInt),
- "Invalid pEffectBuffer: invalid index variable type.");
- VBD( pVarArray->pType->Elements > 0, "Invalid pEffectBuffer: array variable is not an array." );
-
- pVarIndex->pCB->IsUsedByExpression = TRUE;
-
- if (pAssignment->IsObjectAssignment())
- {
- VBD( pVarArray->pType->VarType == EVT_Object &&
- GetSimpleParameterTypeFromObjectType(pVarArray->pType->ObjectType) == g_lvGeneral[psAssignments[i].iState].m_Type,
- "Loading error: invalid variable type or object type." );
-
- // MaxElements is only 16-bits wide
- VBD( pVarArray->pType->Elements <= 0xFFFF, "Internal error: array size is too large." );
- pAssignment->MaxElements = pVarArray->pType->Elements;
-
- pAssignment->DependencyCount = 1;
- VN( pAssignment->pDependencies = PRIVATENEW SAssignment::SDependency[pAssignment->DependencyCount] );
- pAssignment->pDependencies[0].pVariable = pVarIndex;
-
- // Point this assignment to the start of the variable's object array.
- // When this assignment is dirty, we write the value of this pointer plus
- // the index given by its one dependency directly into the destination
- pAssignment->Source = pVarArray->Data;
- pAssignment->AssignmentType = ERAT_ObjectVariableIndex;
- }
- else
- {
- VBD( pVarArray->pType->BelongsInConstantBuffer(), "Invalid pEffectBuffer: assignment type mismatch." );
-
- pAssignment->DependencyCount = 2;
- VN( pAssignment->pDependencies = PRIVATENEW SAssignment::SDependency[pAssignment->DependencyCount] );
- pAssignment->pDependencies[0].pVariable = pVarIndex;
- pAssignment->pDependencies[1].pVariable = pVarArray;
-
- // When pVarIndex is updated, we update the source pointer.
- // When pVarArray is updated, we copy data from the source to the destination.
- pAssignment->Source.pGeneric = NULL;
- pAssignment->AssignmentType = ERAT_NumericVariableIndex;
- }
-
- // Can't get rid of this assignment
- ++ finalAssignments;
-
- break;
-
- case ECAT_ExpressionIndex:// e.g. LHS = myVar[a + b * c];
- case ECAT_Expression: // e.g. LHS = a + b * c;
- // we do not support FXLVM
- VHD( E_NOTIMPL, "FXLVM Expressions (complex assignments like myVar[i*2]) are not supported in Effects11." );
- break;
-
- case ECAT_InlineShader:
- case ECAT_InlineShader5:
- UINT cbShaderBin;
- BYTE *pShaderBin;
- SShaderBlock *pShaderBlock;
- SAnonymousShader *pAnonShader;
- union
- {
- SBinaryAssignment::SInlineShader *psInlineShader;
- SBinaryShaderData5 *psInlineShader5;
- };
-
- // Inline shader assignments must be object types
- D3DXASSERT(pAssignment->IsObjectAssignment());
-
- C_ASSERT( offsetof(SBinaryAssignment::SInlineShader,oShader) == offsetof(SBinaryShaderData5,oShader) );
- C_ASSERT( offsetof(SBinaryAssignment::SInlineShader,oSODecl) == offsetof(SBinaryShaderData5,oSODecls) );
- if( psAssignments[i].AssignmentType == ECAT_InlineShader )
- {
- VHD( m_msUnstructured.ReadAtOffset(psAssignments[i].oInitializer, sizeof(*psInlineShader), (void**) &psInlineShader),
- "Invalid pEffectBuffer: cannot read inline shader." );
- }
- else
- {
- VHD( m_msUnstructured.ReadAtOffset(psAssignments[i].oInitializer, sizeof(*psInlineShader5), (void**) &psInlineShader5),
- "Invalid pEffectBuffer: cannot read inline shader." );
- }
-
- VBD( m_pEffect->m_ShaderBlockCount < m_pHeader->cTotalShaders, "Internal loading error: shader count is out incorrect." );
- VBD( m_pEffect->m_AnonymousShaderCount < m_pHeader->cInlineShaders, "Internal loading error: anonymous shader count is out incorrect." );
-
- pShaderBlock = &m_pEffect->m_pShaderBlocks[m_pEffect->m_ShaderBlockCount];
- pAnonShader = &m_pEffect->m_pAnonymousShaders[m_pEffect->m_AnonymousShaderCount];
- pAnonShader->pShaderBlock = pShaderBlock;
-
- ++ m_pEffect->m_ShaderBlockCount;
- ++ m_pEffect->m_AnonymousShaderCount;
-
- // Write directly into the state block's backing store
- *((void **)pLHS) = pShaderBlock;
-
- VHD( GetUnstructuredDataBlock(psInlineShader->oShader, &cbShaderBin, (void **) &pShaderBin), "Invalid pEffectBuffer: cannot read inline shader block." );
-
- if (cbShaderBin > 0)
- {
- VN( pShaderBlock->pReflectionData = PRIVATENEW SShaderBlock::SReflectionData );
-
- pShaderBlock->pReflectionData->BytecodeLength = cbShaderBin;
- pShaderBlock->pReflectionData->pBytecode = (BYTE*) pShaderBin;
- pShaderBlock->pReflectionData->pStreamOutDecls[0] =
- pShaderBlock->pReflectionData->pStreamOutDecls[1] =
- pShaderBlock->pReflectionData->pStreamOutDecls[2] =
- pShaderBlock->pReflectionData->pStreamOutDecls[3] = NULL;
- pShaderBlock->pReflectionData->RasterizedStream = 0;
- pShaderBlock->pReflectionData->IsNullGS = FALSE;
- pShaderBlock->pReflectionData->pReflection = NULL;
- pShaderBlock->pReflectionData->InterfaceParameterCount = 0;
- pShaderBlock->pReflectionData->pInterfaceParameters = NULL;
- }
-
- switch (pAssignment->LhsType)
- {
- case ELHS_PixelShaderBlock:
- pShaderBlock->pVT = &g_vtPS;
- VBD( psInlineShader->oSODecl == NULL, "Internal loading error: pixel shaders cannot have stream out decls." );
- break;
-
- case ELHS_GeometryShaderBlock:
- pShaderBlock->pVT = &g_vtGS;
- if( psAssignments[i].AssignmentType == ECAT_InlineShader )
- {
- if (psInlineShader->oSODecl)
- {
- // This is a GS with SO
- VHD( GetStringAndAddToReflection(psInlineShader->oSODecl, &pShaderBlock->pReflectionData->pStreamOutDecls[0]),
- "Invalid pEffectBuffer: cannot read SO decl." );
- }
- }
- else
- {
- // This is a GS with addressable stream out
- for( UINT iDecl=0; iDecl < psInlineShader5->cSODecls; ++iDecl )
- {
- if (psInlineShader5->oSODecls[iDecl])
- {
- VHD( GetStringAndAddToReflection(psInlineShader5->oSODecls[iDecl], &pShaderBlock->pReflectionData->pStreamOutDecls[iDecl]),
- "Invalid pEffectBuffer: cannot read SO decl." );
- }
- }
- pShaderBlock->pReflectionData->RasterizedStream = psInlineShader5->RasterizedStream;
- }
- break;
-
- case ELHS_VertexShaderBlock:
- pShaderBlock->pVT = &g_vtVS;
- VBD( psInlineShader->oSODecl == NULL, "Internal loading error: vertex shaders cannot have stream out decls." );
- break;
-
- case ELHS_HullShaderBlock:
- pShaderBlock->pVT = &g_vtHS;
- VBD( psInlineShader->oSODecl == NULL, "Internal loading error: hull shaders cannot have stream out decls." );
- break;
-
- case ELHS_DomainShaderBlock:
- pShaderBlock->pVT = &g_vtDS;
- VBD( psInlineShader->oSODecl == NULL, "Internal loading error: domain shaders cannot have stream out decls." );
- break;
-
- case ELHS_ComputeShaderBlock:
- pShaderBlock->pVT = &g_vtCS;
- VBD( psInlineShader->oSODecl == NULL, "Internal loading error: compute shaders cannot have stream out decls." );
- break;
-
- case ELHS_GeometryShaderSO:
- D3DXASSERT(0); // Should never happen
-
- default:
- VHD( E_FAIL, "Internal loading error: invalid shader type." );
- }
-
- if( psAssignments[i].AssignmentType == ECAT_InlineShader5 )
- {
- pShaderBlock->pReflectionData->InterfaceParameterCount = psInlineShader5->cInterfaceBindings;
- VH( GetInterfaceParametersAndAddToReflection( psInlineShader5->cInterfaceBindings, psInlineShader5->oInterfaceBindings, &pShaderBlock->pReflectionData->pInterfaceParameters ) );
- }
-
- // Now we can get rid of this assignment
- break;
-
- default:
- D3DXASSERT(0);
-
- }
- }
-
- *pFinalAssignments = finalAssignments;
- if (pRTVAssignments)
- *pRTVAssignments = renderTargetViewAssns;
-
-lExit:
- return hr;
-}
-
-
-// Read info from the compiled blob and initialize an object variable
-HRESULT CEffectLoader::LoadObjectVariables()
-{
- HRESULT hr = S_OK;
- UINT iBlock;
- UINT cBlocks;
-
- cBlocks = m_pHeader->Effect.cObjectVariables;
-
- for (iBlock=0; iBlock<cBlocks; iBlock++)
- {
- SBinaryObjectVariable *psBlock;
- SGlobalVariable *pVar;
- SType *pType;
- UINT iElement;
- UINT elementsToRead;
- CCheckedDword chkElementsTotal;
- UINT elementsTotal;
-
- // Read variable info
- VHD( m_msStructured.Read((void**) &psBlock, sizeof(*psBlock)), "Invalid pEffectBuffer: cannot read object variable." );
- VBD( m_pEffect->m_VariableCount < (m_pHeader->Effect.cObjectVariables + m_pHeader->Effect.cNumericVariables + m_pHeader->cInterfaceVariables),
- "Internal loading error: variable count mismatch." );
- pVar = &m_pEffect->m_pVariables[m_pEffect->m_VariableCount];
-
- // Get type
- VH( LoadTypeAndAddToPool(&pType, psBlock->oType) );
-
- // Make sure the right polymorphic type is created
- VH( PlacementNewVariable(pVar, pType, FALSE) );
-
- pVar->pEffect = m_pEffect;
- pVar->pType = pType;
- pVar->pCB = NULL;
- pVar->ExplicitBindPoint = psBlock->ExplicitBindPoint;
-
- if( pType->IsStateBlockObject() )
- {
- pVar->MemberDataOffsetPlus4 = m_pEffect->m_MemberDataCount * sizeof(SMemberDataPointer) + 4;
- m_pEffect->m_MemberDataCount += max(pType->Elements,1);
- }
-
- // Get name
- VHD( GetStringAndAddToReflection(psBlock->oName, &pVar->pName), "Invalid pEffectBuffer: cannot read object variable name." );
- VHD( GetStringAndAddToReflection(psBlock->oSemantic, &pVar->pSemantic), "Invalid pEffectBuffer: cannot read object variable semantic." );
-
- m_pEffect->m_VariableCount++;
- elementsToRead = max(1, pType->Elements);
- chkElementsTotal = elementsToRead;
-
- if (pType->IsStateBlockObject())
- {
- // State blocks
- EBlockType blockType;
- UINT *maxBlockCount;
- UINT *currentBlockCount;
-
- switch (pType->ObjectType)
- {
- case EOT_Blend:
- pVar->Data.pBlock = &m_pEffect->m_pBlendBlocks[m_pEffect->m_BlendBlockCount];
- maxBlockCount = &m_pHeader->cBlendStateBlocks;
- currentBlockCount = &m_pEffect->m_BlendBlockCount;
- blockType = EBT_Blend;
- break;
-
- case EOT_DepthStencil:
- pVar->Data.pBlock = &m_pEffect->m_pDepthStencilBlocks[m_pEffect->m_DepthStencilBlockCount];
- maxBlockCount = &m_pHeader->cDepthStencilBlocks;
- currentBlockCount = &m_pEffect->m_DepthStencilBlockCount;
- blockType = EBT_DepthStencil;
- break;
-
- case EOT_Rasterizer:
- pVar->Data.pBlock = &m_pEffect->m_pRasterizerBlocks[m_pEffect->m_RasterizerBlockCount];
- maxBlockCount = &m_pHeader->cRasterizerStateBlocks;
- currentBlockCount = &m_pEffect->m_RasterizerBlockCount;
- blockType = EBT_Rasterizer;
- break;
-
- default:
- VB(pType->IsSampler());
- pVar->Data.pBlock = &m_pEffect->m_pSamplerBlocks[m_pEffect->m_SamplerBlockCount];
- maxBlockCount = &m_pHeader->cSamplers;
- currentBlockCount = &m_pEffect->m_SamplerBlockCount;
- blockType = EBT_Sampler;
- }
-
- chkElementsTotal += *currentBlockCount;
- VHD( chkElementsTotal.GetValue(&elementsTotal), "Overflow: vaiable elements." );
- VBD( elementsTotal <= *maxBlockCount, "Internal loading error: element count overflow." );
-
- *currentBlockCount += elementsToRead;
-
- for (iElement = 0; iElement < elementsToRead; ++ iElement)
- {
- SBaseBlock *pCurrentBlock;
- UINT cAssignments;
-
- pCurrentBlock = (SBaseBlock *) GetBlockByIndex(pVar->pType->VarType, pVar->pType->ObjectType, pVar->Data.pGeneric, iElement);
- VBD( NULL != pCurrentBlock, "Internal loading error: find state block." );
-
- pCurrentBlock->BlockType = blockType;
-
- VHD( m_msStructured.Read(&cAssignments), "Invalid pEffectBuffer: cannot read state block assignments." );
-
- VH( LoadAssignments( cAssignments, &pCurrentBlock->pAssignments, (BYTE*)pCurrentBlock, NULL, &pCurrentBlock->AssignmentCount ) );
- }
- }
- else if (pType->IsShader())
- {
- // Shaders
-
- chkElementsTotal += m_pEffect->m_ShaderBlockCount;
- VHD( chkElementsTotal.GetValue(&elementsTotal), "Overflow: shader block count." );
- VBD( elementsTotal <= m_pHeader->cTotalShaders, "Invalid pEffectBuffer: shader count mismatch." );
-
- pVar->Data.pShader = &m_pEffect->m_pShaderBlocks[m_pEffect->m_ShaderBlockCount];
-
- for (iElement=0; iElement<elementsToRead; iElement++)
- {
- UINT cbShaderBin;
- void *pShaderBin;
- SShaderBlock *pShaderBlock;
-
- union
- {
- UINT *pOffset;
- SBinaryGSSOInitializer *psInlineGSSO4;
- SBinaryShaderData5 *psInlineShader5;
- };
-
- C_ASSERT( offsetof(SBinaryGSSOInitializer,oShader) == 0 );
- C_ASSERT( offsetof(SBinaryShaderData5,oShader) == 0 );
-
-
- pShaderBlock = &m_pEffect->m_pShaderBlocks[m_pEffect->m_ShaderBlockCount];
- m_pEffect->m_ShaderBlockCount++;
-
- // Get shader binary
- switch (pType->ObjectType)
- {
- case EOT_VertexShader:
- case EOT_GeometryShader:
- case EOT_PixelShader:
- VHD( m_msStructured.Read((void**)&pOffset, sizeof(*pOffset)), "Invalid pEffectBuffer: cannot read shader block." );
- break;
-
- case EOT_GeometryShaderSO:
- VHD( m_msStructured.Read((void**)&psInlineGSSO4, sizeof(*psInlineGSSO4)), "Invalid pEffectBuffer: cannot read inline GS with SO." );
- break;
-
- case EOT_VertexShader5:
- case EOT_GeometryShader5:
- case EOT_HullShader5:
- case EOT_DomainShader5:
- case EOT_PixelShader5:
- case EOT_ComputeShader5:
- VHD( m_msStructured.Read((void**)&psInlineShader5, sizeof(*psInlineShader5)), "Invalid pEffectBuffer: cannot read inline shader." );
- break;
-
- default:
- VH( E_FAIL );
- }
-
- VHD( GetUnstructuredDataBlock(*pOffset, &cbShaderBin, &pShaderBin), "Invalid pEffectBuffer: cannot read shader byte code." );
-
- if (cbShaderBin > 0)
- {
- VN( pShaderBlock->pReflectionData = PRIVATENEW SShaderBlock::SReflectionData );
-
- pShaderBlock->pReflectionData->BytecodeLength = cbShaderBin;
- pShaderBlock->pReflectionData->pBytecode = (BYTE*) pShaderBin;
- pShaderBlock->pReflectionData->pStreamOutDecls[0] =
- pShaderBlock->pReflectionData->pStreamOutDecls[1] =
- pShaderBlock->pReflectionData->pStreamOutDecls[2] =
- pShaderBlock->pReflectionData->pStreamOutDecls[3] = NULL;
- pShaderBlock->pReflectionData->RasterizedStream = 0;
- pShaderBlock->pReflectionData->IsNullGS = FALSE;
- pShaderBlock->pReflectionData->pReflection = NULL;
- pShaderBlock->pReflectionData->InterfaceParameterCount = 0;
- pShaderBlock->pReflectionData->pInterfaceParameters = NULL;
- }
-
- switch (pType->ObjectType)
- {
- case EOT_PixelShader:
- pShaderBlock->pVT = &g_vtPS;
- break;
-
- case EOT_GeometryShaderSO:
- // Get StreamOut decl
- //VH( m_msStructured.Read(&dwOffset) );
- if (cbShaderBin > 0)
- {
- VHD( GetStringAndAddToReflection(psInlineGSSO4->oSODecl, &pShaderBlock->pReflectionData->pStreamOutDecls[0]),
- "Invalid pEffectBuffer: cannot read stream out decl." );
- }
- pShaderBlock->pVT = &g_vtGS;
- break;
-
- case EOT_VertexShader5:
- case EOT_GeometryShader5:
- case EOT_HullShader5:
- case EOT_DomainShader5:
- case EOT_PixelShader5:
- case EOT_ComputeShader5:
- // Get StreamOut decls
- if (cbShaderBin > 0)
- {
- for( UINT iDecl=0; iDecl < psInlineShader5->cSODecls; ++iDecl )
- {
- VHD( GetStringAndAddToReflection(psInlineShader5->oSODecls[iDecl], &pShaderBlock->pReflectionData->pStreamOutDecls[iDecl]),
- "Invalid pEffectBuffer: cannot read stream out decls." );
- }
- pShaderBlock->pReflectionData->RasterizedStream = psInlineShader5->RasterizedStream;
- pShaderBlock->pReflectionData->InterfaceParameterCount = psInlineShader5->cInterfaceBindings;
- VH( GetInterfaceParametersAndAddToReflection( psInlineShader5->cInterfaceBindings, psInlineShader5->oInterfaceBindings, &pShaderBlock->pReflectionData->pInterfaceParameters ) );
- }
- switch (pType->ObjectType)
- {
- case EOT_VertexShader5:
- pShaderBlock->pVT = &g_vtVS;
- break;
- case EOT_GeometryShader5:
- pShaderBlock->pVT = &g_vtGS;
- break;
- case EOT_HullShader5:
- pShaderBlock->pVT = &g_vtHS;
- break;
- case EOT_DomainShader5:
- pShaderBlock->pVT = &g_vtDS;
- break;
- case EOT_PixelShader5:
- pShaderBlock->pVT = &g_vtPS;
- break;
- case EOT_ComputeShader5:
- pShaderBlock->pVT = &g_vtCS;
- break;
- default:
- VH( E_FAIL );
- }
- break;
-
- case EOT_GeometryShader:
- pShaderBlock->pVT = &g_vtGS;
- break;
-
- case EOT_VertexShader:
- pShaderBlock->pVT = &g_vtVS;
- break;
-
- default:
- VHD( E_FAIL, "Invalid pEffectBuffer: invalid shader type." );
- }
- }
- }
- else if (pType->IsObjectType(EOT_String))
- {
- // Strings
-
- chkElementsTotal += m_pEffect->m_StringCount;
- VHD( chkElementsTotal.GetValue(&elementsTotal), "Overflow: string object count." );
- VBD( elementsTotal <= m_pHeader->cStrings, "Invalid pEffectBuffer: string count mismatch." );
-
- pVar->Data.pString = &m_pEffect->m_pStrings[m_pEffect->m_StringCount];
-
- for (iElement=0; iElement<elementsToRead; iElement++)
- {
- UINT dwOffset;
- SString *pString;
-
- pString = &m_pEffect->m_pStrings[m_pEffect->m_StringCount];
- m_pEffect->m_StringCount++;
-
- // Get string
- VHD( m_msStructured.Read(&dwOffset), "Invalid pEffectBuffer: cannot read string offset." );
- VHD( GetStringAndAddToReflection(dwOffset, &pString->pString), "Invalid pEffectBuffer: cannot read string." );
- }
- }
- else if (pType->IsShaderResource())
- {
- // Textures/buffers
-
- chkElementsTotal += m_pEffect->m_ShaderResourceCount;
- VHD( chkElementsTotal.GetValue(&elementsTotal), "Overflow: SRV object count." );
- VBD( elementsTotal <= m_pHeader->cShaderResources, "Invalid pEffectBuffer: SRV count mismatch." );
-
- pVar->Data.pShaderResource = &m_pEffect->m_pShaderResources[m_pEffect->m_ShaderResourceCount];
- m_pEffect->m_ShaderResourceCount += elementsToRead;
- }
- else if (pType->IsUnorderedAccessView())
- {
- // UnorderedAccessViews
-
- chkElementsTotal += m_pEffect->m_UnorderedAccessViewCount;
- VHD( chkElementsTotal.GetValue(&elementsTotal), "Overflow: UAV object count." );
- VBD( elementsTotal <= m_pHeader->cUnorderedAccessViews, "Invalid pEffectBuffer: UAV count mismatch." );
-
- pVar->Data.pUnorderedAccessView = &m_pEffect->m_pUnorderedAccessViews[m_pEffect->m_UnorderedAccessViewCount];
- m_pEffect->m_UnorderedAccessViewCount += elementsToRead;
- }
- else if (pType->IsRenderTargetView())
- {
- // RenderTargets
-
- chkElementsTotal += m_pEffect->m_RenderTargetViewCount;
- VHD( chkElementsTotal.GetValue(&elementsTotal), "Overflow: RTV object count." );
- VBD( elementsTotal <= m_pHeader->cRenderTargetViews, "Invalid pEffectBuffer: RTV count mismatch." );
-
- pVar->Data.pRenderTargetView = &m_pEffect->m_pRenderTargetViews[m_pEffect->m_RenderTargetViewCount];
- m_pEffect->m_RenderTargetViewCount += elementsToRead;
- }
- else if (pType->IsDepthStencilView())
- {
- // DepthStencilViews
-
- chkElementsTotal += m_pEffect->m_DepthStencilViewCount;
- VHD( chkElementsTotal.GetValue(&elementsTotal), "Overflow: DSV object count." );
- VBD( elementsTotal <= m_pHeader->cDepthStencilViews, "Invalid pEffectBuffer: DSV count mismatch." );
-
- pVar->Data.pDepthStencilView = &m_pEffect->m_pDepthStencilViews[m_pEffect->m_DepthStencilViewCount];
- m_pEffect->m_DepthStencilViewCount += elementsToRead;
- }
- else
- {
- VHD( E_FAIL, "Invalid pEffectBuffer: DSV count mismatch." );
- }
-
- // Read annotations
- VH( LoadAnnotations(&pVar->AnnotationCount, &pVar->pAnnotations) );
- }
-lExit:
- return hr;
-}
-
-
-// Read info from the compiled blob and initialize an interface variable
-HRESULT CEffectLoader::LoadInterfaceVariables()
-{
- HRESULT hr = S_OK;
- UINT iBlock;
- UINT cBlocks;
-
- cBlocks = m_pHeader->cInterfaceVariables;
-
- for (iBlock=0; iBlock<cBlocks; iBlock++)
- {
- SBinaryInterfaceVariable *psBlock;
- SGlobalVariable *pVar;
- SType *pType;
- UINT elementsToRead;
- CCheckedDword chkElementsTotal;
- UINT elementsTotal;
- void *pDefaultValue;
-
- // Read variable info
- VHD( m_msStructured.Read((void**) &psBlock, sizeof(*psBlock)), "Invalid pEffectBuffer: cannot read interface block." );
- VBD( m_pEffect->m_VariableCount < (m_pHeader->Effect.cObjectVariables + m_pHeader->Effect.cNumericVariables + m_pHeader->cInterfaceVariables),
- "Internal loading error: variable count mismatch." );
- pVar = &m_pEffect->m_pVariables[m_pEffect->m_VariableCount];
-
- // Get type
- VH( LoadTypeAndAddToPool(&pType, psBlock->oType) );
-
- // Make sure the right polymorphic type is created
- VH( PlacementNewVariable(pVar, pType, FALSE) );
-
- pVar->pEffect = m_pEffect;
- pVar->pType = pType;
- pVar->pCB = NULL;
- pVar->ExplicitBindPoint = (UINT)-1;
- pVar->pSemantic = NULL;
-
- // Get name
- VHD( GetStringAndAddToReflection(psBlock->oName, &pVar->pName), "Invalid pEffectBuffer: cannot read interface name." );
-
- m_pEffect->m_VariableCount++;
- elementsToRead = max(1, pType->Elements);
- chkElementsTotal = elementsToRead;
-
- VBD( pType->IsInterface(), "Internal loading error: invlaid type for interface." );
-
- chkElementsTotal += m_pEffect->m_InterfaceCount;
- VHD( chkElementsTotal.GetValue(&elementsTotal), "Overflow: interface count." );
- VBD( elementsTotal <= m_pHeader->cInterfaceVariableElements, "Invalid pEffectBuffer: interface count mismatch." );
-
- pVar->Data.pInterface = &m_pEffect->m_pInterfaces[m_pEffect->m_InterfaceCount];
- m_pEffect->m_InterfaceCount += elementsToRead;
-
- // Get default value
- if (0 != psBlock->oDefaultValue)
- {
- VHD( m_msUnstructured.ReadAtOffset(psBlock->oDefaultValue, elementsToRead * sizeof(SBinaryInterfaceInitializer), &pDefaultValue),
- "Invalid pEffectBuffer: cannot read interface initializer offset." );
- for( UINT i=0; i < elementsToRead; i++ )
- {
- SBinaryInterfaceInitializer* pInterfaceInit = &((SBinaryInterfaceInitializer*)pDefaultValue)[i];
- LPCSTR pClassInstanceName;
- VHD( m_msUnstructured.ReadAtOffset(pInterfaceInit->oInstanceName, &pClassInstanceName), "Invalid pEffectBuffer: cannot read interface initializer." );
-
- SGlobalVariable *pCIVariable = m_pEffect->FindVariableByName(pClassInstanceName);
- VBD( pCIVariable != NULL, "Loading error: cannot find class instance for interface initializer." );
- VBD( pCIVariable->pType->IsClassInstance(), "Loading error: variable type mismatch for interface initializer." );
- if( pInterfaceInit->ArrayIndex == (UINT)-1 )
- {
- VBD( pCIVariable->pType->Elements == 0, "Loading error: array mismatch for interface initializer." );
- pVar->Data.pInterface[i].pClassInstance = (SClassInstanceGlobalVariable*)pCIVariable;
- }
- else
- {
- VBD( pCIVariable->pType->Elements > 0, "Loading error: array mismatch for interface initializer." );
- VBD( pInterfaceInit->ArrayIndex < pCIVariable->pType->Elements, "Loading error: array index out of range." );
-
- SMember* pMember = (SMember*)pCIVariable->GetElement( pInterfaceInit->ArrayIndex );
- VBD( pMember->IsValid(), "Loading error: cannot find member by name." );
- VBD( pMember->pType->IsClassInstance(), "Loading error: member type mismatch for interface initializer." );
- pVar->Data.pInterface[i].pClassInstance = (SClassInstanceGlobalVariable*)pMember;
- }
- }
- }
-
-
- // Read annotations
- VH( LoadAnnotations(&pVar->AnnotationCount, &pVar->pAnnotations) );
- }
-lExit:
- return hr;
-}
-
-
-// Read info from the compiled blob and initialize a group (and contained techniques and passes)
-HRESULT CEffectLoader::LoadGroups()
-{
- HRESULT hr = S_OK;
- UINT iGroup;
- UINT TechniquesInEffect = 0;
-
- for( iGroup=0; iGroup<m_pHeader->cGroups; iGroup++ )
- {
- SGroup *pGroup = &m_pEffect->m_pGroups[iGroup];
- SBinaryGroup *psGroup;
-
- // Read group info
- VHD( m_msStructured.Read((void**) &psGroup, sizeof(*psGroup)), "Invalid pEffectBuffer: cannot read group." );
- pGroup->TechniqueCount = psGroup->cTechniques;
- VN( pGroup->pTechniques = PRIVATENEW STechnique[pGroup->TechniqueCount] );
- VHD( GetStringAndAddToReflection(psGroup->oName, &pGroup->pName), "Invalid pEffectBuffer: cannot read group name." );
-
- if( pGroup->pName == NULL )
- {
- VBD( m_pEffect->m_pNullGroup == NULL, "Internal loading error: multiple NULL groups." );
- m_pEffect->m_pNullGroup = pGroup;
- }
-
- // Read annotations
- VH( LoadAnnotations(&pGroup->AnnotationCount, &pGroup->pAnnotations) );
-
- UINT iTechnique;
- for( iTechnique=0; iTechnique < psGroup->cTechniques; iTechnique++ )
- {
- VH( LoadTechnique( &pGroup->pTechniques[iTechnique] ) );
- }
- TechniquesInEffect += psGroup->cTechniques;
- }
-
- VBD( TechniquesInEffect == m_pHeader->cTechniques, "Loading error: technique count mismatch." );
- m_pEffect->m_TechniqueCount = m_pHeader->cTechniques;
- m_pEffect->m_GroupCount = m_pHeader->cGroups;
-
-lExit:
- return hr;
-}
-
-
-// Read info from the compiled blob and initialize a technique (and contained passes)
-HRESULT CEffectLoader::LoadTechnique( STechnique* pTech )
-{
- HRESULT hr = S_OK;
- UINT iPass;
-
- SBinaryTechnique *psTech;
-
- // Read technique info
- VHD( m_msStructured.Read((void**) &psTech, sizeof(*psTech)), "Invalid pEffectBuffer: cannot read technique." );
- pTech->PassCount = psTech->cPasses;
- VN( pTech->pPasses = PRIVATENEW SPassBlock[pTech->PassCount] );
- VHD( GetStringAndAddToReflection(psTech->oName, &pTech->pName), "Invalid pEffectBuffer: cannot read technique name." );
-
- // Read annotations
- VH( LoadAnnotations(&pTech->AnnotationCount, &pTech->pAnnotations) );
-
- for (iPass=0; iPass<psTech->cPasses; iPass++)
- {
- SBinaryPass *psPass;
- SPassBlock *pPass = &pTech->pPasses[iPass];
-
- // Read pass info
- VHD( m_msStructured.Read((void**) &psPass, sizeof(SBinaryPass)), "Invalid pEffectBuffer: cannot read pass." );
- VHD( GetStringAndAddToReflection(psPass->oName, &pPass->pName), "Invalid pEffectBuffer: cannot read pass name." );
-
- // Read annotations
- VH( LoadAnnotations(&pPass->AnnotationCount, &pPass->pAnnotations) );
-
- VH( LoadAssignments( psPass->cAssignments, &pPass->pAssignments, (BYTE*)pPass, &pPass->BackingStore.RenderTargetViewCount, &pPass->AssignmentCount ) );
- VBD( pPass->BackingStore.RenderTargetViewCount <= D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT, "Invalid pEffectBuffer: too many RTVs in pass." );
-
- // Initialize other pass information
- pPass->pEffect = m_pEffect;
- pPass->BlockType = EBT_Pass;
- }
-
-lExit:
- return hr;
-}
-
-
-// Read info from the compiled blob and initialize a set of annotations
-HRESULT CEffectLoader::LoadAnnotations(UINT *pcAnnotations, SAnnotation **ppAnnotations)
-{
- HRESULT hr = S_OK;
- UINT cAnnotations, i, oData;
- SAnnotation *pAnnotations = NULL;
-
- VHD( m_msStructured.Read(&cAnnotations), "Invalid pEffectBuffer: cannot read anootation count." );
-
- if (cAnnotations)
- {
- UINT annotationsSize;
- CCheckedDword chkAnnotationsSize;
-
- chkAnnotationsSize = cAnnotations;
- chkAnnotationsSize *= sizeof(SAnnotation);
- VHD( chkAnnotationsSize.GetValue(&annotationsSize), "Overflow in annotations." );
-
- // we allocate raw bytes for annotations because they are polymorphic types that need to be placement new'ed
- VN( pAnnotations = (SAnnotation *) PRIVATENEW BYTE[annotationsSize] );
-
- for (i=0; i<cAnnotations; i++)
- {
- SBinaryAnnotation *psAnnotation;
- SAnnotation *pAn = &pAnnotations[i];
- SType *pType;
-
- VHD( m_msStructured.Read((void**) &psAnnotation, sizeof(SBinaryAnnotation)), "Invalid pEffectBuffer: cannot read annotation." );
-
- VH( LoadTypeAndAddToPool(&pType, psAnnotation->oType) );
-
- // Make sure the right polymorphic type is created
- VH( PlacementNewVariable(pAn, pType, TRUE) );
-
- pAn->pEffect = m_pEffect;
- pAn->pType = pType;
-
- VHD( GetStringAndAddToReflection(psAnnotation->oName, &pAn->pName), "Invalid pEffectBuffer: cannot read annotation name." );
-
- if (pType->IsObjectType(EOT_String))
- {
- UINT cElements = max(1, pType->Elements);
- UINT j;
- VN( pAn->Data.pString = PRIVATENEW SString[cElements] );
- for (j = 0; j < cElements; ++ j)
- {
- // Read initializer offset
- VHD( m_msStructured.Read(&oData), "Invalid pEffectBuffer: cannot read string." );
- VHD( GetStringAndAddToReflection(oData, &pAn->Data.pString[j].pString), "Invalid pEffectBuffer: cannot read string initializer." );
- }
- }
- else if (pType->BelongsInConstantBuffer())
- {
- void *pDefaultValue;
- UINT bytesUnpacked;
-
- // Read initializer offset
- VHD( m_msStructured.Read(&oData), "Invalid pEffectBuffer: cannot read annotation." );
-
- VBD( oData != 0, "Invalid pEffectBuffer: invalid anotation offset." );
-
- VN( pAn->Data.pGeneric = PRIVATENEW BYTE[pType->TotalSize] );
- ZeroMemory(pAn->Data.pGeneric, pType->TotalSize);
- VHD( m_msUnstructured.ReadAtOffset(oData, pType->PackedSize, &pDefaultValue), "Invalid pEffectBuffer: cannot read variable default value." );
- VH( UnpackData((BYTE*) pAn->Data.pGeneric, (BYTE*) pDefaultValue, pType->PackedSize, pType, &bytesUnpacked) );
- VBD( bytesUnpacked == pType->PackedSize, "Invalid pEffectBuffer: packed sizes to not match." );
- }
- else
- {
- VHD( E_FAIL, "Invalid pEffectBuffer: invalid annotation type." );
- }
- }
- }
-
- *pcAnnotations = cAnnotations;
- *ppAnnotations = pAnnotations;
-lExit:
-
- return hr;
-}
-
-//////////////////////////////////////////////////////////////////////////
-// Build shader block dependencies from shader metadata
-//////////////////////////////////////////////////////////////////////////
-
-//
-// Grabs shader resource dependency information from the bytecode of the shader
-// (cbuffer, tbuffer, texture, buffer, sampler, and UAV dependencies),
-// and sets up the given SShaderBlock to point to the dependencies within the effect
-//
-HRESULT CEffectLoader::GrabShaderData(SShaderBlock *pShaderBlock)
-{
- HRESULT hr = S_OK;
- UINT i, j;
- CEffectVector<SRange> vRanges[ER_Count], *pvRange;
- SRange *pRange = NULL;
- CEffectVector<SConstantBuffer*> vTBuffers;
-
- //////////////////////////////////////////////////////////////////////////
- // Step 1: iterate through the resource binding structures and build
- // an "optimized" list of all of the dependencies
-
- D3D11_SHADER_DESC ShaderDesc;
- pShaderBlock->pReflectionData->pReflection->GetDesc( &ShaderDesc );
-
- // Since we have the shader desc, let's find out if this is a NULL GS
- if( D3D11_SHVER_GET_TYPE( ShaderDesc.Version ) == D3D11_SHVER_VERTEX_SHADER && pShaderBlock->GetShaderType() == EOT_GeometryShader )
- {
- pShaderBlock->pReflectionData->IsNullGS = TRUE;
- }
-
- pShaderBlock->CBDepCount = pShaderBlock->ResourceDepCount = pShaderBlock->TBufferDepCount = pShaderBlock->SampDepCount = 0;
- pShaderBlock->UAVDepCount = pShaderBlock->InterfaceDepCount = 0;
-
- for(i = 0; i < ShaderDesc.BoundResources; i++)
- {
- LPCSTR pName;
- UINT bindPoint, size;
- ERanges eRange;
- SShaderResource *pShaderResource = NULL;
- SUnorderedAccessView *pUnorderedAccessView = NULL;
- SSamplerBlock *pSampler = NULL;
- SConstantBuffer *pCB = NULL;
- SVariable *pVariable = NULL;
- BOOL isFX9TextureLoad = FALSE;
- D3D11_SHADER_INPUT_BIND_DESC ResourceDesc;
-
- pShaderBlock->pReflectionData->pReflection->GetResourceBindingDesc( i, &ResourceDesc );
-
- // HUGE ASSUMPTION: the bindpoints we read in the shader metadata are sorted;
- // i.e. bindpoints are steadily increasing
- // If this assumption is not met, then we will hit an assert below
-
- pName = ResourceDesc.Name;
- bindPoint = ResourceDesc.BindPoint;
- size = ResourceDesc.BindCount;
-
- switch( ResourceDesc.Type )
- {
- case D3D10_SIT_CBUFFER:
- eRange = ER_CBuffer;
-
- pCB = m_pEffect->FindCB(pName);
- VBD( NULL != pCB, "Loading error: cannot find cbuffer." );
- VBD( size == 1, "Loading error: cbuffer arrays are not supported." );
- break;
-
- case D3D10_SIT_TBUFFER:
- eRange = ER_Texture;
-
- pCB = m_pEffect->FindCB(pName);
- VBD( NULL != pCB, "Loading error: cannot find tbuffer." );
- VBD( FALSE != pCB->IsTBuffer, "Loading error: cbuffer found where tbuffer is expected." );
- VBD( size == 1, "Loading error: tbuffer arrays are not supported." );
- pShaderResource = &pCB->TBuffer;
- break;
-
- case D3D10_SIT_TEXTURE:
- case D3D11_SIT_STRUCTURED:
- case D3D11_SIT_BYTEADDRESS:
- eRange = ER_Texture;
-
- pVariable = m_pEffect->FindVariableByNameWithParsing(pName);
- VBD( pVariable != NULL, "Loading error: cannot find SRV variable." );
- UINT elements;
- elements = max(1, pVariable->pType->Elements);
- VBD( size <= elements, "Loading error: SRV array size mismatch." );
-
- if (pVariable->pType->IsShaderResource())
- {
- // this is just a straight texture assignment
- pShaderResource = pVariable->Data.pShaderResource;
- }
- else
- {
- // This is a FX9/HLSL9-style texture load instruction that specifies only a sampler
- VBD( pVariable->pType->IsSampler(), "Loading error: shader dependency is neither an SRV nor sampler.");
- isFX9TextureLoad = TRUE;
- pSampler = pVariable->Data.pSampler;
- // validate that all samplers actually used (i.e. based on size, not elements) in this variable have a valid TEXTURE assignment
- for (j = 0; j < size; ++ j)
- {
- if (NULL == pSampler[j].BackingStore.pTexture)
- {
- // print spew appropriately for samplers vs sampler arrays
- if (0 == pVariable->pType->Elements)
- {
- DPF(0, "%s: Sampler %s does not have a texture bound to it, even though the sampler is used in a DX9-style texture load instruction", g_szEffectLoadArea, pName);
- }
- else
- {
- DPF(0, "%s: Sampler %s[%d] does not have a texture bound to it, even though the sampler array is used in a DX9-style texture load instruction", g_szEffectLoadArea, pName, j);
- }
-
- VH( E_FAIL );
- }
- }
- }
- break;
-
- case D3D11_SIT_UAV_RWTYPED:
- case D3D11_SIT_UAV_RWSTRUCTURED:
- case D3D11_SIT_UAV_RWBYTEADDRESS:
- case D3D11_SIT_UAV_APPEND_STRUCTURED:
- case D3D11_SIT_UAV_CONSUME_STRUCTURED:
- case D3D11_SIT_UAV_RWSTRUCTURED_WITH_COUNTER:
- eRange = ER_UnorderedAccessView;
-
- pVariable = m_pEffect->FindVariableByNameWithParsing(pName);
- VBD( pVariable != NULL, "Loading error: cannot find UAV variable." );
- VBD( size <= max(1, pVariable->pType->Elements), "Loading error: UAV array index out of range." );
- VBD( pVariable->pType->IsUnorderedAccessView(), "Loading error: UAV variable expected." );
- pUnorderedAccessView = pVariable->Data.pUnorderedAccessView;
- break;
-
- case D3D10_SIT_SAMPLER:
- eRange = ER_Sampler;
-
- pVariable = m_pEffect->FindVariableByNameWithParsing(pName);
- VBD( pVariable != NULL, "Loading error: cannot find sampler variable." );
- VBD( size <= max(1, pVariable->pType->Elements), "Loading error: sampler array index out of range." );
- VBD( pVariable->pType->IsSampler(), "Loading error: sampler variable expected." );
- pSampler = pVariable->Data.pSampler;
- break;
-
- default:
- VHD( E_FAIL, "Internal loading error: unexpected shader dependency type." );
- };
-
- //
- // Here's where the "optimized" part comes in; whenever there's
- // a resource dependency, see if it's located contiguous to
- // an existing resource dependency and merge them together
- // if possible
- //
- UINT rangeCount;
- pvRange = &vRanges[eRange];
- rangeCount = pvRange->GetSize();
-
- if ( rangeCount > 0 )
- {
- // Can we continue an existing range?
- pRange = &( (*pvRange)[rangeCount - 1] );
-
- // Make sure that bind points are strictly increasing,
- // otherwise this algorithm breaks and we'd get worse runtime performance
- D3DXASSERT(pRange->last <= bindPoint);
-
- if ( pRange->last != bindPoint )
- {
- if( eRange != ER_UnorderedAccessView )
- {
- // No we can't. Begin a new range by setting rangeCount to 0 and triggering the next IF
- rangeCount = 0;
- }
- else
- {
- // UAVs will always be located in one range, as they are more expensive to set
- while(pRange->last < bindPoint)
- {
- VHD( pRange->vResources.Add(&g_NullUnorderedAccessView), "Internal loading error: cannot add UAV to range." );
- pRange->last++;
- }
- }
- }
- }
-
- if ( rangeCount == 0 )
- {
- VN( pRange = pvRange->Add() );
- pRange->start = bindPoint;
- }
-
- pRange->last = bindPoint + size;
-
- switch( ResourceDesc.Type )
- {
- case D3D10_SIT_CBUFFER:
- VHD( pRange->vResources.Add(pCB), "Internal loading error: cannot add cbuffer to range." );
- break;
- case D3D10_SIT_TBUFFER:
- VHD( pRange->vResources.Add(pShaderResource), "Internal loading error: cannot add tbuffer to range." );
- VHD( vTBuffers.Add( (SConstantBuffer*)pCB ), "Internal loading error: cannot add tbuffer to vector." );
- break;
- case D3D10_SIT_TEXTURE:
- case D3D11_SIT_STRUCTURED:
- case D3D11_SIT_BYTEADDRESS:
- if (isFX9TextureLoad)
- {
- // grab all of the textures from each sampler
- for (j = 0; j < size; ++ j)
- {
- VHD( pRange->vResources.Add(pSampler[j].BackingStore.pTexture), "Internal loading error: cannot add SRV to range." );
- }
- }
- else
- {
- // add the whole array
- for (j = 0; j < size; ++ j)
- {
- VHD( pRange->vResources.Add(pShaderResource + j), "Internal loading error: cannot add SRV to range." );
- }
- }
- break;
- case D3D11_SIT_UAV_RWTYPED:
- case D3D11_SIT_UAV_RWSTRUCTURED:
- case D3D11_SIT_UAV_RWBYTEADDRESS:
- case D3D11_SIT_UAV_APPEND_STRUCTURED:
- case D3D11_SIT_UAV_CONSUME_STRUCTURED:
- case D3D11_SIT_UAV_RWSTRUCTURED_WITH_COUNTER:
- // add the whole array
- for (j = 0; j < size; ++ j)
- {
- VHD( pRange->vResources.Add(pUnorderedAccessView + j), "Internal loading error: cannot add UAV to range." );
- }
- break;
- case D3D10_SIT_SAMPLER:
- // add the whole array
- for (j = 0; j < size; ++ j)
- {
- VHD( pRange->vResources.Add(pSampler + j), "Internal loading error: cannot add sampler to range." );
- }
- break;
- default:
- VHD( E_FAIL, "Internal loading error: unexpected shader dependency type." );
- }
- }
-
-
- //////////////////////////////////////////////////////////////////////////
- // Step 2: iterate through the interfaces and build
- // an "optimized" list of all of the dependencies
-
- UINT NumInterfaces = pShaderBlock->pReflectionData->pReflection->GetNumInterfaceSlots();
- UINT CurInterfaceParameter = 0;
- if( NumInterfaces > 0 )
- {
- D3DXASSERT( ShaderDesc.ConstantBuffers > 0 );
-
- for( i=0; i < ShaderDesc.ConstantBuffers; i++ )
- {
- ID3D11ShaderReflectionConstantBuffer* pCB = pShaderBlock->pReflectionData->pReflection->GetConstantBufferByIndex(i);
- VN( pCB );
- D3D11_SHADER_BUFFER_DESC CBDesc;
- VHD( pCB->GetDesc( &CBDesc ), "Internal loading error: cannot get CB desc." );
- if( CBDesc.Type != D3D11_CT_INTERFACE_POINTERS )
- {
- continue;
- }
-
- for( UINT iVar=0; iVar < CBDesc.Variables; iVar++ )
- {
- ID3D11ShaderReflectionVariable* pInterfaceVar = pCB->GetVariableByIndex( iVar );
- VN( pInterfaceVar );
- D3D11_SHADER_VARIABLE_DESC InterfaceDesc;
- pInterfaceVar->GetDesc( &InterfaceDesc );
-
- LPCSTR pName;
- UINT bindPoint, size;
- SGlobalVariable *pVariable = NULL;
- SInterface *pInterface = NULL;
- UINT VariableElements;
-
- pName = InterfaceDesc.Name;
- bindPoint = InterfaceDesc.StartOffset;
- size = InterfaceDesc.Size;
-
- if( bindPoint == (UINT)-1 )
- {
- continue;
- }
-
- D3DXASSERT( InterfaceDesc.uFlags & D3D11_SVF_INTERFACE_POINTER );
- if( InterfaceDesc.uFlags & D3D11_SVF_INTERFACE_PARAMETER )
- {
- // This interface pointer is a parameter to the shader
- if( pShaderBlock->pReflectionData->InterfaceParameterCount == 0 )
- {
- // There may be no interface parameters in this shader if it was compiled but had no interfaced bound to it.
- // The shader cannot be set (correctly) in any pass.
- continue;
- }
- else
- {
- VBD( CurInterfaceParameter < pShaderBlock->pReflectionData->InterfaceParameterCount,
- "Internal loading error: interface count mismatch.");
- SShaderBlock::SInterfaceParameter* pInterfaceInfo;
- pInterfaceInfo = &pShaderBlock->pReflectionData->pInterfaceParameters[CurInterfaceParameter];
- ++CurInterfaceParameter;
- SGlobalVariable *pParent = m_pEffect->FindVariableByName(pInterfaceInfo->pName);
- VBD( pParent != NULL, "Loading error: cannot find parent type." );
- if( pInterfaceInfo->Index == (UINT)-1 )
- {
- pVariable = pParent;
- VariableElements = pVariable->pType->Elements;
- }
- else
- {
- // We want a specific index of the variable (ex. "MyVar[2]")
- VBD( size == 1, "Loading error: interface array type mismatch." );
- pVariable = (SGlobalVariable*)pParent->GetElement( pInterfaceInfo->Index );
- VBD( pVariable->IsValid(), "Loading error: interface array index out of range." );
- VariableElements = 0;
- }
- }
- }
- else
- {
- // This interface pointer is a global interface used in the shader
- pVariable = m_pEffect->FindVariableByName(pName);
- VBD( pVariable != NULL, "Loading error: cannot find interface variable." );
- VariableElements = pVariable->pType->Elements;
- }
- VBD( size <= max(1, VariableElements), "Loading error: interface array size mismatch." );
- if( pVariable->pType->IsInterface() )
- {
- pInterface = pVariable->Data.pInterface;
- }
- else if( pVariable->pType->IsClassInstance() )
- {
- // For class instances, we create background interfaces which point to the class instance. This is done so
- // the shader can always expect SInterface dependencies, rather than a mix of SInterfaces and class instances
- VN( pInterface = PRIVATENEW SInterface[size] );
- if( VariableElements == 0 )
- {
- D3DXASSERT( size == 1 );
- pInterface[0].pClassInstance = (SClassInstanceGlobalVariable*)pVariable;
- m_BackgroundInterfaces.Add( &pInterface[0] );
- }
- else
- {
- // Fill each element of the SInstance array individually
- VBD( size == VariableElements, "Loading error: class instance array size mismatch." );
- for( UINT iElement=0; iElement < size; iElement++ )
- {
- SGlobalVariable *pElement = (SGlobalVariable*)pVariable->GetElement( iElement );
- VBD( pElement->IsValid(), "Internal loading error: class instance array index out of range." );
- pInterface[iElement].pClassInstance = (SClassInstanceGlobalVariable*)pElement;
- m_BackgroundInterfaces.Add( &pInterface[iElement] );
- }
- }
- }
- else
- {
- VHD( E_FAIL, "Loading error: invalid interface initializer variable type.");
- }
-
- //
- // Here's where the "optimized" part comes in; whenever there's
- // a resource dependency, see if it's located contiguous to
- // an existing resource dependency and merge them together
- // if possible
- //
- UINT rangeCount;
- pvRange = &vRanges[ER_Interfaces];
- rangeCount = pvRange->GetSize();
-
- VBD( rangeCount <= 1, "Internal loading error: invalid range count." );
-
- if ( rangeCount == 0 )
- {
- VN( pRange = pvRange->Add() );
- pRange->start = pRange->last = 0;
- }
- else
- {
- pRange = &( (*pvRange)[0] );
- }
-
- if( bindPoint < pRange->last )
- {
- // add interfaces into the range that already exists
- VBD( bindPoint + size < pRange->last, "Internal loading error: range overlap." );
- for( j = 0; j < size; ++ j )
- {
- pRange->vResources[j + bindPoint] = pInterface + j;
- }
- }
- else
- {
- // add interfaces to the end of the range
-
- // add missing interface slots, if necessary
- while(pRange->last < bindPoint)
- {
- VHD( pRange->vResources.Add(&g_NullInterface), "Internal loading error: cannot add NULL interface to range." );
- pRange->last++;
- }
-
- D3DXASSERT( bindPoint == pRange->last );
- for( j=0; j < size; ++ j )
- {
- VHD( pRange->vResources.Add(pInterface + j), "Internal loading error: cannot at interface to range." );
- }
- pRange->last = bindPoint + size;
- }
- }
-
- // There is only one interface cbuffer
- break;
- }
- }
-
- //////////////////////////////////////////////////////////////////////////
- // Step 3: allocate room in pShaderBlock for all of the dependency
- // pointers and then hook them up
-
- pShaderBlock->SampDepCount = vRanges[ ER_Sampler ].GetSize();
- pShaderBlock->CBDepCount = vRanges[ ER_CBuffer ].GetSize();
- pShaderBlock->InterfaceDepCount = vRanges[ ER_Interfaces ].GetSize();
- pShaderBlock->ResourceDepCount = vRanges[ ER_Texture ].GetSize();
- pShaderBlock->UAVDepCount = vRanges[ ER_UnorderedAccessView ].GetSize();
- pShaderBlock->TBufferDepCount = vTBuffers.GetSize();
-
- VN( pShaderBlock->pSampDeps = PRIVATENEW SShaderSamplerDependency[pShaderBlock->SampDepCount] );
- VN( pShaderBlock->pCBDeps = PRIVATENEW SShaderCBDependency[pShaderBlock->CBDepCount] );
- VN( pShaderBlock->pInterfaceDeps = PRIVATENEW SInterfaceDependency[pShaderBlock->InterfaceDepCount] );
- VN( pShaderBlock->pResourceDeps = PRIVATENEW SShaderResourceDependency[pShaderBlock->ResourceDepCount] );
- VN( pShaderBlock->pUAVDeps = PRIVATENEW SUnorderedAccessViewDependency[pShaderBlock->UAVDepCount] );
- VN( pShaderBlock->ppTbufDeps = PRIVATENEW SConstantBuffer*[pShaderBlock->TBufferDepCount] );
-
- for (i=0; i<pShaderBlock->CBDepCount; ++i)
- {
- SShaderCBDependency *pDep = &pShaderBlock->pCBDeps[i];
-
- pRange = &vRanges[ER_CBuffer][i];
-
- pDep->StartIndex = pRange->start;
- pDep->Count = pRange->last - pDep->StartIndex;
- pDep->ppFXPointers = PRIVATENEW SConstantBuffer*[ pDep->Count ];
- pDep->ppD3DObjects = PRIVATENEW ID3D11Buffer*[ pDep->Count ];
-
- D3DXASSERT(pDep->Count == pRange->vResources.GetSize());
- for (j=0; j<pDep->Count; ++j)
- {
- pDep->ppFXPointers[j] = (SConstantBuffer *)pRange->vResources[j];
- pDep->ppD3DObjects[j] = NULL;
- }
- }
-
- for (i=0; i<pShaderBlock->SampDepCount; ++i)
- {
- SShaderSamplerDependency *pDep = &pShaderBlock->pSampDeps[i];
-
- pRange = &vRanges[ER_Sampler][i];
-
- pDep->StartIndex = pRange->start;
- pDep->Count = pRange->last - pDep->StartIndex;
- pDep->ppFXPointers = PRIVATENEW SSamplerBlock*[ pDep->Count ];
- pDep->ppD3DObjects = PRIVATENEW ID3D11SamplerState*[ pDep->Count ];
-
- D3DXASSERT(pDep->Count == pRange->vResources.GetSize());
- for (j=0; j<pDep->Count; ++j)
- {
- pDep->ppFXPointers[j] = (SSamplerBlock *) pRange->vResources[j];
- pDep->ppD3DObjects[j] = NULL;
- }
- }
-
- for (i=0; i<pShaderBlock->InterfaceDepCount; ++i)
- {
- SInterfaceDependency *pDep = &pShaderBlock->pInterfaceDeps[i];
-
- pRange = &vRanges[ER_Interfaces][i];
-
- pDep->StartIndex = pRange->start;
- pDep->Count = pRange->last - pDep->StartIndex;
- pDep->ppFXPointers = PRIVATENEW SInterface*[ pDep->Count ];
- pDep->ppD3DObjects = PRIVATENEW ID3D11ClassInstance*[ pDep->Count ];
-
- D3DXASSERT(pDep->Count == pRange->vResources.GetSize());
- for (j=0; j<pDep->Count; ++j)
- {
- pDep->ppFXPointers[j] = (SInterface *) pRange->vResources[j];
- pDep->ppD3DObjects[j] = NULL;
- }
- }
-
- for (i=0; i<pShaderBlock->ResourceDepCount; ++i)
- {
- SShaderResourceDependency *pDep = &pShaderBlock->pResourceDeps[i];
-
- pRange = &vRanges[ER_Texture][i];
-
- pDep->StartIndex = pRange->start;
- pDep->Count = pRange->last - pDep->StartIndex;
- pDep->ppFXPointers = PRIVATENEW SShaderResource*[ pDep->Count ];
- pDep->ppD3DObjects = PRIVATENEW ID3D11ShaderResourceView*[ pDep->Count ];
-
- D3DXASSERT(pDep->Count == pRange->vResources.GetSize());
- for (j=0; j<pDep->Count; ++j)
- {
- pDep->ppFXPointers[j] = (SShaderResource *) pRange->vResources[j];
- pDep->ppD3DObjects[j] = NULL;
- }
- }
-
- for (i=0; i<pShaderBlock->UAVDepCount; ++i)
- {
- SUnorderedAccessViewDependency *pDep = &pShaderBlock->pUAVDeps[i];
-
- pRange = &vRanges[ER_UnorderedAccessView][i];
-
- pDep->StartIndex = pRange->start;
- pDep->Count = pRange->last - pDep->StartIndex;
- pDep->ppFXPointers = PRIVATENEW SUnorderedAccessView*[ pDep->Count ];
- pDep->ppD3DObjects = PRIVATENEW ID3D11UnorderedAccessView*[ pDep->Count ];
-
- D3DXASSERT(pDep->Count == pRange->vResources.GetSize());
- for (j=0; j<pDep->Count; ++j)
- {
- pDep->ppFXPointers[j] = (SUnorderedAccessView *) pRange->vResources[j];
- pDep->ppD3DObjects[j] = NULL;
- }
- }
-
- if (pShaderBlock->TBufferDepCount > 0)
- {
- memcpy(pShaderBlock->ppTbufDeps, &vTBuffers[0], pShaderBlock->TBufferDepCount * sizeof(SConstantBuffer*));
- }
-
-lExit:
- return hr;
-}
-
-// Create shader reflection interface and grab dependency info
-HRESULT CEffectLoader::BuildShaderBlock(SShaderBlock *pShaderBlock)
-{
- HRESULT hr = S_OK;
-
- // unused shader block? that's not right
- VBD( pShaderBlock->pVT != NULL, "Internal loading error: NULL shader vtable." );
-
- D3DXASSERT(pShaderBlock->pD3DObject == NULL);
-
- if (NULL == pShaderBlock->pReflectionData)
- {
- // File contains a shader variable without an assigned shader, or this is a null assignment.
- // Usually, this is called by one of these guys:
- // SetVertexShader( NULL );
- // or
- // vertexshader g_VS = NULL;
- return S_OK;
- }
-
- // Initialize the reflection interface
- VHD( D3DReflect( pShaderBlock->pReflectionData->pBytecode, pShaderBlock->pReflectionData->BytecodeLength, IID_ID3D11ShaderReflection, (void**)&pShaderBlock->pReflectionData->pReflection ),
- "Internal loading error: cannot create shader reflection object." );
-
- // Get dependencies
- VH( GrabShaderData( pShaderBlock ) );
-
- // Grab input signatures for VS
- if( EOT_VertexShader == pShaderBlock->GetShaderType() )
- {
- D3DXASSERT( pShaderBlock->pInputSignatureBlob == NULL );
- VHD( D3DGetInputSignatureBlob( pShaderBlock->pReflectionData->pBytecode, pShaderBlock->pReflectionData->BytecodeLength, &pShaderBlock->pInputSignatureBlob ),
- "Internal loading error: cannot get input signature." );
- }
-
-lExit:
- return hr;
-}
-
-#undef PRIVATENEW
-
-
-//////////////////////////////////////////////////////////////////////////
-// Code to relocate data to private heaps (reflection & runtime effect)
-//
-// Important note about alignment: all reasonable chunks of data are
-// machine word aligned (that is, any piece of data moved as a whole is
-// aligned as a whole. This means that when computing m_ReflectionMemory
-// or m_EffectMemory, each addition is aligned. This also means
-// that, when later relocating that same memory, you must call MoveData
-// or MoveString on the same chunks that were aligned. This is
-// because: Align(a * b) != a * Align(b).
-//////////////////////////////////////////////////////////////////////////
-
-//////////////////////////////////////////////////////////////////////////
-// Reflection reallocation code
-//////////////////////////////////////////////////////////////////////////
-
-HRESULT CEffectLoader::CalculateAnnotationSize(UINT cAnnotations, SAnnotation *pAnnotations)
-{
- HRESULT hr = S_OK;
- UINT i;
-
- m_ReflectionMemory += AlignToPowerOf2(cAnnotations * sizeof(SAnnotation), c_DataAlignment);
- for (i=0; i<cAnnotations; i++)
- {
- if (pAnnotations[i].pType->BelongsInConstantBuffer())
- {
- m_ReflectionMemory += AlignToPowerOf2(pAnnotations[i].pType->TotalSize, c_DataAlignment);
- }
- else
- {
- VBD( pAnnotations[i].pType->IsObjectType(EOT_String), "Invalid pEffectBuffer: invalid annotation type." );
-
- UINT cElements;
- cElements = max(1, pAnnotations[i].pType->Elements);
-
- m_ReflectionMemory += AlignToPowerOf2(cElements * sizeof(SString), c_DataAlignment);
-
- }
- }
-
-lExit:
- return hr;
-}
-
-HRESULT CEffectLoader::ReallocateAnnotationData(UINT cAnnotations, SAnnotation **ppAnnotations)
-{
- HRESULT hr = S_OK;
- UINT i;
- SAnnotation *pAnnotations;
-
- VHD( m_pReflection->m_Heap.MoveData((void**) ppAnnotations, cAnnotations * sizeof(SAnnotation)),
- "Internal loading error: cannot move annotation data." );
- pAnnotations = *ppAnnotations;
-
- for (i=0; i<cAnnotations; i++)
- {
- SAnnotation *pAn = &pAnnotations[i];
- pAn->pEffect = m_pEffect;
-
- VHD( m_pReflection->m_Heap.MoveString(&pAn->pName), "Internal loading error: cannot move annotation name." );
-
- // Reallocate type later
- if (pAn->pType->BelongsInConstantBuffer())
- {
- VHD( m_pReflection->m_Heap.MoveData( &pAn->Data.pGeneric, pAn->pType->TotalSize ), "Internal loading error: cannot move annotation data." );
- }
- else if (pAnnotations[i].pType->IsObjectType(EOT_String))
- {
- UINT j;
- UINT cElements = max(1, pAn->pType->Elements);
-
- VHD( m_pReflection->m_Heap.MoveData((void**) &pAn->Data.pString, cElements * sizeof(SString)), "Internal loading error: cannot move annotation string." );
- for (j = 0; j < cElements; ++ j)
- {
- VHD( m_pReflection->m_Heap.MoveString(&pAn->Data.pString[j].pString), "Internal loading error: cannot move annotation string element." );
- }
- }
- else
- {
- VHD( E_FAIL, "Invalid pEffectBuffer: invalid annotation type." );
- }
- }
-
-lExit:
- return hr;
-}
-
-HRESULT CEffectLoader::InitializeReflectionDataAndMoveStrings( UINT KnownSize )
-{
- HRESULT hr = S_OK;
- UINT i, j, k;
- UINT cbStrings;
- CEffectHeap *pHeap = &m_pReflection->m_Heap;
-
- // Get byte counts
- cbStrings = m_pEffect->m_StringCount * sizeof( SString );
-
- if( KnownSize )
- {
- m_ReflectionMemory = KnownSize;
- }
- else
- {
- m_ReflectionMemory += AlignToPowerOf2(cbStrings, c_DataAlignment);
-
- for (i=0; i<m_pEffect->m_CBCount; i++)
- {
- VH( CalculateAnnotationSize(m_pEffect->m_pCBs[i].AnnotationCount, m_pEffect->m_pCBs[i].pAnnotations) );
- }
-
- for (i=0; i<m_pEffect->m_VariableCount; i++)
- {
- VH( CalculateAnnotationSize(m_pEffect->m_pVariables[i].AnnotationCount, m_pEffect->m_pVariables[i].pAnnotations) );
- }
-
- for (i=0; i<m_pEffect->m_GroupCount; i++)
- {
- VH( CalculateAnnotationSize(m_pEffect->m_pGroups[i].AnnotationCount, m_pEffect->m_pGroups[i].pAnnotations) );
-
- for (j=0; j<m_pEffect->m_pGroups[i].TechniqueCount; j++)
- {
- VH( CalculateAnnotationSize(m_pEffect->m_pGroups[i].pTechniques[j].AnnotationCount, m_pEffect->m_pGroups[i].pTechniques[j].pAnnotations) );
-
- for (k=0; k<m_pEffect->m_pGroups[i].pTechniques[j].PassCount; k++)
- {
- VH( CalculateAnnotationSize(m_pEffect->m_pGroups[i].pTechniques[j].pPasses[k].AnnotationCount, m_pEffect->m_pGroups[i].pTechniques[j].pPasses[k].pAnnotations) );
- }
- }
- }
-
- // Calculate shader reflection data size
- for (i=0; i<m_pEffect->m_ShaderBlockCount; i++)
- {
- if (NULL != m_pEffect->m_pShaderBlocks[i].pReflectionData)
- {
- m_ReflectionMemory += AlignToPowerOf2(sizeof(SShaderBlock::SReflectionData), c_DataAlignment);
- m_ReflectionMemory += AlignToPowerOf2(m_pEffect->m_pShaderBlocks[i].pReflectionData->BytecodeLength, c_DataAlignment);
- // stream out decl is handled as a string, and thus its size is already factored because of GetStringAndAddToReflection
- }
- }
- }
-
- VHD( pHeap->ReserveMemory(m_ReflectionMemory), "Internal loading error: failed to reserve reflection memory." );
-
- // Strings are handled separately because we are moving them to reflection
- m_pOldStrings = m_pEffect->m_pStrings;
- VHD( pHeap->MoveData((void**) &m_pEffect->m_pStrings, cbStrings), "Internal loading error: cannot move string data." );
- for(i=0; i<m_pEffect->m_StringCount; i++)
- {
- VHD( pHeap->MoveString( &m_pEffect->m_pStrings[i].pString), "Internal loading error: cannot move string pointer." );
- }
-
-lExit:
- return hr;
-}
-
-// Move all reflection data to private heap
-HRESULT CEffectLoader::ReallocateReflectionData( bool Cloning )
-{
- HRESULT hr = S_OK;
- UINT i, j, k;
- CEffectHeap *pHeap = &m_pReflection->m_Heap;
-
- for(i=0; i<m_pEffect->m_CBCount; i++)
- {
- VHD( pHeap->MoveString( &m_pEffect->m_pCBs[i].pName ), "Internal loading error: cannot move CB name." );
- VH( ReallocateAnnotationData(m_pEffect->m_pCBs[i].AnnotationCount, &m_pEffect->m_pCBs[i].pAnnotations) );
- }
-
- for(i=0; i<m_pEffect->m_VariableCount; i++)
- {
- VHD( pHeap->MoveString( &m_pEffect->m_pVariables[i].pName ), "Internal loading error: cannot move variable name." );
- VHD( pHeap->MoveString( &m_pEffect->m_pVariables[i].pSemantic ), "Internal loading error: cannot move variable semantic." );
- VH( ReallocateAnnotationData(m_pEffect->m_pVariables[i].AnnotationCount, &m_pEffect->m_pVariables[i].pAnnotations) );
- }
-
- for(i=0; i<m_pEffect->m_GroupCount; i++)
- {
- VHD( pHeap->MoveString( &m_pEffect->m_pGroups[i].pName ), "Internal loading error: cannot move group name." );
- VH( ReallocateAnnotationData(m_pEffect->m_pGroups[i].AnnotationCount, &m_pEffect->m_pGroups[i].pAnnotations) );
-
- for(j=0; j<m_pEffect->m_pGroups[i].TechniqueCount; j++)
- {
- VHD( pHeap->MoveString( &m_pEffect->m_pGroups[i].pTechniques[j].pName ), "Internal loading error: cannot move technique name." );
- VH( ReallocateAnnotationData(m_pEffect->m_pGroups[i].pTechniques[j].AnnotationCount, &m_pEffect->m_pGroups[i].pTechniques[j].pAnnotations) );
-
- for(k=0; k<m_pEffect->m_pGroups[i].pTechniques[j].PassCount; k++)
- {
- VHD( pHeap->MoveString( &m_pEffect->m_pGroups[i].pTechniques[j].pPasses[k].pName ), "Internal loading error: cannot move pass name." );
- VH( ReallocateAnnotationData(m_pEffect->m_pGroups[i].pTechniques[j].pPasses[k].AnnotationCount, &m_pEffect->m_pGroups[i].pTechniques[j].pPasses[k].pAnnotations) );
- }
- }
- }
-
- if( !Cloning )
- {
- // When not cloning, every member in m_pMemberInterfaces is from a global variable, so we can take pName and pSemantic
- // from the parent variable, which were updated above
- for (i = 0; i < m_pEffect->m_pMemberInterfaces.GetSize(); ++ i)
- {
- SMember* pMember = m_pEffect->m_pMemberInterfaces[i];
- SGlobalVariable* pTopLevelEntity = (SGlobalVariable*)pMember->pTopLevelEntity;
- VH( FixupVariablePointer( &pTopLevelEntity ) );
- pMember->pName = pTopLevelEntity->pName;
- pMember->pSemantic = pTopLevelEntity->pSemantic;
- }
- }
-
- // Move shader bytecode
- for (i=0; i<m_pEffect->m_ShaderBlockCount; i++)
- {
- if (NULL != m_pEffect->m_pShaderBlocks[i].pReflectionData)
- {
- VHD( pHeap->MoveData((void**)&m_pEffect->m_pShaderBlocks[i].pReflectionData, sizeof(SShaderBlock::SReflectionData)),
- "Internal loading error: cannot move shader reflection block." );
- VHD( pHeap->MoveData((void**)&m_pEffect->m_pShaderBlocks[i].pReflectionData->pBytecode, m_pEffect->m_pShaderBlocks[i].pReflectionData->BytecodeLength),
- "Internal loading error: cannot move shader bytecode.");
- for( UINT iDecl=0; iDecl < D3D11_SO_STREAM_COUNT; ++iDecl )
- {
- VHD( pHeap->MoveString(&m_pEffect->m_pShaderBlocks[i].pReflectionData->pStreamOutDecls[iDecl]), "Internal loading error: cannot move SO decl." );
- }
- VH( pHeap->MoveInterfaceParameters(m_pEffect->m_pShaderBlocks[i].pReflectionData->InterfaceParameterCount, &m_pEffect->m_pShaderBlocks[i].pReflectionData->pInterfaceParameters ) );
- }
-
- }
-
-lExit:
- return hr;
-}
-
-//////////////////////////////////////////////////////////////////////////
-// Runtime effect reallocation code
-//////////////////////////////////////////////////////////////////////////
-
-template<class T> HRESULT CEffectLoader::ReallocateBlockAssignments(T* &pBlocks, UINT cBlocks, T* pOldBlocks)
-{
- HRESULT hr = S_OK;
- CEffectHeap *pHeap = &m_pEffect->m_Heap;
- UINT i, j;
-
- for(i=0; i<cBlocks; i++)
- {
- T *pBlock = &pBlocks[i];
- VHD( pHeap->MoveData((void**) &pBlock->pAssignments, sizeof(SAssignment)*pBlock->AssignmentCount), "Internal loading error: cannot move assignment count." );
-
- for (j=0; j<pBlock->AssignmentCount; j++)
- {
- SAssignment *pAssignment = &pBlock->pAssignments[j];
- UINT cbDeps;
-
- // When cloning, convert pointers back into offsets
- if( pOldBlocks )
- {
- T *pOldBlock = &pOldBlocks[i];
- pAssignment->Destination.Offset = (UINT)( (UINT_PTR)pAssignment->Destination.pGeneric - (UINT_PTR)pOldBlock ) ;
- }
-
- // Convert destination pointers from offset to real pointer
- pAssignment->Destination.pGeneric = (BYTE*) pBlock + pAssignment->Destination.Offset;
-
- // Make sure the data pointer points into the backing store
- VBD( pAssignment->Destination.pGeneric >= &pBlock->BackingStore &&
- pAssignment->Destination.pGeneric < (BYTE*) &pBlock->BackingStore + sizeof(pBlock->BackingStore),
- "Internal loading error: assignment destination out of range." );
-
- // Fixup dependencies
- cbDeps = pAssignment->DependencyCount * sizeof(SAssignment::SDependency);
- VHD( pHeap->MoveData((void**) &pAssignment->pDependencies, cbDeps), "Internal loading error: cannot move assignment dependencies." );
-
- SGlobalVariable *pOldVariable = NULL;
- for(UINT iDep=0; iDep<pAssignment->DependencyCount; iDep++)
- {
- SAssignment::SDependency *pDep = &pAssignment->pDependencies[iDep];
- // We ignore all but the last variable because below, we only use the last dependency
- pOldVariable = pDep->pVariable;
- VH( FixupVariablePointer(&pDep->pVariable) );
- }
-
- // Fixup source pointers
- switch(pAssignment->LhsType)
- {
- case ELHS_VertexShaderBlock:
- case ELHS_PixelShaderBlock:
- case ELHS_GeometryShaderBlock:
- case ELHS_HullShaderBlock:
- case ELHS_DomainShaderBlock:
- case ELHS_ComputeShaderBlock:
- VH( FixupShaderPointer(&pAssignment->Source.pShader) );
- break;
-
- case ELHS_DepthStencilBlock:
- VH( FixupDSPointer((SDepthStencilBlock**)&pAssignment->Source.pBlock) );
- break;
- case ELHS_BlendBlock:
- VH( FixupABPointer((SBlendBlock**) &pAssignment->Source.pBlock) );
- break;
- case ELHS_RasterizerBlock:
- VH( FixupRSPointer((SRasterizerBlock**) &pAssignment->Source.pBlock) );
- break;
-
- case ELHS_Texture:
- VH( FixupShaderResourcePointer((SShaderResource**) &pAssignment->Source.pShaderResource) );
- break;
-
- default:
- // Non-object assignment (must have at least one dependency or it would have been pruned by now)
- D3DXASSERT( !pAssignment->IsObjectAssignment() && pAssignment->DependencyCount > 0 );
-
- // Numeric variables must be relocated before this function is called
-
- switch (pAssignment->AssignmentType)
- {
- case ERAT_NumericVariable:
- case ERAT_NumericVariableIndex:
- // the variable or variable array is always the last dependency in the chain
- SGlobalVariable *pVariable;
- pVariable = pAssignment->pDependencies[pAssignment->DependencyCount - 1].pVariable;
- D3DXASSERT( pVariable->pType->BelongsInConstantBuffer() && NULL != pVariable->pCB );
-
- // When cloning, convert pointers back into offsets
- if( pOldBlocks )
- {
- VBD( pOldVariable != NULL, "Internal loading error: pOldVariable is NULL." );
- pAssignment->Source.Offset = pAssignment->Source.pNumeric - pOldVariable->pCB->pBackingStore;
- }
-
- // Convert from offset to pointer
- pAssignment->Source.pNumeric = pVariable->pCB->pBackingStore + pAssignment->Source.Offset;
- break;
-
- default:
- // Shouldn't be able to get here
- D3DXASSERT(0);
- VHD( E_FAIL, "Loading error: invalid assignment type." );
- }
- break;
-
- case ELHS_Invalid:
- VHD( E_FAIL, "Loading error: invalid assignment type." );
- }
-
- D3DXASSERT(m_pEffect->m_LocalTimer > 0);
- m_pEffect->EvaluateAssignment(pAssignment);
- }
- }
-
-lExit:
- return hr;
-}
-
-template<class T> UINT CEffectLoader::CalculateBlockAssignmentSize(T* &pBlocks, UINT cBlocks)
-{
- UINT dwSize = 0;
- UINT i, j;
-
- for(i=0; i<cBlocks; i++)
- {
- SBaseBlock *pBlock = &pBlocks[i];
- dwSize += AlignToPowerOf2(pBlock->AssignmentCount * sizeof(SAssignment), c_DataAlignment);
-
- for (j=0; j<pBlock->AssignmentCount; j++)
- {
- SAssignment *pAssignment = &pBlock->pAssignments[j];
-
- dwSize += AlignToPowerOf2(pAssignment->DependencyCount * sizeof(SAssignment::SDependency), c_DataAlignment);
- }
- }
-
- return dwSize;
-}
-
-HRESULT CEffectLoader::ReallocateShaderBlocks()
-{
- HRESULT hr = S_OK;
- UINT i, j, k;
- CEffectHeap *pHeap = &m_pEffect->m_Heap;
- const char* pError = "Internal loading error: cannot move shader data.";
-
- for (i=0; i<m_pEffect->m_ShaderBlockCount; i++)
- {
- SShaderBlock *pShader = &m_pEffect->m_pShaderBlocks[i];
-
- // pShader->pReflection data and all of its members (bytecode, SO decl, etc.) are handled by ReallocateReflectionData()
- VHD( pHeap->MoveData((void**) &pShader->pCBDeps, pShader->CBDepCount * sizeof(SShaderCBDependency)), pError );
- VHD( pHeap->MoveData((void**) &pShader->pSampDeps, pShader->SampDepCount * sizeof(SShaderSamplerDependency)), pError );
- VHD( pHeap->MoveData((void**) &pShader->pInterfaceDeps, pShader->InterfaceDepCount * sizeof(SInterfaceDependency)), pError );
- VHD( pHeap->MoveData((void**) &pShader->pResourceDeps, pShader->ResourceDepCount * sizeof(SShaderResourceDependency)), pError );
- VHD( pHeap->MoveData((void**) &pShader->pUAVDeps, pShader->UAVDepCount * sizeof(SUnorderedAccessViewDependency)), pError );
- VHD( pHeap->MoveData((void**) &pShader->ppTbufDeps, pShader->TBufferDepCount * sizeof(SConstantBuffer*)), pError );
-
- for (j=0; j<pShader->CBDepCount; j++)
- {
- SShaderCBDependency *pCBDeps = &pShader->pCBDeps[j];
- VHD( pHeap->MoveData((void**) &pCBDeps->ppD3DObjects, pCBDeps->Count * sizeof(ID3D11Buffer*)), pError );
- VHD( pHeap->MoveData((void**) &pCBDeps->ppFXPointers, pCBDeps->Count * sizeof(SConstantBuffer*)), pError );
-
- for (k=0; k<pCBDeps->Count; k++)
- {
- VH( FixupCBPointer( &pCBDeps->ppFXPointers[k] ) );
- }
- }
-
- for (j=0; j<pShader->SampDepCount; j++)
- {
- SShaderSamplerDependency *pSampDeps = &pShader->pSampDeps[j];
- VHD( pHeap->MoveData((void**) &pSampDeps->ppD3DObjects, pSampDeps->Count * sizeof(ID3D11SamplerState*)), pError );
- VHD( pHeap->MoveData((void**) &pSampDeps->ppFXPointers, pSampDeps->Count * sizeof(SSamplerBlock*)), pError );
-
- for (k=0; k<pSampDeps->Count; k++)
- {
- VH( FixupSamplerPointer(&pSampDeps->ppFXPointers[k]) );
- }
- }
-
- for (j=0; j<pShader->InterfaceDepCount; j++)
- {
- SInterfaceDependency *pInterfaceDeps = &pShader->pInterfaceDeps[j];
- VHD( pHeap->MoveData((void**) &pInterfaceDeps->ppD3DObjects, pInterfaceDeps->Count * sizeof(ID3D11ClassInstance*)), pError );
- VHD( pHeap->MoveData((void**) &pInterfaceDeps->ppFXPointers, pInterfaceDeps->Count * sizeof(SInterface*)), pError );
-
- for (k=0; k<pInterfaceDeps->Count; k++)
- {
- VH( FixupInterfacePointer(&pInterfaceDeps->ppFXPointers[k], true) );
- }
- }
-
- for (j=0; j<pShader->ResourceDepCount; j++)
- {
- SShaderResourceDependency *pResourceDeps = &pShader->pResourceDeps[j];
- VHD( pHeap->MoveData((void**) &pResourceDeps->ppD3DObjects, pResourceDeps->Count * sizeof(ID3D11ShaderResourceView*)), pError );
- VHD( pHeap->MoveData((void**) &pResourceDeps->ppFXPointers, pResourceDeps->Count * sizeof(SShaderResource*)), pError );
-
- for (k=0; k<pResourceDeps->Count; k++)
- {
- VH( FixupShaderResourcePointer(&pResourceDeps->ppFXPointers[k]) );
- }
- }
-
- for (j=0; j<pShader->UAVDepCount; j++)
- {
- SUnorderedAccessViewDependency *pUAVDeps = &pShader->pUAVDeps[j];
- VHD( pHeap->MoveData((void**) &pUAVDeps->ppD3DObjects, pUAVDeps->Count * sizeof(ID3D11UnorderedAccessView*)), pError );
- VHD( pHeap->MoveData((void**) &pUAVDeps->ppFXPointers, pUAVDeps->Count * sizeof(SUnorderedAccessView*)), pError );
-
- for (k=0; k<pUAVDeps->Count; k++)
- {
- VH( FixupUnorderedAccessViewPointer(&pUAVDeps->ppFXPointers[k]) );
- }
- }
-
- for (j=0; j<pShader->TBufferDepCount; j++)
- {
- VH( FixupCBPointer( &pShader->ppTbufDeps[j] ) );
- }
- }
-
-lExit:
- return hr;
-}
-
-
-UINT CEffectLoader::CalculateShaderBlockSize()
-{
- UINT dwSize = 0;
- UINT i, j;
-
- for (i=0; i<m_pEffect->m_ShaderBlockCount; i++)
- {
- SShaderBlock *pShader = &m_pEffect->m_pShaderBlocks[i];
-
- dwSize += AlignToPowerOf2(pShader->CBDepCount * sizeof(SShaderCBDependency), c_DataAlignment);
- dwSize += AlignToPowerOf2(pShader->SampDepCount * sizeof(SShaderSamplerDependency), c_DataAlignment);
- dwSize += AlignToPowerOf2(pShader->InterfaceDepCount * sizeof(SInterfaceDependency), c_DataAlignment);
- dwSize += AlignToPowerOf2(pShader->ResourceDepCount * sizeof(SShaderResourceDependency), c_DataAlignment);
- dwSize += AlignToPowerOf2(pShader->UAVDepCount * sizeof(SUnorderedAccessViewDependency), c_DataAlignment);
- dwSize += AlignToPowerOf2(pShader->TBufferDepCount * sizeof(SConstantBuffer*), c_DataAlignment);
-
- for (j=0; j<pShader->CBDepCount; j++)
- {
- SShaderCBDependency *pCBDeps = &pShader->pCBDeps[j];
- dwSize += AlignToPowerOf2(pCBDeps->Count * sizeof(ID3D11Buffer*), c_DataAlignment);
- dwSize += AlignToPowerOf2(pCBDeps->Count * sizeof(SConstantBuffer*), c_DataAlignment);
- }
-
- for (j=0; j<pShader->SampDepCount; j++)
- {
- SShaderSamplerDependency *pSampDeps = &pShader->pSampDeps[j];
- dwSize += AlignToPowerOf2(pSampDeps->Count * sizeof(ID3D11SamplerState*), c_DataAlignment);
- dwSize += AlignToPowerOf2(pSampDeps->Count * sizeof(SSamplerBlock*), c_DataAlignment);
- }
-
- for (j=0; j<pShader->InterfaceDepCount; j++)
- {
- SInterfaceDependency *pInterfaceDeps = &pShader->pInterfaceDeps[j];
- dwSize += AlignToPowerOf2(pInterfaceDeps->Count * sizeof(ID3D11ClassInstance*), c_DataAlignment);
- dwSize += AlignToPowerOf2(pInterfaceDeps->Count * sizeof(SInterface*), c_DataAlignment);
- }
-
- for (j=0; j<pShader->ResourceDepCount; j++)
- {
- SShaderResourceDependency *pResourceDeps = &pShader->pResourceDeps[j];
- dwSize += AlignToPowerOf2(pResourceDeps->Count * sizeof(ID3D11ShaderResourceView*), c_DataAlignment);
- dwSize += AlignToPowerOf2(pResourceDeps->Count * sizeof(SShaderResource*), c_DataAlignment);
- }
-
- for (j=0; j<pShader->UAVDepCount; j++)
- {
- SUnorderedAccessViewDependency *pUAVDeps = &pShader->pUAVDeps[j];
- dwSize += AlignToPowerOf2(pUAVDeps->Count * sizeof(ID3D11UnorderedAccessView*), c_DataAlignment);
- dwSize += AlignToPowerOf2(pUAVDeps->Count * sizeof(SUnorderedAccessView*), c_DataAlignment);
- }
- }
-
- return dwSize;
-}
-
-// Move all (non-reflection) effect data to private heap
-HRESULT CEffectLoader::ReallocateEffectData( bool Cloning )
-{
- HRESULT hr = S_OK;
- UINT i, j;
- CEffectHeap *pHeap = &m_pEffect->m_Heap;
- UINT cbCBs = sizeof(SConstantBuffer) * m_pEffect->m_CBCount;
- UINT cbVariables = sizeof(SGlobalVariable) * m_pEffect->m_VariableCount;
- UINT cbGroups = sizeof(STechnique) * m_pEffect->m_GroupCount;
- UINT cbShaders = sizeof(SShaderBlock) * m_pEffect->m_ShaderBlockCount;
- UINT cbDS = sizeof(SDepthStencilBlock) * m_pEffect->m_DepthStencilBlockCount;
- UINT cbAB = sizeof(SBlendBlock) * m_pEffect->m_BlendBlockCount;
- UINT cbRS = sizeof(SRasterizerBlock) * m_pEffect->m_RasterizerBlockCount;
- UINT cbSamplers = sizeof(SSamplerBlock) * m_pEffect->m_SamplerBlockCount;
- UINT cbMemberDatas = sizeof(SMemberDataPointer) * m_pEffect->m_MemberDataCount;
- UINT cbInterfaces = sizeof(SInterface) * m_pEffect->m_InterfaceCount;
- UINT cbBackgroundInterfaces = sizeof(SInterface) * m_BackgroundInterfaces.GetSize();
- UINT cbShaderResources = sizeof(SShaderResource) * m_pEffect->m_ShaderResourceCount;
- UINT cbUnorderedAccessViews = sizeof(SUnorderedAccessView) * m_pEffect->m_UnorderedAccessViewCount;
- UINT cbRenderTargetViews = sizeof(SRenderTargetView) * m_pEffect->m_RenderTargetViewCount;
- UINT cbDepthStencilViews = sizeof(SDepthStencilView) * m_pEffect->m_DepthStencilViewCount;
- UINT cbAnonymousShaders = sizeof(SAnonymousShader) * m_pEffect->m_AnonymousShaderCount;
-
- // Calculate memory needed
- m_EffectMemory += AlignToPowerOf2(cbCBs, c_DataAlignment);
- m_EffectMemory += AlignToPowerOf2(cbVariables, c_DataAlignment);
- m_EffectMemory += AlignToPowerOf2(cbGroups, c_DataAlignment);
- m_EffectMemory += AlignToPowerOf2(cbShaders, c_DataAlignment);
- m_EffectMemory += AlignToPowerOf2(cbMemberDatas, c_DataAlignment);
- m_EffectMemory += AlignToPowerOf2(cbInterfaces + cbBackgroundInterfaces, c_DataAlignment);
- m_EffectMemory += AlignToPowerOf2(cbShaderResources, c_DataAlignment);
- m_EffectMemory += AlignToPowerOf2(cbUnorderedAccessViews, c_DataAlignment);
- m_EffectMemory += AlignToPowerOf2(cbRenderTargetViews, c_DataAlignment);
- m_EffectMemory += AlignToPowerOf2(cbDepthStencilViews, c_DataAlignment);
- m_EffectMemory += AlignToPowerOf2(cbDS, c_DataAlignment);
- m_EffectMemory += AlignToPowerOf2(cbAB, c_DataAlignment);
- m_EffectMemory += AlignToPowerOf2(cbRS, c_DataAlignment);
- m_EffectMemory += AlignToPowerOf2(cbSamplers, c_DataAlignment);
- m_EffectMemory += AlignToPowerOf2(cbAnonymousShaders, c_DataAlignment);
-
- m_EffectMemory += CalculateShaderBlockSize();
-
- for (i=0; i<m_pEffect->m_CBCount; i++)
- {
- SConstantBuffer *pCB = &m_pEffect->m_pCBs[i];
-
- m_EffectMemory += AlignToPowerOf2(pCB->Size, c_DataAlignment);
- }
-
- for (i=0; i<m_pEffect->m_GroupCount; i++)
- {
- SGroup *pGroup = &m_pEffect->m_pGroups[i];
-
- m_EffectMemory += AlignToPowerOf2(pGroup->TechniqueCount * sizeof(STechnique), c_DataAlignment);
-
- for (j=0; j<pGroup->TechniqueCount; j++)
- {
- STechnique *pTech = &pGroup->pTechniques[j];
-
- m_EffectMemory += AlignToPowerOf2(pTech->PassCount * sizeof(SPassBlock), c_DataAlignment);
- m_EffectMemory += CalculateBlockAssignmentSize(pTech->pPasses, pTech->PassCount);
- }
- };
-
- m_EffectMemory += CalculateBlockAssignmentSize(m_pEffect->m_pBlendBlocks, m_pEffect->m_BlendBlockCount);
- m_EffectMemory += CalculateBlockAssignmentSize(m_pEffect->m_pDepthStencilBlocks, m_pEffect->m_DepthStencilBlockCount);
- m_EffectMemory += CalculateBlockAssignmentSize(m_pEffect->m_pRasterizerBlocks, m_pEffect->m_RasterizerBlockCount);
- m_EffectMemory += CalculateBlockAssignmentSize(m_pEffect->m_pSamplerBlocks, m_pEffect->m_SamplerBlockCount);
-
- // Reserve memory
- VHD( pHeap->ReserveMemory(m_EffectMemory), "Internal loading error: cannot reserve effect memory." );
-
- // Move DataMemberPointer blocks
- m_pOldMemberDataBlocks = m_pEffect->m_pMemberDataBlocks;
- VHD( pHeap->MoveData((void**) &m_pEffect->m_pMemberDataBlocks, cbMemberDatas), "Internal loading error: cannot move member data blocks." );
-
- // Move CBs
- m_pOldCBs = m_pEffect->m_pCBs;
- VHD( pHeap->MoveData((void**) &m_pEffect->m_pCBs, cbCBs), "Internal loading error: cannot move CB count." );
- for (i=0; i<m_pEffect->m_CBCount; i++)
- {
- SConstantBuffer *pCB = &m_pEffect->m_pCBs[i];
-
- VHD( pHeap->MoveData((void**) &pCB->pBackingStore, pCB->Size), "Internal loading error: cannot move CB backing store." );
-
- if( !Cloning )
- {
- // When creating the effect, MemberDataOffsetPlus4 is used, not pMemberData
- if( pCB->MemberDataOffsetPlus4 )
- {
- pCB->pMemberData = (SMemberDataPointer*)( (BYTE*)m_pEffect->m_pMemberDataBlocks + ( pCB->MemberDataOffsetPlus4 - 4 ) );
- }
- }
- else if (pCB->pMemberData)
- {
- // When cloning an effect, pMemberData points to valid data in the original effect
- VH( FixupMemberDataPointer( &pCB->pMemberData ) );
- }
- }
-
- // Move numeric variables; move all variable types
- m_pOldVars = m_pEffect->m_pVariables;
- VHD( pHeap->MoveData((void**) &m_pEffect->m_pVariables, cbVariables), "Internal loading error: cannot move variable count." );
- for (i=0; i<m_pEffect->m_VariableCount; i++)
- {
- SGlobalVariable *pVar = &m_pEffect->m_pVariables[i];
- pVar->pEffect = m_pEffect;
-
- if( Cloning && pVar->pType->BelongsInConstantBuffer())
- {
- // Convert pointer back to offset
- // pVar->pCB refers to the old CB
- pVar->Data.Offset = (UINT_PTR)pVar->Data.pGeneric - (UINT_PTR)pVar->pCB->pBackingStore;
- }
-
- if (pVar->pCB)
- {
- VH( FixupCBPointer( &pVar->pCB ) );
- }
-
- if( !Cloning )
- {
- // When creating the effect, MemberDataOffsetPlus4 is used, not pMemberData
- if( pVar->MemberDataOffsetPlus4 )
- {
- pVar->pMemberData = (SMemberDataPointer*)( (BYTE*)m_pEffect->m_pMemberDataBlocks + ( pVar->MemberDataOffsetPlus4 - 4 ) );
- }
- }
- else if (pVar->pMemberData)
- {
- // When cloning an effect, pMemberData points to valid data in the original effect
- VH( FixupMemberDataPointer( &pVar->pMemberData ) );
- }
-
- if (pVar->pType->BelongsInConstantBuffer())
- {
- // Convert from offsets to pointers
- pVar->Data.pGeneric = pVar->pCB->pBackingStore + pVar->Data.Offset;
- }
- }
-
- // Fixup each CB's array of child variable pointers
- for (i=0; i<m_pEffect->m_CBCount; i++)
- {
- SConstantBuffer *pCB = &m_pEffect->m_pCBs[i];
- pCB->pEffect = m_pEffect;
-
- if (pCB->pVariables != NULL)
- {
- VH( FixupVariablePointer(&pCB->pVariables) );
- }
- }
-
- // Move shaders
- m_pOldShaders = m_pEffect->m_pShaderBlocks;
- VHD( pHeap->MoveData((void**) &m_pEffect->m_pShaderBlocks, cbShaders), "Internal loading error: cannot move shader count." );
-
- // Move interfaces, combining global interfaces and those that were created during shader initialization
- m_pOldInterfaces = m_pEffect->m_pInterfaces;
- m_OldInterfaceCount = m_pEffect->m_InterfaceCount;
- VHD( pHeap->MoveEmptyDataBlock((void**) &m_pEffect->m_pInterfaces, cbInterfaces + cbBackgroundInterfaces), "Internal loading error: cannot move shader." );
- memcpy( m_pEffect->m_pInterfaces, m_pOldInterfaces, cbInterfaces );
- for( i=0; i < m_BackgroundInterfaces.GetSize(); i++ )
- {
- D3DXASSERT( m_BackgroundInterfaces[i] != NULL );
- BYTE* pDst = (BYTE*)m_pEffect->m_pInterfaces + ( m_pEffect->m_InterfaceCount * sizeof(SInterface) );
- memcpy( pDst, m_BackgroundInterfaces[i], sizeof(SInterface) );
- m_pEffect->m_InterfaceCount++;
- }
-
- m_pOldShaderResources = m_pEffect->m_pShaderResources;
- VHD( pHeap->MoveData((void**) &m_pEffect->m_pShaderResources, cbShaderResources), "Internal loading error: cannot move SRVs." );
-
- m_pOldUnorderedAccessViews = m_pEffect->m_pUnorderedAccessViews;
- VHD( pHeap->MoveData((void**) &m_pEffect->m_pUnorderedAccessViews, cbUnorderedAccessViews), "Internal loading error: cannot move UAVS." );
-
- m_pOldRenderTargetViews = m_pEffect->m_pRenderTargetViews;
- VHD( pHeap->MoveData((void**) &m_pEffect->m_pRenderTargetViews, cbRenderTargetViews), "Internal loading error: cannot move RTVs." );
-
- m_pOldDepthStencilViews = m_pEffect->m_pDepthStencilViews;
- VHD( pHeap->MoveData((void**) &m_pEffect->m_pDepthStencilViews, cbDepthStencilViews), "Internal loading error: cannot move DSVs." );
-
- m_pOldDS = m_pEffect->m_pDepthStencilBlocks;
- VHD( pHeap->MoveData((void**) &m_pEffect->m_pDepthStencilBlocks, cbDS), "Internal loading error: cannot move depth-stencil state blocks." );
- VH( ReallocateBlockAssignments(m_pEffect->m_pDepthStencilBlocks, m_pEffect->m_DepthStencilBlockCount, Cloning ? m_pOldDS : NULL) );
-
- m_pOldAB = m_pEffect->m_pBlendBlocks;
- VHD( pHeap->MoveData((void**) &m_pEffect->m_pBlendBlocks, cbAB), "Internal loading error: cannot move blend state blocks." );
- VH( ReallocateBlockAssignments(m_pEffect->m_pBlendBlocks, m_pEffect->m_BlendBlockCount, Cloning ? m_pOldAB : NULL) );
-
- m_pOldRS = m_pEffect->m_pRasterizerBlocks;
- VHD( pHeap->MoveData((void**) &m_pEffect->m_pRasterizerBlocks, cbRS), "Internal loading error: cannot move rasterizer state blocks." );
- VH( ReallocateBlockAssignments(m_pEffect->m_pRasterizerBlocks, m_pEffect->m_RasterizerBlockCount, Cloning ? m_pOldRS : NULL) );
-
- m_pOldSamplers = m_pEffect->m_pSamplerBlocks;
- VHD( pHeap->MoveData((void**) &m_pEffect->m_pSamplerBlocks, cbSamplers), "Internal loading error: cannot move samplers." );
- VH( ReallocateBlockAssignments(m_pEffect->m_pSamplerBlocks, m_pEffect->m_SamplerBlockCount, Cloning ? m_pOldSamplers : NULL) );
-
- // Fixup sampler backing stores
- for (i=0; i<m_pEffect->m_SamplerBlockCount; ++i)
- {
- VH( FixupShaderResourcePointer(&m_pEffect->m_pSamplerBlocks[i].BackingStore.pTexture) );
- }
-
- // Fixup each interface's class instance variable pointer
- for (i=0; i<m_pEffect->m_InterfaceCount; i++)
- {
- SInterface *pInterface = &m_pEffect->m_pInterfaces[i];
-
- if (pInterface->pClassInstance != NULL)
- {
- VH( FixupVariablePointer( (SGlobalVariable**)&pInterface->pClassInstance ) );
- }
- }
-
- // Fixup pointers for non-numeric variables
- for (i=0; i<m_pEffect->m_VariableCount; i++)
- {
- SGlobalVariable *pVar = &m_pEffect->m_pVariables[i];
-
- if (pVar->pType->IsShader())
- {
- VH( FixupShaderPointer(&pVar->Data.pShader) );
- }
- else if (pVar->pType->IsShaderResource())
- {
- VH( FixupShaderResourcePointer(&pVar->Data.pShaderResource) );
- }
- else if (pVar->pType->IsUnorderedAccessView())
- {
- VH( FixupUnorderedAccessViewPointer(&pVar->Data.pUnorderedAccessView) );
- }
- else if (pVar->pType->IsInterface())
- {
- VH( FixupInterfacePointer(&pVar->Data.pInterface, false) );
- }
- else if (pVar->pType->IsObjectType(EOT_String))
- {
- if( !m_pEffect->IsOptimized() )
- {
- VH( FixupStringPointer(&pVar->Data.pString) );
- }
- }
- else if (pVar->pType->IsStateBlockObject())
- {
- switch(pVar->pType->ObjectType)
- {
- case EOT_DepthStencil:
- VH( FixupDSPointer((SDepthStencilBlock**) &pVar->Data.pBlock) );
- break;
- case EOT_Blend:
- VH( FixupABPointer((SBlendBlock**) &pVar->Data.pBlock) );
- break;
- case EOT_Rasterizer:
- VH( FixupRSPointer((SRasterizerBlock**) &pVar->Data.pBlock) );
- break;
- case EOT_Sampler:
- VB(pVar->pType->IsSampler());
- VH( FixupSamplerPointer((SSamplerBlock**) &pVar->Data.pBlock) );
- break;
- default:
- VH( E_FAIL );
- }
- }
- else if (pVar->pType->VarType == EVT_Struct || pVar->pType->VarType == EVT_Numeric)
- {
- if( pVar->pType->IsClassInstance() )
- {
- // do nothing
- }
- else
- {
- // do nothing
- }
- }
- else if (pVar->pType->IsRenderTargetView())
- {
- VH( FixupRenderTargetViewPointer(&pVar->Data.pRenderTargetView) );
- }
- else if (pVar->pType->IsDepthStencilView())
- {
- VH( FixupDepthStencilViewPointer(&pVar->Data.pDepthStencilView) );
- }
- else
- {
- VHD( E_FAIL, "Internal loading error: Invalid variable type." );
- }
- }
-
- // Fixup created members
- for (i = 0; i < m_pEffect->m_pMemberInterfaces.GetSize(); ++ i)
- {
- SMember* pMember = m_pEffect->m_pMemberInterfaces[i];
- SGlobalVariable** ppTopLevelEntity = (SGlobalVariable**)&pMember->pTopLevelEntity;
- VN( *ppTopLevelEntity );
-
- // This might be set to false later, for supporting textures inside classes
- const bool bGlobalMemberDataBlock = true;
-
- if( Cloning )
- {
- if( pMember->pType->BelongsInConstantBuffer() )
- {
- D3DXASSERT( pMember->Data.pGeneric == NULL || (*ppTopLevelEntity)->pEffect->m_Heap.IsInHeap(pMember->Data.pGeneric) );
- pMember->Data.Offset = (UINT)( (BYTE*)pMember->Data.pGeneric - (BYTE*)(*ppTopLevelEntity)->pCB->pBackingStore );
- }
- if( bGlobalMemberDataBlock && pMember->pMemberData )
- {
- pMember->MemberDataOffsetPlus4 = (UINT)( (BYTE*)pMember->pMemberData - (BYTE*)(*ppTopLevelEntity)->pEffect->m_pMemberDataBlocks ) + 4;
- }
- }
-
- VH( FixupVariablePointer( ppTopLevelEntity ) );
-
- if (pMember->pType->BelongsInConstantBuffer())
- {
- // Convert from offsets to pointers
- pMember->Data.pGeneric = (*ppTopLevelEntity)->pCB->pBackingStore + pMember->Data.Offset;
- }
- if( bGlobalMemberDataBlock && pMember->MemberDataOffsetPlus4 )
- {
- pMember->pMemberData = (SMemberDataPointer*)( (BYTE*)m_pEffect->m_pMemberDataBlocks + ( pMember->MemberDataOffsetPlus4 - 4 ) );
- }
- }
-
- // Fixup shader data
- VH( ReallocateShaderBlocks() );
-
- // Move groups, techniques, and passes
- m_pOldGroups = m_pEffect->m_pGroups;
- VHD( pHeap->MoveData((void**) &m_pEffect->m_pGroups, cbGroups), "Internal loading error: cannot move groups." );
- for (i=0; i<m_pEffect->m_GroupCount; i++)
- {
- SGroup *pGroup = &m_pEffect->m_pGroups[i];
- UINT cbTechniques;
-
- cbTechniques = pGroup->TechniqueCount * sizeof(STechnique);
- VHD( pHeap->MoveData((void**) &pGroup->pTechniques, cbTechniques), "Internal loading error: cannot move techniques." );
-
- for (j=0; j<pGroup->TechniqueCount; j++)
- {
- STechnique *pTech = &pGroup->pTechniques[j];
- UINT cbPass;
- UINT iPass;
-
- cbPass = pTech->PassCount * sizeof(SPassBlock);
- SPassBlock* pOldPasses = Cloning ? pTech->pPasses : NULL;
- VHD( pHeap->MoveData((void**) &pTech->pPasses, cbPass), "Internal loading error: cannot move passes." );
-
- for (iPass = 0; iPass < pTech->PassCount; ++ iPass)
- {
- pTech->pPasses[iPass].pEffect = m_pEffect;
-
- // Fixup backing store pointers in passes
- VH( FixupABPointer((SBlendBlock**) &pTech->pPasses[iPass].BackingStore.pBlendBlock) );
- VH( FixupDSPointer((SDepthStencilBlock**) &pTech->pPasses[iPass].BackingStore.pDepthStencilBlock) );
- VH( FixupRSPointer((SRasterizerBlock**) &pTech->pPasses[iPass].BackingStore.pRasterizerBlock) );
- VH( FixupShaderPointer((SShaderBlock**) &pTech->pPasses[iPass].BackingStore.pVertexShaderBlock) );
- VH( FixupShaderPointer((SShaderBlock**) &pTech->pPasses[iPass].BackingStore.pPixelShaderBlock) );
- VH( FixupShaderPointer((SShaderBlock**) &pTech->pPasses[iPass].BackingStore.pGeometryShaderBlock) );
- VH( FixupShaderPointer((SShaderBlock**) &pTech->pPasses[iPass].BackingStore.pHullShaderBlock) );
- VH( FixupShaderPointer((SShaderBlock**) &pTech->pPasses[iPass].BackingStore.pDomainShaderBlock) );
- VH( FixupShaderPointer((SShaderBlock**) &pTech->pPasses[iPass].BackingStore.pComputeShaderBlock) );
- VH( FixupDepthStencilViewPointer( &pTech->pPasses[iPass].BackingStore.pDepthStencilView) );
- for (UINT iRT = 0; iRT < D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT; iRT++)
- {
- VH( FixupRenderTargetViewPointer( &pTech->pPasses[iPass].BackingStore.pRenderTargetViews[iRT] ) );
- }
- }
-
- VH( ReallocateBlockAssignments( pTech->pPasses, pTech->PassCount, pOldPasses ) );
- }
- }
- VH( FixupGroupPointer( &m_pEffect->m_pNullGroup ) );
-
- // Move anonymous shader variables
- VHD( pHeap->MoveData((void **) &m_pEffect->m_pAnonymousShaders, cbAnonymousShaders), "Internal loading error: cannot move anonymous shaders." );
- for (i=0; i<m_pEffect->m_AnonymousShaderCount; ++i)
- {
- SAnonymousShader *pAnonymousShader = m_pEffect->m_pAnonymousShaders + i;
- VH( FixupShaderPointer((SShaderBlock**) &pAnonymousShader->pShaderBlock) );
- }
-
- VBD( pHeap->GetSize() == m_EffectMemory, "Loading error: effect size mismatch." );
-
-lExit:
- return hr;
-}
-
-}
diff --git a/sample/d3d11/Effects11/EffectLoad.h b/sample/d3d11/Effects11/EffectLoad.h
deleted file mode 100644
index c5f5dc1..0000000
--- a/sample/d3d11/Effects11/EffectLoad.h
+++ /dev/null
@@ -1,149 +0,0 @@
-//////////////////////////////////////////////////////////////////////////////
-//
-// Copyright (C) Microsoft Corporation. All Rights Reserved.
-//
-// File: EffectLoad.h
-// Content: D3DX11 Effects header for the FX file loader
-// A CEffectLoader is created at load time to facilitate loading
-//
-//////////////////////////////////////////////////////////////////////////////
-
-#pragma once
-
-namespace D3DX11Effects
-{
-
-// Ranges are used for dependency checking during load
-
-enum ERanges
-{
- ER_CBuffer = 0,
- ER_Texture, // Includes TBuffers
- ER_Sampler,
- ER_UnorderedAccessView,
- ER_Interfaces,
- ER_Count // This should be the size of the enum
-};
-
-struct SRange
-{
- UINT start;
- UINT last;
- CEffectVector<void *> vResources; // should be (last - start) in length, resource type depends on the range type
-};
-
-// Used during load to validate assignments
-D3D10_SHADER_VARIABLE_TYPE GetSimpleParameterTypeFromObjectType(EObjectType ObjectType);
-
-
-// A class to facilitate loading an Effect. This class is a friend of CEffect.
-class CEffectLoader
-{
- friend HRESULT CEffect::CloneEffect(UINT Flags, ID3DX11Effect** ppClonedEffect );
-
-protected:
- // Load-time allocations that eventually get moved happen out of the TempHeap. This heap will grow as needed
- CDataBlockStore m_BulkHeap;
-
- BYTE *m_pData;
- SBinaryHeader5 *m_pHeader;
- DWORD m_Version;
-
- CEffect *m_pEffect;
- CEffectReflection *m_pReflection;
-
- D3DX11Core::CMemoryStream m_msStructured;
- D3DX11Core::CMemoryStream m_msUnstructured;
-
- // used to avoid repeated hash buffer allocations in LoadTypeAndAddToPool
- CEffectVector<BYTE> m_HashBuffer;
-
- UINT m_dwBufferSize; // Size of data buffer in bytes
-
- // List of SInterface blocks created to back class instances bound to shaders
- CEffectVector<SInterface*> m_BackgroundInterfaces;
-
- // Pointers to pre-reallocation data
- SGlobalVariable *m_pOldVars;
- SShaderBlock *m_pOldShaders;
- SDepthStencilBlock *m_pOldDS;
- SBlendBlock *m_pOldAB;
- SRasterizerBlock *m_pOldRS;
- SConstantBuffer *m_pOldCBs;
- SSamplerBlock *m_pOldSamplers;
- UINT m_OldInterfaceCount;
- SInterface *m_pOldInterfaces;
- SShaderResource *m_pOldShaderResources;
- SUnorderedAccessView *m_pOldUnorderedAccessViews;
- SRenderTargetView *m_pOldRenderTargetViews;
- SDepthStencilView *m_pOldDepthStencilViews;
- SString *m_pOldStrings;
- SMemberDataPointer *m_pOldMemberDataBlocks;
- CEffectVectorOwner<SMember> *m_pvOldMemberInterfaces;
- SGroup *m_pOldGroups;
-
- UINT m_EffectMemory; // Effect private heap
- UINT m_ReflectionMemory; // Reflection private heap
-
- // Loader helpers
- HRESULT LoadCBs();
- HRESULT LoadNumericVariable(SConstantBuffer *pParentCB);
- HRESULT LoadObjectVariables();
- HRESULT LoadInterfaceVariables();
-
- HRESULT LoadTypeAndAddToPool(SType **ppType, UINT dwOffset);
- HRESULT LoadStringAndAddToPool(__out_ecount_full(1) char **ppString, UINT dwOffset);
- HRESULT LoadAssignments( UINT Assignments, SAssignment **pAssignments, BYTE *pBackingStore, UINT *pRTVAssignments, UINT *pFinalAssignments );
- HRESULT LoadGroups();
- HRESULT LoadTechnique( STechnique* pTech );
- HRESULT LoadAnnotations(UINT *pcAnnotations, SAnnotation **ppAnnotations);
-
- HRESULT ExecuteConstantAssignment(SBinaryConstant *pConstant, void *pLHS, D3D10_SHADER_VARIABLE_TYPE lhsType);
- UINT UnpackData(BYTE *pDestData, BYTE *pSrcData, UINT PackedDataSize, SType *pType, UINT *pBytesRead);
-
- // Build shader blocks
- HRESULT ConvertRangesToBindings(SShaderBlock *pShaderBlock, CEffectVector<SRange> *pvRanges );
- HRESULT GrabShaderData(SShaderBlock *pShaderBlock);
- HRESULT BuildShaderBlock(SShaderBlock *pShaderBlock);
-
- // Memory compactors
- HRESULT InitializeReflectionDataAndMoveStrings( UINT KnownSize = 0 );
- HRESULT ReallocateReflectionData( bool Cloning = false );
- HRESULT ReallocateEffectData( bool Cloning = false );
- HRESULT ReallocateShaderBlocks();
- template<class T> HRESULT ReallocateBlockAssignments(T* &pBlocks, UINT cBlocks, T* pOldBlocks = NULL);
- HRESULT ReallocateAnnotationData(UINT cAnnotations, SAnnotation **ppAnnotations);
-
- HRESULT CalculateAnnotationSize(UINT cAnnotations, SAnnotation *pAnnotations);
- UINT CalculateShaderBlockSize();
- template<class T> UINT CalculateBlockAssignmentSize(T* &pBlocks, UINT cBlocks);
-
- HRESULT FixupCBPointer(SConstantBuffer **ppCB);
- HRESULT FixupShaderPointer(SShaderBlock **ppShaderBlock);
- HRESULT FixupDSPointer(SDepthStencilBlock **ppDSBlock);
- HRESULT FixupABPointer(SBlendBlock **ppABBlock);
- HRESULT FixupRSPointer(SRasterizerBlock **ppRSBlock);
- HRESULT FixupInterfacePointer(SInterface **ppInterface, bool CheckBackgroundInterfaces);
- HRESULT FixupShaderResourcePointer(SShaderResource **ppResource);
- HRESULT FixupUnorderedAccessViewPointer(SUnorderedAccessView **ppResource);
- HRESULT FixupRenderTargetViewPointer(SRenderTargetView **ppRenderTargetView);
- HRESULT FixupDepthStencilViewPointer(SDepthStencilView **ppDepthStencilView);
- HRESULT FixupSamplerPointer(SSamplerBlock **ppSampler);
- HRESULT FixupVariablePointer(SGlobalVariable **ppVar);
- HRESULT FixupStringPointer(SString **ppString);
- HRESULT FixupMemberDataPointer(SMemberDataPointer **ppMemberData);
- HRESULT FixupGroupPointer(SGroup **ppGroup);
-
- // Methods to retrieve data from the unstructured block
- // (these do not make copies; they simply return pointers into the block)
- HRESULT GetStringAndAddToReflection(UINT offset, __out_ecount_full(1) char **ppPointer); // Returns a string from the file string block, updates m_EffectMemory
- HRESULT GetUnstructuredDataBlock(UINT offset, UINT *pdwSize, void **ppData);
- // This function makes a copy of the array of SInterfaceParameters, but not a copy of the strings
- HRESULT GetInterfaceParametersAndAddToReflection( UINT InterfaceCount, UINT offset, __out_ecount_full(1) SShaderBlock::SInterfaceParameter **ppInterfaces );
-public:
-
- HRESULT LoadEffect(CEffect *pEffect, CONST void *pEffectBuffer, UINT cbEffectBuffer);
-};
-
-
-} \ No newline at end of file
diff --git a/sample/d3d11/Effects11/EffectNonRuntime.cpp b/sample/d3d11/Effects11/EffectNonRuntime.cpp
deleted file mode 100644
index 5484d50..0000000
--- a/sample/d3d11/Effects11/EffectNonRuntime.cpp
+++ /dev/null
@@ -1,2963 +0,0 @@
-//////////////////////////////////////////////////////////////////////////////
-//
-// Copyright (C) Microsoft Corporation. All Rights Reserved.
-//
-// File: EffectNonRuntime.cpp
-// Content: D3DX11 Effect low-frequency utility functions
-// These functions are not intended to be called regularly. They
-// are typically called when creating, cloning, or optimizing an
-// Effect, or reflecting a variable.
-//
-//////////////////////////////////////////////////////////////////////////////
-
-#include "pchfx.h"
-#include "SOParser.h"
-
-namespace D3DX11Effects
-{
-
-extern SUnorderedAccessView g_NullUnorderedAccessView;
-
-SBaseBlock::SBaseBlock()
-: BlockType(EBT_Invalid)
-, IsUserManaged(FALSE)
-, AssignmentCount(0)
-, pAssignments(NULL)
-{
-
-}
-
-SPassBlock::SPassBlock()
-{
- pName = NULL;
- AnnotationCount = 0;
- pAnnotations = NULL;
- InitiallyValid = TRUE;
- HasDependencies = FALSE;
- ZeroMemory(&BackingStore, sizeof(BackingStore));
-}
-
-STechnique::STechnique()
-: pName(NULL)
-, PassCount(0)
-, pPasses(NULL)
-, AnnotationCount(0)
-, pAnnotations(NULL)
-, InitiallyValid( TRUE )
-, HasDependencies( FALSE )
-{
-}
-
-SGroup::SGroup()
-: pName(NULL)
-, TechniqueCount(0)
-, pTechniques(NULL)
-, AnnotationCount(0)
-, pAnnotations(NULL)
-, InitiallyValid( TRUE )
-, HasDependencies( FALSE )
-{
-}
-
-SDepthStencilBlock::SDepthStencilBlock()
-{
- pDSObject = NULL;
- ZeroMemory(&BackingStore, sizeof(BackingStore));
- IsValid = TRUE;
-
- BackingStore.BackFace.StencilFailOp = D3D11_STENCIL_OP_KEEP;
- BackingStore.BackFace.StencilFunc = D3D11_COMPARISON_ALWAYS;
- BackingStore.BackFace.StencilPassOp = D3D11_STENCIL_OP_KEEP;
- BackingStore.BackFace.StencilDepthFailOp = D3D11_STENCIL_OP_KEEP;
- BackingStore.DepthEnable = TRUE;
- BackingStore.DepthFunc = D3D11_COMPARISON_LESS;
- BackingStore.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL;
- BackingStore.FrontFace.StencilFailOp = D3D11_STENCIL_OP_KEEP;
- BackingStore.FrontFace.StencilFunc = D3D11_COMPARISON_ALWAYS;
- BackingStore.FrontFace.StencilPassOp = D3D11_STENCIL_OP_KEEP;
- BackingStore.FrontFace.StencilDepthFailOp = D3D11_STENCIL_OP_KEEP;
- BackingStore.StencilEnable = FALSE;
- BackingStore.StencilReadMask = D3D11_DEFAULT_STENCIL_READ_MASK;
- BackingStore.StencilWriteMask = D3D11_DEFAULT_STENCIL_WRITE_MASK;
-}
-
-SBlendBlock::SBlendBlock()
-{
- pBlendObject = NULL;
- ZeroMemory(&BackingStore, sizeof(BackingStore));
- IsValid = TRUE;
-
- BackingStore.AlphaToCoverageEnable = FALSE;
- BackingStore.IndependentBlendEnable = TRUE;
- for( UINT i=0; i < D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT; i++ )
- {
- BackingStore.RenderTarget[i].SrcBlend = D3D11_BLEND_ONE;
- BackingStore.RenderTarget[i].DestBlend = D3D11_BLEND_ZERO;
- BackingStore.RenderTarget[i].BlendOp = D3D11_BLEND_OP_ADD;
- BackingStore.RenderTarget[i].SrcBlendAlpha = D3D11_BLEND_ONE;
- BackingStore.RenderTarget[i].DestBlendAlpha = D3D11_BLEND_ZERO;
- BackingStore.RenderTarget[i].BlendOpAlpha = D3D11_BLEND_OP_ADD;
- memset(&BackingStore.RenderTarget[i].RenderTargetWriteMask, 0x0F, sizeof(BackingStore.RenderTarget[i].RenderTargetWriteMask));
- }
-}
-
-SRasterizerBlock::SRasterizerBlock()
-{
- pRasterizerObject = NULL;
- ZeroMemory(&BackingStore, sizeof(BackingStore));
- IsValid = TRUE;
-
- BackingStore.AntialiasedLineEnable = FALSE;
- BackingStore.CullMode = D3D11_CULL_BACK;
- BackingStore.DepthBias = D3D11_DEFAULT_DEPTH_BIAS;
- BackingStore.DepthBiasClamp = D3D11_DEFAULT_DEPTH_BIAS_CLAMP;
- BackingStore.FillMode = D3D11_FILL_SOLID;
- BackingStore.FrontCounterClockwise = FALSE;
- BackingStore.MultisampleEnable = FALSE;
- BackingStore.ScissorEnable = FALSE;
- BackingStore.SlopeScaledDepthBias = D3D11_DEFAULT_SLOPE_SCALED_DEPTH_BIAS;
- BackingStore.DepthClipEnable = TRUE;
-}
-
-SSamplerBlock::SSamplerBlock()
-{
- pD3DObject = NULL;
- ZeroMemory(&BackingStore, sizeof(BackingStore));
-
- BackingStore.SamplerDesc.AddressU = D3D11_TEXTURE_ADDRESS_CLAMP;
- BackingStore.SamplerDesc.AddressV = D3D11_TEXTURE_ADDRESS_CLAMP;
- BackingStore.SamplerDesc.AddressW = D3D11_TEXTURE_ADDRESS_CLAMP;
- BackingStore.SamplerDesc.BorderColor[3] = D3D11_DEFAULT_BORDER_COLOR_COMPONENT;
- BackingStore.SamplerDesc.BorderColor[2] = D3D11_DEFAULT_BORDER_COLOR_COMPONENT;
- BackingStore.SamplerDesc.BorderColor[1] = D3D11_DEFAULT_BORDER_COLOR_COMPONENT;
- BackingStore.SamplerDesc.BorderColor[0] = D3D11_DEFAULT_BORDER_COLOR_COMPONENT;
- BackingStore.SamplerDesc.ComparisonFunc = D3D11_COMPARISON_NEVER;
- BackingStore.SamplerDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR;
- BackingStore.SamplerDesc.MaxAnisotropy = (UINT32) D3D11_DEFAULT_MAX_ANISOTROPY;
- BackingStore.SamplerDesc.MipLODBias = D3D11_DEFAULT_MIP_LOD_BIAS;
- BackingStore.SamplerDesc.MinLOD = -FLT_MAX;
- BackingStore.SamplerDesc.MaxLOD = FLT_MAX;
-}
-
-SShaderBlock::SShaderBlock(SD3DShaderVTable *pVirtualTable)
-{
- IsValid = TRUE;
-
- pVT = pVirtualTable;
-
- pReflectionData = NULL;
-
- pD3DObject = NULL;
-
- CBDepCount = 0;
- pCBDeps = NULL;
-
- SampDepCount = 0;
- pSampDeps = NULL;
-
- InterfaceDepCount = 0;
- pInterfaceDeps = NULL;
-
- ResourceDepCount = 0;
- pResourceDeps = NULL;
-
- UAVDepCount = 0;
- pUAVDeps = NULL;
-
- TBufferDepCount = 0;
- ppTbufDeps = NULL;
-
- pInputSignatureBlob = NULL;
-}
-
-HRESULT SShaderBlock::OnDeviceBind()
-{
- HRESULT hr = S_OK;
- UINT i, j;
-
- // Update all CB deps
- for (i=0; i<CBDepCount; i++)
- {
- D3DXASSERT(pCBDeps[i].Count);
-
- for (j=0; j<pCBDeps[i].Count; j++)
- {
- pCBDeps[i].ppD3DObjects[j] = pCBDeps[i].ppFXPointers[j]->pD3DObject;
-
- if ( !pCBDeps[i].ppD3DObjects[j] )
- VH( E_FAIL );
- }
- }
-
- // Update all sampler deps
- for (i=0; i<SampDepCount; i++)
- {
- D3DXASSERT(pSampDeps[i].Count);
-
- for (j=0; j<pSampDeps[i].Count; j++)
- {
- pSampDeps[i].ppD3DObjects[j] = pSampDeps[i].ppFXPointers[j]->pD3DObject;
-
- if ( !pSampDeps[i].ppD3DObjects[j] )
- VH( E_FAIL );
- }
- }
-
- // Texture deps will be set automatically on use since they are initially marked dirty.
-
-lExit:
- return hr;
-}
-
-extern SD3DShaderVTable g_vtVS;
-extern SD3DShaderVTable g_vtGS;
-extern SD3DShaderVTable g_vtPS;
-extern SD3DShaderVTable g_vtHS;
-extern SD3DShaderVTable g_vtDS;
-extern SD3DShaderVTable g_vtCS;
-
-EObjectType SShaderBlock::GetShaderType()
-{
- if (&g_vtVS == pVT)
- return EOT_VertexShader;
- else if (&g_vtGS == pVT)
- return EOT_GeometryShader;
- else if (&g_vtPS == pVT)
- return EOT_PixelShader;
- else if (&g_vtHS == pVT)
- return EOT_HullShader5;
- else if (&g_vtDS == pVT)
- return EOT_DomainShader5;
- else if (&g_vtCS == pVT)
- return EOT_ComputeShader5;
-
- return EOT_Invalid;
-}
-
-#define _SET_BIT(bytes, x) (bytes[x / 8] |= (1 << (x % 8)))
-
-HRESULT SShaderBlock::ComputeStateBlockMask(D3DX11_STATE_BLOCK_MASK *pStateBlockMask)
-{
- HRESULT hr = S_OK;
- UINT i, j;
- BYTE *pSamplerMask = NULL, *pShaderResourceMask = NULL, *pConstantBufferMask = NULL, *pUnorderedAccessViewMask = NULL, *pInterfaceMask = NULL;
-
- switch (GetShaderType())
- {
- case EOT_VertexShader:
- case EOT_VertexShader5:
- pStateBlockMask->VS = 1;
- pSamplerMask = pStateBlockMask->VSSamplers;
- pShaderResourceMask = pStateBlockMask->VSShaderResources;
- pConstantBufferMask = pStateBlockMask->VSConstantBuffers;
- pInterfaceMask = pStateBlockMask->VSInterfaces;
- pUnorderedAccessViewMask = NULL;
- break;
-
- case EOT_GeometryShader:
- case EOT_GeometryShader5:
- pStateBlockMask->GS = 1;
- pSamplerMask = pStateBlockMask->GSSamplers;
- pShaderResourceMask = pStateBlockMask->GSShaderResources;
- pConstantBufferMask = pStateBlockMask->GSConstantBuffers;
- pInterfaceMask = pStateBlockMask->GSInterfaces;
- pUnorderedAccessViewMask = NULL;
- break;
-
- case EOT_PixelShader:
- case EOT_PixelShader5:
- pStateBlockMask->PS = 1;
- pSamplerMask = pStateBlockMask->PSSamplers;
- pShaderResourceMask = pStateBlockMask->PSShaderResources;
- pConstantBufferMask = pStateBlockMask->PSConstantBuffers;
- pInterfaceMask = pStateBlockMask->PSInterfaces;
- pUnorderedAccessViewMask = &pStateBlockMask->PSUnorderedAccessViews;
- break;
-
- case EOT_HullShader5:
- pStateBlockMask->HS = 1;
- pSamplerMask = pStateBlockMask->HSSamplers;
- pShaderResourceMask = pStateBlockMask->HSShaderResources;
- pConstantBufferMask = pStateBlockMask->HSConstantBuffers;
- pInterfaceMask = pStateBlockMask->HSInterfaces;
- pUnorderedAccessViewMask = NULL;
- break;
-
- case EOT_DomainShader5:
- pStateBlockMask->DS = 1;
- pSamplerMask = pStateBlockMask->DSSamplers;
- pShaderResourceMask = pStateBlockMask->DSShaderResources;
- pConstantBufferMask = pStateBlockMask->DSConstantBuffers;
- pInterfaceMask = pStateBlockMask->DSInterfaces;
- pUnorderedAccessViewMask = NULL;
- break;
-
- case EOT_ComputeShader5:
- pStateBlockMask->CS = 1;
- pSamplerMask = pStateBlockMask->CSSamplers;
- pShaderResourceMask = pStateBlockMask->CSShaderResources;
- pConstantBufferMask = pStateBlockMask->CSConstantBuffers;
- pInterfaceMask = pStateBlockMask->CSInterfaces;
- pUnorderedAccessViewMask = &pStateBlockMask->CSUnorderedAccessViews;
- break;
-
- default:
- D3DXASSERT(0);
- VH(E_FAIL);
- }
-
- for (i = 0; i < SampDepCount; ++ i)
- {
- for (j = 0; j < pSampDeps[i].Count; ++ j)
- {
- _SET_BIT(pSamplerMask, (pSampDeps[i].StartIndex + j));
- }
- }
-
- for (i = 0; i < InterfaceDepCount; ++ i)
- {
- for (j = 0; j < pInterfaceDeps[i].Count; ++ j)
- {
- _SET_BIT(pInterfaceMask, (pInterfaceDeps[i].StartIndex + j));
- }
- }
-
- for (i = 0; i < ResourceDepCount; ++ i)
- {
- for (j = 0; j < pResourceDeps[i].Count; ++ j)
- {
- _SET_BIT(pShaderResourceMask, (pResourceDeps[i].StartIndex + j));
- }
- }
-
- for (i = 0; i < CBDepCount; ++ i)
- {
- for (j = 0; j < pCBDeps[i].Count; ++ j)
- {
- _SET_BIT(pConstantBufferMask, (pCBDeps[i].StartIndex + j));
- }
- }
-
- for (i = 0; i < UAVDepCount; ++ i)
- {
- D3DXASSERT( pUnorderedAccessViewMask != NULL );
- for (j = 0; j < pUAVDeps[i].Count; ++ j)
- {
- if( pUAVDeps[i].ppFXPointers[j] != &g_NullUnorderedAccessView )
- _SET_BIT(pUnorderedAccessViewMask, (pUAVDeps[i].StartIndex + j));
- }
- }
-
-lExit:
- return hr;
-}
-
-#undef _SET_BIT
-
-HRESULT SShaderBlock::GetShaderDesc(D3DX11_EFFECT_SHADER_DESC *pDesc, BOOL IsInline)
-{
- HRESULT hr = S_OK;
-
- ZeroMemory(pDesc, sizeof(*pDesc));
-
- pDesc->pInputSignature = pInputSignatureBlob ? (const BYTE*)pInputSignatureBlob->GetBufferPointer() : NULL;
- pDesc->IsInline = IsInline;
-
- if (NULL != pReflectionData)
- {
- // initialize these only if present; otherwise leave them NULL or 0
- pDesc->pBytecode = pReflectionData->pBytecode;
- pDesc->BytecodeLength = pReflectionData->BytecodeLength;
- for( UINT iDecl=0; iDecl < D3D11_SO_STREAM_COUNT; ++iDecl )
- {
- pDesc->SODecls[iDecl] = pReflectionData->pStreamOutDecls[iDecl];
- }
- pDesc->RasterizedStream = pReflectionData->RasterizedStream;
-
- // get # of input & output signature entries
- D3DXASSERT( pReflectionData->pReflection != NULL );
-
- D3D11_SHADER_DESC ShaderDesc;
- pReflectionData->pReflection->GetDesc( &ShaderDesc );
- pDesc->NumInputSignatureEntries = ShaderDesc.InputParameters;
- pDesc->NumOutputSignatureEntries = ShaderDesc.OutputParameters;
- pDesc->NumPatchConstantSignatureEntries = ShaderDesc.PatchConstantParameters;
- }
-lExit:
- return hr;
-}
-
-HRESULT SShaderBlock::GetVertexShader(ID3D11VertexShader **ppVS)
-{
- if (EOT_VertexShader == GetShaderType() ||
- EOT_VertexShader5 == GetShaderType())
- {
- *ppVS = (ID3D11VertexShader *) pD3DObject;
- SAFE_ADDREF(*ppVS);
- return S_OK;
- }
- else
- {
- *ppVS = NULL;
- DPF(0, "ID3DX11EffectShaderVariable::GetVertexShader: This shader variable is not a vertex shader");
- return D3DERR_INVALIDCALL;
- }
-}
-
-HRESULT SShaderBlock::GetGeometryShader(ID3D11GeometryShader **ppGS)
-{
- if (EOT_GeometryShader == GetShaderType() ||
- EOT_GeometryShaderSO == GetShaderType() ||
- EOT_GeometryShader5 == GetShaderType())
- {
- *ppGS = (ID3D11GeometryShader *) pD3DObject;
- SAFE_ADDREF(*ppGS);
- return S_OK;
- }
- else
- {
- *ppGS = NULL;
- DPF(0, "ID3DX11EffectShaderVariable::GetGeometryShader: This shader variable is not a geometry shader");
- return D3DERR_INVALIDCALL;
- }
-}
-
-HRESULT SShaderBlock::GetPixelShader(ID3D11PixelShader **ppPS)
-{
- if (EOT_PixelShader == GetShaderType() ||
- EOT_PixelShader5 == GetShaderType())
- {
- *ppPS = (ID3D11PixelShader *) pD3DObject;
- SAFE_ADDREF(*ppPS);
- return S_OK;
- }
- else
- {
- *ppPS = NULL;
- DPF(0, "ID3DX11EffectShaderVariable::GetPixelShader: This shader variable is not a pixel shader");
- return D3DERR_INVALIDCALL;
- }
-}
-
-HRESULT SShaderBlock::GetHullShader(ID3D11HullShader **ppHS)
-{
- if (EOT_HullShader5 == GetShaderType())
- {
- *ppHS = (ID3D11HullShader *) pD3DObject;
- SAFE_ADDREF(*ppHS);
- return S_OK;
- }
- else
- {
- *ppHS = NULL;
- DPF(0, "ID3DX11EffectShaderVariable::GetHullShader: This shader variable is not a hull shader");
- return D3DERR_INVALIDCALL;
- }
-}
-
-HRESULT SShaderBlock::GetDomainShader(ID3D11DomainShader **ppDS)
-{
- if (EOT_DomainShader5 == GetShaderType())
- {
- *ppDS = (ID3D11DomainShader *) pD3DObject;
- SAFE_ADDREF(*ppDS);
- return S_OK;
- }
- else
- {
- *ppDS = NULL;
- DPF(0, "ID3DX11EffectShaderVariable::GetDomainShader: This shader variable is not a domain shader");
- return D3DERR_INVALIDCALL;
- }
-}
-
-HRESULT SShaderBlock::GetComputeShader(ID3D11ComputeShader **ppCS)
-{
- if (EOT_ComputeShader5 == GetShaderType())
- {
- *ppCS = (ID3D11ComputeShader *) pD3DObject;
- SAFE_ADDREF(*ppCS);
- return S_OK;
- }
- else
- {
- *ppCS = NULL;
- DPF(0, "ID3DX11EffectShaderVariable::GetComputeShader: This shader variable is not a compute shader");
- return D3DERR_INVALIDCALL;
- }
-}
-
-HRESULT SShaderBlock::GetSignatureElementDesc(ESigType SigType, UINT Element, D3D11_SIGNATURE_PARAMETER_DESC *pDesc)
-{
- HRESULT hr = S_OK;
- LPCSTR pFuncName;
- switch( SigType )
- {
- case ST_Input:
-#pragma prefast(suppress:__WARNING_UNUSED_POINTER_ASSIGNMENT, "pFuncName used in DPF")
- pFuncName = "ID3DX11EffectShaderVariable::GetInputSignatureElementDesc";
- break;
- case ST_Output:
-#pragma prefast(suppress:__WARNING_UNUSED_POINTER_ASSIGNMENT, "pFuncName used in DPF")
- pFuncName = "ID3DX11EffectShaderVariable::GetOutputSignatureElementDesc";
- break;
- case ST_PatchConstant:
-#pragma prefast(suppress:__WARNING_UNUSED_POINTER_ASSIGNMENT, "pFuncName used in DPF")
- pFuncName = "ID3DX11EffectShaderVariable::GetPatchConstantSignatureElementDesc";
- break;
- default:
- D3DXASSERT( false );
- return E_FAIL;
- };
-
- if (NULL != pReflectionData)
- {
- // get # of signature entries
- D3DXASSERT( pReflectionData->pReflection != NULL );
-
- D3D11_SHADER_DESC ShaderDesc;
- VH( pReflectionData->pReflection->GetDesc( &ShaderDesc ) );
-
- D3D11_SIGNATURE_PARAMETER_DESC ParamDesc;
- if( pReflectionData->IsNullGS )
- {
- switch( SigType )
- {
- case ST_Input:
- // The input signature for a null-GS is the output signature of the previous VS
- SigType = ST_Output;
- break;
- case ST_PatchConstant:
- // GeometryShaders cannot have patch constant signatures
- return E_INVALIDARG;
- };
- }
-
- switch( SigType )
- {
- case ST_Input:
- if( Element >= ShaderDesc.InputParameters )
- {
- DPF( 0, "%s: Invalid Element index (%d) specified", pFuncName, Element );
- VH( E_INVALIDARG );
- }
- VH( pReflectionData->pReflection->GetInputParameterDesc( Element, &ParamDesc ) );
- break;
- case ST_Output:
- if( Element >= ShaderDesc.OutputParameters )
- {
- DPF( 0, "%s: Invalid Element index (%d) specified", pFuncName, Element );
- VH( E_INVALIDARG );
- }
- VH( pReflectionData->pReflection->GetOutputParameterDesc( Element, &ParamDesc ) );
- break;
- case ST_PatchConstant:
- if( Element >= ShaderDesc.PatchConstantParameters )
- {
- DPF( 0, "%s: Invalid Element index (%d) specified", pFuncName, Element );
- VH( E_INVALIDARG );
- }
- VH( pReflectionData->pReflection->GetPatchConstantParameterDesc( Element, &ParamDesc ) );
- break;
- };
-
- pDesc->SemanticName = ParamDesc.SemanticName;
- pDesc->SystemValueType = ParamDesc.SystemValueType;
-
- // Pixel shaders need to be special-cased as they don't technically output SVs
- if( pDesc->SystemValueType == D3D10_NAME_UNDEFINED && GetShaderType() == EOT_PixelShader )
- {
- if( _stricmp(pDesc->SemanticName, "SV_TARGET") == 0 )
- {
- pDesc->SystemValueType = D3D10_NAME_TARGET;
- }
- else if( _stricmp(pDesc->SemanticName, "SV_DEPTH") == 0 )
- {
- pDesc->SystemValueType = D3D10_NAME_DEPTH;
- }
- else if( _stricmp(pDesc->SemanticName, "SV_COVERAGE") == 0 )
- {
- pDesc->SystemValueType = D3D10_NAME_COVERAGE;
- }
- }
-
- pDesc->SemanticIndex = ParamDesc.SemanticIndex;
- pDesc->Register = ParamDesc.Register;
- pDesc->Mask = ParamDesc.Mask;
- pDesc->ComponentType = ParamDesc.ComponentType;
- pDesc->ReadWriteMask = ParamDesc.ReadWriteMask;
- }
- else
- {
- DPF(0, "%s: Cannot get signatures; shader bytecode is not present", pFuncName);
- VH( D3DERR_INVALIDCALL );
- }
-
-lExit:
- return hr;
-}
-
-SString::SString()
-{
- pString = NULL;
-}
-
-SRenderTargetView::SRenderTargetView()
-{
- pRenderTargetView = NULL;
-}
-
-SDepthStencilView::SDepthStencilView()
-{
- pDepthStencilView = NULL;
-}
-
-void * GetBlockByIndex(EVarType VarType, EObjectType ObjectType, void *pBaseBlock, UINT Index)
-{
- switch( VarType )
- {
- case EVT_Interface:
- return (SInterface *)pBaseBlock + Index;
- case EVT_Object:
- switch (ObjectType)
- {
- case EOT_Blend:
- return (SBlendBlock *)pBaseBlock + Index;
- case EOT_DepthStencil:
- return (SDepthStencilBlock *)pBaseBlock + Index;
- case EOT_Rasterizer:
- return (SRasterizerBlock *)pBaseBlock + Index;
- case EOT_PixelShader:
- case EOT_PixelShader5:
- case EOT_GeometryShader:
- case EOT_GeometryShaderSO:
- case EOT_GeometryShader5:
- case EOT_VertexShader:
- case EOT_VertexShader5:
- case EOT_HullShader5:
- case EOT_DomainShader5:
- case EOT_ComputeShader5:
- return (SShaderBlock *)pBaseBlock + Index;
- case EOT_String:
- return (SString *)pBaseBlock + Index;
- case EOT_Sampler:
- return (SSamplerBlock *)pBaseBlock + Index;
- case EOT_Buffer:
- case EOT_Texture:
- case EOT_Texture1D:
- case EOT_Texture1DArray:
- case EOT_Texture2D:
- case EOT_Texture2DArray:
- case EOT_Texture2DMS:
- case EOT_Texture2DMSArray:
- case EOT_Texture3D:
- case EOT_TextureCube:
- case EOT_TextureCubeArray:
- case EOT_ByteAddressBuffer:
- case EOT_StructuredBuffer:
- return (SShaderResource *)pBaseBlock + Index;
- case EOT_DepthStencilView:
- return (SDepthStencilView *)pBaseBlock + Index;
- case EOT_RenderTargetView:
- return (SRenderTargetView *)pBaseBlock + Index;
- case EOT_RWTexture1D:
- case EOT_RWTexture1DArray:
- case EOT_RWTexture2D:
- case EOT_RWTexture2DArray:
- case EOT_RWTexture3D:
- case EOT_RWBuffer:
- case EOT_RWByteAddressBuffer:
- case EOT_RWStructuredBuffer:
- case EOT_RWStructuredBufferAlloc:
- case EOT_RWStructuredBufferConsume:
- case EOT_AppendStructuredBuffer:
- case EOT_ConsumeStructuredBuffer:
- return (SUnorderedAccessView *)pBaseBlock + Index;
- default:
- D3DXASSERT(0);
- return NULL;
- }
- default:
- D3DXASSERT(0);
- return NULL;
- }
-}
-
-CEffect::CEffect( UINT Flags )
-{
- m_RefCount = 1;
-
- m_pVariables = NULL;
- m_pAnonymousShaders = NULL;
- m_pGroups = NULL;
- m_pNullGroup = NULL;
- m_pShaderBlocks = NULL;
- m_pDepthStencilBlocks = NULL;
- m_pBlendBlocks = NULL;
- m_pRasterizerBlocks = NULL;
- m_pSamplerBlocks = NULL;
- m_pCBs = NULL;
- m_pStrings = NULL;
- m_pMemberDataBlocks = NULL;
- m_pInterfaces = NULL;
- m_pShaderResources = NULL;
- m_pUnorderedAccessViews = NULL;
- m_pRenderTargetViews = NULL;
- m_pDepthStencilViews = NULL;
- m_pDevice = NULL;
- m_pClassLinkage = NULL;
- m_pContext = NULL;
-
- m_VariableCount = 0;
- m_AnonymousShaderCount = 0;
- m_ShaderBlockCount = 0;
- m_DepthStencilBlockCount = 0;
- m_BlendBlockCount = 0;
- m_RasterizerBlockCount = 0;
- m_SamplerBlockCount = 0;
- m_StringCount = 0;
- m_MemberDataCount = 0;
- m_InterfaceCount = 0;
- m_ShaderResourceCount = 0;
- m_UnorderedAccessViewCount = 0;
- m_RenderTargetViewCount = 0;
- m_DepthStencilViewCount = 0;
- m_CBCount = 0;
- m_TechniqueCount = 0;
- m_GroupCount = 0;
-
- m_pReflection = NULL;
- m_LocalTimer = 1;
- m_Flags = Flags;
- m_FXLIndex = 0;
-
- m_pTypePool = NULL;
- m_pStringPool = NULL;
- m_pPooledHeap = NULL;
- m_pOptimizedTypeHeap = NULL;
-}
-
-void CEffect::ReleaseShaderRefection()
-{
- for( UINT i = 0; i < m_ShaderBlockCount; ++ i )
- {
- SAFE_RELEASE( m_pShaderBlocks[i].pInputSignatureBlob );
- if( m_pShaderBlocks[i].pReflectionData )
- {
- SAFE_RELEASE( m_pShaderBlocks[i].pReflectionData->pReflection );
- }
- }
-}
-
-CEffect::~CEffect()
-{
- ID3D11InfoQueue *pInfoQueue = NULL;
-
- // Mute debug spew
- if (m_pDevice)
- m_pDevice->QueryInterface(__uuidof(ID3D11InfoQueue), (void**) &pInfoQueue);
-
- if (pInfoQueue)
- {
- D3D11_INFO_QUEUE_FILTER filter;
- D3D11_MESSAGE_CATEGORY messageCategory = D3D11_MESSAGE_CATEGORY_STATE_SETTING;
- ZeroMemory(&filter, sizeof(filter));
-
- filter.DenyList.NumCategories = 1;
- filter.DenyList.pCategoryList = &messageCategory;
- pInfoQueue->PushStorageFilter(&filter);
- }
-
- UINT i;
-
- if( NULL != m_pDevice )
- {
- // if m_pDevice == NULL, then we failed LoadEffect(), which means ReleaseShaderReflection was already called.
-
- // Release the shader reflection info, as it was not created on the private heap
- // This must be called before we delete m_pReflection
- ReleaseShaderRefection();
- }
-
- SAFE_DELETE( m_pReflection );
- SAFE_DELETE( m_pTypePool );
- SAFE_DELETE( m_pStringPool );
- SAFE_DELETE( m_pPooledHeap );
- SAFE_DELETE( m_pOptimizedTypeHeap );
-
- // this code assumes the effect has been loaded & relocated,
- // so check for that before freeing the resources
-
- if (NULL != m_pDevice)
- {
- // Keep the following in line with AddRefAllForCloning
-
- D3DXASSERT(NULL == m_pRasterizerBlocks || m_Heap.IsInHeap(m_pRasterizerBlocks));
- for (i = 0; i < m_RasterizerBlockCount; ++ i)
- {
- SAFE_RELEASE(m_pRasterizerBlocks[i].pRasterizerObject);
- }
-
- D3DXASSERT(NULL == m_pBlendBlocks || m_Heap.IsInHeap(m_pBlendBlocks));
- for (i = 0; i < m_BlendBlockCount; ++ i)
- {
- SAFE_RELEASE(m_pBlendBlocks[i].pBlendObject);
- }
-
- D3DXASSERT(NULL == m_pDepthStencilBlocks || m_Heap.IsInHeap(m_pDepthStencilBlocks));
- for (i = 0; i < m_DepthStencilBlockCount; ++ i)
- {
- SAFE_RELEASE(m_pDepthStencilBlocks[i].pDSObject);
- }
-
- D3DXASSERT(NULL == m_pSamplerBlocks || m_Heap.IsInHeap(m_pSamplerBlocks));
- for (i = 0; i < m_SamplerBlockCount; ++ i)
- {
- SAFE_RELEASE(m_pSamplerBlocks[i].pD3DObject);
- }
-
- D3DXASSERT(NULL == m_pShaderResources || m_Heap.IsInHeap(m_pShaderResources));
- for (i = 0; i < m_ShaderResourceCount; ++ i)
- {
- SAFE_RELEASE(m_pShaderResources[i].pShaderResource);
- }
-
- D3DXASSERT(NULL == m_pUnorderedAccessViews || m_Heap.IsInHeap(m_pUnorderedAccessViews));
- for (i = 0; i < m_UnorderedAccessViewCount; ++ i)
- {
- SAFE_RELEASE(m_pUnorderedAccessViews[i].pUnorderedAccessView);
- }
-
- D3DXASSERT(NULL == m_pRenderTargetViews || m_Heap.IsInHeap(m_pRenderTargetViews));
- for (i = 0; i < m_RenderTargetViewCount; ++ i)
- {
- SAFE_RELEASE(m_pRenderTargetViews[i].pRenderTargetView);
- }
-
- D3DXASSERT(NULL == m_pDepthStencilViews || m_Heap.IsInHeap(m_pDepthStencilViews));
- for (i = 0; i < m_DepthStencilViewCount; ++ i)
- {
- SAFE_RELEASE(m_pDepthStencilViews[i].pDepthStencilView);
- }
-
- D3DXASSERT(NULL == m_pMemberDataBlocks || m_Heap.IsInHeap(m_pMemberDataBlocks));
- for (i = 0; i < m_MemberDataCount; ++ i)
- {
- switch( m_pMemberDataBlocks[i].Type )
- {
- case MDT_ClassInstance:
- SAFE_RELEASE(m_pMemberDataBlocks[i].Data.pD3DClassInstance);
- break;
- case MDT_BlendState:
- SAFE_RELEASE(m_pMemberDataBlocks[i].Data.pD3DEffectsManagedBlendState);
- break;
- case MDT_DepthStencilState:
- SAFE_RELEASE(m_pMemberDataBlocks[i].Data.pD3DEffectsManagedDepthStencilState);
- break;
- case MDT_RasterizerState:
- SAFE_RELEASE(m_pMemberDataBlocks[i].Data.pD3DEffectsManagedRasterizerState);
- break;
- case MDT_SamplerState:
- SAFE_RELEASE(m_pMemberDataBlocks[i].Data.pD3DEffectsManagedSamplerState);
- break;
- case MDT_Buffer:
- SAFE_RELEASE(m_pMemberDataBlocks[i].Data.pD3DEffectsManagedConstantBuffer);
- break;
- case MDT_ShaderResourceView:
- SAFE_RELEASE(m_pMemberDataBlocks[i].Data.pD3DEffectsManagedTextureBuffer);
- break;
- default:
- D3DXASSERT( false );
- }
- }
-
- D3DXASSERT(NULL == m_pCBs || m_Heap.IsInHeap(m_pCBs));
- for (i = 0; i < m_CBCount; ++ i)
- {
- SAFE_RELEASE(m_pCBs[i].TBuffer.pShaderResource);
- SAFE_RELEASE(m_pCBs[i].pD3DObject);
- }
-
- D3DXASSERT(NULL == m_pShaderBlocks || m_Heap.IsInHeap(m_pShaderBlocks));
- for (i = 0; i < m_ShaderBlockCount; ++ i)
- {
- SAFE_RELEASE(m_pShaderBlocks[i].pD3DObject);
- }
-
- SAFE_RELEASE( m_pDevice );
- }
- SAFE_RELEASE( m_pClassLinkage );
- D3DXASSERT( m_pContext == NULL );
-
- // Restore debug spew
- if (pInfoQueue)
- {
- pInfoQueue->PopStorageFilter();
- SAFE_RELEASE(pInfoQueue);
- }
-}
-
-// AddRef all D3D object when cloning
-void CEffect::AddRefAllForCloning( CEffect* pEffectSource )
-{
- UINT i;
-
- // Keep the following in line with ~CEffect
-
- D3DXASSERT( m_pDevice != NULL );
-
- for( UINT i = 0; i < m_ShaderBlockCount; ++ i )
- {
- SAFE_ADDREF( m_pShaderBlocks[i].pInputSignatureBlob );
- if( m_pShaderBlocks[i].pReflectionData )
- {
- SAFE_ADDREF( m_pShaderBlocks[i].pReflectionData->pReflection );
- }
- }
-
- D3DXASSERT(NULL == m_pRasterizerBlocks || pEffectSource->m_Heap.IsInHeap(m_pRasterizerBlocks));
- for (i = 0; i < m_RasterizerBlockCount; ++ i)
- {
- SAFE_ADDREF(m_pRasterizerBlocks[i].pRasterizerObject);
- }
-
- D3DXASSERT(NULL == m_pBlendBlocks || pEffectSource->m_Heap.IsInHeap(m_pBlendBlocks));
- for (i = 0; i < m_BlendBlockCount; ++ i)
- {
- SAFE_ADDREF(m_pBlendBlocks[i].pBlendObject);
- }
-
- D3DXASSERT(NULL == m_pDepthStencilBlocks || pEffectSource->m_Heap.IsInHeap(m_pDepthStencilBlocks));
- for (i = 0; i < m_DepthStencilBlockCount; ++ i)
- {
- SAFE_ADDREF(m_pDepthStencilBlocks[i].pDSObject);
- }
-
- D3DXASSERT(NULL == m_pSamplerBlocks || pEffectSource->m_Heap.IsInHeap(m_pSamplerBlocks));
- for (i = 0; i < m_SamplerBlockCount; ++ i)
- {
- SAFE_ADDREF(m_pSamplerBlocks[i].pD3DObject);
- }
-
- D3DXASSERT(NULL == m_pShaderResources || pEffectSource->m_Heap.IsInHeap(m_pShaderResources));
- for (i = 0; i < m_ShaderResourceCount; ++ i)
- {
- SAFE_ADDREF(m_pShaderResources[i].pShaderResource);
- }
-
- D3DXASSERT(NULL == m_pUnorderedAccessViews || pEffectSource->m_Heap.IsInHeap(m_pUnorderedAccessViews));
- for (i = 0; i < m_UnorderedAccessViewCount; ++ i)
- {
- SAFE_ADDREF(m_pUnorderedAccessViews[i].pUnorderedAccessView);
- }
-
- D3DXASSERT(NULL == m_pRenderTargetViews || pEffectSource->m_Heap.IsInHeap(m_pRenderTargetViews));
- for (i = 0; i < m_RenderTargetViewCount; ++ i)
- {
- SAFE_ADDREF(m_pRenderTargetViews[i].pRenderTargetView);
- }
-
- D3DXASSERT(NULL == m_pDepthStencilViews || pEffectSource->m_Heap.IsInHeap(m_pDepthStencilViews));
- for (i = 0; i < m_DepthStencilViewCount; ++ i)
- {
- SAFE_ADDREF(m_pDepthStencilViews[i].pDepthStencilView);
- }
-
- D3DXASSERT(NULL == m_pMemberDataBlocks || pEffectSource->m_Heap.IsInHeap(m_pMemberDataBlocks));
- for (i = 0; i < m_MemberDataCount; ++ i)
- {
- switch( m_pMemberDataBlocks[i].Type )
- {
- case MDT_ClassInstance:
- SAFE_ADDREF(m_pMemberDataBlocks[i].Data.pD3DClassInstance);
- break;
- case MDT_BlendState:
- SAFE_ADDREF(m_pMemberDataBlocks[i].Data.pD3DEffectsManagedBlendState);
- break;
- case MDT_DepthStencilState:
- SAFE_ADDREF(m_pMemberDataBlocks[i].Data.pD3DEffectsManagedDepthStencilState);
- break;
- case MDT_RasterizerState:
- SAFE_ADDREF(m_pMemberDataBlocks[i].Data.pD3DEffectsManagedRasterizerState);
- break;
- case MDT_SamplerState:
- SAFE_ADDREF(m_pMemberDataBlocks[i].Data.pD3DEffectsManagedSamplerState);
- break;
- case MDT_Buffer:
- SAFE_ADDREF(m_pMemberDataBlocks[i].Data.pD3DEffectsManagedConstantBuffer);
- break;
- case MDT_ShaderResourceView:
- SAFE_ADDREF(m_pMemberDataBlocks[i].Data.pD3DEffectsManagedTextureBuffer);
- break;
- default:
- D3DXASSERT( false );
- }
- }
-
- // There's no need to AddRef CBs, since they are recreated
- D3DXASSERT(NULL == m_pCBs || pEffectSource->m_Heap.IsInHeap(m_pCBs));
- for (i = 0; i < m_CBCount; ++ i)
- {
- SAFE_ADDREF(m_pCBs[i].TBuffer.pShaderResource);
- SAFE_ADDREF(m_pCBs[i].pD3DObject);
- }
-
- D3DXASSERT(NULL == m_pShaderBlocks || pEffectSource->m_Heap.IsInHeap(m_pShaderBlocks));
- for (i = 0; i < m_ShaderBlockCount; ++ i)
- {
- SAFE_ADDREF(m_pShaderBlocks[i].pD3DObject);
- }
-
- SAFE_ADDREF( m_pDevice );
-
- SAFE_ADDREF( m_pClassLinkage );
- D3DXASSERT( m_pContext == NULL );
-}
-
-HRESULT CEffect::QueryInterface(REFIID iid, LPVOID *ppv)
-{
- HRESULT hr = S_OK;
-
- if(NULL == ppv)
- {
- DPF(0, "ID3DX11Effect::QueryInterface: NULL parameter");
- hr = E_INVALIDARG;
- goto EXIT;
- }
-
- *ppv = NULL;
- if(IsEqualIID(iid, IID_IUnknown))
- {
- *ppv = (IUnknown *) this;
- }
- else if(IsEqualIID(iid, IID_ID3DX11Effect))
- {
- *ppv = (ID3DX11Effect *) this;
- }
- else
- {
- return E_NOINTERFACE;
- }
-
- AddRef();
-
-EXIT:
- return hr;
-}
-
-ULONG CEffect::AddRef()
-{
- return ++ m_RefCount;
-}
-
-ULONG CEffect::Release()
-{
- if (-- m_RefCount > 0)
- {
- return m_RefCount;
- }
- else
- {
- delete this;
- }
-
- return 0;
-}
-
-// In all shaders, replace pOldBufferBlock with pNewBuffer, if pOldBufferBlock is a dependency
-void CEffect::ReplaceCBReference(SConstantBuffer *pOldBufferBlock, ID3D11Buffer *pNewBuffer)
-{
- UINT iShaderBlock;
-
- for (iShaderBlock=0; iShaderBlock<m_ShaderBlockCount; iShaderBlock++)
- {
- for (UINT iCBDep = 0; iCBDep < m_pShaderBlocks[iShaderBlock].CBDepCount; iCBDep++)
- {
- for (UINT iCB = 0; iCB < m_pShaderBlocks[iShaderBlock].pCBDeps[iCBDep].Count; iCB++)
- {
- if (m_pShaderBlocks[iShaderBlock].pCBDeps[iCBDep].ppFXPointers[iCB] == pOldBufferBlock)
- m_pShaderBlocks[iShaderBlock].pCBDeps[iCBDep].ppD3DObjects[iCB] = pNewBuffer;
- }
- }
- }
-}
-
-// In all shaders, replace pOldSamplerBlock with pNewSampler, if pOldSamplerBlock is a dependency
-void CEffect::ReplaceSamplerReference(SSamplerBlock *pOldSamplerBlock, ID3D11SamplerState *pNewSampler)
-{
- UINT iShaderBlock;
-
- for (iShaderBlock=0; iShaderBlock<m_ShaderBlockCount; iShaderBlock++)
- {
- for (UINT iSamplerDep = 0; iSamplerDep < m_pShaderBlocks[iShaderBlock].SampDepCount; iSamplerDep++)
- {
- for (UINT iSampler = 0; iSampler < m_pShaderBlocks[iShaderBlock].pSampDeps[iSamplerDep].Count; iSampler++)
- {
- if (m_pShaderBlocks[iShaderBlock].pSampDeps[iSamplerDep].ppFXPointers[iSampler] == pOldSamplerBlock)
- m_pShaderBlocks[iShaderBlock].pSampDeps[iSamplerDep].ppD3DObjects[iSampler] = pNewSampler;
- }
- }
- }
-}
-
-// Call BindToDevice after the effect has been fully loaded.
-// BindToDevice will release all D3D11 objects and create new ones on the new device
-HRESULT CEffect::BindToDevice(ID3D11Device *pDevice)
-{
- HRESULT hr = S_OK;
-
- // Set new device
- if (pDevice == NULL)
- {
- DPF(0, "ID3DX11Effect: pDevice must point to a valid D3D11 device");
- return D3DERR_INVALIDCALL;
- }
-
- if (m_pDevice != NULL)
- {
- DPF(0, "ID3DX11Effect: Internal error, rebinding effects to a new device is not supported");
- return D3DERR_INVALIDCALL;
- }
-
- bool featureLevelGE11 = ( pDevice->GetFeatureLevel() >= D3D_FEATURE_LEVEL_11_0 );
-
- pDevice->AddRef();
- SAFE_RELEASE(m_pDevice);
- m_pDevice = pDevice;
- VH( m_pDevice->CreateClassLinkage( &m_pClassLinkage ) );
-
- // Create all constant buffers
- SConstantBuffer *pCB = m_pCBs;
- SConstantBuffer *pCBLast = m_pCBs + m_CBCount;
- for(; pCB != pCBLast; pCB++)
- {
- SAFE_RELEASE(pCB->pD3DObject);
- SAFE_RELEASE(pCB->TBuffer.pShaderResource);
-
- // This is a CBuffer
- if (pCB->Size > 0)
- {
- if (pCB->IsTBuffer)
- {
- D3D11_BUFFER_DESC bufDesc;
- // size is always register aligned
- bufDesc.ByteWidth = pCB->Size;
- bufDesc.Usage = D3D11_USAGE_DEFAULT;
- bufDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
- bufDesc.CPUAccessFlags = 0;
- bufDesc.MiscFlags = 0;
-
- VH( pDevice->CreateBuffer( &bufDesc, NULL, &pCB->pD3DObject) );
-
- D3D11_SHADER_RESOURCE_VIEW_DESC viewDesc;
- viewDesc.Format = DXGI_FORMAT_R32G32B32A32_UINT;
- viewDesc.ViewDimension = D3D11_SRV_DIMENSION_BUFFER;
- viewDesc.Buffer.ElementOffset = 0;
- viewDesc.Buffer.ElementWidth = pCB->Size / SType::c_RegisterSize;
-
- VH( pDevice->CreateShaderResourceView( pCB->pD3DObject, &viewDesc, &pCB->TBuffer.pShaderResource) );
- }
- else
- {
- D3D11_BUFFER_DESC bufDesc;
- // size is always register aligned
- bufDesc.ByteWidth = pCB->Size;
- bufDesc.Usage = D3D11_USAGE_DEFAULT;
- bufDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
- bufDesc.CPUAccessFlags = 0;
- bufDesc.MiscFlags = 0;
-
- VH( pDevice->CreateBuffer( &bufDesc, NULL, &pCB->pD3DObject) );
- pCB->TBuffer.pShaderResource = NULL;
- }
-
- pCB->IsDirty = TRUE;
- }
- else
- {
- pCB->IsDirty = FALSE;
- }
- }
-
- // Create all RasterizerStates
- SRasterizerBlock *pRB = m_pRasterizerBlocks;
- SRasterizerBlock *pRBLast = m_pRasterizerBlocks + m_RasterizerBlockCount;
- for(; pRB != pRBLast; pRB++)
- {
- SAFE_RELEASE(pRB->pRasterizerObject);
- if( SUCCEEDED( m_pDevice->CreateRasterizerState( &pRB->BackingStore, &pRB->pRasterizerObject) ) )
- pRB->IsValid = TRUE;
- else
- pRB->IsValid = FALSE;
- }
-
- // Create all DepthStencils
- SDepthStencilBlock *pDS = m_pDepthStencilBlocks;
- SDepthStencilBlock *pDSLast = m_pDepthStencilBlocks + m_DepthStencilBlockCount;
- for(; pDS != pDSLast; pDS++)
- {
- SAFE_RELEASE(pDS->pDSObject);
- if( SUCCEEDED( m_pDevice->CreateDepthStencilState( &pDS->BackingStore, &pDS->pDSObject) ) )
- pDS->IsValid = TRUE;
- else
- pDS->IsValid = FALSE;
- }
-
- // Create all BlendStates
- SBlendBlock *pBlend = m_pBlendBlocks;
- SBlendBlock *pBlendLast = m_pBlendBlocks + m_BlendBlockCount;
- for(; pBlend != pBlendLast; pBlend++)
- {
- SAFE_RELEASE(pBlend->pBlendObject);
- if( SUCCEEDED( m_pDevice->CreateBlendState( &pBlend->BackingStore, &pBlend->pBlendObject ) ) )
- pBlend->IsValid = TRUE;
- else
- pBlend->IsValid = FALSE;
- }
-
- // Create all Samplers
- SSamplerBlock *pSampler = m_pSamplerBlocks;
- SSamplerBlock *pSamplerLast = m_pSamplerBlocks + m_SamplerBlockCount;
- for(; pSampler != pSamplerLast; pSampler++)
- {
- SAFE_RELEASE(pSampler->pD3DObject);
-
- VH( m_pDevice->CreateSamplerState( &pSampler->BackingStore.SamplerDesc, &pSampler->pD3DObject) );
- }
-
- // Create all shaders
- ID3D11ClassLinkage* neededClassLinkage = featureLevelGE11 ? m_pClassLinkage : NULL;
- SShaderBlock *pShader = m_pShaderBlocks;
- SShaderBlock *pShaderLast = m_pShaderBlocks + m_ShaderBlockCount;
- for(; pShader != pShaderLast; pShader++)
- {
- SAFE_RELEASE(pShader->pD3DObject);
-
- if (NULL == pShader->pReflectionData)
- {
- // NULL shader. It's one of these:
- // PixelShader ps;
- // or
- // SetPixelShader( NULL );
- continue;
- }
-
- if (pShader->pReflectionData->pStreamOutDecls[0] || pShader->pReflectionData->pStreamOutDecls[1] ||
- pShader->pReflectionData->pStreamOutDecls[2] || pShader->pReflectionData->pStreamOutDecls[3] )
- {
- // This is a geometry shader, process it's data
- CSOParser soParser;
- VH( soParser.Parse(pShader->pReflectionData->pStreamOutDecls) );
- UINT strides[4];
- soParser.GetStrides( strides );
- hr = m_pDevice->CreateGeometryShaderWithStreamOutput((UINT*) pShader->pReflectionData->pBytecode,
- pShader->pReflectionData->BytecodeLength,
- soParser.GetDeclArray(),
- soParser.GetDeclCount(),
- strides,
- featureLevelGE11 ? 4 : 1,
- pShader->pReflectionData->RasterizedStream,
- neededClassLinkage,
- (ID3D11GeometryShader**) &pShader->pD3DObject);
- if (FAILED(hr))
- {
- DPF(1, "ID3DX11Effect::Load - failed to create GeometryShader with StreamOutput decl: \"%s\"", soParser.GetErrorString() );
- pShader->IsValid = FALSE;
- hr = S_OK;
- }
- }
- else
- {
- // This is a regular shader
- if( pShader->pReflectionData->RasterizedStream == D3D11_SO_NO_RASTERIZED_STREAM )
- pShader->IsValid = FALSE;
- else
- {
- if( FAILED( (m_pDevice->*(pShader->pVT->pCreateShader))( (UINT *) pShader->pReflectionData->pBytecode, pShader->pReflectionData->BytecodeLength, neededClassLinkage, &pShader->pD3DObject) ) )
- {
- DPF(1, "ID3DX11Effect::Load - failed to create shader" );
- pShader->IsValid = FALSE;
- }
- }
- }
-
- // Update all dependency pointers
- VH( pShader->OnDeviceBind() );
- }
-
- // Initialize the member data pointers for all variables
- UINT CurMemberData = 0;
- for (UINT i = 0; i < m_VariableCount; ++ i)
- {
- if( m_pVariables[i].pMemberData )
- {
- if( m_pVariables[i].pType->IsClassInstance() )
- {
- for (UINT j = 0; j < max(m_pVariables[i].pType->Elements,1); ++j)
- {
- D3DXASSERT( CurMemberData < m_MemberDataCount );
- ID3D11ClassInstance** ppCI = &(m_pVariables[i].pMemberData + j)->Data.pD3DClassInstance;
- (m_pVariables[i].pMemberData + j)->Type = MDT_ClassInstance;
- (m_pVariables[i].pMemberData + j)->Data.pD3DClassInstance = NULL;
- if( m_pVariables[i].pType->TotalSize > 0 )
- {
- // ignore failures in GetClassInstance;
- m_pClassLinkage->GetClassInstance( m_pVariables[i].pName, j, ppCI );
- }
- else
- {
- // The HLSL compiler optimizes out zero-sized classes, so we have to create class instances from scratch
- if( FAILED( m_pClassLinkage->CreateClassInstance( m_pVariables[i].pType->pTypeName, 0, 0, 0, 0, ppCI ) ) )
- {
- DPF(0, "ID3DX11Effect: Out of memory while trying to create new class instance interface");
- }
- }
- CurMemberData++;
- }
- }
- else if( m_pVariables[i].pType->IsStateBlockObject() )
- {
- for (UINT j = 0; j < max(m_pVariables[i].pType->Elements,1); ++j)
- {
- switch( m_pVariables[i].pType->ObjectType )
- {
- case EOT_Blend:
- (m_pVariables[i].pMemberData + j)->Type = MDT_BlendState;
- (m_pVariables[i].pMemberData + j)->Data.pD3DEffectsManagedBlendState = NULL;
- break;
- case EOT_Rasterizer:
- (m_pVariables[i].pMemberData + j)->Type = MDT_RasterizerState;
- (m_pVariables[i].pMemberData + j)->Data.pD3DEffectsManagedRasterizerState = NULL;
- break;
- case EOT_DepthStencil:
- (m_pVariables[i].pMemberData + j)->Type = MDT_DepthStencilState;
- (m_pVariables[i].pMemberData + j)->Data.pD3DEffectsManagedDepthStencilState = NULL;
- break;
- case EOT_Sampler:
- (m_pVariables[i].pMemberData + j)->Type = MDT_SamplerState;
- (m_pVariables[i].pMemberData + j)->Data.pD3DEffectsManagedSamplerState = NULL;
- break;
- default:
- VB( FALSE );
- }
- CurMemberData++;
- }
- }
- else
- {
- VB( FALSE );
- }
- }
- }
- for(pCB = m_pCBs; pCB != pCBLast; pCB++)
- {
- (pCB->pMemberData + 0)->Type = MDT_Buffer;
- (pCB->pMemberData + 0)->Data.pD3DEffectsManagedConstantBuffer = NULL;
- CurMemberData++;
- (pCB->pMemberData + 1)->Type = MDT_ShaderResourceView;
- (pCB->pMemberData + 1)->Data.pD3DEffectsManagedTextureBuffer = NULL;
- CurMemberData++;
- }
-
-
- // Determine which techniques and passes are known to be invalid
- for( UINT iGroup=0; iGroup < m_GroupCount; iGroup++ )
- {
- SGroup* pGroup = &m_pGroups[iGroup];
- pGroup->InitiallyValid = TRUE;
-
- for( UINT iTech=0; iTech < pGroup->TechniqueCount; iTech++ )
- {
- STechnique* pTechnique = &pGroup->pTechniques[iTech];
- pTechnique->InitiallyValid = TRUE;
-
- for( UINT iPass = 0; iPass < pTechnique->PassCount; iPass++ )
- {
- SPassBlock* pPass = &pTechnique->pPasses[iPass];
- pPass->InitiallyValid = TRUE;
-
- if( pPass->BackingStore.pBlendBlock != NULL && !pPass->BackingStore.pBlendBlock->IsValid )
- pPass->InitiallyValid = FALSE;
- if( pPass->BackingStore.pDepthStencilBlock != NULL && !pPass->BackingStore.pDepthStencilBlock->IsValid )
- pPass->InitiallyValid = FALSE;
- if( pPass->BackingStore.pRasterizerBlock != NULL && !pPass->BackingStore.pRasterizerBlock->IsValid )
- pPass->InitiallyValid = FALSE;
- if( pPass->BackingStore.pVertexShaderBlock != NULL && !pPass->BackingStore.pVertexShaderBlock->IsValid )
- pPass->InitiallyValid = FALSE;
- if( pPass->BackingStore.pPixelShaderBlock != NULL && !pPass->BackingStore.pPixelShaderBlock->IsValid )
- pPass->InitiallyValid = FALSE;
- if( pPass->BackingStore.pGeometryShaderBlock != NULL && !pPass->BackingStore.pGeometryShaderBlock->IsValid )
- pPass->InitiallyValid = FALSE;
- if( pPass->BackingStore.pHullShaderBlock != NULL && !pPass->BackingStore.pHullShaderBlock->IsValid )
- pPass->InitiallyValid = FALSE;
- if( pPass->BackingStore.pDomainShaderBlock != NULL && !pPass->BackingStore.pDomainShaderBlock->IsValid )
- pPass->InitiallyValid = FALSE;
- if( pPass->BackingStore.pComputeShaderBlock != NULL && !pPass->BackingStore.pComputeShaderBlock->IsValid )
- pPass->InitiallyValid = FALSE;
-
- pTechnique->InitiallyValid &= pPass->InitiallyValid;
- }
- pGroup->InitiallyValid &= pTechnique->InitiallyValid;
- }
- }
-
-lExit:
- return hr;
-}
-
-// FindVariableByName, plus an understanding of literal indices
-// This code handles A[i].
-// It does not handle anything else, like A.B, A[B[i]], A[B]
-SVariable * CEffect::FindVariableByNameWithParsing(LPCSTR pName)
-{
- SGlobalVariable *pVariable;
- const UINT MAX_PARSABLE_NAME_LENGTH = 256;
- char pScratchString[MAX_PARSABLE_NAME_LENGTH];
-
- const char* pSource = pName;
- char* pDest = pScratchString;
- char* pEnd = pScratchString + MAX_PARSABLE_NAME_LENGTH;
-
- pVariable = NULL;
-
- while( *pSource != 0 )
- {
- if( pDest == pEnd )
- {
- pVariable = FindLocalVariableByName(pName);
- if( pVariable == NULL )
- {
- DPF( 0, "Name %s is too long to parse", &pName );
- }
- return pVariable;
- }
-
- if( *pSource == '[' )
- {
- // parse previous variable name
- *pDest = 0;
- D3DXASSERT( pVariable == NULL );
- pVariable = FindLocalVariableByName(pScratchString);
- if( pVariable == NULL )
- {
- return NULL;
- }
- pDest = pScratchString;
- }
- else if( *pSource == ']' )
- {
- // parse integer
- *pDest = 0;
- UINT index = atoi(pScratchString);
- D3DXASSERT( pVariable != NULL );
- pVariable = (SGlobalVariable*)pVariable->GetElement(index);
- if( pVariable && !pVariable->IsValid() )
- {
- pVariable = NULL;
- }
- return pVariable;
- }
- else
- {
- // add character
- *pDest = *pSource;
- pDest++;
- }
- pSource++;
- }
-
- if( pDest != pScratchString )
- {
- // parse the variable name (there was no [i])
- *pDest = 0;
- D3DXASSERT( pVariable == NULL );
- pVariable = FindLocalVariableByName(pScratchString);
- }
-
- return pVariable;
-}
-
-SGlobalVariable * CEffect::FindVariableByName(LPCSTR pName)
-{
- SGlobalVariable *pVariable;
-
- pVariable = FindLocalVariableByName(pName);
-
- return pVariable;
-}
-
-SGlobalVariable * CEffect::FindLocalVariableByName(LPCSTR pName)
-{
- SGlobalVariable *pVariable, *pVariableEnd;
-
- pVariableEnd = m_pVariables + m_VariableCount;
- for (pVariable = m_pVariables; pVariable != pVariableEnd; pVariable++)
- {
- if (strcmp( pVariable->pName, pName) == 0)
- {
- return pVariable;
- }
- }
-
- return NULL;
-}
-
-
-//
-// Checks to see if two types are equivalent (either at runtime
-// or during the type-pooling load process)
-//
-// Major assumption: if both types are structures, then their
-// member types & names should already have been added to the pool,
-// in which case their member type & name pointers should be equal.
-//
-// This is true because complex data types (structures) have all
-// sub-types translated before the containing type is translated,
-// which means that simple sub-types (numeric types) have already
-// been pooled.
-//
-BOOL SType::IsEqual(SType *pOtherType) CONST
-{
- if (VarType != pOtherType->VarType || Elements != pOtherType->Elements
- || strcmp(pTypeName, pOtherType->pTypeName) != 0)
- {
- return FALSE;
- }
-
- switch (VarType)
- {
- case EVT_Struct:
- {
- if (StructType.Members != pOtherType->StructType.Members)
- {
- return FALSE;
- }
- D3DXASSERT(StructType.pMembers != NULL && pOtherType->StructType.pMembers != NULL);
-
- UINT i;
- for (i = 0; i < StructType.Members; ++ i)
- {
- // names for types must exist (not true for semantics)
- D3DXASSERT(StructType.pMembers[i].pName != NULL && pOtherType->StructType.pMembers[i].pName != NULL);
-
- if (StructType.pMembers[i].pType != pOtherType->StructType.pMembers[i].pType ||
- StructType.pMembers[i].Data.Offset != pOtherType->StructType.pMembers[i].Data.Offset ||
- StructType.pMembers[i].pName != pOtherType->StructType.pMembers[i].pName ||
- StructType.pMembers[i].pSemantic != pOtherType->StructType.pMembers[i].pSemantic)
- {
- return FALSE;
- }
- }
- }
- break;
-
- case EVT_Object:
- {
- if (ObjectType != pOtherType->ObjectType)
- {
- return FALSE;
- }
- }
- break;
-
- case EVT_Numeric:
- {
- if (NumericType.Rows != pOtherType->NumericType.Rows ||
- NumericType.Columns != pOtherType->NumericType.Columns ||
- NumericType.ScalarType != pOtherType->NumericType.ScalarType ||
- NumericType.NumericLayout != pOtherType->NumericType.NumericLayout ||
- NumericType.IsColumnMajor != pOtherType->NumericType.IsColumnMajor ||
- NumericType.IsPackedArray != pOtherType->NumericType.IsPackedArray)
- {
- return FALSE;
- }
- }
- break;
-
- case EVT_Interface:
- {
- // VarType and pTypeName handled above
- }
- break;
-
- default:
- {
- D3DXASSERT(0);
- return FALSE;
- }
- break;
- }
-
- D3DXASSERT(TotalSize == pOtherType->TotalSize && Stride == pOtherType->Stride && PackedSize == pOtherType->PackedSize);
-
- return TRUE;
-}
-
-UINT SType::GetTotalUnpackedSize(BOOL IsSingleElement) CONST
-{
- if (VarType == EVT_Object)
- {
- return 0;
- }
- else if (VarType == EVT_Interface)
- {
- return 0;
- }
- else if (Elements > 0 && IsSingleElement)
- {
- D3DXASSERT( ( TotalSize == 0 && Stride == 0 ) ||
- ( (TotalSize > (Stride * (Elements - 1))) && (TotalSize <= (Stride * Elements)) ) );
- return TotalSize - Stride * (Elements - 1);
- }
- else
- {
- return TotalSize;
- }
-}
-
-UINT SType::GetTotalPackedSize(BOOL IsSingleElement) CONST
-{
- if (Elements > 0 && IsSingleElement)
- {
- D3DXASSERT(PackedSize % Elements == 0);
- return PackedSize / Elements;
- }
- else
- {
- return PackedSize;
- }
-}
-
-SConstantBuffer *CEffect::FindCB(LPCSTR pName)
-{
- UINT i;
-
- for (i=0; i<m_CBCount; i++)
- {
- if (!strcmp(m_pCBs[i].pName, pName))
- {
- return &m_pCBs[i];
- }
- }
-
- return NULL;
-}
-
-inline UINT PtrToDword(void *pPtr)
-{
- return (UINT)(UINT_PTR) pPtr;
-}
-
-BOOL CEffect::IsOptimized()
-{
- if ((m_Flags & D3DX11_EFFECT_OPTIMIZED) != 0)
- {
- D3DXASSERT(NULL == m_pReflection);
- return TRUE;
- }
- else
- {
- D3DXASSERT(NULL != m_pReflection);
- return FALSE;
- }
-}
-
-// Replace *ppType with the corresponding value in pMappingTable
-// pMappingTable table describes how to map old type pointers to new type pointers
-static HRESULT RemapType(SType **ppType, CPointerMappingTable *pMappingTable)
-{
- HRESULT hr = S_OK;
-
- SPointerMapping ptrMapping;
- CPointerMappingTable::CIterator iter;
- ptrMapping.pOld = *ppType;
- VH( pMappingTable->FindValueWithHash(ptrMapping, ptrMapping.Hash(), &iter) );
- *ppType = (SType *) iter.GetData().pNew;
-
-lExit:
- return hr;
-}
-
-// Replace *ppString with the corresponding value in pMappingTable
-// pMappingTable table describes how to map old string pointers to new string pointers
-static HRESULT RemapString(__in char **ppString, CPointerMappingTable *pMappingTable)
-{
- HRESULT hr = S_OK;
-
- SPointerMapping ptrMapping;
- CPointerMappingTable::CIterator iter;
- ptrMapping.pOld = *ppString;
- VH( pMappingTable->FindValueWithHash(ptrMapping, ptrMapping.Hash(), &iter) );
- *ppString = (char *) iter.GetData().pNew;
-
-lExit:
- return hr;
-}
-
-// Used in cloning, copy m_pMemberInterfaces from pEffectSource to this
-HRESULT CEffect::CopyMemberInterfaces( CEffect* pEffectSource )
-{
- HRESULT hr = S_OK;
- UINT i; // after a failure, this holds the failing index
-
- UINT Members = pEffectSource->m_pMemberInterfaces.GetSize();
- m_pMemberInterfaces.AddRange(Members);
- for( i=0; i < Members; i++ )
- {
- SMember* pOldMember = pEffectSource->m_pMemberInterfaces[i];
- if( pOldMember == NULL )
- {
- // During Optimization, m_pMemberInterfaces[i] was set to NULL because it was an annotation
- m_pMemberInterfaces[i] = NULL;
- continue;
- }
-
- SMember *pNewMember;
- D3DXASSERT( pOldMember->pTopLevelEntity != NULL );
-
- if (NULL == (pNewMember = CreateNewMember((SType*)pOldMember->pType, FALSE)))
- {
- DPF(0, "ID3DX11Effect: Out of memory while trying to create new member variable interface");
- VN( pNewMember );
- }
-
- pNewMember->pType = pOldMember->pType;
- pNewMember->pName = pOldMember->pName;
- pNewMember->pSemantic = pOldMember->pSemantic;
- pNewMember->Data.pGeneric = pOldMember->Data.pGeneric;
- pNewMember->IsSingleElement = pOldMember->IsSingleElement;
- pNewMember->pTopLevelEntity = pOldMember->pTopLevelEntity;
- pNewMember->pMemberData = pOldMember->pMemberData;
-
- m_pMemberInterfaces[i] = pNewMember;
- }
-
-lExit:
- if( FAILED(hr) )
- {
- D3DXASSERT( i < Members );
- ZeroMemory( &m_pMemberInterfaces[i], sizeof(SMember) * ( Members - i ) );
- }
- return hr;
-}
-
-// Used in cloning, copy the string pool from pEffectSource to this and build mappingTable
-// for use in RemapString
-HRESULT CEffect::CopyStringPool( CEffect* pEffectSource, CPointerMappingTable& mappingTable )
-{
- HRESULT hr = S_OK;
- D3DXASSERT( m_pPooledHeap != NULL );
- VN( m_pStringPool = NEW CEffect::CStringHashTable );
- m_pStringPool->SetPrivateHeap(m_pPooledHeap);
- VH( m_pStringPool->AutoGrow() );
-
- CStringHashTable::CIterator stringIter;
-
- // move strings over, build mapping table
- for (pEffectSource->m_pStringPool->GetFirstEntry(&stringIter); !pEffectSource->m_pStringPool->PastEnd(&stringIter); pEffectSource->m_pStringPool->GetNextEntry(&stringIter))
- {
- SPointerMapping ptrMapping;
- char *pString;
-
- const char* pOldString = stringIter.GetData();
- ptrMapping.pOld = (void*)pOldString;
- UINT len = (UINT)strlen(pOldString);
- UINT hash = ptrMapping.Hash();
- VN( pString = new(*m_pPooledHeap) char[len + 1] );
- ptrMapping.pNew = (void*)pString;
- memcpy(ptrMapping.pNew, ptrMapping.pOld, len + 1);
- VH( m_pStringPool->AddValueWithHash(pString, hash) );
-
- VH( mappingTable.AddValueWithHash(ptrMapping, hash) );
- }
-
- // Uncomment to print string mapping
- /*
- CPointerMappingTable::CIterator mapIter;
- for (mappingTable.GetFirstEntry(&mapIter); !mappingTable.PastEnd(&mapIter); mappingTable.GetNextEntry(&mapIter))
- {
- SPointerMapping ptrMapping = mapIter.GetData();
- DPF(0, "string: 0x%x : 0x%x %s", (UINT_PTR)ptrMapping.pOld, (UINT_PTR)ptrMapping.pNew, (char*)ptrMapping.pNew );
- }*/
-
-lExit:
- return hr;
-}
-
-// Used in cloning, copy the unoptimized type pool from pEffectSource to this and build mappingTableTypes
-// for use in RemapType. mappingTableStrings is the mapping table previously filled when copying strings.
-HRESULT CEffect::CopyTypePool( CEffect* pEffectSource, CPointerMappingTable& mappingTableTypes, CPointerMappingTable& mappingTableStrings )
-{
- HRESULT hr = S_OK;
- D3DXASSERT( m_pPooledHeap != NULL );
- VN( m_pTypePool = NEW CEffect::CTypeHashTable );
- m_pTypePool->SetPrivateHeap(m_pPooledHeap);
- VH( m_pTypePool->AutoGrow() );
-
- CTypeHashTable::CIterator typeIter;
- CPointerMappingTable::CIterator mapIter;
-
- // first pass: move types over, build mapping table
- for (pEffectSource->m_pTypePool->GetFirstEntry(&typeIter); !pEffectSource->m_pTypePool->PastEnd(&typeIter); pEffectSource->m_pTypePool->GetNextEntry(&typeIter))
- {
- SPointerMapping ptrMapping;
- SType *pType;
-
- ptrMapping.pOld = typeIter.GetData();
- UINT hash = ptrMapping.Hash();
- VN( (ptrMapping.pNew) = new(*m_pPooledHeap) SType );
- memcpy(ptrMapping.pNew, ptrMapping.pOld, sizeof(SType));
-
- pType = (SType *) ptrMapping.pNew;
-
- // if this is a struct, move its members to the newly allocated space
- if (EVT_Struct == pType->VarType)
- {
- SVariable* pOldMembers = pType->StructType.pMembers;
- VN( pType->StructType.pMembers = new(*m_pPooledHeap) SVariable[pType->StructType.Members] );
- memcpy(pType->StructType.pMembers, pOldMembers, pType->StructType.Members * sizeof(SVariable));
- }
-
- VH( m_pTypePool->AddValueWithHash(pType, hash) );
- VH( mappingTableTypes.AddValueWithHash(ptrMapping, hash) );
- }
-
- // second pass: fixup structure member & name pointers
- for (mappingTableTypes.GetFirstEntry(&mapIter); !mappingTableTypes.PastEnd(&mapIter); mappingTableTypes.GetNextEntry(&mapIter))
- {
- SPointerMapping ptrMapping = mapIter.GetData();
-
- // Uncomment to print type mapping
- //DPF(0, "type: 0x%x : 0x%x", (UINT_PTR)ptrMapping.pOld, (UINT_PTR)ptrMapping.pNew );
-
- SType *pType = (SType *) ptrMapping.pNew;
-
- if( pType->pTypeName )
- {
- VH( RemapString(&pType->pTypeName, &mappingTableStrings) );
- }
-
- // if this is a struct, fix up its members' pointers
- if (EVT_Struct == pType->VarType)
- {
- for (UINT i = 0; i < pType->StructType.Members; ++ i)
- {
- VH( RemapType((SType**)&pType->StructType.pMembers[i].pType, &mappingTableTypes) );
- if( pType->StructType.pMembers[i].pName )
- {
- VH( RemapString(&pType->StructType.pMembers[i].pName, &mappingTableStrings) );
- }
- if( pType->StructType.pMembers[i].pSemantic )
- {
- VH( RemapString(&pType->StructType.pMembers[i].pSemantic, &mappingTableStrings) );
- }
- }
- }
- }
-
-lExit:
- return hr;
-}
-
-// Used in cloning, copy the unoptimized type pool from pEffectSource to this and build mappingTableTypes
-// for use in RemapType. mappingTableStrings is the mapping table previously filled when copying strings.
-HRESULT CEffect::CopyOptimizedTypePool( CEffect* pEffectSource, CPointerMappingTable& mappingTableTypes )
-{
- HRESULT hr = S_OK;
- CEffectHeap* pOptimizedTypeHeap = NULL;
-
- D3DXASSERT( pEffectSource->m_pOptimizedTypeHeap != NULL );
- D3DXASSERT( m_pTypePool == NULL );
- D3DXASSERT( m_pStringPool == NULL );
- D3DXASSERT( m_pPooledHeap == NULL );
-
- VN( pOptimizedTypeHeap = NEW CEffectHeap );
- VH( pOptimizedTypeHeap->ReserveMemory( pEffectSource->m_pOptimizedTypeHeap->GetSize() ) );
- CPointerMappingTable::CIterator mapIter;
-
- // first pass: move types over, build mapping table
- BYTE* pReadTypes = pEffectSource->m_pOptimizedTypeHeap->GetDataStart();
- while( pEffectSource->m_pOptimizedTypeHeap->IsInHeap( pReadTypes ) )
- {
- SPointerMapping ptrMapping;
- SType *pType;
- UINT moveSize;
-
- ptrMapping.pOld = ptrMapping.pNew = pReadTypes;
- moveSize = sizeof(SType);
- VH( pOptimizedTypeHeap->MoveData(&ptrMapping.pNew, moveSize) );
- pReadTypes += moveSize;
-
- pType = (SType *) ptrMapping.pNew;
-
- // if this is a struct, move its members to the newly allocated space
- if (EVT_Struct == pType->VarType)
- {
- moveSize = pType->StructType.Members * sizeof(SVariable);
- VH( pOptimizedTypeHeap->MoveData((void **)&pType->StructType.pMembers, moveSize) );
- pReadTypes += moveSize;
- }
-
- VH( mappingTableTypes.AddValueWithHash(ptrMapping, ptrMapping.Hash()) );
- }
-
- // second pass: fixup structure member & name pointers
- for (mappingTableTypes.GetFirstEntry(&mapIter); !mappingTableTypes.PastEnd(&mapIter); mappingTableTypes.GetNextEntry(&mapIter))
- {
- SPointerMapping ptrMapping = mapIter.GetData();
-
- // Uncomment to print type mapping
- //DPF(0, "type: 0x%x : 0x%x", (UINT_PTR)ptrMapping.pOld, (UINT_PTR)ptrMapping.pNew );
-
- SType *pType = (SType *) ptrMapping.pNew;
-
- // if this is a struct, fix up its members' pointers
- if (EVT_Struct == pType->VarType)
- {
- for (UINT i = 0; i < pType->StructType.Members; ++ i)
- {
- VH( RemapType((SType**)&pType->StructType.pMembers[i].pType, &mappingTableTypes) );
- }
- }
- }
-
-lExit:
- return hr;
-}
-
-// Used in cloning, create new ID3D11ConstantBuffers for each non-single CB
-HRESULT CEffect::RecreateCBs()
-{
- HRESULT hr = S_OK;
- UINT i; // after a failure, this holds the failing index
-
- for (i = 0; i < m_CBCount; ++ i)
- {
- SConstantBuffer* pCB = &m_pCBs[i];
-
- pCB->IsNonUpdatable = pCB->IsUserManaged || pCB->ClonedSingle();
-
- if( pCB->Size > 0 && !pCB->ClonedSingle() )
- {
- ID3D11Buffer** ppOriginalBuffer;
- ID3D11ShaderResourceView** ppOriginalTBufferView;
-
- if( pCB->IsUserManaged )
- {
- ppOriginalBuffer = &pCB->pMemberData[0].Data.pD3DEffectsManagedConstantBuffer;
- ppOriginalTBufferView = &pCB->pMemberData[1].Data.pD3DEffectsManagedTextureBuffer;
- }
- else
- {
- ppOriginalBuffer = &pCB->pD3DObject;
- ppOriginalTBufferView = &pCB->TBuffer.pShaderResource;
- }
-
- VN( *ppOriginalBuffer );
- D3D11_BUFFER_DESC bufDesc;
- (*ppOriginalBuffer)->GetDesc( &bufDesc );
- ID3D11Buffer* pNewBuffer = NULL;
- VH( m_pDevice->CreateBuffer( &bufDesc, NULL, &pNewBuffer ) );
- (*ppOriginalBuffer)->Release();
- (*ppOriginalBuffer) = pNewBuffer;
- pNewBuffer = NULL;
-
- if( pCB->IsTBuffer )
- {
- VN( *ppOriginalTBufferView );
- D3D11_SHADER_RESOURCE_VIEW_DESC viewDesc;
- (*ppOriginalTBufferView)->GetDesc( &viewDesc );
- ID3D11ShaderResourceView* pNewView = NULL;
- VH( m_pDevice->CreateShaderResourceView( (*ppOriginalBuffer), &viewDesc, &pNewView) );
- (*ppOriginalTBufferView)->Release();
- (*ppOriginalTBufferView) = pNewView;
- pNewView = NULL;
- }
- else
- {
- D3DXASSERT( *ppOriginalTBufferView == NULL );
- ReplaceCBReference( pCB, (*ppOriginalBuffer) );
- }
-
- pCB->IsDirty = TRUE;
- }
- }
-
-lExit:
- return hr;
-}
-
-// Move Name and Semantic strings using mappingTableStrings
-HRESULT CEffect::FixupMemberInterface( SMember* pMember, CEffect* pEffectSource, CPointerMappingTable& mappingTableStrings )
-{
- HRESULT hr = S_OK;
-
- if( pMember->pName )
- {
- if( pEffectSource->m_pReflection && pEffectSource->m_pReflection->m_Heap.IsInHeap(pMember->pName) )
- {
- pMember->pName = (char*)((UINT_PTR)pMember->pName - (UINT_PTR)pEffectSource->m_pReflection->m_Heap.GetDataStart() + (UINT_PTR)m_pReflection->m_Heap.GetDataStart());
- }
- else
- {
- VH( RemapString(&pMember->pName, &mappingTableStrings) );
- }
- }
- if( pMember->pSemantic )
- {
- if( pEffectSource->m_pReflection && pEffectSource->m_pReflection->m_Heap.IsInHeap(pMember->pSemantic) )
- {
- pMember->pSemantic = (char*)((UINT_PTR)pMember->pSemantic - (UINT_PTR)pEffectSource->m_pReflection->m_Heap.GetDataStart() + (UINT_PTR)m_pReflection->m_Heap.GetDataStart());
- }
- else
- {
- VH( RemapString(&pMember->pSemantic, &mappingTableStrings) );
- }
- }
-
-lExit:
- return hr;
-}
-
-//////////////////////////////////////////////////////////////////////////
-// Public API to create a copy of this effect
-HRESULT CEffect::CloneEffect(UINT Flags, ID3DX11Effect** ppClonedEffect )
-{
- HRESULT hr = S_OK;
- CPointerMappingTable mappingTableTypes;
- CPointerMappingTable mappingTableStrings;
-
- CEffectLoader loader;
- CEffect* pNewEffect = NULL;
- CDataBlockStore* pTempHeap = NULL;
-
-
- VN( pNewEffect = NEW CEffect( m_Flags ) );
- if( Flags & D3DX11_EFFECT_CLONE_FORCE_NONSINGLE )
- {
- // The effect is cloned as if there was no original, so don't mark it as cloned
- pNewEffect->m_Flags &= ~(UINT)D3DX11_EFFECT_CLONE;
- }
- else
- {
- pNewEffect->m_Flags |= D3DX11_EFFECT_CLONE;
- }
-
- pNewEffect->m_VariableCount = m_VariableCount;
- pNewEffect->m_pVariables = m_pVariables;
- pNewEffect->m_AnonymousShaderCount = m_AnonymousShaderCount;
- pNewEffect->m_pAnonymousShaders = m_pAnonymousShaders;
- pNewEffect->m_TechniqueCount = m_TechniqueCount;
- pNewEffect->m_GroupCount = m_GroupCount;
- pNewEffect->m_pGroups = m_pGroups;
- pNewEffect->m_pNullGroup = m_pNullGroup;
- pNewEffect->m_ShaderBlockCount = m_ShaderBlockCount;
- pNewEffect->m_pShaderBlocks = m_pShaderBlocks;
- pNewEffect->m_DepthStencilBlockCount = m_DepthStencilBlockCount;
- pNewEffect->m_pDepthStencilBlocks = m_pDepthStencilBlocks;
- pNewEffect->m_BlendBlockCount = m_BlendBlockCount;
- pNewEffect->m_pBlendBlocks = m_pBlendBlocks;
- pNewEffect->m_RasterizerBlockCount = m_RasterizerBlockCount;
- pNewEffect->m_pRasterizerBlocks = m_pRasterizerBlocks;
- pNewEffect->m_SamplerBlockCount = m_SamplerBlockCount;
- pNewEffect->m_pSamplerBlocks = m_pSamplerBlocks;
- pNewEffect->m_MemberDataCount = m_MemberDataCount;
- pNewEffect->m_pMemberDataBlocks = m_pMemberDataBlocks;
- pNewEffect->m_InterfaceCount = m_InterfaceCount;
- pNewEffect->m_pInterfaces = m_pInterfaces;
- pNewEffect->m_CBCount = m_CBCount;
- pNewEffect->m_pCBs = m_pCBs;
- pNewEffect->m_StringCount = m_StringCount;
- pNewEffect->m_pStrings = m_pStrings;
- pNewEffect->m_ShaderResourceCount = m_ShaderResourceCount;
- pNewEffect->m_pShaderResources = m_pShaderResources;
- pNewEffect->m_UnorderedAccessViewCount = m_UnorderedAccessViewCount;
- pNewEffect->m_pUnorderedAccessViews = m_pUnorderedAccessViews;
- pNewEffect->m_RenderTargetViewCount = m_RenderTargetViewCount;
- pNewEffect->m_pRenderTargetViews = m_pRenderTargetViews;
- pNewEffect->m_DepthStencilViewCount = m_DepthStencilViewCount;
- pNewEffect->m_pDepthStencilViews = m_pDepthStencilViews;
- pNewEffect->m_LocalTimer = m_LocalTimer;
- pNewEffect->m_FXLIndex = m_FXLIndex;
- pNewEffect->m_pDevice = m_pDevice;
- pNewEffect->m_pClassLinkage = m_pClassLinkage;
-
- pNewEffect->AddRefAllForCloning( this );
-
-
- // m_pMemberInterfaces is a vector of cbuffer members that were created when the user called GetMemberBy* or GetElement
- // or during Effect loading when an interface is initialized to a global class variable elment.
- VH( pNewEffect->CopyMemberInterfaces( this ) );
-
- loader.m_pvOldMemberInterfaces = &m_pMemberInterfaces;
- loader.m_pEffect = pNewEffect;
- loader.m_EffectMemory = loader.m_ReflectionMemory = 0;
-
-
- // Move data from current effect to new effect
- if( !IsOptimized() )
- {
- VN( pNewEffect->m_pReflection = NEW CEffectReflection() );
- loader.m_pReflection = pNewEffect->m_pReflection;
-
- // make sure strings are moved before ReallocateEffectData
- VH( loader.InitializeReflectionDataAndMoveStrings( m_pReflection->m_Heap.GetSize() ) );
- }
- VH( loader.ReallocateEffectData( true ) );
- if( !IsOptimized() )
- {
- VH( loader.ReallocateReflectionData( true ) );
- }
-
-
- // Data structures for remapping type pointers and string pointers
- VN( pTempHeap = NEW CDataBlockStore );
- pTempHeap->EnableAlignment();
- mappingTableTypes.SetPrivateHeap(pTempHeap);
- mappingTableStrings.SetPrivateHeap(pTempHeap);
- VH( mappingTableTypes.AutoGrow() );
- VH( mappingTableStrings.AutoGrow() );
-
- if( !IsOptimized() )
- {
- // Let's re-create the type pool and string pool
- VN( pNewEffect->m_pPooledHeap = NEW CDataBlockStore );
- pNewEffect->m_pPooledHeap->EnableAlignment();
-
- VH( pNewEffect->CopyStringPool( this, mappingTableStrings ) );
- VH( pNewEffect->CopyTypePool( this, mappingTableTypes, mappingTableStrings ) );
- }
- else
- {
- // There's no string pool after optimizing. Let's re-create the type pool
- VH( pNewEffect->CopyOptimizedTypePool( this, mappingTableTypes ) );
- }
-
- // fixup this effect's variable's types
- VH( pNewEffect->OptimizeTypes(&mappingTableTypes, true) );
- VH( pNewEffect->RecreateCBs() );
-
-
- for (UINT i = 0; i < pNewEffect->m_pMemberInterfaces.GetSize(); ++ i)
- {
- SMember* pMember = pNewEffect->m_pMemberInterfaces[i];
- VH( pNewEffect->FixupMemberInterface( pMember, this, mappingTableStrings ) );
- }
-
-
-lExit:
- SAFE_DELETE( pTempHeap );
- if( FAILED( hr ) )
- {
- SAFE_DELETE( pNewEffect );
- }
- *ppClonedEffect = pNewEffect;
- return hr;
-}
-
-// Move all type pointers using pMappingTable.
-// This is called after creating the optimized type pool or during cloning.
-HRESULT CEffect::OptimizeTypes(CPointerMappingTable *pMappingTable, bool Cloning)
-{
- HRESULT hr = S_OK;
- UINT i;
-
- // find all child types, point them to the new location
- for (i = 0; i < m_VariableCount; ++ i)
- {
- VH( RemapType((SType**)&m_pVariables[i].pType, pMappingTable) );
- }
-
- UINT Members = m_pMemberInterfaces.GetSize();
- for( i=0; i < Members; i++ )
- {
- if( m_pMemberInterfaces[i] != NULL )
- {
- VH( RemapType((SType**)&m_pMemberInterfaces[i]->pType, pMappingTable) );
- }
- }
-
- // when cloning, there may be annotations
- if( Cloning )
- {
- for (UINT iVar = 0; iVar < m_VariableCount; ++ iVar)
- {
- for(i = 0; i < m_pVariables[iVar].AnnotationCount; ++ i )
- {
- VH( RemapType((SType**)&m_pVariables[iVar].pAnnotations[i].pType, pMappingTable) );
- }
- }
- for (UINT iCB = 0; iCB < m_CBCount; ++ iCB)
- {
- for(i = 0; i < m_pCBs[iCB].AnnotationCount; ++ i )
- {
- VH( RemapType((SType**)&m_pCBs[iCB].pAnnotations[i].pType, pMappingTable) );
- }
- }
- for (UINT iGroup = 0; iGroup < m_GroupCount; ++ iGroup)
- {
- for(i = 0; i < m_pGroups[iGroup].AnnotationCount; ++ i )
- {
- VH( RemapType((SType**)&m_pGroups[iGroup].pAnnotations[i].pType, pMappingTable) );
- }
- for(UINT iTech = 0; iTech < m_pGroups[iGroup].TechniqueCount; ++ iTech )
- {
- for(i = 0; i < m_pGroups[iGroup].pTechniques[iTech].AnnotationCount; ++ i )
- {
- VH( RemapType((SType**)&m_pGroups[iGroup].pTechniques[iTech].pAnnotations[i].pType, pMappingTable) );
- }
- for(UINT iPass = 0; iPass < m_pGroups[iGroup].pTechniques[iTech].PassCount; ++ iPass )
- {
- for(i = 0; i < m_pGroups[iGroup].pTechniques[iTech].pPasses[iPass].AnnotationCount; ++ i )
- {
- VH( RemapType((SType**)&m_pGroups[iGroup].pTechniques[iTech].pPasses[iPass].pAnnotations[i].pType, pMappingTable) );
- }
- }
- }
- }
- }
-lExit:
- return hr;
-}
-
-//////////////////////////////////////////////////////////////////////////
-// Public API to shed this effect of its reflection data
-HRESULT CEffect::Optimize()
-{
- HRESULT hr = S_OK;
- UINT i, j, k;
- CEffectHeap *pOptimizedTypeHeap = NULL;
-
- if (IsOptimized())
- {
- DPF(0, "ID3DX11Effect::Optimize: Effect has already been Optimize()'ed");
- return S_OK;
- }
-
- // Delete annotations, names, semantics, and string data on variables
-
- for (i = 0; i < m_VariableCount; ++ i)
- {
- m_pVariables[i].AnnotationCount = 0;
- m_pVariables[i].pAnnotations = NULL;
- m_pVariables[i].pName = NULL;
- m_pVariables[i].pSemantic = NULL;
-
- // 2) Point string variables to NULL
- if (m_pVariables[i].pType->IsObjectType(EOT_String))
- {
- D3DXASSERT(NULL != m_pVariables[i].Data.pString);
- m_pVariables[i].Data.pString = NULL;
- }
- }
-
- // Delete annotations and names on CBs
-
- for (i = 0; i < m_CBCount; ++ i)
- {
- m_pCBs[i].AnnotationCount = 0;
- m_pCBs[i].pAnnotations = NULL;
- m_pCBs[i].pName = NULL;
- m_pCBs[i].IsEffectOptimized = TRUE;
- }
-
- // Delete annotations and names on techniques and passes
-
- for (i = 0; i < m_GroupCount; ++ i)
- {
- m_pGroups[i].AnnotationCount = 0;
- m_pGroups[i].pAnnotations = NULL;
- m_pGroups[i].pName = NULL;
-
- for (j = 0; j < m_pGroups[i].TechniqueCount; ++ j)
- {
- m_pGroups[i].pTechniques[j].AnnotationCount = 0;
- m_pGroups[i].pTechniques[j].pAnnotations = NULL;
- m_pGroups[i].pTechniques[j].pName = NULL;
-
- for (k = 0; k < m_pGroups[i].pTechniques[j].PassCount; ++ k)
- {
- m_pGroups[i].pTechniques[j].pPasses[k].AnnotationCount = 0;
- m_pGroups[i].pTechniques[j].pPasses[k].pAnnotations = NULL;
- m_pGroups[i].pTechniques[j].pPasses[k].pName = NULL;
- }
- }
- };
-
- // 2) Remove shader bytecode & stream out decls
- // (all are contained within pReflectionData)
-
- for (i = 0; i < m_ShaderBlockCount; ++ i)
- {
- if( m_pShaderBlocks[i].pReflectionData )
- {
- // pReflection was not created with PRIVATENEW
- SAFE_RELEASE( m_pShaderBlocks[i].pReflectionData->pReflection );
-
- m_pShaderBlocks[i].pReflectionData = NULL;
- }
- }
-
- UINT Members = m_pMemberInterfaces.GetSize();
- for( i=0; i < Members; i++ )
- {
- D3DXASSERT( m_pMemberInterfaces[i] != NULL );
- if( IsReflectionData(m_pMemberInterfaces[i]->pTopLevelEntity) )
- {
- D3DXASSERT( IsReflectionData(m_pMemberInterfaces[i]->Data.pGeneric) );
-
- // This is checked when cloning (so we don't clone Optimized-out member variables)
- m_pMemberInterfaces[i] = NULL;
- }
- else
- {
- m_pMemberInterfaces[i]->pName = NULL;
- m_pMemberInterfaces[i]->pSemantic = NULL;
- }
- }
-
-
-
- // get rid of the name/type hash tables and string data,
- // then reallocate the type data and fix up this effect
- CPointerMappingTable mappingTable;
- CTypeHashTable::CIterator typeIter;
- CPointerMappingTable::CIterator mapIter;
- CCheckedDword chkSpaceNeeded = 0;
- UINT spaceNeeded;
-
- // first pass: compute needed space
- for (m_pTypePool->GetFirstEntry(&typeIter); !m_pTypePool->PastEnd(&typeIter); m_pTypePool->GetNextEntry(&typeIter))
- {
- SType *pType = typeIter.GetData();
-
- chkSpaceNeeded += AlignToPowerOf2(sizeof(SType), c_DataAlignment);
-
- // if this is a struct, allocate room for its members
- if (EVT_Struct == pType->VarType)
- {
- chkSpaceNeeded += AlignToPowerOf2(pType->StructType.Members * sizeof(SVariable), c_DataAlignment);
- }
- }
-
- VH( chkSpaceNeeded.GetValue(&spaceNeeded) );
-
- D3DXASSERT(NULL == m_pOptimizedTypeHeap);
- VN( pOptimizedTypeHeap = NEW CEffectHeap );
- VH( pOptimizedTypeHeap->ReserveMemory(spaceNeeded));
-
- // use the private heap that we're about to destroy as scratch space for the mapping table
- mappingTable.SetPrivateHeap(m_pPooledHeap);
- VH( mappingTable.AutoGrow() );
-
- // second pass: move types over, build mapping table
- for (m_pTypePool->GetFirstEntry(&typeIter); !m_pTypePool->PastEnd(&typeIter); m_pTypePool->GetNextEntry(&typeIter))
- {
- SPointerMapping ptrMapping;
- SType *pType;
-
- ptrMapping.pOld = ptrMapping.pNew = typeIter.GetData();
- VH( pOptimizedTypeHeap->MoveData(&ptrMapping.pNew, sizeof(SType)) );
-
- pType = (SType *) ptrMapping.pNew;
-
- // if this is a struct, move its members to the newly allocated space
- if (EVT_Struct == pType->VarType)
- {
- VH( pOptimizedTypeHeap->MoveData((void **)&pType->StructType.pMembers, pType->StructType.Members * sizeof(SVariable)) );
- }
-
- VH( mappingTable.AddValueWithHash(ptrMapping, ptrMapping.Hash()) );
- }
-
- // third pass: fixup structure member & name pointers
- for (mappingTable.GetFirstEntry(&mapIter); !mappingTable.PastEnd(&mapIter); mappingTable.GetNextEntry(&mapIter))
- {
- SPointerMapping ptrMapping = mapIter.GetData();
- SType *pType = (SType *) ptrMapping.pNew;
-
- pType->pTypeName = NULL;
-
- // if this is a struct, fix up its members' pointers
- if (EVT_Struct == pType->VarType)
- {
- for (i = 0; i < pType->StructType.Members; ++ i)
- {
- VH( RemapType((SType**)&pType->StructType.pMembers[i].pType, &mappingTable) );
- pType->StructType.pMembers[i].pName = NULL;
- pType->StructType.pMembers[i].pSemantic = NULL;
- }
- }
- }
-
- // fixup this effect's variable's types
- VH( OptimizeTypes(&mappingTable) );
-
- m_pOptimizedTypeHeap = pOptimizedTypeHeap;
- pOptimizedTypeHeap = NULL;
-
-#ifdef D3DX11_FX_PRINT_HASH_STATS
- DPF(0, "Compiler string pool hash table statistics:");
- m_pTypePool->PrintHashTableStats();
- DPF(0, "Compiler type pool hash table statistics:");
- m_pStringPool->PrintHashTableStats();
-#endif // D3DX11_FX_PRINT_HASH_STATS
-
- SAFE_DELETE(m_pTypePool);
- SAFE_DELETE(m_pStringPool);
- SAFE_DELETE(m_pPooledHeap);
-
- DPF(0, "ID3DX11Effect::Optimize: %d bytes of reflection data freed.", m_pReflection->m_Heap.GetSize());
- SAFE_DELETE(m_pReflection);
- m_Flags |= D3DX11_EFFECT_OPTIMIZED;
-
-lExit:
- SAFE_DELETE(pOptimizedTypeHeap);
- return hr;
-}
-
-SMember * CreateNewMember(SType *pType, BOOL IsAnnotation)
-{
- switch (pType->VarType)
- {
- case EVT_Struct:
- if (IsAnnotation)
- {
- D3DXASSERT(sizeof(SNumericAnnotationMember) == sizeof(SMember));
- return (SMember*) NEW SNumericAnnotationMember;
- }
- else if (pType->StructType.ImplementsInterface)
- {
- D3DXASSERT(sizeof(SClassInstanceGlobalVariableMember) == sizeof(SMember));
- return (SMember*) NEW SClassInstanceGlobalVariableMember;
- }
- else
- {
- D3DXASSERT(sizeof(SNumericGlobalVariableMember) == sizeof(SMember));
- return (SMember*) NEW SNumericGlobalVariableMember;
- }
- break;
- case EVT_Interface:
- D3DXASSERT(sizeof(SInterfaceGlobalVariableMember) == sizeof(SMember));
- return (SMember*) NEW SInterfaceGlobalVariableMember;
- break;
- case EVT_Object:
- switch (pType->ObjectType)
- {
- case EOT_String:
- if (IsAnnotation)
- {
- D3DXASSERT(sizeof(SStringAnnotationMember) == sizeof(SMember));
- return (SMember*) NEW SStringAnnotationMember;
- }
- else
- {
- D3DXASSERT(sizeof(SStringGlobalVariableMember) == sizeof(SMember));
- return (SMember*) NEW SStringGlobalVariableMember;
- }
-
- break;
- case EOT_Texture:
- case EOT_Texture1D:
- case EOT_Texture1DArray:
- case EOT_Texture2D:
- case EOT_Texture2DArray:
- case EOT_Texture2DMS:
- case EOT_Texture2DMSArray:
- case EOT_Texture3D:
- case EOT_TextureCube:
- case EOT_TextureCubeArray:
- case EOT_Buffer:
- case EOT_ByteAddressBuffer:
- case EOT_StructuredBuffer:
- D3DXASSERT(!IsAnnotation);
- D3DXASSERT(sizeof(SShaderResourceGlobalVariableMember) == sizeof(SMember));
- return (SMember*) NEW SShaderResourceGlobalVariableMember;
- break;
- case EOT_RWTexture1D:
- case EOT_RWTexture1DArray:
- case EOT_RWTexture2D:
- case EOT_RWTexture2DArray:
- case EOT_RWTexture3D:
- case EOT_RWBuffer:
- case EOT_RWByteAddressBuffer:
- case EOT_RWStructuredBuffer:
- case EOT_RWStructuredBufferAlloc:
- case EOT_RWStructuredBufferConsume:
- case EOT_AppendStructuredBuffer:
- case EOT_ConsumeStructuredBuffer:
- D3DXASSERT(!IsAnnotation);
- D3DXASSERT(sizeof(SUnorderedAccessViewGlobalVariableMember) == sizeof(SMember));
- return (SMember*) NEW SUnorderedAccessViewGlobalVariableMember;
- break;
- case EOT_VertexShader:
- case EOT_VertexShader5:
- case EOT_GeometryShader:
- case EOT_GeometryShaderSO:
- case EOT_GeometryShader5:
- case EOT_PixelShader:
- case EOT_PixelShader5:
- case EOT_HullShader5:
- case EOT_DomainShader5:
- case EOT_ComputeShader5:
- D3DXASSERT(!IsAnnotation);
- D3DXASSERT(sizeof(SShaderGlobalVariableMember) == sizeof(SMember));
- return (SMember*) NEW SShaderGlobalVariableMember;
- break;
- case EOT_Blend:
- D3DXASSERT(!IsAnnotation);
- D3DXASSERT(sizeof(SBlendGlobalVariableMember) == sizeof(SMember));
- return (SMember*) NEW SBlendGlobalVariableMember;
- break;
- case EOT_Rasterizer:
- D3DXASSERT(!IsAnnotation);
- D3DXASSERT(sizeof(SRasterizerGlobalVariableMember) == sizeof(SMember));
- return (SMember*) NEW SRasterizerGlobalVariableMember;
- break;
- case EOT_DepthStencil:
- D3DXASSERT(!IsAnnotation);
- D3DXASSERT(sizeof(SDepthStencilGlobalVariableMember) == sizeof(SMember));
- return (SMember*) NEW SDepthStencilGlobalVariableMember;
- break;
- case EOT_Sampler:
- D3DXASSERT(!IsAnnotation);
- D3DXASSERT(sizeof(SSamplerGlobalVariableMember) == sizeof(SMember));
- return (SMember*) NEW SSamplerGlobalVariableMember;
- break;
- case EOT_DepthStencilView:
- D3DXASSERT(!IsAnnotation);
- D3DXASSERT(sizeof(SDepthStencilViewGlobalVariableMember) == sizeof(SMember));
- return (SMember*) NEW SDepthStencilViewGlobalVariableMember;
- break;
- case EOT_RenderTargetView:
- D3DXASSERT(!IsAnnotation);
- D3DXASSERT(sizeof(SRenderTargetViewGlobalVariableMember) == sizeof(SMember));
- return (SMember*) NEW SRenderTargetViewGlobalVariableMember;
- break;
- default:
- D3DXASSERT(0);
- DPF( 0, "Internal error: invalid object type." );
- return NULL;
- break;
- }
- break;
- case EVT_Numeric:
- switch (pType->NumericType.NumericLayout)
- {
- case ENL_Matrix:
- if (IsAnnotation)
- {
- D3DXASSERT(sizeof(SMatrixAnnotationMember) == sizeof(SMember));
- return (SMember*) NEW SMatrixAnnotationMember;
- }
- else
- {
- D3DXASSERT(sizeof(SMatrixGlobalVariableMember) == sizeof(SMember));
- D3DXASSERT(sizeof(SMatrix4x4ColumnMajorGlobalVariableMember) == sizeof(SMember));
- D3DXASSERT(sizeof(SMatrix4x4RowMajorGlobalVariableMember) == sizeof(SMember));
-
- if (pType->NumericType.Rows == 4 && pType->NumericType.Columns == 4)
- {
- if (pType->NumericType.IsColumnMajor)
- {
- return (SMember*) NEW SMatrix4x4ColumnMajorGlobalVariableMember;
- }
- else
- {
- return (SMember*) NEW SMatrix4x4RowMajorGlobalVariableMember;
- }
- }
- else
- {
- return (SMember*) NEW SMatrixGlobalVariableMember;
- }
- }
- break;
- case ENL_Vector:
- switch (pType->NumericType.ScalarType)
- {
- case EST_Float:
- if (IsAnnotation)
- {
- D3DXASSERT(sizeof(SFloatVectorAnnotationMember) == sizeof(SMember));
- return (SMember*) NEW SFloatVectorAnnotationMember;
- }
- else
- {
- D3DXASSERT(sizeof(SFloatVectorGlobalVariableMember) == sizeof(SMember));
- D3DXASSERT(sizeof(SFloatVector4GlobalVariableMember) == sizeof(SMember));
-
- if (pType->NumericType.Columns == 4)
- {
- return (SMember*) NEW SFloatVector4GlobalVariableMember;
- }
- else
- {
- return (SMember*) NEW SFloatVectorGlobalVariableMember;
- }
- }
- break;
- case EST_Bool:
- if (IsAnnotation)
- {
- D3DXASSERT(sizeof(SBoolVectorAnnotationMember) == sizeof(SMember));
- return (SMember*) NEW SBoolVectorAnnotationMember;
- }
- else
- {
- D3DXASSERT(sizeof(SBoolVectorGlobalVariableMember) == sizeof(SMember));
- return (SMember*) NEW SBoolVectorGlobalVariableMember;
- }
- break;
- case EST_UInt:
- case EST_Int:
- if (IsAnnotation)
- {
- D3DXASSERT(sizeof(SIntVectorAnnotationMember) == sizeof(SMember));
- return (SMember*) NEW SIntVectorAnnotationMember;
- }
- else
- {
- D3DXASSERT(sizeof(SIntVectorGlobalVariableMember) == sizeof(SMember));
- return (SMember*) NEW SIntVectorGlobalVariableMember;
- }
- break;
- default:
- D3DXASSERT(0);
- DPF( 0, "Internal loading error: invalid vector type." );
- break;
- }
- break;
- case ENL_Scalar:
- switch (pType->NumericType.ScalarType)
- {
- case EST_Float:
- if (IsAnnotation)
- {
- D3DXASSERT(sizeof(SFloatScalarAnnotationMember) == sizeof(SMember));
- return (SMember*) NEW SFloatScalarAnnotationMember;
- }
- else
- {
- D3DXASSERT(sizeof(SFloatScalarGlobalVariableMember) == sizeof(SMember));
- return (SMember*) NEW SFloatScalarGlobalVariableMember;
- }
- break;
- case EST_UInt:
- case EST_Int:
- if (IsAnnotation)
- {
- D3DXASSERT(sizeof(SIntScalarAnnotationMember) == sizeof(SMember));
- return (SMember*) NEW SIntScalarAnnotationMember;
- }
- else
- {
- D3DXASSERT(sizeof(SIntScalarGlobalVariableMember) == sizeof(SMember));
- return (SMember*) NEW SIntScalarGlobalVariableMember;
- }
- break;
- case EST_Bool:
- if (IsAnnotation)
- {
- D3DXASSERT(sizeof(SBoolScalarAnnotationMember) == sizeof(SMember));
- return (SMember*) NEW SBoolScalarAnnotationMember;
- }
- else
- {
- D3DXASSERT(sizeof(SBoolScalarGlobalVariableMember) == sizeof(SMember));
- return (SMember*) NEW SBoolScalarGlobalVariableMember;
- }
- break;
- default:
- DPF( 0, "Internal loading error: invalid scalar type." );
- D3DXASSERT(0);
- break;
- }
- break;
- default:
- D3DXASSERT(0);
- DPF( 0, "Internal loading error: invalid numeric type." );
- break;
- }
- break;
- default:
- D3DXASSERT(0);
- DPF( 0, "Internal loading error: invalid variable type." );
- break;
- }
- return NULL;
-}
-
-// Global variables are created in place because storage for them was allocated during LoadEffect
-HRESULT PlacementNewVariable(void *pVar, SType *pType, BOOL IsAnnotation)
-{
- switch (pType->VarType)
- {
- case EVT_Struct:
- if (IsAnnotation)
- {
- D3DXASSERT(sizeof(SNumericAnnotation) == sizeof(SAnnotation));
- new(pVar) SNumericAnnotation();
- }
- else if (pType->StructType.ImplementsInterface)
- {
- D3DXASSERT(sizeof(SClassInstanceGlobalVariable) == sizeof(SGlobalVariable));
- new(pVar) SClassInstanceGlobalVariable;
- }
- else
- {
- D3DXASSERT(sizeof(SNumericGlobalVariable) == sizeof(SGlobalVariable));
- new(pVar) SNumericGlobalVariable;
- }
- break;
- case EVT_Interface:
- D3DXASSERT(sizeof(SInterfaceGlobalVariable) == sizeof(SGlobalVariable));
- new(pVar) SInterfaceGlobalVariable;
- break;
- case EVT_Object:
- switch (pType->ObjectType)
- {
- case EOT_String:
- if (IsAnnotation)
- {
- D3DXASSERT(sizeof(SStringAnnotation) == sizeof(SAnnotation));
- new(pVar) SStringAnnotation;
- }
- else
- {
- D3DXASSERT(sizeof(SStringGlobalVariable) == sizeof(SGlobalVariable));
- new(pVar) SStringGlobalVariable;
- }
-
- break;
- case EOT_Texture:
- case EOT_Texture1D:
- case EOT_Texture1DArray:
- case EOT_Texture2D:
- case EOT_Texture2DArray:
- case EOT_Texture2DMS:
- case EOT_Texture2DMSArray:
- case EOT_Texture3D:
- case EOT_TextureCube:
- case EOT_TextureCubeArray:
- case EOT_Buffer:
- case EOT_ByteAddressBuffer:
- case EOT_StructuredBuffer:
- D3DXASSERT(!IsAnnotation);
- D3DXASSERT(sizeof(SShaderResourceGlobalVariable) == sizeof(SGlobalVariable));
- new(pVar) SShaderResourceGlobalVariable;
- break;
- case EOT_RWTexture1D:
- case EOT_RWTexture1DArray:
- case EOT_RWTexture2D:
- case EOT_RWTexture2DArray:
- case EOT_RWTexture3D:
- case EOT_RWBuffer:
- case EOT_RWByteAddressBuffer:
- case EOT_RWStructuredBuffer:
- case EOT_RWStructuredBufferAlloc:
- case EOT_RWStructuredBufferConsume:
- case EOT_AppendStructuredBuffer:
- case EOT_ConsumeStructuredBuffer:
- D3DXASSERT(!IsAnnotation);
- D3DXASSERT(sizeof(SUnorderedAccessViewGlobalVariable) == sizeof(SGlobalVariable));
- new(pVar) SUnorderedAccessViewGlobalVariable;
- break;
- case EOT_VertexShader:
- case EOT_VertexShader5:
- case EOT_GeometryShader:
- case EOT_GeometryShaderSO:
- case EOT_GeometryShader5:
- case EOT_PixelShader:
- case EOT_PixelShader5:
- case EOT_HullShader5:
- case EOT_DomainShader5:
- case EOT_ComputeShader5:
- D3DXASSERT(!IsAnnotation);
- D3DXASSERT(sizeof(SShaderGlobalVariable) == sizeof(SGlobalVariable));
- new(pVar) SShaderGlobalVariable;
- break;
- case EOT_Blend:
- D3DXASSERT(!IsAnnotation);
- D3DXASSERT(sizeof(SBlendGlobalVariable) == sizeof(SGlobalVariable));
- new(pVar) SBlendGlobalVariable;
- break;
- case EOT_Rasterizer:
- D3DXASSERT(!IsAnnotation);
- D3DXASSERT(sizeof(SRasterizerGlobalVariable) == sizeof(SGlobalVariable));
- new(pVar) SRasterizerGlobalVariable;
- break;
- case EOT_DepthStencil:
- D3DXASSERT(!IsAnnotation);
- D3DXASSERT(sizeof(SDepthStencilGlobalVariable) == sizeof(SGlobalVariable));
- new(pVar) SDepthStencilGlobalVariable;
- break;
- case EOT_Sampler:
- D3DXASSERT(!IsAnnotation);
- D3DXASSERT(sizeof(SSamplerGlobalVariable) == sizeof(SGlobalVariable));
- new(pVar) SSamplerGlobalVariable;
- break;
- case EOT_RenderTargetView:
- D3DXASSERT(!IsAnnotation);
- D3DXASSERT(sizeof(SRenderTargetViewGlobalVariable) == sizeof(SGlobalVariable));
- new(pVar) SRenderTargetViewGlobalVariable;
- break;
- case EOT_DepthStencilView:
- D3DXASSERT(!IsAnnotation);
- D3DXASSERT(sizeof(SDepthStencilViewGlobalVariable) == sizeof(SGlobalVariable));
- new(pVar) SDepthStencilViewGlobalVariable;
- break;
- default:
- D3DXASSERT(0);
- DPF( 0, "Internal loading error: invalid object type." );
- return E_FAIL;
- break;
- }
- break;
- case EVT_Numeric:
- switch (pType->NumericType.NumericLayout)
- {
- case ENL_Matrix:
- if (IsAnnotation)
- {
- D3DXASSERT(sizeof(SMatrixAnnotation) == sizeof(SAnnotation));
- new(pVar) SMatrixAnnotation;
- }
- else
- {
- D3DXASSERT(sizeof(SMatrixGlobalVariable) == sizeof(SGlobalVariable));
- D3DXASSERT(sizeof(SMatrix4x4ColumnMajorGlobalVariable) == sizeof(SGlobalVariable));
- D3DXASSERT(sizeof(SMatrix4x4RowMajorGlobalVariable) == sizeof(SGlobalVariable));
-
- if (pType->NumericType.Rows == 4 && pType->NumericType.Columns == 4)
- {
- if (pType->NumericType.IsColumnMajor)
- {
- new(pVar) SMatrix4x4ColumnMajorGlobalVariable;
- }
- else
- {
- new(pVar) SMatrix4x4RowMajorGlobalVariable;
- }
- }
- else
- {
- new(pVar) SMatrixGlobalVariable;
- }
- }
- break;
- case ENL_Vector:
- switch (pType->NumericType.ScalarType)
- {
- case EST_Float:
- if (IsAnnotation)
- {
- D3DXASSERT(sizeof(SFloatVectorAnnotation) == sizeof(SAnnotation));
- new(pVar) SFloatVectorAnnotation;
- }
- else
- {
- D3DXASSERT(sizeof(SFloatVectorGlobalVariable) == sizeof(SGlobalVariable));
- D3DXASSERT(sizeof(SFloatVector4GlobalVariable) == sizeof(SGlobalVariable));
-
- if (pType->NumericType.Columns == 4)
- {
- new(pVar) SFloatVector4GlobalVariable;
- }
- else
- {
- new(pVar) SFloatVectorGlobalVariable;
- }
- }
- break;
- case EST_Bool:
- if (IsAnnotation)
- {
- D3DXASSERT(sizeof(SBoolVectorAnnotation) == sizeof(SAnnotation));
- new(pVar) SBoolVectorAnnotation;
- }
- else
- {
- D3DXASSERT(sizeof(SBoolVectorGlobalVariable) == sizeof(SGlobalVariable));
- new(pVar) SBoolVectorGlobalVariable;
- }
- break;
- case EST_UInt:
- case EST_Int:
- if (IsAnnotation)
- {
- D3DXASSERT(sizeof(SIntVectorAnnotation) == sizeof(SAnnotation));
- new(pVar) SIntVectorAnnotation;
- }
- else
- {
- D3DXASSERT(sizeof(SIntVectorGlobalVariable) == sizeof(SGlobalVariable));
- new(pVar) SIntVectorGlobalVariable;
- }
- break;
- }
- break;
- case ENL_Scalar:
- switch (pType->NumericType.ScalarType)
- {
- case EST_Float:
- if (IsAnnotation)
- {
- D3DXASSERT(sizeof(SFloatScalarAnnotation) == sizeof(SAnnotation));
- new(pVar) SFloatScalarAnnotation;
- }
- else
- {
- D3DXASSERT(sizeof(SFloatScalarGlobalVariable) == sizeof(SGlobalVariable));
- new(pVar) SFloatScalarGlobalVariable;
- }
- break;
- case EST_UInt:
- case EST_Int:
- if (IsAnnotation)
- {
- D3DXASSERT(sizeof(SIntScalarAnnotation) == sizeof(SAnnotation));
- new(pVar) SIntScalarAnnotation;
- }
- else
- {
- D3DXASSERT(sizeof(SIntScalarGlobalVariable) == sizeof(SGlobalVariable));
- new(pVar) SIntScalarGlobalVariable;
- }
- break;
- case EST_Bool:
- if (IsAnnotation)
- {
- D3DXASSERT(sizeof(SBoolScalarAnnotation) == sizeof(SAnnotation));
- new(pVar) SBoolScalarAnnotation;
- }
- else
- {
- D3DXASSERT(sizeof(SBoolScalarGlobalVariable) == sizeof(SGlobalVariable));
- new(pVar) SBoolScalarGlobalVariable;
- }
- break;
- default:
- D3DXASSERT(0);
- DPF( 0, "Internal loading error: invalid scalar type." );
- return E_FAIL;
- break;
- }
- break;
- default:
- D3DXASSERT(0);
- DPF( 0, "Internal loading error: invalid numeric type." );
- return E_FAIL;
- break;
- }
- break;
- default:
- D3DXASSERT(0);
- DPF( 0, "Internal loading error: invalid variable type." );
- return E_FAIL;
- break;
- }
- return S_OK;
-}
-
-}
diff --git a/sample/d3d11/Effects11/EffectReflection.cpp b/sample/d3d11/Effects11/EffectReflection.cpp
deleted file mode 100644
index 138447b..0000000
--- a/sample/d3d11/Effects11/EffectReflection.cpp
+++ /dev/null
@@ -1,2151 +0,0 @@
-//////////////////////////////////////////////////////////////////////////////
-//
-// Copyright (C) Microsoft Corporation. All Rights Reserved.
-//
-// File: EffectReflection.cpp
-// Content: D3DX11 Effects public reflection APIs
-//
-//////////////////////////////////////////////////////////////////////////////
-
-#include "pchfx.h"
-
-namespace D3DX11Effects
-{
-
-SEffectInvalidType g_InvalidType;
-
-SEffectInvalidScalarVariable g_InvalidScalarVariable;
-SEffectInvalidVectorVariable g_InvalidVectorVariable;
-SEffectInvalidMatrixVariable g_InvalidMatrixVariable;
-SEffectInvalidStringVariable g_InvalidStringVariable;
-SEffectInvalidClassInstanceVariable g_InvalidClassInstanceVariable;
-SEffectInvalidInterfaceVariable g_InvalidInterfaceVariable;
-SEffectInvalidShaderResourceVariable g_InvalidShaderResourceVariable;
-SEffectInvalidUnorderedAccessViewVariable g_InvalidUnorderedAccessViewVariable;
-SEffectInvalidRenderTargetViewVariable g_InvalidRenderTargetViewVariable;
-SEffectInvalidDepthStencilViewVariable g_InvalidDepthStencilViewVariable;
-SEffectInvalidConstantBuffer g_InvalidConstantBuffer;
-SEffectInvalidShaderVariable g_InvalidShaderVariable;
-SEffectInvalidBlendVariable g_InvalidBlendVariable;
-SEffectInvalidDepthStencilVariable g_InvalidDepthStencilVariable;
-SEffectInvalidRasterizerVariable g_InvalidRasterizerVariable;
-SEffectInvalidSamplerVariable g_InvalidSamplerVariable;
-
-SEffectInvalidPass g_InvalidPass;
-SEffectInvalidTechnique g_InvalidTechnique;
-SEffectInvalidGroup g_InvalidGroup;
-
-
-//////////////////////////////////////////////////////////////////////////
-// Helper routine implementations
-//////////////////////////////////////////////////////////////////////////
-
-ID3DX11EffectConstantBuffer * NoParentCB()
-{
- DPF(0, "ID3DX11EffectVariable::GetParentConstantBuffer: Variable does not have a parent constant buffer");
- // have to typecast because the type of g_InvalidScalarVariable has not been declared yet
- return &g_InvalidConstantBuffer;
-}
-
-ID3DX11EffectVariable * GetAnnotationByIndexHelper(const char *pClassName, UINT Index, UINT AnnotationCount, SAnnotation *pAnnotations)
-{
- if (Index >= AnnotationCount)
- {
- DPF(0, "%s::GetAnnotationByIndex: Invalid index (%d, total: %d)", pClassName, Index, AnnotationCount);
- return &g_InvalidScalarVariable;
- }
-
- return pAnnotations + Index;
-}
-
-ID3DX11EffectVariable * GetAnnotationByNameHelper(const char *pClassName, LPCSTR Name, UINT AnnotationCount, SAnnotation *pAnnotations)
-{
- UINT i;
- for (i = 0; i < AnnotationCount; ++ i)
- {
- if (strcmp(pAnnotations[i].pName, Name) == 0)
- {
- return pAnnotations + i;
- }
- }
-
- DPF(0, "%s::GetAnnotationByName: Annotation [%s] not found", pClassName, Name);
- return &g_InvalidScalarVariable;
-}
-
-//////////////////////////////////////////////////////////////////////////
-// Effect routines to pool interfaces
-//////////////////////////////////////////////////////////////////////////
-
-ID3DX11EffectType * CEffect::CreatePooledSingleElementTypeInterface(SType *pType)
-{
- UINT i;
-
- if (IsOptimized())
- {
- DPF(0, "ID3DX11Effect: Cannot create new type interfaces since the effect has been Optimize()'ed");
- return &g_InvalidType;
- }
-
- for (i = 0; i < m_pTypeInterfaces.GetSize(); ++ i)
- {
- if (m_pTypeInterfaces[i]->pType == pType)
- {
- return (SSingleElementType*)m_pTypeInterfaces[i];
- }
- }
- SSingleElementType *pNewType;
- if (NULL == (pNewType = NEW SSingleElementType))
- {
- DPF(0, "ID3DX11Effect: Out of memory while trying to create new type interface");
- return &g_InvalidType;
- }
-
- pNewType->pType = pType;
- m_pTypeInterfaces.Add(pNewType);
-
- return pNewType;
-}
-
-// Create a member variable (via GetMemberBy* or GetElement)
-ID3DX11EffectVariable * CEffect::CreatePooledVariableMemberInterface(TTopLevelVariable<ID3DX11EffectVariable> *pTopLevelEntity, SVariable *pMember, UDataPointer Data, BOOL IsSingleElement, UINT Index)
-{
- BOOL IsAnnotation;
- UINT i;
-
- if (IsOptimized())
- {
- DPF(0, "ID3DX11Effect: Cannot create new variable interfaces since the effect has been Optimize()'ed");
- return &g_InvalidScalarVariable;
- }
-
- for (i = 0; i < m_pMemberInterfaces.GetSize(); ++ i)
- {
- if (m_pMemberInterfaces[i]->pType == pMember->pType &&
- m_pMemberInterfaces[i]->pName == pMember->pName &&
- m_pMemberInterfaces[i]->pSemantic == pMember->pSemantic &&
- m_pMemberInterfaces[i]->Data.pGeneric == Data.pGeneric &&
- m_pMemberInterfaces[i]->IsSingleElement == IsSingleElement &&
- ((SMember*)m_pMemberInterfaces[i])->pTopLevelEntity == pTopLevelEntity)
- {
- return (ID3DX11EffectVariable *) m_pMemberInterfaces[i];
- }
- }
-
- // is this annotation or runtime data?
- if( pTopLevelEntity->pEffect->IsReflectionData(pTopLevelEntity) )
- {
- D3DXASSERT( pTopLevelEntity->pEffect->IsReflectionData(Data.pGeneric) );
- IsAnnotation = TRUE;
- }
- else
- {
- // if the heap is empty, we are still loading the Effect, and thus creating a member for a variable initializer
- // ex. Interface myInt = myClassArray[2];
- if( pTopLevelEntity->pEffect->m_Heap.GetSize() > 0 )
- {
- D3DXASSERT( pTopLevelEntity->pEffect->IsRuntimeData(pTopLevelEntity) );
- if (!pTopLevelEntity->pType->IsObjectType(EOT_String))
- {
- // strings are funny; their data is reflection data, so ignore those
- D3DXASSERT( pTopLevelEntity->pEffect->IsRuntimeData(Data.pGeneric) );
- }
- }
- IsAnnotation = FALSE;
- }
-
- SMember *pNewMember;
-
- if (NULL == (pNewMember = CreateNewMember((SType*)pMember->pType, IsAnnotation)))
- {
- DPF(0, "ID3DX11Effect: Out of memory while trying to create new member variable interface");
- return &g_InvalidScalarVariable;
- }
-
- pNewMember->pType = pMember->pType;
- pNewMember->pName = pMember->pName;
- pNewMember->pSemantic = pMember->pSemantic;
- pNewMember->Data.pGeneric = Data.pGeneric;
- pNewMember->IsSingleElement = IsSingleElement;
- pNewMember->pTopLevelEntity = pTopLevelEntity;
-
- if( IsSingleElement && pMember->pMemberData )
- {
- D3DXASSERT( !IsAnnotation );
- // This is an element of a global variable array
- pNewMember->pMemberData = pMember->pMemberData + Index;
- }
-
- if (FAILED(m_pMemberInterfaces.Add(pNewMember)))
- {
- SAFE_DELETE(pNewMember);
- DPF(0, "ID3DX11Effect: Out of memory while trying to create new member variable interface");
- return &g_InvalidScalarVariable;
- }
-
- return (ID3DX11EffectVariable *) pNewMember;
-}
-
-//////////////////////////////////////////////////////////////////////////
-// ID3DX11EffectType (SType, SSingleElementType implementations)
-//////////////////////////////////////////////////////////////////////////
-
-static ID3DX11EffectType * GetTypeByIndexHelper(UINT Index, UINT VariableCount,
- SVariable *pVariables, UINT SizeOfVariableType)
-{
- LPCSTR pFuncName = "ID3DX11EffectType::GetMemberTypeByIndex";
-
- if (Index >= VariableCount)
- {
- DPF(0, "%s: Invalid index (%d, total: %d)", pFuncName, Index, VariableCount);
- return &g_InvalidType;
- }
-
- SVariable *pVariable = (SVariable *)((BYTE *)pVariables + Index * SizeOfVariableType);
- if (NULL == pVariable->pName)
- {
- DPF(0, "%s: Cannot get member types; Effect has been Optimize()'ed", pFuncName);
- return &g_InvalidType;
- }
-
- return (ID3DX11EffectType *) pVariable->pType;
-}
-
-static ID3DX11EffectType * GetTypeByNameHelper(LPCSTR Name, UINT VariableCount,
- SVariable *pVariables, UINT SizeOfVariableType)
-{
- LPCSTR pFuncName = "ID3DX11EffectType::GetMemberTypeByName";
-
- if (NULL == Name)
- {
- DPF(0, "%s: Parameter Name was NULL.", pFuncName);
- return &g_InvalidType;
- }
-
- UINT i;
- SVariable *pVariable;
-
- for (i = 0; i < VariableCount; ++ i)
- {
- pVariable = (SVariable *)((BYTE *)pVariables + i * SizeOfVariableType);
- if (NULL == pVariable->pName)
- {
- DPF(0, "%s: Cannot get member types; Effect has been Optimize()'ed", pFuncName);
- return &g_InvalidType;
- }
- if (strcmp(pVariable->pName, Name) == 0)
- {
- return (ID3DX11EffectType *) pVariable->pType;
- }
- }
-
- DPF(0, "%s: Member type [%s] not found", pFuncName, Name);
- return &g_InvalidType;
-}
-
-
-static ID3DX11EffectType * GetTypeBySemanticHelper(LPCSTR Semantic, UINT VariableCount,
- SVariable *pVariables, UINT SizeOfVariableType)
-{
- LPCSTR pFuncName = "ID3DX11EffectType::GetMemberTypeBySemantic";
-
- if (NULL == Semantic)
- {
- DPF(0, "%s: Parameter Semantic was NULL.", pFuncName);
- return &g_InvalidType;
- }
-
- UINT i;
- SVariable *pVariable;
-
- for (i = 0; i < VariableCount; ++ i)
- {
- pVariable = (SVariable *)((BYTE *)pVariables + i * SizeOfVariableType);
- if (NULL == pVariable->pName)
- {
- DPF(0, "%s: Cannot get member types; Effect has been Optimize()'ed", pFuncName);
- return &g_InvalidType;
- }
- if (NULL != pVariable->pSemantic &&
- _stricmp(pVariable->pSemantic, Semantic) == 0)
- {
- return (ID3DX11EffectType *) pVariable->pType;
- }
- }
-
- DPF(0, "%s: Member type with semantic [%s] not found", pFuncName, Semantic);
- return &g_InvalidType;
-}
-
-ID3DX11EffectType * SType::GetMemberTypeByIndex(UINT Index)
-{
- if (VarType != EVT_Struct)
- {
- DPF(0, "ID3DX11EffectType::GetMemberTypeByIndex: This interface does not refer to a structure");
- return &g_InvalidType;
- }
-
- return GetTypeByIndexHelper(Index, StructType.Members, StructType.pMembers, sizeof(SVariable));
-}
-
-ID3DX11EffectType * SType::GetMemberTypeByName(LPCSTR Name)
-{
- if (VarType != EVT_Struct)
- {
- DPF(0, "ID3DX11EffectType::GetMemberTypeByName: This interface does not refer to a structure");
- return &g_InvalidType;
- }
-
- return GetTypeByNameHelper(Name, StructType.Members, StructType.pMembers, sizeof(SVariable));
-}
-
-ID3DX11EffectType * SType::GetMemberTypeBySemantic(LPCSTR Semantic)
-{
- if (VarType != EVT_Struct)
- {
- DPF(0, "ID3DX11EffectType::GetMemberTypeBySemantic: This interface does not refer to a structure");
- return &g_InvalidType;
- }
-
- return GetTypeBySemanticHelper(Semantic, StructType.Members, StructType.pMembers, sizeof(SVariable));
-}
-
-LPCSTR SType::GetMemberName(UINT Index)
-{
- LPCSTR pFuncName = "ID3DX11EffectType::GetMemberName";
-
- if (VarType != EVT_Struct)
- {
- DPF(0, "%s: This interface does not refer to a structure", pFuncName);
- return NULL;
- }
-
- if (Index >= StructType.Members)
- {
- DPF(0, "%s: Invalid index (%d, total: %d)", pFuncName, Index, StructType.Members);
- return NULL;
- }
-
- SVariable *pVariable = StructType.pMembers + Index;
-
- if (NULL == pVariable->pName)
- {
- DPF(0, "%s: Cannot get member names; Effect has been Optimize()'ed", pFuncName);
- return NULL;
- }
-
- return pVariable->pName;
-}
-
-LPCSTR SType::GetMemberSemantic(UINT Index)
-{
- LPCSTR pFuncName = "ID3DX11EffectType::GetMemberSemantic";
-
- if (VarType != EVT_Struct)
- {
- DPF(0, "%s: This interface does not refer to a structure", pFuncName);
- return NULL;
- }
-
- if (Index >= StructType.Members)
- {
- DPF(0, "%s: Invalid index (%d, total: %d)", pFuncName, Index, StructType.Members);
- return NULL;
- }
-
- SVariable *pVariable = StructType.pMembers + Index;
-
- if (NULL == pVariable->pName)
- {
- DPF(0, "%s: Cannot get member semantics; Effect has been Optimize()'ed", pFuncName);
- return NULL;
- }
-
- return pVariable->pSemantic;
-}
-
-HRESULT SType::GetDescHelper(D3DX11_EFFECT_TYPE_DESC *pDesc, BOOL IsSingleElement) const
-{
- HRESULT hr = S_OK;
- LPCSTR pFuncName = "ID3DX11EffectType::GetDesc";
-
- VERIFYPARAMETER(pDesc);
-
- pDesc->TypeName = pTypeName;
-
- // intentionally return 0 so they know it's not a single element array
- pDesc->Elements = IsSingleElement ? 0 : Elements;
- pDesc->PackedSize = GetTotalPackedSize(IsSingleElement);
- pDesc->UnpackedSize = GetTotalUnpackedSize(IsSingleElement);
- pDesc->Stride = Stride;
-
- switch (VarType)
- {
- case EVT_Numeric:
- switch (NumericType.NumericLayout)
- {
- case ENL_Matrix:
- if (NumericType.IsColumnMajor)
- {
- pDesc->Class = D3D10_SVC_MATRIX_COLUMNS;
- }
- else
- {
- pDesc->Class = D3D10_SVC_MATRIX_ROWS;
- }
- break;
- case ENL_Vector:
- pDesc->Class = D3D10_SVC_VECTOR;
- break;
- case ENL_Scalar:
- pDesc->Class = D3D10_SVC_SCALAR;
- break;
- default:
- D3DXASSERT(0);
- }
-
- switch (NumericType.ScalarType)
- {
- case EST_Bool:
- pDesc->Type = D3D10_SVT_BOOL;
- break;
- case EST_Int:
- pDesc->Type = D3D10_SVT_INT;
- break;
- case EST_UInt:
- pDesc->Type = D3D10_SVT_UINT;
- break;
- case EST_Float:
- pDesc->Type = D3D10_SVT_FLOAT;
- break;
- default:
- D3DXASSERT(0);
- }
-
- pDesc->Rows = NumericType.Rows;
- pDesc->Columns = NumericType.Columns;
- pDesc->Members = 0;
-
- break;
-
- case EVT_Struct:
- pDesc->Rows = 0;
- pDesc->Columns = 0;
- pDesc->Members = StructType.Members;
- if( StructType.ImplementsInterface )
- {
- pDesc->Class = D3D11_SVC_INTERFACE_CLASS;
- }
- else
- {
- pDesc->Class = D3D10_SVC_STRUCT;
- }
- pDesc->Type = D3D10_SVT_VOID;
- break;
-
- case EVT_Interface:
- pDesc->Rows = 0;
- pDesc->Columns = 0;
- pDesc->Members = 0;
- pDesc->Class = D3D11_SVC_INTERFACE_POINTER;
- pDesc->Type = D3D11_SVT_INTERFACE_POINTER;
- break;
-
- case EVT_Object:
- pDesc->Rows = 0;
- pDesc->Columns = 0;
- pDesc->Members = 0;
- pDesc->Class = D3D10_SVC_OBJECT;
-
- switch (ObjectType)
- {
- case EOT_String:
- pDesc->Type = D3D10_SVT_STRING;
- break;
- case EOT_Blend:
- pDesc->Type = D3D10_SVT_BLEND;
- break;
- case EOT_DepthStencil:
- pDesc->Type = D3D10_SVT_DEPTHSTENCIL;
- break;
- case EOT_Rasterizer:
- pDesc->Type = D3D10_SVT_RASTERIZER;
- break;
- case EOT_PixelShader:
- case EOT_PixelShader5:
- pDesc->Type = D3D10_SVT_PIXELSHADER;
- break;
- case EOT_VertexShader:
- case EOT_VertexShader5:
- pDesc->Type = D3D10_SVT_VERTEXSHADER;
- break;
- case EOT_GeometryShader:
- case EOT_GeometryShaderSO:
- case EOT_GeometryShader5:
- pDesc->Type = D3D10_SVT_GEOMETRYSHADER;
- break;
- case EOT_HullShader5:
- pDesc->Type = D3D11_SVT_HULLSHADER;
- break;
- case EOT_DomainShader5:
- pDesc->Type = D3D11_SVT_DOMAINSHADER;
- break;
- case EOT_ComputeShader5:
- pDesc->Type = D3D11_SVT_COMPUTESHADER;
- break;
- case EOT_Texture:
- pDesc->Type = D3D10_SVT_TEXTURE;
- break;
- case EOT_Texture1D:
- pDesc->Type = D3D10_SVT_TEXTURE1D;
- break;
- case EOT_Texture1DArray:
- pDesc->Type = D3D10_SVT_TEXTURE1DARRAY;
- break;
- case EOT_Texture2D:
- pDesc->Type = D3D10_SVT_TEXTURE2D;
- break;
- case EOT_Texture2DArray:
- pDesc->Type = D3D10_SVT_TEXTURE2DARRAY;
- break;
- case EOT_Texture2DMS:
- pDesc->Type = D3D10_SVT_TEXTURE2DMS;
- break;
- case EOT_Texture2DMSArray:
- pDesc->Type = D3D10_SVT_TEXTURE2DMSARRAY;
- break;
- case EOT_Texture3D:
- pDesc->Type = D3D10_SVT_TEXTURE3D;
- break;
- case EOT_TextureCube:
- pDesc->Type = D3D10_SVT_TEXTURECUBE;
- break;
- case EOT_TextureCubeArray:
- pDesc->Type = D3D10_SVT_TEXTURECUBEARRAY;
- break;
- case EOT_Buffer:
- pDesc->Type = D3D10_SVT_BUFFER;
- break;
- case EOT_Sampler:
- pDesc->Type = D3D10_SVT_SAMPLER;
- break;
- case EOT_RenderTargetView:
- pDesc->Type = D3D10_SVT_RENDERTARGETVIEW;
- break;
- case EOT_DepthStencilView:
- pDesc->Type = D3D10_SVT_DEPTHSTENCILVIEW;
- break;
- case EOT_RWTexture1D:
- pDesc->Type = D3D11_SVT_RWTEXTURE1D;
- break;
- case EOT_RWTexture1DArray:
- pDesc->Type = D3D11_SVT_RWTEXTURE1DARRAY;
- break;
- case EOT_RWTexture2D:
- pDesc->Type = D3D11_SVT_RWTEXTURE2D;
- break;
- case EOT_RWTexture2DArray:
- pDesc->Type = D3D11_SVT_RWTEXTURE2DARRAY;
- break;
- case EOT_RWTexture3D:
- pDesc->Type = D3D11_SVT_RWTEXTURE3D;
- break;
- case EOT_RWBuffer:
- pDesc->Type = D3D11_SVT_RWBUFFER;
- break;
- case EOT_ByteAddressBuffer:
- pDesc->Type = D3D11_SVT_BYTEADDRESS_BUFFER;
- break;
- case EOT_RWByteAddressBuffer:
- pDesc->Type = D3D11_SVT_RWBYTEADDRESS_BUFFER;
- break;
- case EOT_StructuredBuffer:
- pDesc->Type = D3D11_SVT_STRUCTURED_BUFFER;
- break;
- case EOT_RWStructuredBuffer:
- case EOT_RWStructuredBufferAlloc:
- case EOT_RWStructuredBufferConsume:
- pDesc->Type = D3D11_SVT_RWSTRUCTURED_BUFFER;
- break;
- case EOT_AppendStructuredBuffer:
- pDesc->Type = D3D11_SVT_APPEND_STRUCTURED_BUFFER;
- break;
- case EOT_ConsumeStructuredBuffer:
- pDesc->Type = D3D11_SVT_CONSUME_STRUCTURED_BUFFER;
- break;
-
- default:
- D3DXASSERT(0);
- }
- break;
-
- default:
- D3DXASSERT(0);
- }
-
-lExit:
- return hr;
-
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// ID3DX11EffectShaderVariable (SAnonymousShader implementation)
-////////////////////////////////////////////////////////////////////////////////
-
-SAnonymousShader::SAnonymousShader(SShaderBlock *pBlock)
-{
- pShaderBlock = pBlock;
-}
-
-BOOL SAnonymousShader::IsValid()
-{
- return pShaderBlock && pShaderBlock->IsValid;
-}
-
-ID3DX11EffectType * SAnonymousShader::GetType()
-{
- return (ID3DX11EffectType *) this;
-}
-
-HRESULT SAnonymousShader::GetDesc(D3DX11_EFFECT_VARIABLE_DESC *pDesc)
-{
- pDesc->Annotations = 0;
- pDesc->Flags = 0;
-
- pDesc->Name = "$Anonymous";
- pDesc->Semantic = NULL;
- pDesc->BufferOffset = 0;
-
- return S_OK;
-}
-
-ID3DX11EffectVariable * SAnonymousShader::GetAnnotationByIndex(UINT Index)
-{
- DPF(0, "ID3DX11EffectVariable::GetAnnotationByIndex: Anonymous shaders cannot have annotations");
- return &g_InvalidScalarVariable;
-}
-
-ID3DX11EffectVariable * SAnonymousShader::GetAnnotationByName(LPCSTR Name)
-{
- DPF(0, "ID3DX11EffectVariable::GetAnnotationByName: Anonymous shaders cannot have annotations");
- return &g_InvalidScalarVariable;
-}
-
-ID3DX11EffectVariable * SAnonymousShader::GetMemberByIndex(UINT Index)
-{
- DPF(0, "ID3DX11EffectVariable::GetMemberByIndex: Variable is not a structure");
- return &g_InvalidScalarVariable;
-}
-
-ID3DX11EffectVariable * SAnonymousShader::GetMemberByName(LPCSTR Name)
-{
- DPF(0, "ID3DX11EffectVariable::GetMemberByName: Variable is not a structure");
- return &g_InvalidScalarVariable;
-}
-
-ID3DX11EffectVariable * SAnonymousShader::GetMemberBySemantic(LPCSTR Semantic)
-{
- DPF(0, "ID3DX11EffectVariable::GetMemberBySemantic: Variable is not a structure");
- return &g_InvalidScalarVariable;
-}
-
-ID3DX11EffectVariable * SAnonymousShader::GetElement(UINT Index)
-{
- DPF(0, "ID3DX11EffectVariable::GetElement: Anonymous shaders cannot have elements");
- return &g_InvalidScalarVariable;
-}
-
-ID3DX11EffectConstantBuffer * SAnonymousShader::GetParentConstantBuffer()
-{
- return NoParentCB();
-}
-
-ID3DX11EffectShaderVariable * SAnonymousShader::AsShader()
-{
- return (ID3DX11EffectShaderVariable *) this;
-}
-
-HRESULT SAnonymousShader::SetRawValue(CONST void *pData, UINT Offset, UINT Count)
-{
- return ObjectSetRawValue();
-}
-
-HRESULT SAnonymousShader::GetRawValue(__out_bcount(Count) void *pData, UINT Offset, UINT Count)
-{
- return ObjectGetRawValue();
-}
-
-#define ANONYMOUS_SHADER_INDEX_CHECK() \
- HRESULT hr = S_OK; \
- if (0 != ShaderIndex) \
- { \
- DPF(0, "%s: Invalid index specified", pFuncName); \
- VH(E_INVALIDARG); \
- } \
-
-HRESULT SAnonymousShader::GetShaderDesc(UINT ShaderIndex, D3DX11_EFFECT_SHADER_DESC *pDesc)
-{
- LPCSTR pFuncName = "ID3DX11EffectShaderVariable::GetShaderDesc";
-
- ANONYMOUS_SHADER_INDEX_CHECK();
-
- pShaderBlock->GetShaderDesc(pDesc, TRUE);
-
-lExit:
- return hr;
-}
-
-HRESULT SAnonymousShader::GetVertexShader(UINT ShaderIndex, ID3D11VertexShader **ppVS)
-{
- LPCSTR pFuncName = "ID3DX11EffectShaderVariable::GetVertexShader";
-
- ANONYMOUS_SHADER_INDEX_CHECK();
-
- VH( pShaderBlock->GetVertexShader(ppVS) );
-
-lExit:
- return hr;
-}
-
-HRESULT SAnonymousShader::GetGeometryShader(UINT ShaderIndex, ID3D11GeometryShader **ppGS)
-{
- LPCSTR pFuncName = "ID3DX11EffectShaderVariable::GetGeometryShader";
-
- ANONYMOUS_SHADER_INDEX_CHECK();
-
- VH( pShaderBlock->GetGeometryShader(ppGS) );
-
-lExit:
- return hr;
-}
-
-HRESULT SAnonymousShader::GetPixelShader(UINT ShaderIndex, ID3D11PixelShader **ppPS)
-{
- LPCSTR pFuncName = "ID3DX11EffectShaderVariable::GetPixelShader";
-
- ANONYMOUS_SHADER_INDEX_CHECK();
-
- VH( pShaderBlock->GetPixelShader(ppPS) );
-
-lExit:
- return hr;
-}
-
-HRESULT SAnonymousShader::GetHullShader(UINT ShaderIndex, ID3D11HullShader **ppHS)
-{
- LPCSTR pFuncName = "ID3DX11EffectShaderVariable::GetHullShader";
-
- ANONYMOUS_SHADER_INDEX_CHECK();
-
- VH( pShaderBlock->GetHullShader(ppHS) );
-
-lExit:
- return hr;
-}
-
-HRESULT SAnonymousShader::GetDomainShader(UINT ShaderIndex, ID3D11DomainShader **ppCS)
-{
- LPCSTR pFuncName = "ID3DX11EffectShaderVariable::GetDomainShader";
-
- ANONYMOUS_SHADER_INDEX_CHECK();
-
- VH( pShaderBlock->GetDomainShader(ppCS) );
-
-lExit:
- return hr;
-}
-
-HRESULT SAnonymousShader::GetComputeShader(UINT ShaderIndex, ID3D11ComputeShader **ppCS)
-{
- LPCSTR pFuncName = "ID3DX11EffectShaderVariable::GetComputeShader";
-
- ANONYMOUS_SHADER_INDEX_CHECK();
-
- VH( pShaderBlock->GetComputeShader(ppCS) );
-
-lExit:
- return hr;
-}
-
-HRESULT SAnonymousShader::GetInputSignatureElementDesc(UINT ShaderIndex, UINT Element, D3D11_SIGNATURE_PARAMETER_DESC *pDesc)
-{
- LPCSTR pFuncName = "ID3DX11EffectShaderVariable::GetInputSignatureElementDesc";
-
- ANONYMOUS_SHADER_INDEX_CHECK();
-
- VH( pShaderBlock->GetSignatureElementDesc(SShaderBlock::ST_Input, Element, pDesc) );
-
-lExit:
- return hr;
-}
-
-HRESULT SAnonymousShader::GetOutputSignatureElementDesc(UINT ShaderIndex, UINT Element, D3D11_SIGNATURE_PARAMETER_DESC *pDesc)
-{
- LPCSTR pFuncName = "ID3DX11EffectShaderVariable::GetOutputSignatureElementDesc";
-
- ANONYMOUS_SHADER_INDEX_CHECK();
-
- VH( pShaderBlock->GetSignatureElementDesc(SShaderBlock::ST_Output, Element, pDesc) );
-
-lExit:
- return hr;
-}
-
-HRESULT SAnonymousShader::GetPatchConstantSignatureElementDesc(UINT ShaderIndex, UINT Element, D3D11_SIGNATURE_PARAMETER_DESC *pDesc)
-{
- LPCSTR pFuncName = "ID3DX11EffectShaderVariable::GetPatchConstantSignatureElementDesc";
-
- ANONYMOUS_SHADER_INDEX_CHECK();
-
- VH( pShaderBlock->GetSignatureElementDesc(SShaderBlock::ST_PatchConstant, Element, pDesc) );
-
-lExit:
- return hr;
-}
-
-HRESULT SAnonymousShader::GetDesc(D3DX11_EFFECT_TYPE_DESC *pDesc)
-{
- pDesc->Class = D3D10_SVC_OBJECT;
-
- switch (pShaderBlock->GetShaderType())
- {
- case EOT_VertexShader:
- case EOT_VertexShader5:
- pDesc->TypeName = "vertexshader";
- pDesc->Type = D3D10_SVT_VERTEXSHADER;
- break;
- case EOT_GeometryShader:
- case EOT_GeometryShader5:
- pDesc->TypeName = "geometryshader";
- pDesc->Type = D3D10_SVT_GEOMETRYSHADER;
- break;
- case EOT_PixelShader:
- case EOT_PixelShader5:
- pDesc->TypeName = "pixelshader";
- pDesc->Type = D3D10_SVT_PIXELSHADER;
- break;
- case EOT_HullShader5:
- pDesc->TypeName = "Hullshader";
- pDesc->Type = D3D11_SVT_HULLSHADER;
- break;
- case EOT_DomainShader5:
- pDesc->TypeName = "Domainshader";
- pDesc->Type = D3D11_SVT_DOMAINSHADER;
- break;
- case EOT_ComputeShader5:
- pDesc->TypeName = "Computeshader";
- pDesc->Type = D3D11_SVT_COMPUTESHADER;
- break;
- }
-
- pDesc->Elements = 0;
- pDesc->Members = 0;
- pDesc->Rows = 0;
- pDesc->Columns = 0;
- pDesc->PackedSize = 0;
- pDesc->UnpackedSize = 0;
- pDesc->Stride = 0;
-
- return S_OK;
-}
-
-ID3DX11EffectType * SAnonymousShader::GetMemberTypeByIndex(UINT Index)
-{
- DPF(0, "ID3DX11EffectType::GetMemberTypeByIndex: This interface does not refer to a structure");
- return &g_InvalidType;
-}
-
-ID3DX11EffectType * SAnonymousShader::GetMemberTypeByName(LPCSTR Name)
-{
- DPF(0, "ID3DX11EffectType::GetMemberTypeByName: This interface does not refer to a structure");
- return &g_InvalidType;
-}
-
-ID3DX11EffectType * SAnonymousShader::GetMemberTypeBySemantic(LPCSTR Semantic)
-{
- DPF(0, "ID3DX11EffectType::GetMemberTypeBySemantic: This interface does not refer to a structure");
- return &g_InvalidType;
-}
-
-LPCSTR SAnonymousShader::GetMemberName(UINT Index)
-{
- DPF(0, "ID3DX11EffectType::GetMemberName: This interface does not refer to a structure");
- return NULL;
-}
-
-LPCSTR SAnonymousShader::GetMemberSemantic(UINT Index)
-{
- DPF(0, "ID3DX11EffectType::GetMemberSemantic: This interface does not refer to a structure");
- return NULL;
-}
-
-//////////////////////////////////////////////////////////////////////////
-// ID3DX11EffectConstantBuffer (SConstantBuffer implementation)
-//////////////////////////////////////////////////////////////////////////
-
-BOOL SConstantBuffer::IsValid()
-{
- return TRUE;
-}
-
-ID3DX11EffectType * SConstantBuffer::GetType()
-{
- return (ID3DX11EffectType *) this;
-}
-
-HRESULT SConstantBuffer::GetDesc(D3DX11_EFFECT_VARIABLE_DESC *pDesc)
-{
- pDesc->Annotations = AnnotationCount;
- pDesc->Flags = 0;
-
- pDesc->Name = pName;
- pDesc->Semantic = NULL;
- pDesc->BufferOffset = 0;
-
- if (ExplicitBindPoint != -1)
- {
- pDesc->ExplicitBindPoint = ExplicitBindPoint;
- pDesc->Flags |= D3DX11_EFFECT_VARIABLE_EXPLICIT_BIND_POINT;
- }
- else
- {
- pDesc->ExplicitBindPoint = 0;
- }
-
- return S_OK;
-}
-
-ID3DX11EffectVariable * SConstantBuffer::GetAnnotationByIndex(UINT Index)
-{
- return GetAnnotationByIndexHelper("ID3DX11EffectVariable", Index, AnnotationCount, pAnnotations);
-}
-
-ID3DX11EffectVariable * SConstantBuffer::GetAnnotationByName(LPCSTR Name)
-{
- return GetAnnotationByNameHelper("ID3DX11EffectVariable", Name, AnnotationCount, pAnnotations);
-}
-
-ID3DX11EffectVariable * SConstantBuffer::GetMemberByIndex(UINT Index)
-{
- SGlobalVariable *pMember;
- UDataPointer dataPtr;
-
- if (IsEffectOptimized)
- {
- DPF(0, "ID3DX11EffectVariable::GetMemberByIndex: Cannot get members; effect has been Optimize()'ed");
- return &g_InvalidScalarVariable;
- }
-
- if (!GetVariableByIndexHelper<SGlobalVariable>(Index, VariableCount, (SGlobalVariable*)pVariables,
- NULL, &pMember, &dataPtr.pGeneric))
- {
- return &g_InvalidScalarVariable;
- }
-
- return (ID3DX11EffectVariable *) pMember;
-}
-
-ID3DX11EffectVariable * SConstantBuffer::GetMemberByName(LPCSTR Name)
-{
- SGlobalVariable *pMember;
- UDataPointer dataPtr;
- UINT index;
-
- if (IsEffectOptimized)
- {
- DPF(0, "ID3DX11EffectVariable::GetMemberByName: Cannot get members; effect has been Optimize()'ed");
- return &g_InvalidScalarVariable;
- }
-
- if (!GetVariableByNameHelper<SGlobalVariable>(Name, VariableCount, (SGlobalVariable*)pVariables,
- NULL, &pMember, &dataPtr.pGeneric, &index))
- {
- return &g_InvalidScalarVariable;
- }
-
- return (ID3DX11EffectVariable *) pMember;
-}
-
-ID3DX11EffectVariable * SConstantBuffer::GetMemberBySemantic(LPCSTR Semantic)
-{
- SGlobalVariable *pMember;
- UDataPointer dataPtr;
- UINT index;
-
- if (IsEffectOptimized)
- {
- DPF(0, "ID3DX11EffectVariable::GetMemberBySemantic: Cannot get members; effect has been Optimize()'ed");
- return &g_InvalidScalarVariable;
- }
-
- if (!GetVariableBySemanticHelper<SGlobalVariable>(Semantic, VariableCount, (SGlobalVariable*)pVariables,
- NULL, &pMember, &dataPtr.pGeneric, &index))
- {
- return &g_InvalidScalarVariable;
- }
-
- return (ID3DX11EffectVariable *) pMember;
-}
-
-ID3DX11EffectVariable * SConstantBuffer::GetElement(UINT Index)
-{
- LPCSTR pFuncName = "ID3DX11EffectVariable::GetElement";
- DPF(0, "%s: This interface does not refer to an array", pFuncName);
- return &g_InvalidScalarVariable;
-}
-
-ID3DX11EffectConstantBuffer * SConstantBuffer::GetParentConstantBuffer()
-{
- LPCSTR pFuncName = "ID3DX11EffectVariable::GetParentConstantBuffer";
- DPF(0, "%s: Constant buffers do not have parent constant buffers", pFuncName);
- return &g_InvalidConstantBuffer;
-}
-
-ID3DX11EffectConstantBuffer * SConstantBuffer::AsConstantBuffer()
-{
- return (ID3DX11EffectConstantBuffer *) this;
-}
-
-HRESULT SConstantBuffer::GetDesc(D3DX11_EFFECT_TYPE_DESC *pDesc)
-{
- pDesc->TypeName = IsTBuffer ? "tbuffer" : "cbuffer";
- pDesc->Class = D3D10_SVC_OBJECT;
- pDesc->Type = IsTBuffer ? D3D10_SVT_TBUFFER : D3D10_SVT_CBUFFER;
-
- pDesc->Elements = 0;
- pDesc->Members = VariableCount;
- pDesc->Rows = 0;
- pDesc->Columns = 0;
-
- UINT i;
- pDesc->PackedSize = 0;
- for (i = 0; i < VariableCount; ++ i)
- {
- pDesc->PackedSize += pVariables[i].pType->PackedSize;
- }
-
- pDesc->UnpackedSize = Size;
- D3DXASSERT(pDesc->UnpackedSize >= pDesc->PackedSize);
-
- pDesc->Stride = AlignToPowerOf2(pDesc->UnpackedSize, SType::c_RegisterSize);
-
- return S_OK;
-}
-
-ID3DX11EffectType * SConstantBuffer::GetMemberTypeByIndex(UINT Index)
-{
- return GetTypeByIndexHelper(Index, VariableCount, pVariables, sizeof (SGlobalVariable));
-}
-
-ID3DX11EffectType * SConstantBuffer::GetMemberTypeByName(LPCSTR Name)
-{
- return GetTypeByNameHelper(Name, VariableCount, pVariables, sizeof (SGlobalVariable));
-}
-
-ID3DX11EffectType * SConstantBuffer::GetMemberTypeBySemantic(LPCSTR Semantic)
-{
- return GetTypeBySemanticHelper(Semantic, VariableCount, pVariables, sizeof (SGlobalVariable));
-}
-
-LPCSTR SConstantBuffer::GetMemberName(UINT Index)
-{
- LPCSTR pFuncName = "ID3DX11EffectType::GetMemberName";
-
- if (IsEffectOptimized)
- {
- DPF(0, "%s: Cannot get member names; Effect has been Optimize()'ed", pFuncName);
- return NULL;
- }
-
- if (Index >= VariableCount)
- {
- DPF(0, "%s: Invalid index (%d, total: %d)", pFuncName, Index, VariableCount);
- return NULL;
- }
-
- return pVariables[Index].pName;
-}
-
-LPCSTR SConstantBuffer::GetMemberSemantic(UINT Index)
-{
- LPCSTR pFuncName = "ID3DX11EffectType::GetMemberSemantic";
-
- if (IsEffectOptimized)
- {
- DPF(0, "%s: Cannot get member semantics; Effect has been Optimize()'ed", pFuncName);
- return NULL;
- }
-
- if (Index >= VariableCount)
- {
- DPF(0, "%s: Invalid index (%d, total: %d)", pFuncName, Index, VariableCount);
- return NULL;
- }
-
- return pVariables[Index].pSemantic;
-}
-
-HRESULT SConstantBuffer::SetRawValue(CONST void *pData, UINT Offset, UINT Count)
-{
- HRESULT hr = S_OK;
-
-#ifdef _DEBUG
- LPCSTR pFuncName = "ID3DX11EffectVariable::SetRawValue";
-
- VERIFYPARAMETER(pData);
-
- if ((Offset + Count < Offset) ||
- (Count + (BYTE*)pData < (BYTE*)pData) ||
- ((Offset + Count) > Size))
- {
- // overflow of some kind
- DPF(0, "%s: Invalid range specified", pFuncName);
- VH(E_INVALIDARG);
- }
-#endif
-
- if (IsUsedByExpression)
- {
- UINT i;
- for (i = 0; i < VariableCount; ++ i)
- {
- ((SGlobalVariable*)pVariables)[i].DirtyVariable();
- }
- }
- else
- {
- IsDirty = TRUE;
- }
-
- memcpy(pBackingStore + Offset, pData, Count);
-
-lExit:
- return hr;
-}
-
-HRESULT SConstantBuffer::GetRawValue(__out_bcount(Count) void *pData, UINT Offset, UINT Count)
-{
- HRESULT hr = S_OK;
-
-#ifdef _DEBUG
- LPCSTR pFuncName = "ID3DX11EffectVariable::GetRawValue";
-
- VERIFYPARAMETER(pData);
-
- if ((Offset + Count < Offset) ||
- (Count + (BYTE*)pData < (BYTE*)pData) ||
- ((Offset + Count) > Size))
- {
- // overflow of some kind
- DPF(0, "%s: Invalid range specified", pFuncName);
- VH(E_INVALIDARG);
- }
-#endif
-
- memcpy(pData, pBackingStore + Offset, Count);
-
-lExit:
- return hr;
-}
-
-bool SConstantBuffer::ClonedSingle() const
-{
- return IsSingle && ( pEffect->m_Flags & D3DX11_EFFECT_CLONE );
-}
-
-HRESULT SConstantBuffer::SetConstantBuffer(ID3D11Buffer *pConstantBuffer)
-{
- HRESULT hr = S_OK;
- LPCSTR pFuncName = "ID3DX11EffectConstantBuffer::SetConstantBuffer";
-
- if (IsTBuffer)
- {
- DPF(0, "%s: This is a texture buffer; use SetTextureBuffer instead", pFuncName);
- VH(D3DERR_INVALIDCALL);
- }
-
- // Replace all references to the old shader block with this one
- pEffect->ReplaceCBReference(this, pConstantBuffer);
-
- if( !IsUserManaged )
- {
- // Save original cbuffer in case we UndoSet
- D3DXASSERT( pMemberData[0].Type == MDT_Buffer );
- VB( pMemberData[0].Data.pD3DEffectsManagedConstantBuffer == NULL );
- pMemberData[0].Data.pD3DEffectsManagedConstantBuffer = pD3DObject;
- pD3DObject = NULL;
- IsUserManaged = TRUE;
- IsNonUpdatable = TRUE;
- }
-
- SAFE_ADDREF( pConstantBuffer );
- SAFE_RELEASE( pD3DObject );
- pD3DObject = pConstantBuffer;
-
-lExit:
- return hr;
-}
-
-HRESULT SConstantBuffer::GetConstantBuffer(ID3D11Buffer **ppConstantBuffer)
-{
- HRESULT hr = S_OK;
- LPCSTR pFuncName = "ID3DX11EffectConstantBuffer::GetConstantBuffer";
-
- VERIFYPARAMETER(ppConstantBuffer);
-
- if (IsTBuffer)
- {
- DPF(0, "%s: This is a texture buffer; use GetTextureBuffer instead", pFuncName);
- VH(D3DERR_INVALIDCALL);
- }
-
- *ppConstantBuffer = pD3DObject;
- SAFE_ADDREF(*ppConstantBuffer);
-
-lExit:
- return hr;
-}
-
-HRESULT SConstantBuffer::UndoSetConstantBuffer()
-{
- HRESULT hr = S_OK;
- LPCSTR pFuncName = "ID3DX11EffectConstantBuffer::UndoSetConstantBuffer";
-
- if (IsTBuffer)
- {
- DPF(0, "%s: This is a texture buffer; use UndoSetTextureBuffer instead", pFuncName);
- VH(D3DERR_INVALIDCALL);
- }
-
- if( !IsUserManaged )
- {
- return S_FALSE;
- }
-
- // Replace all references to the old shader block with this one
- pEffect->ReplaceCBReference(this, pMemberData[0].Data.pD3DEffectsManagedConstantBuffer);
-
- // Revert to original cbuffer
- SAFE_RELEASE( pD3DObject );
- pD3DObject = pMemberData[0].Data.pD3DEffectsManagedConstantBuffer;
- pMemberData[0].Data.pD3DEffectsManagedConstantBuffer = NULL;
- IsUserManaged = FALSE;
- IsNonUpdatable = ClonedSingle();
-
-lExit:
- return hr;
-}
-
-HRESULT SConstantBuffer::SetTextureBuffer(ID3D11ShaderResourceView *pTextureBuffer)
-{
- HRESULT hr = S_OK;
- LPCSTR pFuncName = "ID3DX11EffectConstantBuffer::SetTextureBuffer";
-
- if (!IsTBuffer)
- {
- DPF(0, "%s: This is a constant buffer; use SetConstantBuffer instead", pFuncName);
- VH(D3DERR_INVALIDCALL);
- }
-
- if( !IsUserManaged )
- {
- // Save original cbuffer and tbuffer in case we UndoSet
- D3DXASSERT( pMemberData[0].Type == MDT_Buffer );
- VB( pMemberData[0].Data.pD3DEffectsManagedConstantBuffer == NULL );
- pMemberData[0].Data.pD3DEffectsManagedConstantBuffer = pD3DObject;
- pD3DObject = NULL;
- D3DXASSERT( pMemberData[1].Type == MDT_ShaderResourceView );
- VB( pMemberData[1].Data.pD3DEffectsManagedTextureBuffer == NULL );
- pMemberData[1].Data.pD3DEffectsManagedTextureBuffer = TBuffer.pShaderResource;
- TBuffer.pShaderResource = NULL;
- IsUserManaged = TRUE;
- IsNonUpdatable = TRUE;
- }
-
- SAFE_ADDREF( pTextureBuffer );
- SAFE_RELEASE(pD3DObject); // won't be needing this anymore...
- SAFE_RELEASE( TBuffer.pShaderResource );
- TBuffer.pShaderResource = pTextureBuffer;
-
-lExit:
- return hr;
-}
-
-HRESULT SConstantBuffer::GetTextureBuffer(ID3D11ShaderResourceView **ppTextureBuffer)
-{
- HRESULT hr = S_OK;
- LPCSTR pFuncName = "ID3DX11EffectConstantBuffer::GetTextureBuffer";
-
- VERIFYPARAMETER(ppTextureBuffer);
-
- if (!IsTBuffer)
- {
- DPF(0, "%s: This is a constant buffer; use GetConstantBuffer instead", pFuncName);
- VH(D3DERR_INVALIDCALL);
- }
-
- *ppTextureBuffer = TBuffer.pShaderResource;
- SAFE_ADDREF(*ppTextureBuffer);
-
-lExit:
- return hr;
-}
-
-HRESULT SConstantBuffer::UndoSetTextureBuffer()
-{
- HRESULT hr = S_OK;
- LPCSTR pFuncName = "ID3DX11EffectConstantBuffer::UndoSetTextureBuffer";
-
- if (!IsTBuffer)
- {
- DPF(0, "%s: This is a texture buffer; use UndoSetConstantBuffer instead", pFuncName);
- VH(D3DERR_INVALIDCALL);
- }
-
- if( !IsUserManaged )
- {
- return S_FALSE;
- }
-
- // Revert to original cbuffer
- SAFE_RELEASE( pD3DObject );
- pD3DObject = pMemberData[0].Data.pD3DEffectsManagedConstantBuffer;
- pMemberData[0].Data.pD3DEffectsManagedConstantBuffer = NULL;
- SAFE_RELEASE( TBuffer.pShaderResource );
- TBuffer.pShaderResource = pMemberData[1].Data.pD3DEffectsManagedTextureBuffer;
- pMemberData[1].Data.pD3DEffectsManagedTextureBuffer = NULL;
- IsUserManaged = FALSE;
- IsNonUpdatable = ClonedSingle();
-
-lExit:
- return hr;
-}
-
-//////////////////////////////////////////////////////////////////////////
-// ID3DX11EffectPass (CEffectPass implementation)
-//////////////////////////////////////////////////////////////////////////
-
-BOOL SPassBlock::IsValid()
-{
- if( HasDependencies )
- return pEffect->ValidatePassBlock( this );
- return InitiallyValid;
-}
-
-HRESULT SPassBlock::GetDesc(D3DX11_PASS_DESC *pDesc)
-{
- HRESULT hr = S_OK;
- LPCSTR pFuncName = "ID3DX11EffectPass::GetDesc";
-
- VERIFYPARAMETER(pDesc);
-
- ZeroMemory(pDesc, sizeof(*pDesc));
-
- pDesc->Name = pName;
- pDesc->Annotations = AnnotationCount;
-
- SAssignment *pAssignment;
- SAssignment *pLastAssn;
-
- pEffect->IncrementTimer();
-
- pAssignment = pAssignments;
- pLastAssn = pAssignments + AssignmentCount;
-
- for(; pAssignment < pLastAssn; pAssignment++)
- {
- pEffect->EvaluateAssignment(pAssignment);
- }
-
- if( BackingStore.pVertexShaderBlock && BackingStore.pVertexShaderBlock->pInputSignatureBlob )
- {
- // pInputSignatureBlob can be null if we're setting a NULL VS "SetVertexShader( NULL )"
- pDesc->pIAInputSignature = (BYTE*)BackingStore.pVertexShaderBlock->pInputSignatureBlob->GetBufferPointer();
- pDesc->IAInputSignatureSize = BackingStore.pVertexShaderBlock->pInputSignatureBlob->GetBufferSize();
- }
-
- pDesc->StencilRef = BackingStore.StencilRef;
- pDesc->SampleMask = BackingStore.SampleMask;
- pDesc->BlendFactor[0] = BackingStore.BlendFactor[0];
- pDesc->BlendFactor[1] = BackingStore.BlendFactor[1];
- pDesc->BlendFactor[2] = BackingStore.BlendFactor[2];
- pDesc->BlendFactor[3] = BackingStore.BlendFactor[3];
-
-lExit:
- return hr;
-}
-
-extern SShaderBlock g_NullVS;
-extern SShaderBlock g_NullGS;
-extern SShaderBlock g_NullPS;
-extern SShaderBlock g_NullHS;
-extern SShaderBlock g_NullDS;
-extern SShaderBlock g_NullCS;
-
-SAnonymousShader g_AnonymousNullVS(&g_NullVS);
-SAnonymousShader g_AnonymousNullGS(&g_NullGS);
-SAnonymousShader g_AnonymousNullPS(&g_NullPS);
-SAnonymousShader g_AnonymousNullHS(&g_NullHS);
-SAnonymousShader g_AnonymousNullDS(&g_NullDS);
-SAnonymousShader g_AnonymousNullCS(&g_NullCS);
-
-template<EObjectType EShaderType>
-HRESULT SPassBlock::GetShaderDescHelper(D3DX11_PASS_SHADER_DESC *pDesc)
-{
- HRESULT hr = S_OK;
- UINT i;
- LPCSTR pFuncName = NULL;
- SShaderBlock *pShaderBlock = NULL;
-
- ApplyPassAssignments();
-
- switch (EShaderType)
- {
- case EOT_VertexShader:
- case EOT_VertexShader5:
-#pragma prefast(suppress:__WARNING_UNUSED_POINTER_ASSIGNMENT, "pFuncName used in DPF")
- pFuncName = "ID3DX11EffectPass::GetVertexShaderDesc";
- pShaderBlock = BackingStore.pVertexShaderBlock;
- break;
- case EOT_PixelShader:
- case EOT_PixelShader5:
-#pragma prefast(suppress:__WARNING_UNUSED_POINTER_ASSIGNMENT, "pFuncName used in DPF")
- pFuncName = "ID3DX11EffectPass::GetPixelShaderDesc";
- pShaderBlock = BackingStore.pPixelShaderBlock;
- break;
- case EOT_GeometryShader:
- case EOT_GeometryShader5:
-#pragma prefast(suppress:__WARNING_UNUSED_POINTER_ASSIGNMENT, "pFuncName used in DPF")
- pFuncName = "ID3DX11EffectPass::GetGeometryShaderDesc";
- pShaderBlock = BackingStore.pGeometryShaderBlock;
- break;
- case EOT_HullShader5:
-#pragma prefast(suppress:__WARNING_UNUSED_POINTER_ASSIGNMENT, "pFuncName used in DPF")
- pFuncName = "ID3DX11EffectPass::GetHullShaderDesc";
- pShaderBlock = BackingStore.pHullShaderBlock;
- break;
- case EOT_DomainShader5:
-#pragma prefast(suppress:__WARNING_UNUSED_POINTER_ASSIGNMENT, "pFuncName used in DPF")
- pFuncName = "ID3DX11EffectPass::GetDomainShaderDesc";
- pShaderBlock = BackingStore.pDomainShaderBlock;
- break;
- case EOT_ComputeShader5:
-#pragma prefast(suppress:__WARNING_UNUSED_POINTER_ASSIGNMENT, "pFuncName used in DPF")
- pFuncName = "ID3DX11EffectPass::GetComputeShaderDesc";
- pShaderBlock = BackingStore.pComputeShaderBlock;
- break;
- default:
- D3DXASSERT(0);
- }
-
- VERIFYPARAMETER(pDesc);
-
- // in case of error (or in case the assignment doesn't exist), return something reasonable
- pDesc->pShaderVariable = &g_InvalidShaderVariable;
- pDesc->ShaderIndex = 0;
-
- if (NULL != pShaderBlock)
- {
- UINT elements, varCount, anonymousShaderCount;
- SGlobalVariable *pVariables;
- SAnonymousShader *pAnonymousShaders;
-
- if (pShaderBlock == &g_NullVS)
- {
- pDesc->pShaderVariable = &g_AnonymousNullVS;
- pDesc->ShaderIndex = 0;
- // we're done
- goto lExit;
- }
- else if (pShaderBlock == &g_NullGS)
- {
- pDesc->pShaderVariable = &g_AnonymousNullGS;
- pDesc->ShaderIndex = 0;
- // we're done
- goto lExit;
- }
- else if (pShaderBlock == &g_NullPS)
- {
- pDesc->pShaderVariable = &g_AnonymousNullPS;
- pDesc->ShaderIndex = 0;
- // we're done
- goto lExit;
- }
- else if (pShaderBlock == &g_NullHS)
- {
- pDesc->pShaderVariable = &g_AnonymousNullHS;
- pDesc->ShaderIndex = 0;
- // we're done
- goto lExit;
- }
- else if (pShaderBlock == &g_NullDS)
- {
- pDesc->pShaderVariable = &g_AnonymousNullDS;
- pDesc->ShaderIndex = 0;
- // we're done
- goto lExit;
- }
- else if (pShaderBlock == &g_NullCS)
- {
- pDesc->pShaderVariable = &g_AnonymousNullCS;
- pDesc->ShaderIndex = 0;
- // we're done
- goto lExit;
- }
- else
- {
- VB( pEffect->IsRuntimeData(pShaderBlock) );
- varCount = pEffect->m_VariableCount;
- pVariables = pEffect->m_pVariables;
- anonymousShaderCount = pEffect->m_AnonymousShaderCount;
- pAnonymousShaders = pEffect->m_pAnonymousShaders;
- }
-
- for (i = 0; i < varCount; ++ i)
- {
- elements = max(1, pVariables[i].pType->Elements);
- // make sure the variable type matches, and don't forget about GeometryShaderSO's
- if (pVariables[i].pType->IsShader())
- {
- if (pShaderBlock >= pVariables[i].Data.pShader && pShaderBlock < pVariables[i].Data.pShader + elements)
- {
- pDesc->pShaderVariable = (ID3DX11EffectShaderVariable *)(pVariables + i);
- pDesc->ShaderIndex = (UINT)(UINT_PTR)(pShaderBlock - pVariables[i].Data.pShader);
- // we're done
- goto lExit;
- }
- }
- }
-
- for (i = 0; i < anonymousShaderCount; ++ i)
- {
- if (pShaderBlock == pAnonymousShaders[i].pShaderBlock)
- {
- VB(EShaderType == pAnonymousShaders[i].pShaderBlock->GetShaderType())
- pDesc->pShaderVariable = (pAnonymousShaders + i);
- pDesc->ShaderIndex = 0;
- // we're done
- goto lExit;
- }
- }
-
- DPF(0, "%s: Internal error; shader not found", pFuncName);
- VH( E_FAIL );
- }
-
-lExit:
- return hr;
-}
-
-HRESULT SPassBlock::GetVertexShaderDesc(D3DX11_PASS_SHADER_DESC *pDesc)
-{
- return GetShaderDescHelper<EOT_VertexShader>(pDesc);
-}
-
-HRESULT SPassBlock::GetPixelShaderDesc(D3DX11_PASS_SHADER_DESC *pDesc)
-{
- return GetShaderDescHelper<EOT_PixelShader>(pDesc);
-}
-
-HRESULT SPassBlock::GetGeometryShaderDesc(D3DX11_PASS_SHADER_DESC *pDesc)
-{
- return GetShaderDescHelper<EOT_GeometryShader>(pDesc);
-}
-
-HRESULT SPassBlock::GetHullShaderDesc(D3DX11_PASS_SHADER_DESC *pDesc)
-{
- return GetShaderDescHelper<EOT_HullShader5>(pDesc);
-}
-
-HRESULT SPassBlock::GetDomainShaderDesc(D3DX11_PASS_SHADER_DESC *pDesc)
-{
- return GetShaderDescHelper<EOT_DomainShader5>(pDesc);
-}
-
-HRESULT SPassBlock::GetComputeShaderDesc(D3DX11_PASS_SHADER_DESC *pDesc)
-{
- return GetShaderDescHelper<EOT_ComputeShader5>(pDesc);
-}
-
-ID3DX11EffectVariable * SPassBlock::GetAnnotationByIndex(UINT Index)
-{
- return GetAnnotationByIndexHelper("ID3DX11EffectPass", Index, AnnotationCount, pAnnotations);
-}
-
-ID3DX11EffectVariable * SPassBlock::GetAnnotationByName(LPCSTR Name)
-{
- return GetAnnotationByNameHelper("ID3DX11EffectPass", Name, AnnotationCount, pAnnotations);
-}
-
-HRESULT SPassBlock::Apply(UINT Flags, ID3D11DeviceContext* pContext)
-{
- HRESULT hr = S_OK;
-
- // TODO: Flags are not yet implemented
-
- D3DXASSERT( pEffect->m_pContext == NULL );
- pEffect->m_pContext = pContext;
- pEffect->ApplyPassBlock(this);
- pEffect->m_pContext = NULL;
-
-lExit:
- return hr;
-}
-
-HRESULT SPassBlock::ComputeStateBlockMask(D3DX11_STATE_BLOCK_MASK *pStateBlockMask)
-{
- HRESULT hr = S_OK;
- UINT i, j;
-
- // flags indicating whether the following shader types were caught by assignment checks or not
- BOOL bVS = FALSE, bGS = FALSE, bPS = FALSE, bHS = FALSE, bDS = FALSE, bCS = FALSE;
-
- for (i = 0; i < AssignmentCount; ++ i)
- {
- BOOL bShader = FALSE;
-
- switch (pAssignments[i].LhsType)
- {
- case ELHS_VertexShaderBlock:
- bVS = TRUE;
- bShader = TRUE;
- break;
- case ELHS_GeometryShaderBlock:
- bGS = TRUE;
- bShader = TRUE;
- break;
- case ELHS_PixelShaderBlock:
- bPS = TRUE;
- bShader = TRUE;
- break;
- case ELHS_HullShaderBlock:
- bHS = TRUE;
- bShader = TRUE;
- break;
- case ELHS_DomainShaderBlock:
- bDS = TRUE;
- bShader = TRUE;
- break;
- case ELHS_ComputeShaderBlock:
- bCS = TRUE;
- bShader = TRUE;
- break;
-
- case ELHS_RasterizerBlock:
- pStateBlockMask->RSRasterizerState = 1;
- break;
- case ELHS_BlendBlock:
- pStateBlockMask->OMBlendState = 1;
- break;
- case ELHS_DepthStencilBlock:
- pStateBlockMask->OMDepthStencilState = 1;
- break;
-
- default:
- // ignore this assignment (must be a scalar/vector assignment associated with a state object)
- break;
- }
-
- if (bShader)
- {
- for (j = 0; j < pAssignments[i].MaxElements; ++ j)
- {
- // compute state block mask for the union of ALL shaders
- VH( pAssignments[i].Source.pShader[j].ComputeStateBlockMask(pStateBlockMask) );
- }
- }
- }
-
- // go over the state block objects in case there was no corresponding assignment
- if (NULL != BackingStore.pRasterizerBlock)
- {
- pStateBlockMask->RSRasterizerState = 1;
- }
- if (NULL != BackingStore.pBlendBlock)
- {
- pStateBlockMask->OMBlendState = 1;
- }
- if (NULL != BackingStore.pDepthStencilBlock)
- {
- pStateBlockMask->OMDepthStencilState = 1;
- }
-
- // go over the shaders only if an assignment didn't already catch them
- if (FALSE == bVS && NULL != BackingStore.pVertexShaderBlock)
- {
- VH( BackingStore.pVertexShaderBlock->ComputeStateBlockMask(pStateBlockMask) );
- }
- if (FALSE == bGS && NULL != BackingStore.pGeometryShaderBlock)
- {
- VH( BackingStore.pGeometryShaderBlock->ComputeStateBlockMask(pStateBlockMask) );
- }
- if (FALSE == bPS && NULL != BackingStore.pPixelShaderBlock)
- {
- VH( BackingStore.pPixelShaderBlock->ComputeStateBlockMask(pStateBlockMask) );
- }
- if (FALSE == bHS && NULL != BackingStore.pHullShaderBlock)
- {
- VH( BackingStore.pHullShaderBlock->ComputeStateBlockMask(pStateBlockMask) );
- }
- if (FALSE == bDS && NULL != BackingStore.pDomainShaderBlock)
- {
- VH( BackingStore.pDomainShaderBlock->ComputeStateBlockMask(pStateBlockMask) );
- }
- if (FALSE == bCS && NULL != BackingStore.pComputeShaderBlock)
- {
- VH( BackingStore.pComputeShaderBlock->ComputeStateBlockMask(pStateBlockMask) );
- }
-
-lExit:
- return hr;
-}
-
-//////////////////////////////////////////////////////////////////////////
-// ID3DX11EffectTechnique (STechnique implementation)
-//////////////////////////////////////////////////////////////////////////
-
-BOOL STechnique::IsValid()
-{
- if( HasDependencies )
- {
- for( UINT i = 0; i < PassCount; i++ )
- {
- if( !((SPassBlock*)pPasses)[i].IsValid() )
- return FALSE;
- }
- return TRUE;
- }
- return InitiallyValid;
-}
-
-HRESULT STechnique::GetDesc(D3DX11_TECHNIQUE_DESC *pDesc)
-{
- HRESULT hr = S_OK;
-
- LPCSTR pFuncName = "ID3DX11EffectTechnique::GetDesc";
-
- VERIFYPARAMETER(pDesc);
-
- pDesc->Name = pName;
- pDesc->Annotations = AnnotationCount;
- pDesc->Passes = PassCount;
-
-lExit:
- return hr;
-}
-
-ID3DX11EffectVariable * STechnique::GetAnnotationByIndex(UINT Index)
-{
- return GetAnnotationByIndexHelper("ID3DX11EffectTechnique", Index, AnnotationCount, pAnnotations);
-}
-
-ID3DX11EffectVariable * STechnique::GetAnnotationByName(LPCSTR Name)
-{
- return GetAnnotationByNameHelper("ID3DX11EffectTechnique", Name, AnnotationCount, pAnnotations);
-}
-
-ID3DX11EffectPass * STechnique::GetPassByIndex(UINT Index)
-{
- LPCSTR pFuncName = "ID3DX11EffectTechnique::GetPassByIndex";
-
- if (Index >= PassCount)
- {
- DPF(0, "%s: Invalid pass index (%d, total: %d)", pFuncName, Index, PassCount);
- return &g_InvalidPass;
- }
-
- return (ID3DX11EffectPass *)(pPasses + Index);
-}
-
-ID3DX11EffectPass * STechnique::GetPassByName(LPCSTR Name)
-{
- LPCSTR pFuncName = "ID3DX11EffectTechnique::GetPassByName";
-
- UINT i;
-
- for (i = 0; i < PassCount; ++ i)
- {
- if (NULL != pPasses[i].pName &&
- strcmp(pPasses[i].pName, Name) == 0)
- {
- break;
- }
- }
-
- if (i == PassCount)
- {
- DPF(0, "%s: Pass [%s] not found", pFuncName, Name);
- return &g_InvalidPass;
- }
-
- return (ID3DX11EffectPass *)(pPasses + i);
-}
-
-HRESULT STechnique::ComputeStateBlockMask(D3DX11_STATE_BLOCK_MASK *pStateBlockMask)
-{
- HRESULT hr = S_OK;
- UINT i;
-
- for (i = 0; i < PassCount; ++ i)
- {
- VH( ((SPassBlock*)pPasses)[i].ComputeStateBlockMask(pStateBlockMask) );
- }
-
-lExit:
- return hr;
-}
-
-//////////////////////////////////////////////////////////////////////////
-// ID3DX11EffectGroup (SGroup implementation)
-//////////////////////////////////////////////////////////////////////////
-
-BOOL SGroup::IsValid()
-{
- if( HasDependencies )
- {
- for( UINT i = 0; i < TechniqueCount; i++ )
- {
- if( !((STechnique*)pTechniques)[i].IsValid() )
- return FALSE;
- }
- return TRUE;
- }
- return InitiallyValid;
-}
-
-HRESULT SGroup::GetDesc(D3DX11_GROUP_DESC *pDesc)
-{
- HRESULT hr = S_OK;
-
- LPCSTR pFuncName = "ID3DX11EffectGroup::GetDesc";
-
- VERIFYPARAMETER(pDesc);
-
- pDesc->Name = pName;
- pDesc->Annotations = AnnotationCount;
- pDesc->Techniques = TechniqueCount;
-
-lExit:
- return hr;
-}
-
-ID3DX11EffectVariable * SGroup::GetAnnotationByIndex(UINT Index)
-{
- return GetAnnotationByIndexHelper("ID3DX11EffectGroup", Index, AnnotationCount, pAnnotations);
-}
-
-ID3DX11EffectVariable * SGroup::GetAnnotationByName(LPCSTR Name)
-{
- return GetAnnotationByNameHelper("ID3DX11EffectGroup", Name, AnnotationCount, pAnnotations);
-}
-
-ID3DX11EffectTechnique * SGroup::GetTechniqueByIndex(UINT Index)
-{
- LPCSTR pFuncName = "ID3DX11EffectGroup::GetTechniqueByIndex";
-
- if (Index >= TechniqueCount)
- {
- DPF(0, "%s: Invalid pass index (%d, total: %d)", pFuncName, Index, TechniqueCount);
- return &g_InvalidTechnique;
- }
-
- return (ID3DX11EffectTechnique *)(pTechniques + Index);
-}
-
-ID3DX11EffectTechnique * SGroup::GetTechniqueByName(LPCSTR Name)
-{
- LPCSTR pFuncName = "ID3DX11EffectGroup::GetTechniqueByName";
-
- UINT i;
-
- for (i = 0; i < TechniqueCount; ++ i)
- {
- if (NULL != pTechniques[i].pName &&
- strcmp(pTechniques[i].pName, Name) == 0)
- {
- break;
- }
- }
-
- if (i == TechniqueCount)
- {
- DPF(0, "%s: Technique [%s] not found", pFuncName, Name);
- return &g_InvalidTechnique;
- }
-
- return (ID3DX11EffectTechnique *)(pTechniques + i);
-}
-
-//////////////////////////////////////////////////////////////////////////
-// ID3DX11Effect Public Reflection APIs (CEffect)
-//////////////////////////////////////////////////////////////////////////
-
-HRESULT CEffect::GetDevice(ID3D11Device **ppDevice)
-{
- HRESULT hr = S_OK;
- LPCSTR pFuncName = "ID3DX11Effect::GetDevice";
- VERIFYPARAMETER(ppDevice);
-
- m_pDevice->AddRef();
- *ppDevice = m_pDevice;
-
-lExit:
- return hr;
-}
-
-HRESULT CEffect::GetDesc(D3DX11_EFFECT_DESC *pDesc)
-{
- HRESULT hr = S_OK;
-
- LPCSTR pFuncName = "ID3DX11Effect::GetDesc";
-
- VERIFYPARAMETER(pDesc);
-
- pDesc->ConstantBuffers = m_CBCount;
- pDesc->GlobalVariables = m_VariableCount;
- pDesc->Techniques = m_TechniqueCount;
- pDesc->Groups = m_GroupCount;
- pDesc->InterfaceVariables = m_InterfaceCount;
-
-lExit:
- return hr;
-}
-
-ID3DX11EffectConstantBuffer * CEffect::GetConstantBufferByIndex(UINT Index)
-{
- LPCSTR pFuncName = "ID3DX11Effect::GetConstantBufferByIndex";
-
- if (Index < m_CBCount)
- {
- return m_pCBs + Index;
- }
-
- DPF(0, "%s: Invalid constant buffer index", pFuncName);
- return &g_InvalidConstantBuffer;
-}
-
-ID3DX11EffectConstantBuffer * CEffect::GetConstantBufferByName(LPCSTR Name)
-{
- HRESULT hr = S_OK;
- LPCSTR pFuncName = "ID3DX11Effect::GetConstantBufferByName";
-
- if (IsOptimized())
- {
- DPF(0, "%s: Cannot get constant buffer interfaces by name since the effect has been Optimize()'ed", pFuncName);
- return &g_InvalidConstantBuffer;
- }
-
- if (NULL == Name)
- {
- DPF(0, "%s: Parameter Name was NULL.", pFuncName);
- return &g_InvalidConstantBuffer;
- }
-
- UINT i;
-
- for (i = 0; i < m_CBCount; ++ i)
- {
- if (strcmp(m_pCBs[i].pName, Name) == 0)
- {
- return m_pCBs + i;
- }
- }
-
- DPF(0, "%s: Constant Buffer [%s] not found", pFuncName, Name);
- return &g_InvalidConstantBuffer;
-}
-
-ID3DX11EffectVariable * CEffect::GetVariableByIndex(UINT Index)
-{
- LPCSTR pFuncName = "ID3DX11Effect::GetVariableByIndex";
-
- if (Index < m_VariableCount)
- {
- return m_pVariables + Index;
- }
-
- DPF(0, "%s: Invalid variable index", pFuncName);
- return &g_InvalidScalarVariable;
-}
-
-ID3DX11EffectVariable * CEffect::GetVariableByName(LPCSTR Name)
-{
- HRESULT hr = S_OK;
- LPCSTR pFuncName = "ID3DX11Effect::GetVariableByName";
-
- if (IsOptimized())
- {
- DPF(0, "%s: Cannot get variable interfaces by name since the effect has been Optimize()'ed", pFuncName);
- return &g_InvalidScalarVariable;
- }
-
- if (NULL == Name)
- {
- DPF(0, "%s: Parameter Name was NULL.", pFuncName);
- return &g_InvalidScalarVariable;
- }
-
- UINT i;
-
- for (i = 0; i < m_VariableCount; ++ i)
- {
- if (strcmp(m_pVariables[i].pName, Name) == 0)
- {
- return m_pVariables + i;
- }
- }
-
- DPF(0, "%s: Variable [%s] not found", pFuncName, Name);
- return &g_InvalidScalarVariable;
-}
-
-ID3DX11EffectVariable * CEffect::GetVariableBySemantic(LPCSTR Semantic)
-{
- LPCSTR pFuncName = "ID3DX11Effect::GetVariableBySemantic";
-
- if (IsOptimized())
- {
- DPF(0, "%s: Cannot get variable interfaces by semantic since the effect has been Optimize()'ed", pFuncName);
- return &g_InvalidScalarVariable;
- }
-
- if (NULL == Semantic)
- {
- DPF(0, "%s: Parameter Semantic was NULL.", pFuncName);
- return &g_InvalidScalarVariable;
- }
-
- UINT i;
-
- for (i = 0; i < m_VariableCount; ++ i)
- {
- if (NULL != m_pVariables[i].pSemantic &&
- _stricmp(m_pVariables[i].pSemantic, Semantic) == 0)
- {
- return (ID3DX11EffectVariable *)(m_pVariables + i);
- }
- }
-
- DPF(0, "%s: Variable with semantic [%s] not found", pFuncName, Semantic);
- return &g_InvalidScalarVariable;
-}
-
-ID3DX11EffectTechnique * CEffect::GetTechniqueByIndex(UINT Index)
-{
- LPCSTR pFuncName = "ID3DX11Effect::GetTechniqueByIndex";
-
- if( Index < m_TechniqueCount )
- {
- UINT i;
- for( i=0; i < m_GroupCount; i++ )
- {
- if( Index < m_pGroups[i].TechniqueCount )
- {
- return (ID3DX11EffectTechnique *)(m_pGroups[i].pTechniques + Index);
- }
- Index -= m_pGroups[i].TechniqueCount;
- }
- D3DXASSERT( FALSE );
- }
- DPF(0, "%s: Invalid technique index (%d)", pFuncName, Index);
- return &g_InvalidTechnique;
-}
-
-ID3DX11EffectTechnique * CEffect::GetTechniqueByName(LPCSTR Name)
-{
- HRESULT hr = S_OK;
- LPCSTR pFuncName = "ID3DX11Effect::GetTechniqueByName";
- const UINT MAX_GROUP_TECHNIQUE_SIZE = 256;
- char NameCopy[MAX_GROUP_TECHNIQUE_SIZE];
-
- if (IsOptimized())
- {
- DPF(0, "ID3DX11Effect::GetTechniqueByName: Cannot get technique interfaces by name since the effect has been Optimize()'ed");
- return &g_InvalidTechnique;
- }
-
- if (NULL == Name)
- {
- DPF(0, "%s: Parameter Name was NULL.", pFuncName);
- return &g_InvalidTechnique;
- }
-
- if( FAILED( StringCchCopyA( NameCopy, MAX_GROUP_TECHNIQUE_SIZE, Name ) ) )
- {
- DPF( 0, "Group|Technique name has a length greater than %d.", MAX_GROUP_TECHNIQUE_SIZE );
- return &g_InvalidTechnique;
- }
-
- char* pDelimiter = strchr( NameCopy, '|' );
- if( pDelimiter == NULL )
- {
- if ( m_pNullGroup == NULL )
- {
- DPF( 0, "The effect contains no default group." );
- return &g_InvalidTechnique;
- }
-
- return m_pNullGroup->GetTechniqueByName( Name );
- }
-
- // separate group name and technique name
- *pDelimiter = 0;
-
- return GetGroupByName( NameCopy )->GetTechniqueByName( pDelimiter + 1 );
-}
-
-ID3D11ClassLinkage * CEffect::GetClassLinkage()
-{
- SAFE_ADDREF( m_pClassLinkage );
- return m_pClassLinkage;
-}
-
-ID3DX11EffectGroup * CEffect::GetGroupByIndex(UINT Index)
-{
- LPCSTR pFuncName = "ID3DX11Effect::GetGroupByIndex";
-
- if( Index < m_GroupCount )
- {
- return (ID3DX11EffectGroup *)(m_pGroups + Index);
- }
- DPF(0, "%s: Invalid group index (%d)", pFuncName, Index);
- return &g_InvalidGroup;
-}
-
-ID3DX11EffectGroup * CEffect::GetGroupByName(LPCSTR Name)
-{
- HRESULT hr = S_OK;
- LPCSTR pFuncName = "ID3DX11Effect::GetGroupByName";
-
- if (IsOptimized())
- {
- DPF(0, "ID3DX11Effect::GetGroupByName: Cannot get group interfaces by name since the effect has been Optimize()'ed");
- return &g_InvalidGroup;
- }
-
- if (NULL == Name || Name[0] == 0 )
- {
- return m_pNullGroup ? (ID3DX11EffectGroup *)m_pNullGroup : &g_InvalidGroup;
- }
-
- UINT i;
-
- for (i = 0; i < m_GroupCount; ++ i)
- {
- if (NULL != m_pGroups[i].pName &&
- strcmp(m_pGroups[i].pName, Name) == 0)
- {
- break;
- }
- }
-
- if (i == m_GroupCount)
- {
- DPF(0, "%s: Group [%s] not found", pFuncName, Name);
- return &g_InvalidGroup;
- }
-
- return (ID3DX11EffectGroup *)(m_pGroups + i);
-}
-
-}
diff --git a/sample/d3d11/Effects11/EffectRuntime.cpp b/sample/d3d11/Effects11/EffectRuntime.cpp
deleted file mode 100644
index c09dc84..0000000
--- a/sample/d3d11/Effects11/EffectRuntime.cpp
+++ /dev/null
@@ -1,694 +0,0 @@
-//////////////////////////////////////////////////////////////////////////////
-//
-// Copyright (C) Microsoft Corporation. All Rights Reserved.
-//
-// File: EffectRuntime.cpp
-// Content: D3DX11 Effect runtime routines (performance critical)
-// These functions are expected to be called at high frequency
-// (when applying a pass).
-//
-//////////////////////////////////////////////////////////////////////////////
-
-#include "pchfx.h"
-
-namespace D3DX11Effects
-{
- // D3D11_KEEP_UNORDERED_ACCESS_VIEWS == (UINT)-1
- UINT g_pNegativeOnes[8] = { D3D11_KEEP_UNORDERED_ACCESS_VIEWS, D3D11_KEEP_UNORDERED_ACCESS_VIEWS, D3D11_KEEP_UNORDERED_ACCESS_VIEWS,
- D3D11_KEEP_UNORDERED_ACCESS_VIEWS, D3D11_KEEP_UNORDERED_ACCESS_VIEWS, D3D11_KEEP_UNORDERED_ACCESS_VIEWS,
- D3D11_KEEP_UNORDERED_ACCESS_VIEWS, D3D11_KEEP_UNORDERED_ACCESS_VIEWS };
-
-BOOL SBaseBlock::ApplyAssignments(CEffect *pEffect)
-{
- SAssignment *pAssignment = pAssignments;
- SAssignment *pLastAssn = pAssignments + AssignmentCount;
- BOOL bRecreate = FALSE;
-
- for(; pAssignment < pLastAssn; pAssignment++)
- {
- bRecreate |= pEffect->EvaluateAssignment(pAssignment);
- }
-
- return bRecreate;
-}
-
-void SPassBlock::ApplyPassAssignments()
-{
- SAssignment *pAssignment = pAssignments;
- SAssignment *pLastAssn = pAssignments + AssignmentCount;
-
- pEffect->IncrementTimer();
-
- for(; pAssignment < pLastAssn; pAssignment++)
- {
- pEffect->EvaluateAssignment(pAssignment);
- }
-}
-
-// Returns TRUE if the shader uses global interfaces (since these interfaces can be updated through SetClassInstance)
-BOOL SPassBlock::CheckShaderDependencies( SShaderBlock* pBlock )
-{
- if( pBlock->InterfaceDepCount > 0 )
- {
- D3DXASSERT( pBlock->InterfaceDepCount == 1 );
- for( UINT i=0; i < pBlock->pInterfaceDeps[0].Count; i++ )
- {
- SInterface* pInterfaceDep = pBlock->pInterfaceDeps[0].ppFXPointers[i];
- if( pInterfaceDep > pEffect->m_pInterfaces && pInterfaceDep < (pEffect->m_pInterfaces + pEffect->m_InterfaceCount) )
- {
- // This is a global interface pointer (as opposed to an SInterface created in a BindInterface call
- return TRUE;
- }
- }
- }
- return FALSE;
-}
-
-// Returns TRUE if the pass (and sets HasDependencies) if the pass sets objects whose backing stores can be updated
-BOOL SPassBlock::CheckDependencies()
-{
- if( HasDependencies )
- return TRUE;
-
- for( UINT i=0; i < AssignmentCount; i++ )
- {
- if( pAssignments[i].DependencyCount > 0 )
- return HasDependencies = TRUE;
- }
- if( BackingStore.pBlendBlock && BackingStore.pBlendBlock->AssignmentCount > 0 )
- {
- for( UINT i=0; i < BackingStore.pBlendBlock->AssignmentCount; i++ )
- {
- if( BackingStore.pBlendBlock->pAssignments[i].DependencyCount > 0 )
- return HasDependencies = TRUE;
- }
- }
- if( BackingStore.pDepthStencilBlock && BackingStore.pDepthStencilBlock->AssignmentCount > 0 )
- {
- for( UINT i=0; i < BackingStore.pDepthStencilBlock->AssignmentCount; i++ )
- {
- if( BackingStore.pDepthStencilBlock->pAssignments[i].DependencyCount > 0 )
- return HasDependencies = TRUE;
- }
- }
- if( BackingStore.pRasterizerBlock && BackingStore.pRasterizerBlock->AssignmentCount > 0 )
- {
- for( UINT i=0; i < BackingStore.pRasterizerBlock->AssignmentCount; i++ )
- {
- if( BackingStore.pRasterizerBlock->pAssignments[i].DependencyCount > 0 )
- return HasDependencies = TRUE;
- }
- }
- if( BackingStore.pVertexShaderBlock && CheckShaderDependencies( BackingStore.pVertexShaderBlock ) )
- {
- return HasDependencies = TRUE;
- }
- if( BackingStore.pGeometryShaderBlock && CheckShaderDependencies( BackingStore.pGeometryShaderBlock ) )
- {
- return HasDependencies = TRUE;
- }
- if( BackingStore.pPixelShaderBlock && CheckShaderDependencies( BackingStore.pPixelShaderBlock ) )
- {
- return HasDependencies = TRUE;
- }
- if( BackingStore.pHullShaderBlock && CheckShaderDependencies( BackingStore.pHullShaderBlock ) )
- {
- return HasDependencies = TRUE;
- }
- if( BackingStore.pDomainShaderBlock && CheckShaderDependencies( BackingStore.pDomainShaderBlock ) )
- {
- return HasDependencies = TRUE;
- }
- if( BackingStore.pComputeShaderBlock && CheckShaderDependencies( BackingStore.pComputeShaderBlock ) )
- {
- return HasDependencies = TRUE;
- }
-
- return HasDependencies;
-}
-
-
-// Update constant buffer contents if necessary
-D3DX11INLINE void CheckAndUpdateCB_FX(ID3D11DeviceContext *pContext, SConstantBuffer *pCB)
-{
- if (pCB->IsDirty && !pCB->IsNonUpdatable)
- {
- // CB out of date; rebuild it
- pContext->UpdateSubresource(pCB->pD3DObject, 0, NULL, pCB->pBackingStore, pCB->Size, pCB->Size);
- pCB->IsDirty = FALSE;
- }
-}
-
-
-// Set the shader and dependent state (SRVs, samplers, UAVs, interfaces)
-void CEffect::ApplyShaderBlock(SShaderBlock *pBlock)
-{
- UINT i;
-
- SD3DShaderVTable *pVT = pBlock->pVT;
-
- // Apply constant buffers first (tbuffers are done later)
- SShaderCBDependency *pCBDep = pBlock->pCBDeps;
- SShaderCBDependency *pLastCBDep = pBlock->pCBDeps + pBlock->CBDepCount;
-
- for (; pCBDep<pLastCBDep; pCBDep++)
- {
- D3DXASSERT(pCBDep->ppFXPointers);
-
- for (i = 0; i < pCBDep->Count; ++ i)
- {
- CheckAndUpdateCB_FX(m_pContext, (SConstantBuffer*)pCBDep->ppFXPointers[i]);
- }
-
- (m_pContext->*(pVT->pSetConstantBuffers))(pCBDep->StartIndex, pCBDep->Count, pCBDep->ppD3DObjects);
- }
-
- // Next, apply samplers
- SShaderSamplerDependency *pSampDep = pBlock->pSampDeps;
- SShaderSamplerDependency *pLastSampDep = pBlock->pSampDeps + pBlock->SampDepCount;
-
- for (; pSampDep<pLastSampDep; pSampDep++)
- {
- D3DXASSERT(pSampDep->ppFXPointers);
-
- for (i=0; i<pSampDep->Count; i++)
- {
- if ( ApplyRenderStateBlock(pSampDep->ppFXPointers[i]) )
- {
- // If the sampler was updated, its pointer will have changed
- pSampDep->ppD3DObjects[i] = pSampDep->ppFXPointers[i]->pD3DObject;
- }
- }
- (m_pContext->*(pVT->pSetSamplers))(pSampDep->StartIndex, pSampDep->Count, pSampDep->ppD3DObjects);
- }
-
- // Set the UAVs
- // UAV ranges were combined in EffectLoad. This code remains unchanged, however, so that ranges can be easily split
- D3DXASSERT( pBlock->UAVDepCount < 2 );
- if( pBlock->UAVDepCount > 0 )
- {
- SUnorderedAccessViewDependency *pUAVDep = pBlock->pUAVDeps;
- D3DXASSERT(pUAVDep->ppFXPointers);
-
- for (i=0; i<pUAVDep->Count; i++)
- {
- pUAVDep->ppD3DObjects[i] = pUAVDep->ppFXPointers[i]->pUnorderedAccessView;
- }
-
- if( EOT_ComputeShader5 == pBlock->GetShaderType() )
- {
- m_pContext->CSSetUnorderedAccessViews( pUAVDep->StartIndex, pUAVDep->Count, pUAVDep->ppD3DObjects, g_pNegativeOnes );
- }
- else
- {
- // This call could be combined with the call to set render targets if both exist in the pass
- m_pContext->OMSetRenderTargetsAndUnorderedAccessViews( D3D11_KEEP_RENDER_TARGETS_AND_DEPTH_STENCIL, NULL, NULL, pUAVDep->StartIndex, pUAVDep->Count, pUAVDep->ppD3DObjects, g_pNegativeOnes );
- }
- }
-
- // TBuffers are funny:
- // We keep two references to them. One is in as a standard texture dep, and that gets used for all sets
- // The other is as a part of the TBufferDeps array, which tells us to rebuild the matching CBs.
- // These two refs could be rolled into one, but then we would have to predicate on each CB or each texture.
- SConstantBuffer **ppTB = pBlock->ppTbufDeps;
- SConstantBuffer **ppLastTB = ppTB + pBlock->TBufferDepCount;
-
- for (; ppTB<ppLastTB; ppTB++)
- {
- CheckAndUpdateCB_FX(m_pContext, (SConstantBuffer*)*ppTB);
- }
-
- // Set the textures
- SShaderResourceDependency *pResourceDep = pBlock->pResourceDeps;
- SShaderResourceDependency *pLastResourceDep = pBlock->pResourceDeps + pBlock->ResourceDepCount;
-
- for (; pResourceDep<pLastResourceDep; pResourceDep++)
- {
- D3DXASSERT(pResourceDep->ppFXPointers);
-
- for (i=0; i<pResourceDep->Count; i++)
- {
- pResourceDep->ppD3DObjects[i] = pResourceDep->ppFXPointers[i]->pShaderResource;
- }
-
- (m_pContext->*(pVT->pSetShaderResources))(pResourceDep->StartIndex, pResourceDep->Count, pResourceDep->ppD3DObjects);
- }
-
- // Update Interface dependencies
- UINT Interfaces = 0;
- ID3D11ClassInstance** ppClassInstances = NULL;
- D3DXASSERT( pBlock->InterfaceDepCount < 2 );
- if( pBlock->InterfaceDepCount > 0 )
- {
- SInterfaceDependency *pInterfaceDep = pBlock->pInterfaceDeps;
- D3DXASSERT(pInterfaceDep->ppFXPointers);
-
- ppClassInstances = pInterfaceDep->ppD3DObjects;
- Interfaces = pInterfaceDep->Count;
- for (i=0; i<pInterfaceDep->Count; i++)
- {
- SClassInstanceGlobalVariable* pCI = pInterfaceDep->ppFXPointers[i]->pClassInstance;
- if( pCI )
- {
- D3DXASSERT( pCI->pMemberData != NULL );
- pInterfaceDep->ppD3DObjects[i] = pCI->pMemberData->Data.pD3DClassInstance;
- }
- else
- {
- pInterfaceDep->ppD3DObjects[i] = NULL;
- }
- }
- }
-
- // Now set the shader
- (m_pContext->*(pVT->pSetShader))(pBlock->pD3DObject, ppClassInstances, Interfaces);
-}
-
-// Returns TRUE if the block D3D data was recreated
-BOOL CEffect::ApplyRenderStateBlock(SBaseBlock *pBlock)
-{
- if( pBlock->IsUserManaged )
- {
- return FALSE;
- }
-
- BOOL bRecreate = pBlock->ApplyAssignments(this);
-
- if (bRecreate)
- {
- switch (pBlock->BlockType)
- {
- case EBT_Sampler:
- {
- SSamplerBlock *pSBlock = pBlock->AsSampler();
-
- D3DXASSERT(NULL != pSBlock->pD3DObject);
- pSBlock->pD3DObject->Release();
-
- m_pDevice->CreateSamplerState( &pSBlock->BackingStore.SamplerDesc, &pSBlock->pD3DObject );
-
- }
- break;
-
- case EBT_DepthStencil:
- {
- SDepthStencilBlock *pDSBlock = pBlock->AsDepthStencil();
-
- D3DXASSERT(NULL != pDSBlock->pDSObject);
- SAFE_RELEASE( pDSBlock->pDSObject );
- if( SUCCEEDED( m_pDevice->CreateDepthStencilState( &pDSBlock->BackingStore, &pDSBlock->pDSObject ) ) )
- pDSBlock->IsValid = TRUE;
- else
- pDSBlock->IsValid = FALSE;
- }
- break;
-
- case EBT_Blend:
- {
- SBlendBlock *pBBlock = pBlock->AsBlend();
-
- D3DXASSERT(NULL != pBBlock->pBlendObject);
- SAFE_RELEASE( pBBlock->pBlendObject );
- if( SUCCEEDED( m_pDevice->CreateBlendState( &pBBlock->BackingStore, &pBBlock->pBlendObject ) ) )
- pBBlock->IsValid = TRUE;
- else
- pBBlock->IsValid = FALSE;
- }
- break;
-
- case EBT_Rasterizer:
- {
- SRasterizerBlock *pRBlock = pBlock->AsRasterizer();
-
- D3DXASSERT(NULL != pRBlock->pRasterizerObject);
-
- SAFE_RELEASE( pRBlock->pRasterizerObject );
- if( SUCCEEDED( m_pDevice->CreateRasterizerState( &pRBlock->BackingStore, &pRBlock->pRasterizerObject ) ) )
- pRBlock->IsValid = TRUE;
- else
- pRBlock->IsValid = FALSE;
- }
- break;
-
- default:
- D3DXASSERT(0);
- }
- }
-
- return bRecreate;
-}
-
-void CEffect::ValidateIndex(UINT Elements)
-{
- if (m_FXLIndex >= Elements)
- {
- DPF(0, "ID3DX11Effect: Overindexing variable array (size: %d, index: %d), using index = 0 instead", Elements, m_FXLIndex);
- m_FXLIndex = 0;
- }
-}
-
-// Returns TRUE if the assignment was changed
-BOOL CEffect::EvaluateAssignment(SAssignment *pAssignment)
-{
- BOOL bNeedUpdate = FALSE;
- SGlobalVariable *pVarDep0, *pVarDep1;
-
- switch (pAssignment->AssignmentType)
- {
- case ERAT_NumericVariable:
- D3DXASSERT(pAssignment->DependencyCount == 1);
- if (pAssignment->pDependencies[0].pVariable->LastModifiedTime >= pAssignment->LastRecomputedTime)
- {
- dwordMemcpy(pAssignment->Destination.pNumeric, pAssignment->Source.pNumeric, pAssignment->DataSize);
- bNeedUpdate = TRUE;
- }
- break;
-
- case ERAT_NumericVariableIndex:
- D3DXASSERT(pAssignment->DependencyCount == 2);
- pVarDep0 = pAssignment->pDependencies[0].pVariable;
- pVarDep1 = pAssignment->pDependencies[1].pVariable;
-
- if (pVarDep0->LastModifiedTime >= pAssignment->LastRecomputedTime)
- {
- m_FXLIndex = *pVarDep0->Data.pNumericDword;
-
- ValidateIndex(pVarDep1->pType->Elements);
-
- // Array index variable is dirty, update the pointer
- pAssignment->Source.pNumeric = pVarDep1->Data.pNumeric + pVarDep1->pType->Stride * m_FXLIndex;
-
- // Copy the new data
- dwordMemcpy(pAssignment->Destination.pNumeric, pAssignment->Source.pNumeric, pAssignment->DataSize);
- bNeedUpdate = TRUE;
- }
- else if (pVarDep1->LastModifiedTime >= pAssignment->LastRecomputedTime)
- {
- // Only the array variable is dirty, copy the new data
- dwordMemcpy(pAssignment->Destination.pNumeric, pAssignment->Source.pNumeric, pAssignment->DataSize);
- bNeedUpdate = TRUE;
- }
- break;
-
- case ERAT_ObjectVariableIndex:
- D3DXASSERT(pAssignment->DependencyCount == 1);
- pVarDep0 = pAssignment->pDependencies[0].pVariable;
- if (pVarDep0->LastModifiedTime >= pAssignment->LastRecomputedTime)
- {
- m_FXLIndex = *pVarDep0->Data.pNumericDword;
- ValidateIndex(pAssignment->MaxElements);
-
- // Array index variable is dirty, update the destination pointer
- *((void **)pAssignment->Destination.pGeneric) = pAssignment->Source.pNumeric +
- pAssignment->DataSize * m_FXLIndex;
- bNeedUpdate = TRUE;
- }
- break;
-
- default:
- //case ERAT_Constant: -- These are consumed and discarded
- //case ERAT_ObjectVariable: -- These are consumed and discarded
- //case ERAT_ObjectConstIndex: -- These are consumed and discarded
- //case ERAT_ObjectInlineShader: -- These are consumed and discarded
- //case ERAT_NumericConstIndex: -- ERAT_NumericVariable should be generated instead
- D3DXASSERT(0);
- break;
- }
-
- // Mark the assignment as not dirty
- pAssignment->LastRecomputedTime = m_LocalTimer;
-
- return bNeedUpdate;
-}
-
-// Returns FALSE if this shader has interface dependencies which are NULL (SetShader will fail).
-BOOL CEffect::ValidateShaderBlock( SShaderBlock* pBlock )
-{
- if( !pBlock->IsValid )
- return FALSE;
- if( pBlock->InterfaceDepCount > 0 )
- {
- D3DXASSERT( pBlock->InterfaceDepCount == 1 );
- for( UINT i=0; i < pBlock->pInterfaceDeps[0].Count; i++ )
- {
- SInterface* pInterfaceDep = pBlock->pInterfaceDeps[0].ppFXPointers[i];
- D3DXASSERT( pInterfaceDep != NULL );
- if( pInterfaceDep->pClassInstance == NULL )
- {
- return FALSE;
- }
- }
- }
- return TRUE;
-}
-
-// Returns FALSE if any state in the pass is invalid
-BOOL CEffect::ValidatePassBlock( SPassBlock* pBlock )
-{
- pBlock->ApplyPassAssignments();
-
- if (NULL != pBlock->BackingStore.pBlendBlock)
- {
- ApplyRenderStateBlock(pBlock->BackingStore.pBlendBlock);
- pBlock->BackingStore.pBlendState = pBlock->BackingStore.pBlendBlock->pBlendObject;
- if( !pBlock->BackingStore.pBlendBlock->IsValid )
- return FALSE;
- }
-
- if( NULL != pBlock->BackingStore.pDepthStencilBlock )
- {
- ApplyRenderStateBlock( pBlock->BackingStore.pDepthStencilBlock );
- pBlock->BackingStore.pDepthStencilState = pBlock->BackingStore.pDepthStencilBlock->pDSObject;
- if( !pBlock->BackingStore.pDepthStencilBlock->IsValid )
- return FALSE;
- }
-
- if( NULL != pBlock->BackingStore.pRasterizerBlock )
- {
- ApplyRenderStateBlock( pBlock->BackingStore.pRasterizerBlock );
- if( !pBlock->BackingStore.pRasterizerBlock->IsValid )
- return FALSE;
- }
-
- if( NULL != pBlock->BackingStore.pVertexShaderBlock && !ValidateShaderBlock(pBlock->BackingStore.pVertexShaderBlock) )
- return FALSE;
-
- if( NULL != pBlock->BackingStore.pGeometryShaderBlock && !ValidateShaderBlock(pBlock->BackingStore.pGeometryShaderBlock) )
- return FALSE;
-
- if( NULL != pBlock->BackingStore.pPixelShaderBlock )
- {
- if( !ValidateShaderBlock(pBlock->BackingStore.pPixelShaderBlock) )
- return FALSE;
- else if( pBlock->BackingStore.pPixelShaderBlock->UAVDepCount > 0 &&
- pBlock->BackingStore.RenderTargetViewCount > pBlock->BackingStore.pPixelShaderBlock->pUAVDeps[0].StartIndex )
- {
- return FALSE;
- }
- }
-
- if( NULL != pBlock->BackingStore.pHullShaderBlock && !ValidateShaderBlock(pBlock->BackingStore.pHullShaderBlock) )
- return FALSE;
-
- if( NULL != pBlock->BackingStore.pDomainShaderBlock && !ValidateShaderBlock(pBlock->BackingStore.pDomainShaderBlock) )
- return FALSE;
-
- if( NULL != pBlock->BackingStore.pComputeShaderBlock && !ValidateShaderBlock(pBlock->BackingStore.pComputeShaderBlock) )
- return FALSE;
-
- return TRUE;
-}
-
-// Set all state defined in the pass
-void CEffect::ApplyPassBlock(SPassBlock *pBlock)
-{
- pBlock->ApplyPassAssignments();
-
- if (NULL != pBlock->BackingStore.pBlendBlock)
- {
- ApplyRenderStateBlock(pBlock->BackingStore.pBlendBlock);
-#ifdef FXDEBUG
- if( !pBlock->BackingStore.pBlendBlock->IsValid )
- DPF( 0, "Pass::Apply - warning: applying invalid BlendState." );
-#endif
- pBlock->BackingStore.pBlendState = pBlock->BackingStore.pBlendBlock->pBlendObject;
- m_pContext->OMSetBlendState(pBlock->BackingStore.pBlendState,
- pBlock->BackingStore.BlendFactor,
- pBlock->BackingStore.SampleMask);
- }
-
- if (NULL != pBlock->BackingStore.pDepthStencilBlock)
- {
- ApplyRenderStateBlock(pBlock->BackingStore.pDepthStencilBlock);
-#ifdef FXDEBUG
- if( !pBlock->BackingStore.pDepthStencilBlock->IsValid )
- DPF( 0, "Pass::Apply - warning: applying invalid DepthStencilState." );
-#endif
- pBlock->BackingStore.pDepthStencilState = pBlock->BackingStore.pDepthStencilBlock->pDSObject;
- m_pContext->OMSetDepthStencilState(pBlock->BackingStore.pDepthStencilState,
- pBlock->BackingStore.StencilRef);
- }
-
- if (NULL != pBlock->BackingStore.pRasterizerBlock)
- {
- ApplyRenderStateBlock(pBlock->BackingStore.pRasterizerBlock);
-#ifdef FXDEBUG
- if( !pBlock->BackingStore.pRasterizerBlock->IsValid )
- DPF( 0, "Pass::Apply - warning: applying invalid RasterizerState." );
-#endif
- m_pContext->RSSetState(pBlock->BackingStore.pRasterizerBlock->pRasterizerObject);
- }
-
- if (NULL != pBlock->BackingStore.pRenderTargetViews[0])
- {
- // Grab all render targets
- ID3D11RenderTargetView *pRTV[D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT];
-
- D3DXASSERT(pBlock->BackingStore.RenderTargetViewCount <= D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT);
- __analysis_assume(D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT >= pBlock->BackingStore.RenderTargetViewCount);
-
- for (UINT i=0; i<pBlock->BackingStore.RenderTargetViewCount; i++)
- {
- pRTV[i] = pBlock->BackingStore.pRenderTargetViews[i]->pRenderTargetView;
- }
-
- // This call could be combined with the call to set PS UAVs if both exist in the pass
- m_pContext->OMSetRenderTargetsAndUnorderedAccessViews( pBlock->BackingStore.RenderTargetViewCount, pRTV, pBlock->BackingStore.pDepthStencilView->pDepthStencilView, 7, D3D11_KEEP_UNORDERED_ACCESS_VIEWS, NULL, NULL );
- }
-
- if (NULL != pBlock->BackingStore.pVertexShaderBlock)
- {
-#ifdef FXDEBUG
- if( !pBlock->BackingStore.pVertexShaderBlock->IsValid )
- DPF( 0, "Pass::Apply - warning: applying invalid vertex shader." );
-#endif
- ApplyShaderBlock(pBlock->BackingStore.pVertexShaderBlock);
- }
-
- if (NULL != pBlock->BackingStore.pPixelShaderBlock)
- {
-#ifdef FXDEBUG
- if( !pBlock->BackingStore.pPixelShaderBlock->IsValid )
- DPF( 0, "Pass::Apply - warning: applying invalid pixel shader." );
-#endif
- ApplyShaderBlock(pBlock->BackingStore.pPixelShaderBlock);
- }
-
- if (NULL != pBlock->BackingStore.pGeometryShaderBlock)
- {
-#ifdef FXDEBUG
- if( !pBlock->BackingStore.pGeometryShaderBlock->IsValid )
- DPF( 0, "Pass::Apply - warning: applying invalid geometry shader." );
-#endif
- ApplyShaderBlock(pBlock->BackingStore.pGeometryShaderBlock);
- }
-
- if (NULL != pBlock->BackingStore.pHullShaderBlock)
- {
-#ifdef FXDEBUG
- if( !pBlock->BackingStore.pHullShaderBlock->IsValid )
- DPF( 0, "Pass::Apply - warning: applying invalid hull shader." );
-#endif
- ApplyShaderBlock(pBlock->BackingStore.pHullShaderBlock);
- }
-
- if (NULL != pBlock->BackingStore.pDomainShaderBlock)
- {
-#ifdef FXDEBUG
- if( !pBlock->BackingStore.pDomainShaderBlock->IsValid )
- DPF( 0, "Pass::Apply - warning: applying invalid domain shader." );
-#endif
- ApplyShaderBlock(pBlock->BackingStore.pDomainShaderBlock);
- }
-
- if (NULL != pBlock->BackingStore.pComputeShaderBlock)
- {
-#ifdef FXDEBUG
- if( !pBlock->BackingStore.pComputeShaderBlock->IsValid )
- DPF( 0, "Pass::Apply - warning: applying invalid compute shader." );
-#endif
- ApplyShaderBlock(pBlock->BackingStore.pComputeShaderBlock);
- }
-}
-
-void CEffect::IncrementTimer()
-{
- m_LocalTimer++;
-
-#ifndef _WIN64
-#if _DEBUG && FXDEBUG
- if (m_LocalTimer > g_TimerRolloverCount)
- {
- DPF(0, "Rolling over timer (current time: %d, rollover cap: %d).", m_LocalTimer, g_TimerRolloverCount);
-#else // else !(_DEBUG && FXDEBUG)
- if (m_LocalTimer >= 0x80000000) // check to see if we've exceeded ~2 billion
- {
-#endif // _DEBUG && FXDEBUG
- HandleLocalTimerRollover();
-
- m_LocalTimer = 1;
- }
-#endif // _WIN64
-}
-
-// This function resets all timers, rendering all assignments dirty
-// This is clearly bad for performance, but should only happen every few billion ticks
-void CEffect::HandleLocalTimerRollover()
-{
- UINT i, j, k;
-
- // step 1: update variables
- for (i = 0; i < m_VariableCount; ++ i)
- {
- m_pVariables[i].LastModifiedTime = 0;
- }
-
- // step 2: update assignments on all blocks (pass, depth stencil, rasterizer, blend, sampler)
- for (UINT iGroup = 0; iGroup < m_GroupCount; ++ iGroup)
- {
- for (i = 0; i < m_pGroups[iGroup].TechniqueCount; ++ i)
- {
- for (j = 0; j < m_pGroups[iGroup].pTechniques[i].PassCount; ++ j)
- {
- for (k = 0; k < m_pGroups[iGroup].pTechniques[i].pPasses[j].AssignmentCount; ++ k)
- {
- m_pGroups[iGroup].pTechniques[i].pPasses[j].pAssignments[k].LastRecomputedTime = 0;
- }
- }
- }
- }
-
- for (i = 0; i < m_DepthStencilBlockCount; ++ i)
- {
- for (j = 0; j < m_pDepthStencilBlocks[i].AssignmentCount; ++ j)
- {
- m_pDepthStencilBlocks[i].pAssignments[j].LastRecomputedTime = 0;
- }
- }
-
- for (i = 0; i < m_RasterizerBlockCount; ++ i)
- {
- for (j = 0; j < m_pRasterizerBlocks[i].AssignmentCount; ++ j)
- {
- m_pRasterizerBlocks[i].pAssignments[j].LastRecomputedTime = 0;
- }
- }
-
- for (i = 0; i < m_BlendBlockCount; ++ i)
- {
- for (j = 0; j < m_pBlendBlocks[i].AssignmentCount; ++ j)
- {
- m_pBlendBlocks[i].pAssignments[j].LastRecomputedTime = 0;
- }
- }
-
- for (i = 0; i < m_SamplerBlockCount; ++ i)
- {
- for (j = 0; j < m_pSamplerBlocks[i].AssignmentCount; ++ j)
- {
- m_pSamplerBlocks[i].pAssignments[j].LastRecomputedTime = 0;
- }
- }
-}
-
-}
diff --git a/sample/d3d11/Effects11/EffectVariable.inl b/sample/d3d11/Effects11/EffectVariable.inl
deleted file mode 100644
index 4a8f4b7..0000000
--- a/sample/d3d11/Effects11/EffectVariable.inl
+++ /dev/null
@@ -1,4573 +0,0 @@
-//////////////////////////////////////////////////////////////////////////////
-//
-// Copyright (C) Microsoft Corporation. All Rights Reserved.
-//
-// File: EffectVariable.inl
-// Content: D3DX11 Effects Variable reflection template
-// These templates define the many Effect variable types.
-//
-//////////////////////////////////////////////////////////////////////////////
-
-//////////////////////////////////////////////////////////////////////////
-// Invalid variable forward defines
-//////////////////////////////////////////////////////////////////////////
-
-struct SEffectInvalidScalarVariable;
-struct SEffectInvalidVectorVariable;
-struct SEffectInvalidMatrixVariable;
-struct SEffectInvalidStringVariable;
-struct SEffectInvalidClassInstanceVariable;
-struct SEffectInvalidInterfaceVariable;
-struct SEffectInvalidShaderResourceVariable;
-struct SEffectInvalidUnorderedAccessViewVariable;
-struct SEffectInvalidRenderTargetViewVariable;
-struct SEffectInvalidDepthStencilViewVariable;
-struct SEffectInvalidConstantBuffer;
-struct SEffectInvalidShaderVariable;
-struct SEffectInvalidBlendVariable;
-struct SEffectInvalidDepthStencilVariable;
-struct SEffectInvalidRasterizerVariable;
-struct SEffectInvalidSamplerVariable;
-struct SEffectInvalidTechnique;
-struct SEffectInvalidPass;
-struct SEffectInvalidType;
-
-extern SEffectInvalidScalarVariable g_InvalidScalarVariable;
-extern SEffectInvalidVectorVariable g_InvalidVectorVariable;
-extern SEffectInvalidMatrixVariable g_InvalidMatrixVariable;
-extern SEffectInvalidStringVariable g_InvalidStringVariable;
-extern SEffectInvalidClassInstanceVariable g_InvalidClassInstanceVariable;
-extern SEffectInvalidInterfaceVariable g_InvalidInterfaceVariable;
-extern SEffectInvalidShaderResourceVariable g_InvalidShaderResourceVariable;
-extern SEffectInvalidUnorderedAccessViewVariable g_InvalidUnorderedAccessViewVariable;
-extern SEffectInvalidRenderTargetViewVariable g_InvalidRenderTargetViewVariable;
-extern SEffectInvalidDepthStencilViewVariable g_InvalidDepthStencilViewVariable;
-extern SEffectInvalidConstantBuffer g_InvalidConstantBuffer;
-extern SEffectInvalidShaderVariable g_InvalidShaderVariable;
-extern SEffectInvalidBlendVariable g_InvalidBlendVariable;
-extern SEffectInvalidDepthStencilVariable g_InvalidDepthStencilVariable;
-extern SEffectInvalidRasterizerVariable g_InvalidRasterizerVariable;
-extern SEffectInvalidSamplerVariable g_InvalidSamplerVariable;
-extern SEffectInvalidTechnique g_InvalidTechnique;
-extern SEffectInvalidPass g_InvalidPass;
-extern SEffectInvalidType g_InvalidType;
-
-enum ETemplateVarType
-{
- ETVT_Bool,
- ETVT_Int,
- ETVT_Float
-};
-
-//////////////////////////////////////////////////////////////////////////
-// Invalid effect variable struct definitions
-//////////////////////////////////////////////////////////////////////////
-
-struct SEffectInvalidType : public ID3DX11EffectType
-{
- STDMETHOD_(BOOL, IsValid)() { return FALSE; }
- STDMETHOD(GetDesc)(D3DX11_EFFECT_TYPE_DESC *pDesc) { return E_FAIL; }
- STDMETHOD_(ID3DX11EffectType*, GetMemberTypeByIndex)(UINT Index) { return &g_InvalidType; }
- STDMETHOD_(ID3DX11EffectType*, GetMemberTypeByName)(LPCSTR Name) { return &g_InvalidType; }
- STDMETHOD_(ID3DX11EffectType*, GetMemberTypeBySemantic)(LPCSTR Semanti) { return &g_InvalidType; }
- STDMETHOD_(LPCSTR, GetMemberName)(UINT Index) { return NULL; }
- STDMETHOD_(LPCSTR, GetMemberSemantic)(UINT Index) { return NULL; }
-};
-
-template<typename IBaseInterface>
-struct TEffectInvalidVariable : public IBaseInterface
-{
-public:
- STDMETHOD_(BOOL, IsValid)() { return FALSE; }
- STDMETHOD_(ID3DX11EffectType*, GetType)() { return &g_InvalidType; }
- STDMETHOD(GetDesc)(D3DX11_EFFECT_VARIABLE_DESC *pDesc) { return E_FAIL; }
-
- STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByIndex)(UINT Index) { return &g_InvalidScalarVariable; }
- STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByName)(LPCSTR Name) { return &g_InvalidScalarVariable; }
-
- STDMETHOD_(ID3DX11EffectVariable*, GetMemberByIndex)(UINT Index) { return &g_InvalidScalarVariable; }
- STDMETHOD_(ID3DX11EffectVariable*, GetMemberByName)(LPCSTR Name) { return &g_InvalidScalarVariable; }
- STDMETHOD_(ID3DX11EffectVariable*, GetMemberBySemantic)(LPCSTR Semantic) { return &g_InvalidScalarVariable; }
-
- STDMETHOD_(ID3DX11EffectVariable*, GetElement)(UINT Index) { return &g_InvalidScalarVariable; }
-
- STDMETHOD_(ID3DX11EffectConstantBuffer*, GetParentConstantBuffer)() { return &g_InvalidConstantBuffer; }
-
- STDMETHOD_(ID3DX11EffectScalarVariable*, AsScalar)() { return &g_InvalidScalarVariable; }
- STDMETHOD_(ID3DX11EffectVectorVariable*, AsVector)() { return &g_InvalidVectorVariable; }
- STDMETHOD_(ID3DX11EffectMatrixVariable*, AsMatrix)() { return &g_InvalidMatrixVariable; }
- STDMETHOD_(ID3DX11EffectStringVariable*, AsString)() { return &g_InvalidStringVariable; }
- STDMETHOD_(ID3DX11EffectClassInstanceVariable*, AsClassInstance)() { return &g_InvalidClassInstanceVariable; }
- STDMETHOD_(ID3DX11EffectInterfaceVariable*, AsInterface)() { return &g_InvalidInterfaceVariable; }
- STDMETHOD_(ID3DX11EffectShaderResourceVariable*, AsShaderResource)() { return &g_InvalidShaderResourceVariable; }
- STDMETHOD_(ID3DX11EffectUnorderedAccessViewVariable*, AsUnorderedAccessView)() { return &g_InvalidUnorderedAccessViewVariable; }
- STDMETHOD_(ID3DX11EffectRenderTargetViewVariable*, AsRenderTargetView)() { return &g_InvalidRenderTargetViewVariable; }
- STDMETHOD_(ID3DX11EffectDepthStencilViewVariable*, AsDepthStencilView)() { return &g_InvalidDepthStencilViewVariable; }
- STDMETHOD_(ID3DX11EffectConstantBuffer*, AsConstantBuffer)() { return &g_InvalidConstantBuffer; }
- STDMETHOD_(ID3DX11EffectShaderVariable*, AsShader)() { return &g_InvalidShaderVariable; }
- STDMETHOD_(ID3DX11EffectBlendVariable*, AsBlend)() { return &g_InvalidBlendVariable; }
- STDMETHOD_(ID3DX11EffectDepthStencilVariable*, AsDepthStencil)() { return &g_InvalidDepthStencilVariable; }
- STDMETHOD_(ID3DX11EffectRasterizerVariable*, AsRasterizer)() { return &g_InvalidRasterizerVariable; }
- STDMETHOD_(ID3DX11EffectSamplerVariable*, AsSampler)() { return &g_InvalidSamplerVariable; }
-
- STDMETHOD(SetRawValue)(CONST void *pData, UINT Offset, UINT Count) { return E_FAIL; }
- STDMETHOD(GetRawValue)(void *pData, UINT Offset, UINT Count) { return E_FAIL; }
-};
-
-struct SEffectInvalidScalarVariable : public TEffectInvalidVariable<ID3DX11EffectScalarVariable>
-{
-public:
-
- STDMETHOD(SetFloat)(CONST float Value) { return E_FAIL; }
- STDMETHOD(GetFloat)(float *pValue) { return E_FAIL; }
-
- STDMETHOD(SetFloatArray)(CONST float *pData, UINT Offset, UINT Count) { return E_FAIL; }
- STDMETHOD(GetFloatArray)(float *pData, UINT Offset, UINT Count) { return E_FAIL; }
-
- STDMETHOD(SetInt)(CONST int Value) { return E_FAIL; }
- STDMETHOD(GetInt)(int *pValue) { return E_FAIL; }
-
- STDMETHOD(SetIntArray)(CONST int *pData, UINT Offset, UINT Count) { return E_FAIL; }
- STDMETHOD(GetIntArray)(int *pData, UINT Offset, UINT Count) { return E_FAIL; }
-
- STDMETHOD(SetBool)(CONST BOOL Value) { return E_FAIL; }
- STDMETHOD(GetBool)(BOOL *pValue) { return E_FAIL; }
-
- STDMETHOD(SetBoolArray)(CONST BOOL *pData, UINT Offset, UINT Count) { return E_FAIL; }
- STDMETHOD(GetBoolArray)(BOOL *pData, UINT Offset, UINT Count) { return E_FAIL; }
-};
-
-
-struct SEffectInvalidVectorVariable : public TEffectInvalidVariable<ID3DX11EffectVectorVariable>
-{
-public:
- STDMETHOD(SetFloatVector)(CONST float *pData) { return E_FAIL; };
- STDMETHOD(SetIntVector)(CONST int *pData) { return E_FAIL; };
- STDMETHOD(SetBoolVector)(CONST BOOL *pData) { return E_FAIL; };
-
- STDMETHOD(GetFloatVector)(float *pData) { return E_FAIL; };
- STDMETHOD(GetIntVector)(int *pData) { return E_FAIL; };
- STDMETHOD(GetBoolVector)(BOOL *pData) { return E_FAIL; };
-
- STDMETHOD(SetBoolVectorArray) (CONST BOOL *pData, UINT Offset, UINT Count) { return E_FAIL; };
- STDMETHOD(SetIntVectorArray) (CONST int *pData, UINT Offset, UINT Count) { return E_FAIL; };
- STDMETHOD(SetFloatVectorArray)(CONST float *pData, UINT Offset, UINT Count) { return E_FAIL; };
-
- STDMETHOD(GetBoolVectorArray) (BOOL *pData, UINT Offset, UINT Count) { return E_FAIL; };
- STDMETHOD(GetIntVectorArray) (int *pData, UINT Offset, UINT Count) { return E_FAIL; };
- STDMETHOD(GetFloatVectorArray)(float *pData, UINT Offset, UINT Count) { return E_FAIL; };
-
-};
-
-struct SEffectInvalidMatrixVariable : public TEffectInvalidVariable<ID3DX11EffectMatrixVariable>
-{
-public:
-
- STDMETHOD(SetMatrix)(CONST float *pData) { return E_FAIL; }
- STDMETHOD(GetMatrix)(float *pData) { return E_FAIL; }
-
- STDMETHOD(SetMatrixArray)(CONST float *pData, UINT Offset, UINT Count) { return E_FAIL; }
- STDMETHOD(GetMatrixArray)(float *pData, UINT Offset, UINT Count) { return E_FAIL; }
-
- STDMETHOD(SetMatrixPointerArray)(CONST float **ppData, UINT Offset, UINT Count) { return E_FAIL; }
- STDMETHOD(GetMatrixPointerArray)(float **ppData, UINT Offset, UINT Count) { return E_FAIL; }
-
- STDMETHOD(SetMatrixTranspose)(CONST float *pData) { return E_FAIL; }
- STDMETHOD(GetMatrixTranspose)(float *pData) { return E_FAIL; }
-
- STDMETHOD(SetMatrixTransposeArray)(CONST float *pData, UINT Offset, UINT Count) { return E_FAIL; }
- STDMETHOD(GetMatrixTransposeArray)(float *pData, UINT Offset, UINT Count) { return E_FAIL; }
-
- STDMETHOD(SetMatrixTransposePointerArray)(CONST float **ppData, UINT Offset, UINT Count) { return E_FAIL; }
- STDMETHOD(GetMatrixTransposePointerArray)(float **ppData, UINT Offset, UINT Count) { return E_FAIL; }
-};
-
-struct SEffectInvalidStringVariable : public TEffectInvalidVariable<ID3DX11EffectStringVariable>
-{
-public:
-
- STDMETHOD(GetString)(LPCSTR *ppString) { return E_FAIL; }
- STDMETHOD(GetStringArray)(LPCSTR *ppStrings, UINT Offset, UINT Count) { return E_FAIL; }
-};
-
-struct SEffectInvalidClassInstanceVariable : public TEffectInvalidVariable<ID3DX11EffectClassInstanceVariable>
-{
-public:
-
- STDMETHOD(GetClassInstance)(ID3D11ClassInstance **ppClassInstance) { return E_FAIL; }
-};
-
-
-struct SEffectInvalidInterfaceVariable : public TEffectInvalidVariable<ID3DX11EffectInterfaceVariable>
-{
-public:
-
- STDMETHOD(SetClassInstance)(ID3DX11EffectClassInstanceVariable *pEffectClassInstance) { return E_FAIL; }
- STDMETHOD(GetClassInstance)(ID3DX11EffectClassInstanceVariable **ppEffectClassInstance) { return E_FAIL; }
-};
-
-
-struct SEffectInvalidShaderResourceVariable : public TEffectInvalidVariable<ID3DX11EffectShaderResourceVariable>
-{
-public:
-
- STDMETHOD(SetResource)(ID3D11ShaderResourceView *pResource) { return E_FAIL; }
- STDMETHOD(GetResource)(ID3D11ShaderResourceView **ppResource) { return E_FAIL; }
-
- STDMETHOD(SetResourceArray)(ID3D11ShaderResourceView **ppResources, UINT Offset, UINT Count) { return E_FAIL; }
- STDMETHOD(GetResourceArray)(ID3D11ShaderResourceView **ppResources, UINT Offset, UINT Count) { return E_FAIL; }
-};
-
-
-struct SEffectInvalidUnorderedAccessViewVariable : public TEffectInvalidVariable<ID3DX11EffectUnorderedAccessViewVariable>
-{
-public:
-
- STDMETHOD(SetUnorderedAccessView)(ID3D11UnorderedAccessView *pResource) { return E_FAIL; }
- STDMETHOD(GetUnorderedAccessView)(ID3D11UnorderedAccessView **ppResource) { return E_FAIL; }
-
- STDMETHOD(SetUnorderedAccessViewArray)(ID3D11UnorderedAccessView **ppResources, UINT Offset, UINT Count) { return E_FAIL; }
- STDMETHOD(GetUnorderedAccessViewArray)(ID3D11UnorderedAccessView **ppResources, UINT Offset, UINT Count) { return E_FAIL; }
-};
-
-
-struct SEffectInvalidRenderTargetViewVariable : public TEffectInvalidVariable<ID3DX11EffectRenderTargetViewVariable>
-{
-public:
-
- STDMETHOD(SetRenderTarget)(ID3D11RenderTargetView *pResource) { return E_FAIL; }
- STDMETHOD(GetRenderTarget)(ID3D11RenderTargetView **ppResource) { return E_FAIL; }
-
- STDMETHOD(SetRenderTargetArray)(ID3D11RenderTargetView **ppResources, UINT Offset, UINT Count) { return E_FAIL; }
- STDMETHOD(GetRenderTargetArray)(ID3D11RenderTargetView **ppResources, UINT Offset, UINT Count) { return E_FAIL; }
-};
-
-
-struct SEffectInvalidDepthStencilViewVariable : public TEffectInvalidVariable<ID3DX11EffectDepthStencilViewVariable>
-{
-public:
-
- STDMETHOD(SetDepthStencil)(ID3D11DepthStencilView *pResource) { return E_FAIL; }
- STDMETHOD(GetDepthStencil)(ID3D11DepthStencilView **ppResource) { return E_FAIL; }
-
- STDMETHOD(SetDepthStencilArray)(ID3D11DepthStencilView **ppResources, UINT Offset, UINT Count) { return E_FAIL; }
- STDMETHOD(GetDepthStencilArray)(ID3D11DepthStencilView **ppResources, UINT Offset, UINT Count) { return E_FAIL; }
-};
-
-
-struct SEffectInvalidConstantBuffer : public TEffectInvalidVariable<ID3DX11EffectConstantBuffer>
-{
-public:
-
- STDMETHOD(SetConstantBuffer)(ID3D11Buffer *pConstantBuffer) { return E_FAIL; }
- STDMETHOD(GetConstantBuffer)(ID3D11Buffer **ppConstantBuffer) { return E_FAIL; }
- STDMETHOD(UndoSetConstantBuffer)() { return E_FAIL; }
-
- STDMETHOD(SetTextureBuffer)(ID3D11ShaderResourceView *pTextureBuffer) { return E_FAIL; }
- STDMETHOD(GetTextureBuffer)(ID3D11ShaderResourceView **ppTextureBuffer) { return E_FAIL; }
- STDMETHOD(UndoSetTextureBuffer)() { return E_FAIL; }
-};
-
-struct SEffectInvalidShaderVariable : public TEffectInvalidVariable<ID3DX11EffectShaderVariable>
-{
-public:
-
- STDMETHOD(GetShaderDesc)(UINT ShaderIndex, D3DX11_EFFECT_SHADER_DESC *pDesc) { return E_FAIL; }
-
- STDMETHOD(GetVertexShader)(UINT ShaderIndex, ID3D11VertexShader **ppVS) { return E_FAIL; }
- STDMETHOD(GetGeometryShader)(UINT ShaderIndex, ID3D11GeometryShader **ppGS) { return E_FAIL; }
- STDMETHOD(GetPixelShader)(UINT ShaderIndex, ID3D11PixelShader **ppPS) { return E_FAIL; }
- STDMETHOD(GetHullShader)(UINT ShaderIndex, ID3D11HullShader **ppPS) { return E_FAIL; }
- STDMETHOD(GetDomainShader)(UINT ShaderIndex, ID3D11DomainShader **ppPS) { return E_FAIL; }
- STDMETHOD(GetComputeShader)(UINT ShaderIndex, ID3D11ComputeShader **ppPS) { return E_FAIL; }
-
- STDMETHOD(GetInputSignatureElementDesc)(UINT ShaderIndex, UINT Element, D3D11_SIGNATURE_PARAMETER_DESC *pDesc) { return E_FAIL; }
- STDMETHOD(GetOutputSignatureElementDesc)(UINT ShaderIndex, UINT Element, D3D11_SIGNATURE_PARAMETER_DESC *pDesc) { return E_FAIL; }
- STDMETHOD(GetPatchConstantSignatureElementDesc)(UINT ShaderIndex, UINT Element, D3D11_SIGNATURE_PARAMETER_DESC *pDesc) { return E_FAIL; }
-};
-
-struct SEffectInvalidBlendVariable : public TEffectInvalidVariable<ID3DX11EffectBlendVariable>
-{
-public:
-
- STDMETHOD(GetBlendState)(UINT Index, ID3D11BlendState **ppBlendState) { return E_FAIL; }
- STDMETHOD(SetBlendState)(UINT Index, ID3D11BlendState *pBlendState) { return E_FAIL; }
- STDMETHOD(UndoSetBlendState)(UINT Index) { return E_FAIL; }
- STDMETHOD(GetBackingStore)(UINT Index, D3D11_BLEND_DESC *pBlendDesc) { return E_FAIL; }
-};
-
-struct SEffectInvalidDepthStencilVariable : public TEffectInvalidVariable<ID3DX11EffectDepthStencilVariable>
-{
-public:
-
- STDMETHOD(GetDepthStencilState)(UINT Index, ID3D11DepthStencilState **ppDepthStencilState) { return E_FAIL; }
- STDMETHOD(SetDepthStencilState)(UINT Index, ID3D11DepthStencilState *pDepthStencilState) { return E_FAIL; }
- STDMETHOD(UndoSetDepthStencilState)(UINT Index) { return E_FAIL; }
- STDMETHOD(GetBackingStore)(UINT Index, D3D11_DEPTH_STENCIL_DESC *pDepthStencilDesc) { return E_FAIL; }
-};
-
-struct SEffectInvalidRasterizerVariable : public TEffectInvalidVariable<ID3DX11EffectRasterizerVariable>
-{
-public:
-
- STDMETHOD(GetRasterizerState)(UINT Index, ID3D11RasterizerState **ppRasterizerState) { return E_FAIL; }
- STDMETHOD(SetRasterizerState)(UINT Index, ID3D11RasterizerState *pRasterizerState) { return E_FAIL; }
- STDMETHOD(UndoSetRasterizerState)(UINT Index) { return E_FAIL; }
- STDMETHOD(GetBackingStore)(UINT Index, D3D11_RASTERIZER_DESC *pRasterizerDesc) { return E_FAIL; }
-};
-
-struct SEffectInvalidSamplerVariable : public TEffectInvalidVariable<ID3DX11EffectSamplerVariable>
-{
-public:
-
- STDMETHOD(GetSampler)(UINT Index, ID3D11SamplerState **ppSampler) { return E_FAIL; }
- STDMETHOD(SetSampler)(UINT Index, ID3D11SamplerState *pSampler) { return E_FAIL; }
- STDMETHOD(UndoSetSampler)(UINT Index) { return E_FAIL; }
- STDMETHOD(GetBackingStore)(UINT Index, D3D11_SAMPLER_DESC *pSamplerDesc) { return E_FAIL; }
-};
-
-struct SEffectInvalidPass : public ID3DX11EffectPass
-{
-public:
- STDMETHOD_(BOOL, IsValid)() { return FALSE; }
- STDMETHOD(GetDesc)(D3DX11_PASS_DESC *pDesc) { return E_FAIL; }
-
- STDMETHOD(GetVertexShaderDesc)(D3DX11_PASS_SHADER_DESC *pDesc) { return E_FAIL; }
- STDMETHOD(GetGeometryShaderDesc)(D3DX11_PASS_SHADER_DESC *pDesc) { return E_FAIL; }
- STDMETHOD(GetPixelShaderDesc)(D3DX11_PASS_SHADER_DESC *pDesc) { return E_FAIL; }
- STDMETHOD(GetHullShaderDesc)(D3DX11_PASS_SHADER_DESC *pDesc) { return E_FAIL; }
- STDMETHOD(GetDomainShaderDesc)(D3DX11_PASS_SHADER_DESC *pDesc) { return E_FAIL; }
- STDMETHOD(GetComputeShaderDesc)(D3DX11_PASS_SHADER_DESC *pDesc) { return E_FAIL; }
-
- STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByIndex)(UINT Index) { return &g_InvalidScalarVariable; }
- STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByName)(LPCSTR Name) { return &g_InvalidScalarVariable; }
-
- STDMETHOD(Apply)(UINT Flags, ID3D11DeviceContext* pContext) { return E_FAIL; }
- STDMETHOD(ComputeStateBlockMask)(D3DX11_STATE_BLOCK_MASK *pStateBlockMask) { return E_FAIL; }
-};
-
-struct SEffectInvalidTechnique : public ID3DX11EffectTechnique
-{
-public:
- STDMETHOD_(BOOL, IsValid)() { return FALSE; }
- STDMETHOD(GetDesc)(D3DX11_TECHNIQUE_DESC *pDesc) { return E_FAIL; }
-
- STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByIndex)(UINT Index) { return &g_InvalidScalarVariable; }
- STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByName)(LPCSTR Name) { return &g_InvalidScalarVariable; }
-
- STDMETHOD_(ID3DX11EffectPass*, GetPassByIndex)(UINT Index) { return &g_InvalidPass; }
- STDMETHOD_(ID3DX11EffectPass*, GetPassByName)(LPCSTR Name) { return &g_InvalidPass; }
-
- STDMETHOD(ComputeStateBlockMask)(D3DX11_STATE_BLOCK_MASK *pStateBlockMask) { return E_FAIL; }
-};
-
-struct SEffectInvalidGroup : public ID3DX11EffectGroup
-{
-public:
- STDMETHOD_(BOOL, IsValid)() { return FALSE; }
- STDMETHOD(GetDesc)(D3DX11_GROUP_DESC *pDesc) { return E_FAIL; }
-
- STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByIndex)(UINT Index) { return &g_InvalidScalarVariable; }
- STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByName)(LPCSTR Name) { return &g_InvalidScalarVariable; }
-
- STDMETHOD_(ID3DX11EffectTechnique*, GetTechniqueByIndex)(UINT Index) { return &g_InvalidTechnique; }
- STDMETHOD_(ID3DX11EffectTechnique*, GetTechniqueByName)(LPCSTR Name) { return &g_InvalidTechnique; }
-};
-
-//////////////////////////////////////////////////////////////////////////
-// Helper routines
-//////////////////////////////////////////////////////////////////////////
-
-// This is an annoying warning that pops up in retail builds because
-// the code that jumps to "lExit" is conditionally not compiled.
-// The only alternative is more #ifdefs in every function
-#pragma warning( disable : 4102 ) // 'label' : unreferenced label
-
-#define VERIFYPARAMETER(x) \
-{ if (!(x)) { DPF(0, "%s: Parameter " #x " was NULL.", pFuncName); \
- __BREAK_ON_FAIL; hr = E_INVALIDARG; goto lExit; } }
-
-static HRESULT AnnotationInvalidSetCall(LPCSTR pFuncName)
-{
- DPF(0, "%s: Annotations are readonly", pFuncName);
- return D3DERR_INVALIDCALL;
-}
-
-static HRESULT ObjectSetRawValue()
-{
- DPF(0, "ID3DX11EffectVariable::SetRawValue: Objects do not support ths call; please use the specific object accessors instead.");
- return D3DERR_INVALIDCALL;
-}
-
-static HRESULT ObjectGetRawValue()
-{
- DPF(0, "ID3DX11EffectVariable::GetRawValue: Objects do not support ths call; please use the specific object accessors instead.");
- return D3DERR_INVALIDCALL;
-}
-
-ID3DX11EffectConstantBuffer * NoParentCB();
-
-ID3DX11EffectVariable * GetAnnotationByIndexHelper(const char *pClassName, UINT Index, UINT AnnotationCount, SAnnotation *pAnnotations);
-
-ID3DX11EffectVariable * GetAnnotationByNameHelper(const char *pClassName, LPCSTR Name, UINT AnnotationCount, SAnnotation *pAnnotations);
-
-template<typename SVarType>
-BOOL GetVariableByIndexHelper(UINT Index, UINT VariableCount, SVarType *pVariables,
- BYTE *pBaseAddress, SVarType **ppMember, void **ppDataPtr)
-{
- LPCSTR pFuncName = "ID3DX11EffectVariable::GetMemberByIndex";
-
- if (Index >= VariableCount)
- {
- DPF(0, "%s: Invalid index (%d, total: %d)", pFuncName, Index, VariableCount);
- return FALSE;
- }
-
- *ppMember = pVariables + Index;
- *ppDataPtr = pBaseAddress + (*ppMember)->Data.Offset;
- return TRUE;
-}
-
-template<typename SVarType>
-BOOL GetVariableByNameHelper(LPCSTR Name, UINT VariableCount, SVarType *pVariables,
- BYTE *pBaseAddress, SVarType **ppMember, void **ppDataPtr, UINT* pIndex)
-{
- LPCSTR pFuncName = "ID3DX11EffectVariable::GetMemberByName";
-
- if (NULL == Name)
- {
- DPF(0, "%s: Parameter Name was NULL.", pFuncName);
- return FALSE;
- }
-
- UINT i;
- bool bHasSuper = false;
-
- for (i = 0; i < VariableCount; ++ i)
- {
- *ppMember = pVariables + i;
- D3DXASSERT(NULL != (*ppMember)->pName);
- if (strcmp((*ppMember)->pName, Name) == 0)
- {
- *ppDataPtr = pBaseAddress + (*ppMember)->Data.Offset;
- *pIndex = i;
- return TRUE;
- }
- else if (i == 0 &&
- (*ppMember)->pName[0] == '$' &&
- strcmp((*ppMember)->pName, "$super") == 0)
- {
- bHasSuper = true;
- }
- }
-
- if (bHasSuper)
- {
- SVarType* pSuper = pVariables;
-
- return GetVariableByNameHelper<SVarType>(Name,
- pSuper->pType->StructType.Members,
- (SVarType*)pSuper->pType->StructType.pMembers,
- pBaseAddress + pSuper->Data.Offset,
- ppMember,
- ppDataPtr,
- pIndex);
- }
-
- DPF(0, "%s: Variable [%s] not found", pFuncName, Name);
- return FALSE;
-}
-
-template<typename SVarType>
-BOOL GetVariableBySemanticHelper(LPCSTR Semantic, UINT VariableCount, SVarType *pVariables,
- BYTE *pBaseAddress, SVarType **ppMember, void **ppDataPtr, UINT* pIndex)
-{
- LPCSTR pFuncName = "ID3DX11EffectVariable::GetMemberBySemantic";
-
- if (NULL == Semantic)
- {
- DPF(0, "%s: Parameter Semantic was NULL.", pFuncName);
- return FALSE;
- }
-
- UINT i;
-
- for (i = 0; i < VariableCount; ++ i)
- {
- *ppMember = pVariables + i;
- if (NULL != (*ppMember)->pSemantic &&
- _stricmp((*ppMember)->pSemantic, Semantic) == 0)
- {
- *ppDataPtr = pBaseAddress + (*ppMember)->Data.Offset;
- *pIndex = i;
- return TRUE;
- }
- }
-
- DPF(0, "%s: Variable with semantic [%s] not found", pFuncName, Semantic);
- return FALSE;
-}
-
-D3DX11INLINE BOOL AreBoundsValid(UINT Offset, UINT Count, CONST void *pData, CONST SType *pType, UINT TotalUnpackedSize)
-{
- if (Count == 0) return TRUE;
- UINT singleElementSize = pType->GetTotalUnpackedSize(TRUE);
- D3DXASSERT(singleElementSize <= pType->Stride);
-
- return ((Offset + Count >= Offset) &&
- ((Offset + Count) < ((UINT)-1) / pType->Stride) &&
- (Count * pType->Stride + (BYTE*)pData >= (BYTE*)pData) &&
- ((Offset + Count - 1) * pType->Stride + singleElementSize <= TotalUnpackedSize));
-}
-
-// Note that the branches in this code is based on template parameters and will be compiled out
-template<ETemplateVarType SourceType, ETemplateVarType DestType, typename SRC_TYPE, BOOL ValidatePtr>
-__forceinline HRESULT CopyScalarValue(SRC_TYPE SrcValue, void *pDest, const char *pFuncName)
-{
- HRESULT hr = S_OK;
-#ifdef _DEBUG
- if (ValidatePtr)
- VERIFYPARAMETER(pDest);
-#endif
-
- switch (SourceType)
- {
- case ETVT_Bool:
- switch (DestType)
- {
- case ETVT_Bool:
- *(int*)pDest = (SrcValue != 0) ? -1 : 0;
- break;
-
- case ETVT_Int:
- *(int*)pDest = SrcValue ? 1 : 0;
- break;
-
- case ETVT_Float:
- *(float*)pDest = SrcValue ? 1.0f : 0.0f;
- break;
-
- default:
- D3DXASSERT(0);
- }
- break;
-
-
- case ETVT_Int:
- switch (DestType)
- {
- case ETVT_Bool:
- *(int*)pDest = (SrcValue != 0) ? -1 : 0;
- break;
-
- case ETVT_Int:
- *(int*)pDest = (int) SrcValue;
- break;
-
- case ETVT_Float:
- *(float*)pDest = (float)(SrcValue);
- break;
-
- default:
- D3DXASSERT(0);
- }
- break;
-
- case ETVT_Float:
- switch (DestType)
- {
- case ETVT_Bool:
- *(int*)pDest = (SrcValue != 0.0f) ? -1 : 0;
- break;
-
- case ETVT_Int:
- *(int*)pDest = (int) (SrcValue);
- break;
-
- case ETVT_Float:
- *(float*)pDest = (float) SrcValue;
- break;
-
- default:
- D3DXASSERT(0);
- }
- break;
-
- default:
- D3DXASSERT(0);
- }
-
-lExit:
- return S_OK;
-}
-
-template<ETemplateVarType SourceType, ETemplateVarType DestType, typename SRC_TYPE, typename DEST_TYPE>
-D3DX11INLINE HRESULT SetScalarArray(CONST SRC_TYPE *pSrcValues, DEST_TYPE *pDestValues, UINT Offset, UINT Count,
- SType *pType, UINT TotalUnpackedSize, const char *pFuncName)
-{
- HRESULT hr = S_OK;
-
-#ifdef _DEBUG
- VERIFYPARAMETER(pSrcValues);
-
- if (!AreBoundsValid(Offset, Count, pSrcValues, pType, TotalUnpackedSize))
- {
- DPF(0, "%s: Invalid range specified", pFuncName);
- VH(E_INVALIDARG);
- }
-#endif
-
- UINT i, j, delta = pType->NumericType.IsPackedArray ? 1 : SType::c_ScalarsPerRegister;
- pDestValues += Offset * delta;
- for (i = 0, j = 0; j < Count; i += delta, ++ j)
- {
- // pDestValues[i] = (DEST_TYPE)pSrcValues[j];
- CopyScalarValue<SourceType, DestType, SRC_TYPE, FALSE>(pSrcValues[j], &pDestValues[i], "SetScalarArray");
- }
-
-lExit:
- return hr;
-}
-
-template<ETemplateVarType SourceType, ETemplateVarType DestType, typename SRC_TYPE, typename DEST_TYPE>
-D3DX11INLINE HRESULT GetScalarArray(SRC_TYPE *pSrcValues, DEST_TYPE *pDestValues, UINT Offset, UINT Count,
- SType *pType, UINT TotalUnpackedSize, const char *pFuncName)
-{
- HRESULT hr = S_OK;
-
-#ifdef _DEBUG
- VERIFYPARAMETER(pDestValues);
-
- if (!AreBoundsValid(Offset, Count, pDestValues, pType, TotalUnpackedSize))
- {
- DPF(0, "%s: Invalid range specified", pFuncName);
- VH(E_INVALIDARG);
- }
-#endif
-
- UINT i, j, delta = pType->NumericType.IsPackedArray ? 1 : SType::c_ScalarsPerRegister;
- pSrcValues += Offset * delta;
- for (i = 0, j = 0; j < Count; i += delta, ++ j)
- {
- // pDestValues[j] = (DEST_TYPE)pSrcValues[i];
- CopyScalarValue<SourceType, DestType, SRC_TYPE, FALSE>(pSrcValues[i], &pDestValues[j], "GetScalarArray");
- }
-
-lExit:
- return hr;
-}
-
-
-//////////////////////////////////////////////////////////////////////////
-// TVariable - implements type casting and member/element retrieval
-//////////////////////////////////////////////////////////////////////////
-
-// requires that IBaseInterface contain SVariable's fields and support ID3DX11EffectVariable
-template<typename IBaseInterface>
-struct TVariable : public IBaseInterface
-{
- STDMETHOD_(BOOL, IsValid)() { return TRUE; }
-
- STDMETHOD_(ID3DX11EffectVariable*, GetMemberByIndex)(UINT Index)
- {
- SVariable *pMember;
- UDataPointer dataPtr;
- TTopLevelVariable<ID3DX11EffectVariable> *pTopLevelEntity = GetTopLevelEntity();
-
- if (((ID3DX11Effect*)pTopLevelEntity->pEffect)->IsOptimized())
- {
- DPF(0, "ID3DX11EffectVariable::GetMemberByIndex: Cannot get members; effect has been Optimize()'ed");
- return &g_InvalidScalarVariable;
- }
-
- if (pType->VarType != EVT_Struct)
- {
- DPF(0, "ID3DX11EffectVariable::GetMemberByIndex: Variable is not a structure");
- return &g_InvalidScalarVariable;
- }
-
- if (!GetVariableByIndexHelper<SVariable>(Index, pType->StructType.Members, pType->StructType.pMembers,
- Data.pNumeric, &pMember, &dataPtr.pGeneric))
- {
- return &g_InvalidScalarVariable;
- }
-
- return pTopLevelEntity->pEffect->CreatePooledVariableMemberInterface(pTopLevelEntity, pMember, dataPtr, FALSE, Index);
- }
-
- STDMETHOD_(ID3DX11EffectVariable*, GetMemberByName)(LPCSTR Name)
- {
- SVariable *pMember;
- UDataPointer dataPtr;
- UINT index;
- TTopLevelVariable<ID3DX11EffectVariable> *pTopLevelEntity = GetTopLevelEntity();
-
- if (pTopLevelEntity->pEffect->IsOptimized())
- {
- DPF(0, "ID3DX11EffectVariable::GetMemberByName: Cannot get members; effect has been Optimize()'ed");
- return &g_InvalidScalarVariable;
- }
-
- if (pType->VarType != EVT_Struct)
- {
- DPF(0, "ID3DX11EffectVariable::GetMemberByName: Variable is not a structure");
- return &g_InvalidScalarVariable;
- }
-
- if (!GetVariableByNameHelper<SVariable>(Name, pType->StructType.Members, pType->StructType.pMembers,
- Data.pNumeric, &pMember, &dataPtr.pGeneric, &index))
- {
- return &g_InvalidScalarVariable;
-
- }
-
- return pTopLevelEntity->pEffect->CreatePooledVariableMemberInterface(pTopLevelEntity, pMember, dataPtr, FALSE, index);
- }
-
- STDMETHOD_(ID3DX11EffectVariable*, GetMemberBySemantic)(LPCSTR Semantic)
- {
- SVariable *pMember;
- UDataPointer dataPtr;
- UINT index;
- TTopLevelVariable<ID3DX11EffectVariable> *pTopLevelEntity = GetTopLevelEntity();
-
- if (pTopLevelEntity->pEffect->IsOptimized())
- {
- DPF(0, "ID3DX11EffectVariable::GetMemberBySemantic: Cannot get members; effect has been Optimize()'ed");
- return &g_InvalidScalarVariable;
- }
-
- if (pType->VarType != EVT_Struct)
- {
- DPF(0, "ID3DX11EffectVariable::GetMemberBySemantic: Variable is not a structure");
- return &g_InvalidScalarVariable;
- }
-
- if (!GetVariableBySemanticHelper<SVariable>(Semantic, pType->StructType.Members, pType->StructType.pMembers,
- Data.pNumeric, &pMember, &dataPtr.pGeneric, &index))
- {
- return &g_InvalidScalarVariable;
-
- }
-
- return pTopLevelEntity->pEffect->CreatePooledVariableMemberInterface(pTopLevelEntity, pMember, dataPtr, FALSE, index);
- }
-
- STDMETHOD_(ID3DX11EffectVariable*, GetElement)(UINT Index)
- {
- LPCSTR pFuncName = "ID3DX11EffectVariable::GetElement";
- TTopLevelVariable<ID3DX11EffectVariable> *pTopLevelEntity = GetTopLevelEntity();
- UDataPointer dataPtr;
-
- if (pTopLevelEntity->pEffect->IsOptimized())
- {
- DPF(0, "ID3DX11EffectVariable::GetElement: Cannot get element; effect has been Optimize()'ed");
- return &g_InvalidScalarVariable;
- }
-
- if (!IsArray())
- {
- DPF(0, "%s: This interface does not refer to an array", pFuncName);
- return &g_InvalidScalarVariable;
- }
-
- if (Index >= pType->Elements)
- {
- DPF(0, "%s: Invalid element index (%d, total: %d)", pFuncName, Index, pType->Elements);
- return &g_InvalidScalarVariable;
- }
-
- if (pType->BelongsInConstantBuffer())
- {
- dataPtr.pGeneric = Data.pNumeric + pType->Stride * Index;
- }
- else
- {
- dataPtr.pGeneric = GetBlockByIndex(pType->VarType, pType->ObjectType, Data.pGeneric, Index);
- if (NULL == dataPtr.pGeneric)
- {
- DPF(0, "%s: Internal error", pFuncName);
- return &g_InvalidScalarVariable;
- }
- }
-
- return pTopLevelEntity->pEffect->CreatePooledVariableMemberInterface(pTopLevelEntity, (SVariable *) this, dataPtr, TRUE, Index);
- }
-
- STDMETHOD_(ID3DX11EffectScalarVariable*, AsScalar)()
- {
- LPCSTR pFuncName = "ID3DX11EffectVariable::AsScalar";
-
- if (pType->VarType != EVT_Numeric ||
- pType->NumericType.NumericLayout != ENL_Scalar)
- {
- DPF(0, "%s: Invalid typecast", pFuncName);
- return &g_InvalidScalarVariable;
- }
-
- return (ID3DX11EffectScalarVariable *) this;
- }
-
- STDMETHOD_(ID3DX11EffectVectorVariable*, AsVector)()
- {
- LPCSTR pFuncName = "ID3DX11EffectVariable::AsVector";
-
- if (pType->VarType != EVT_Numeric ||
- pType->NumericType.NumericLayout != ENL_Vector)
- {
- DPF(0, "%s: Invalid typecast", pFuncName);
- return &g_InvalidVectorVariable;
- }
-
- return (ID3DX11EffectVectorVariable *) this;
- }
-
- STDMETHOD_(ID3DX11EffectMatrixVariable*, AsMatrix)()
- {
- LPCSTR pFuncName = "ID3DX11EffectVariable::AsMatrix";
-
- if (pType->VarType != EVT_Numeric ||
- pType->NumericType.NumericLayout != ENL_Matrix)
- {
- DPF(0, "%s: Invalid typecast", pFuncName);
- return &g_InvalidMatrixVariable;
- }
-
- return (ID3DX11EffectMatrixVariable *) this;
- }
-
- STDMETHOD_(ID3DX11EffectStringVariable*, AsString)()
- {
- LPCSTR pFuncName = "ID3DX11EffectVariable::AsString";
-
- if (!pType->IsObjectType(EOT_String))
- {
- DPF(0, "%s: Invalid typecast", pFuncName);
- return &g_InvalidStringVariable;
- }
-
- return (ID3DX11EffectStringVariable *) this;
- }
-
- STDMETHOD_(ID3DX11EffectClassInstanceVariable*, AsClassInstance)()
- {
- LPCSTR pFuncName = "ID3DX11EffectVariable::AsClassInstance";
-
- if (!pType->IsClassInstance() )
- {
- DPF(0, "%s: Invalid typecast", pFuncName);
- return &g_InvalidClassInstanceVariable;
- }
- else if( pMemberData == NULL )
- {
- DPF(0, "%s: Non-global class instance variables (members of structs or classes) and class instances "
- "inside tbuffers are not supported.", pFuncName );
- return &g_InvalidClassInstanceVariable;
- }
-
- return (ID3DX11EffectClassInstanceVariable *) this;
- }
-
- STDMETHOD_(ID3DX11EffectInterfaceVariable*, AsInterface)()
- {
- LPCSTR pFuncName = "ID3DX11EffectVariable::AsInterface";
-
- if (!pType->IsInterface())
- {
- DPF(0, "%s: Invalid typecast", pFuncName);
- return &g_InvalidInterfaceVariable;
- }
-
- return (ID3DX11EffectInterfaceVariable *) this;
- }
-
- STDMETHOD_(ID3DX11EffectShaderResourceVariable*, AsShaderResource)()
- {
- LPCSTR pFuncName = "ID3DX11EffectVariable::AsShaderResource";
-
- if (!pType->IsShaderResource())
- {
- DPF(0, "%s: Invalid typecast", pFuncName);
- return &g_InvalidShaderResourceVariable;
- }
-
- return (ID3DX11EffectShaderResourceVariable *) this;
- }
-
- STDMETHOD_(ID3DX11EffectUnorderedAccessViewVariable*, AsUnorderedAccessView)()
- {
- LPCSTR pFuncName = "ID3DX11EffectVariable::AsUnorderedAccessView";
-
- if (!pType->IsUnorderedAccessView())
- {
- DPF(0, "%s: Invalid typecast", pFuncName);
- return &g_InvalidUnorderedAccessViewVariable;
- }
-
- return (ID3DX11EffectUnorderedAccessViewVariable *) this;
- }
-
- STDMETHOD_(ID3DX11EffectRenderTargetViewVariable*, AsRenderTargetView)()
- {
- LPCSTR pFuncName = "ID3DX11EffectVariable::AsRenderTargetView";
-
- if (!pType->IsRenderTargetView())
- {
- DPF(0, "%s: Invalid typecast", pFuncName);
- return &g_InvalidRenderTargetViewVariable;
- }
-
- return (ID3DX11EffectRenderTargetViewVariable *) this;
- }
-
- STDMETHOD_(ID3DX11EffectDepthStencilViewVariable*, AsDepthStencilView)()
- {
- LPCSTR pFuncName = "ID3DX11EffectVariable::AsDepthStencilView";
-
- if (!pType->IsDepthStencilView())
- {
- DPF(0, "%s: Invalid typecast", pFuncName);
- return &g_InvalidDepthStencilViewVariable;
- }
-
- return (ID3DX11EffectDepthStencilViewVariable *) this;
- }
-
- STDMETHOD_(ID3DX11EffectConstantBuffer*, AsConstantBuffer)()
- {
- LPCSTR pFuncName = "ID3DX11EffectVariable::AsConstantBuffer";
- DPF(0, "%s: Invalid typecast", pFuncName);
- return &g_InvalidConstantBuffer;
- }
-
- STDMETHOD_(ID3DX11EffectShaderVariable*, AsShader)()
- {
- LPCSTR pFuncName = "ID3DX11EffectVariable::AsShader";
-
- if (!pType->IsShader())
- {
- DPF(0, "%s: Invalid typecast", pFuncName);
- return &g_InvalidShaderVariable;
- }
-
- return (ID3DX11EffectShaderVariable *) this;
- }
-
- STDMETHOD_(ID3DX11EffectBlendVariable*, AsBlend)()
- {
- LPCSTR pFuncName = "ID3DX11EffectVariable::AsBlend";
-
- if (!pType->IsObjectType(EOT_Blend))
- {
- DPF(0, "%s: Invalid typecast", pFuncName);
- return &g_InvalidBlendVariable;
- }
-
- return (ID3DX11EffectBlendVariable *) this;
- }
-
- STDMETHOD_(ID3DX11EffectDepthStencilVariable*, AsDepthStencil)()
- {
- LPCSTR pFuncName = "ID3DX11EffectVariable::AsDepthStencil";
-
- if (!pType->IsObjectType(EOT_DepthStencil))
- {
- DPF(0, "%s: Invalid typecast", pFuncName);
- return &g_InvalidDepthStencilVariable;
- }
-
- return (ID3DX11EffectDepthStencilVariable *) this;
- }
-
- STDMETHOD_(ID3DX11EffectRasterizerVariable*, AsRasterizer)()
- {
- LPCSTR pFuncName = "ID3DX11EffectVariable::AsRasterizer";
-
- if (!pType->IsObjectType(EOT_Rasterizer))
- {
- DPF(0, "%s: Invalid typecast", pFuncName);
- return &g_InvalidRasterizerVariable;
- }
-
- return (ID3DX11EffectRasterizerVariable *) this;
- }
-
- STDMETHOD_(ID3DX11EffectSamplerVariable*, AsSampler)()
- {
- LPCSTR pFuncName = "ID3DX11EffectVariable::AsSampler";
-
- if (!pType->IsSampler())
- {
- DPF(0, "%s: Invalid typecast", pFuncName);
- return &g_InvalidSamplerVariable;
- }
-
- return (ID3DX11EffectSamplerVariable *) this;
- }
-
- // Numeric variables should override this
- STDMETHOD(SetRawValue)(CONST void *pData, UINT Offset, UINT Count) { return ObjectSetRawValue(); }
- STDMETHOD(GetRawValue)(void *pData, UINT Offset, UINT Count) { return ObjectGetRawValue(); }
-};
-
-//////////////////////////////////////////////////////////////////////////
-// TTopLevelVariable - functionality for annotations and global variables
-//////////////////////////////////////////////////////////////////////////
-
-template<typename IBaseInterface>
-struct TTopLevelVariable : public SVariable, public IBaseInterface
-{
- // Required to create member/element variable interfaces
- CEffect *pEffect;
-
- CEffect* GetEffect()
- {
- return pEffect;
- }
-
- TTopLevelVariable()
- {
- pEffect = NULL;
- }
-
- UINT GetTotalUnpackedSize()
- {
- return ((SType*)pType)->GetTotalUnpackedSize(FALSE);
- }
-
- STDMETHOD_(ID3DX11EffectType*, GetType)()
- {
- return (ID3DX11EffectType*)(SType*)pType;
- }
-
- TTopLevelVariable<ID3DX11EffectVariable> * GetTopLevelEntity()
- {
- return (TTopLevelVariable<ID3DX11EffectVariable> *)this;
- }
-
- BOOL IsArray()
- {
- return (pType->Elements > 0);
- }
-
-};
-
-//////////////////////////////////////////////////////////////////////////
-// TMember - functionality for structure/array members of other variables
-//////////////////////////////////////////////////////////////////////////
-
-template<typename IBaseInterface>
-struct TMember : public SVariable, public IBaseInterface
-{
- // Indicates that this is a single element of a containing array
- UINT IsSingleElement : 1;
-
- // Required to create member/element variable interfaces
- TTopLevelVariable<ID3DX11EffectVariable> *pTopLevelEntity;
-
- TMember()
- {
- IsSingleElement = FALSE;
- pTopLevelEntity = NULL;
- }
-
- CEffect* GetEffect()
- {
- return pTopLevelEntity->pEffect;
- }
-
- UINT GetTotalUnpackedSize()
- {
- return pType->GetTotalUnpackedSize(IsSingleElement);
- }
-
- STDMETHOD_(ID3DX11EffectType*, GetType)()
- {
- if (IsSingleElement)
- {
- return pTopLevelEntity->pEffect->CreatePooledSingleElementTypeInterface( pType );
- }
- else
- {
- return (ID3DX11EffectType*) pType;
- }
- }
-
- STDMETHOD(GetDesc)(D3DX11_EFFECT_VARIABLE_DESC *pDesc)
- {
- HRESULT hr = S_OK;
- LPCSTR pFuncName = "ID3DX11EffectVariable::GetDesc";
-
- VERIFYPARAMETER(pDesc != NULL);
-
- pDesc->Name = pName;
- pDesc->Semantic = pSemantic;
- pDesc->Flags = 0;
-
- if (pTopLevelEntity->pEffect->IsReflectionData(pTopLevelEntity))
- {
- // Is part of an annotation
- D3DXASSERT(pTopLevelEntity->pEffect->IsReflectionData(Data.pGeneric));
- pDesc->Annotations = 0;
- pDesc->BufferOffset = 0;
- pDesc->Flags |= D3DX11_EFFECT_VARIABLE_ANNOTATION;
- }
- else
- {
- // Is part of a global variable
- D3DXASSERT(pTopLevelEntity->pEffect->IsRuntimeData(pTopLevelEntity));
- if (!pTopLevelEntity->pType->IsObjectType(EOT_String))
- {
- // strings are funny; their data is reflection data, so ignore those
- D3DXASSERT(pTopLevelEntity->pEffect->IsRuntimeData(Data.pGeneric));
- }
-
- pDesc->Annotations = ((TGlobalVariable<ID3DX11Effect>*)pTopLevelEntity)->AnnotationCount;
-
- SConstantBuffer *pCB = ((TGlobalVariable<ID3DX11Effect>*)pTopLevelEntity)->pCB;
-
- if (pType->BelongsInConstantBuffer())
- {
- D3DXASSERT(pCB != NULL);
- UINT_PTR offset = Data.pNumeric - pCB->pBackingStore;
- D3DXASSERT(offset == (UINT)offset);
- pDesc->BufferOffset = (UINT)offset;
- D3DXASSERT(pDesc->BufferOffset >= 0 && pDesc->BufferOffset + GetTotalUnpackedSize() <= pCB->Size);
- }
- else
- {
- D3DXASSERT(pCB == NULL);
- pDesc->BufferOffset = 0;
- }
- }
-
-lExit:
- return hr;
- }
-
- TTopLevelVariable<ID3DX11EffectVariable> * GetTopLevelEntity()
- {
- return pTopLevelEntity;
- }
-
- BOOL IsArray()
- {
- return (pType->Elements > 0 && !IsSingleElement);
- }
-
- STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByIndex)(UINT Index)
- { return pTopLevelEntity->GetAnnotationByIndex(Index); }
- STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByName)(LPCSTR Name)
- { return pTopLevelEntity->GetAnnotationByName(Name); }
-
- STDMETHOD_(ID3DX11EffectConstantBuffer*, GetParentConstantBuffer)()
- { return pTopLevelEntity->GetParentConstantBuffer(); }
-
- // Annotations should never be able to go down this codepath
- void DirtyVariable()
- {
- // make sure to call the global variable's version of dirty variable
- ((TGlobalVariable<ID3DX11EffectVariable>*)pTopLevelEntity)->DirtyVariable();
- }
-};
-
-//////////////////////////////////////////////////////////////////////////
-// TAnnotation - functionality for top level annotations
-//////////////////////////////////////////////////////////////////////////
-
-template<typename IBaseInterface>
-struct TAnnotation : public TVariable<TTopLevelVariable<IBaseInterface> >
-{
- STDMETHOD(GetDesc)(D3DX11_EFFECT_VARIABLE_DESC *pDesc)
- {
- HRESULT hr = S_OK;
- LPCSTR pFuncName = "ID3DX11EffectVariable::GetDesc";
-
- VERIFYPARAMETER(pDesc != NULL);
-
- pDesc->Name = pName;
- pDesc->Semantic = pSemantic;
- pDesc->Flags = D3DX11_EFFECT_VARIABLE_ANNOTATION;
- pDesc->Annotations = 0;
- pDesc->BufferOffset = 0;
- pDesc->ExplicitBindPoint = 0;
-
-lExit:
- return hr;
-
- }
-
- STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByIndex)(UINT Index)
- {
- LPCSTR pFuncName = "ID3DX11EffectVariable::GetAnnotationByIndex";
- DPF(0, "%s: Only variables may have annotations", pFuncName);
- return &g_InvalidScalarVariable;
- }
-
- STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByName)(LPCSTR Name)
- {
- LPCSTR pFuncName = "ID3DX11EffectVariable::GetAnnotationByName";
- DPF(0, "%s: Only variables may have annotations", pFuncName);
- return &g_InvalidScalarVariable;
- }
-
- STDMETHOD_(ID3DX11EffectConstantBuffer*, GetParentConstantBuffer)()
- { return NoParentCB(); }
-
- void DirtyVariable()
- {
- D3DXASSERT(0);
- }
-};
-
-//////////////////////////////////////////////////////////////////////////
-// TGlobalVariable - functionality for top level global variables
-//////////////////////////////////////////////////////////////////////////
-
-template<typename IBaseInterface>
-struct TGlobalVariable : public TVariable<TTopLevelVariable<IBaseInterface> >
-{
- Timer LastModifiedTime;
-
- // if numeric, pointer to the constant buffer where this variable lives
- SConstantBuffer *pCB;
-
- UINT AnnotationCount;
- SAnnotation *pAnnotations;
-
- TGlobalVariable()
- {
- LastModifiedTime = 0;
- pCB = NULL;
- AnnotationCount = 0;
- pAnnotations = NULL;
- }
-
- STDMETHOD(GetDesc)(D3DX11_EFFECT_VARIABLE_DESC *pDesc)
- {
- HRESULT hr = S_OK;
- LPCSTR pFuncName = "ID3DX11EffectVariable::GetDesc";
-
- VERIFYPARAMETER(pDesc != NULL);
-
- pDesc->Name = pName;
- pDesc->Semantic = pSemantic;
- pDesc->Flags = 0;
- pDesc->Annotations = AnnotationCount;
-
- if (pType->BelongsInConstantBuffer())
- {
- D3DXASSERT(pCB != NULL);
- UINT_PTR offset = Data.pNumeric - pCB->pBackingStore;
- D3DXASSERT(offset == (UINT)offset);
- pDesc->BufferOffset = (UINT)offset;
- D3DXASSERT(pDesc->BufferOffset >= 0 && pDesc->BufferOffset + GetTotalUnpackedSize() <= pCB->Size );
- }
- else
- {
- D3DXASSERT(pCB == NULL);
- pDesc->BufferOffset = 0;
- }
-
- if (ExplicitBindPoint != -1)
- {
- pDesc->ExplicitBindPoint = ExplicitBindPoint;
- pDesc->Flags |= D3DX11_EFFECT_VARIABLE_EXPLICIT_BIND_POINT;
- }
- else
- {
- pDesc->ExplicitBindPoint = 0;
- }
-
-lExit:
- return hr;
- }
-
- // these are all well defined for global vars
- STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByIndex)(UINT Index)
- {
- return GetAnnotationByIndexHelper("ID3DX11EffectVariable", Index, AnnotationCount, pAnnotations);
- }
-
- STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByName)(LPCSTR Name)
- {
- return GetAnnotationByNameHelper("ID3DX11EffectVariable", Name, AnnotationCount, pAnnotations);
- }
-
- STDMETHOD_(ID3DX11EffectConstantBuffer*, GetParentConstantBuffer)()
- {
- if (NULL != pCB)
- {
- D3DXASSERT(pType->BelongsInConstantBuffer());
- return (ID3DX11EffectConstantBuffer*)pCB;
- }
- else
- {
- D3DXASSERT(!pType->BelongsInConstantBuffer());
- return &g_InvalidConstantBuffer;
- }
- }
-
- D3DX11INLINE void DirtyVariable()
- {
- D3DXASSERT(NULL != pCB);
- pCB->IsDirty = TRUE;
- LastModifiedTime = pEffect->GetCurrentTime();
- }
-
-};
-
-//////////////////////////////////////////////////////////////////////////
-// TNumericVariable - implements raw set/get functionality
-//////////////////////////////////////////////////////////////////////////
-
-// IMPORTANT NOTE: All of these numeric & object aspect classes MUST NOT
-// add data members to the base variable classes. Otherwise type sizes
-// will disagree between object & numeric variables and we cannot eaily
-// create arrays of global variables using SGlobalVariable
-
-// Requires that IBaseInterface have SVariable's members, GetTotalUnpackedSize() and DirtyVariable()
-template<typename IBaseInterface, BOOL IsAnnotation>
-struct TNumericVariable : public IBaseInterface
-{
- STDMETHOD(SetRawValue)(CONST void *pData, UINT ByteOffset, UINT ByteCount)
- {
- if (IsAnnotation)
- {
- return AnnotationInvalidSetCall("ID3DX11EffectVariable::SetRawValue");
- }
- else
- {
- HRESULT hr = S_OK;
-
-#ifdef _DEBUG
- LPCSTR pFuncName = "ID3DX11EffectVariable::SetRawValue";
-
- VERIFYPARAMETER(pData);
-
- if ((ByteOffset + ByteCount < ByteOffset) ||
- (ByteCount + (BYTE*)pData < (BYTE*)pData) ||
- ((ByteOffset + ByteCount) > GetTotalUnpackedSize()))
- {
- // overflow of some kind
- DPF(0, "%s: Invalid range specified", pFuncName);
- VH(E_INVALIDARG);
- }
-#endif
-
- DirtyVariable();
- memcpy(Data.pNumeric + ByteOffset, pData, ByteCount);
-
-lExit:
- return hr;
- }
- }
-
- STDMETHOD(GetRawValue)(__out_bcount(ByteCount) void *pData, UINT ByteOffset, UINT ByteCount)
- {
- HRESULT hr = S_OK;
-
-#ifdef _DEBUG
- LPCSTR pFuncName = "ID3DX11EffectVariable::GetRawValue";
-
- VERIFYPARAMETER(pData);
-
- if ((ByteOffset + ByteCount < ByteOffset) ||
- (ByteCount + (BYTE*)pData < (BYTE*)pData) ||
- ((ByteOffset + ByteCount) > GetTotalUnpackedSize()))
- {
- // overflow of some kind
- DPF(0, "%s: Invalid range specified", pFuncName);
- VH(E_INVALIDARG);
- }
-#endif
-
- memcpy(pData, Data.pNumeric + ByteOffset, ByteCount);
-
-lExit:
- return hr;
- }
-};
-
-//////////////////////////////////////////////////////////////////////////
-// ID3DX11EffectScalarVariable (TFloatScalarVariable implementation)
-//////////////////////////////////////////////////////////////////////////
-
-template<typename IBaseInterface, BOOL IsAnnotation>
-struct TFloatScalarVariable : public TNumericVariable<IBaseInterface, IsAnnotation>
-{
- STDMETHOD(SetFloat)(CONST float Value);
- STDMETHOD(GetFloat)(float *pValue);
-
- STDMETHOD(SetFloatArray)(CONST float *pData, UINT Offset, UINT Count);
- STDMETHOD(GetFloatArray)(float *pData, UINT Offset, UINT Count);
-
- STDMETHOD(SetInt)(CONST int Value);
- STDMETHOD(GetInt)(int *pValue);
-
- STDMETHOD(SetIntArray)(CONST int *pData, UINT Offset, UINT Count);
- STDMETHOD(GetIntArray)(int *pData, UINT Offset, UINT Count);
-
- STDMETHOD(SetBool)(CONST BOOL Value);
- STDMETHOD(GetBool)(BOOL *pValue);
-
- STDMETHOD(SetBoolArray)(CONST BOOL *pData, UINT Offset, UINT Count);
- STDMETHOD(GetBoolArray)(BOOL *pData, UINT Offset, UINT Count);
-};
-
-template<typename IBaseInterface, BOOL IsAnnotation>
-HRESULT TFloatScalarVariable<IBaseInterface, IsAnnotation>::SetFloat(float Value)
-{
- LPCSTR pFuncName = "ID3DX11EffectScalarVariable::SetFloat";
- if (IsAnnotation) return AnnotationInvalidSetCall(pFuncName);
- DirtyVariable();
- return CopyScalarValue<ETVT_Float, ETVT_Float, float, FALSE>(Value, Data.pNumericFloat, pFuncName);
-}
-
-template<typename IBaseInterface, BOOL IsAnnotation>
-HRESULT TFloatScalarVariable<IBaseInterface, IsAnnotation>::GetFloat(float *pValue)
-{
- return CopyScalarValue<ETVT_Float, ETVT_Float, float, TRUE>(*Data.pNumericFloat, pValue, "ID3DX11EffectScalarVariable::GetFloat");
-}
-
-template<typename IBaseInterface, BOOL IsAnnotation>
-HRESULT TFloatScalarVariable<IBaseInterface, IsAnnotation>::SetFloatArray(CONST float *pData, UINT Offset, UINT Count)
-{
- LPCSTR pFuncName = "ID3DX11EffectScalarVariable::SetFloatArray";
- if (IsAnnotation) return AnnotationInvalidSetCall(pFuncName);
- DirtyVariable();
- return SetScalarArray<ETVT_Float, ETVT_Float, float, float>(pData, Data.pNumericFloat, Offset, Count,
- pType, GetTotalUnpackedSize(), pFuncName);
-}
-
-template<typename IBaseInterface, BOOL IsAnnotation>
-HRESULT TFloatScalarVariable<IBaseInterface, IsAnnotation>::GetFloatArray(float *pData, UINT Offset, UINT Count)
-{
- return GetScalarArray<ETVT_Float, ETVT_Float, float, float>(Data.pNumericFloat, pData, Offset, Count,
- pType, GetTotalUnpackedSize(), "ID3DX11EffectScalarVariable::GetFloatArray");
-}
-
-template<typename IBaseInterface, BOOL IsAnnotation>
-HRESULT TFloatScalarVariable<IBaseInterface, IsAnnotation>::SetInt(CONST int Value)
-{
- LPCSTR pFuncName = "ID3DX11EffectScalarVariable::SetInt";
- if (IsAnnotation) return AnnotationInvalidSetCall(pFuncName);
- DirtyVariable();
- return CopyScalarValue<ETVT_Int, ETVT_Float, int, FALSE>(Value, Data.pNumericFloat, pFuncName);
-}
-
-template<typename IBaseInterface, BOOL IsAnnotation>
-HRESULT TFloatScalarVariable<IBaseInterface, IsAnnotation>::GetInt(int *pValue)
-{
- return CopyScalarValue<ETVT_Float, ETVT_Int, float, TRUE>(*Data.pNumericFloat, pValue, "ID3DX11EffectScalarVariable::GetInt");
-}
-
-template<typename IBaseInterface, BOOL IsAnnotation>
-HRESULT TFloatScalarVariable<IBaseInterface, IsAnnotation>::SetIntArray(CONST int *pData, UINT Offset, UINT Count)
-{
- LPCSTR pFuncName = "ID3DX11EffectScalarVariable::SetIntArray";
- if (IsAnnotation) return AnnotationInvalidSetCall(pFuncName);
- DirtyVariable();
- return SetScalarArray<ETVT_Int, ETVT_Float, int, float>(pData, Data.pNumericFloat, Offset, Count,
- pType, GetTotalUnpackedSize(), pFuncName);
-}
-
-template<typename IBaseInterface, BOOL IsAnnotation>
-HRESULT TFloatScalarVariable<IBaseInterface, IsAnnotation>::GetIntArray(int *pData, UINT Offset, UINT Count)
-{
- return GetScalarArray<ETVT_Float, ETVT_Int, float, int>(Data.pNumericFloat, pData, Offset, Count,
- pType, GetTotalUnpackedSize(), "ID3DX11EffectScalarVariable::GetIntArray");
-}
-
-template<typename IBaseInterface, BOOL IsAnnotation>
-HRESULT TFloatScalarVariable<IBaseInterface, IsAnnotation>::SetBool(CONST BOOL Value)
-{
- LPCSTR pFuncName = "ID3DX11EffectScalarVariable::SetBool";
- if (IsAnnotation) return AnnotationInvalidSetCall(pFuncName);
- DirtyVariable();
- return CopyScalarValue<ETVT_Bool, ETVT_Float, BOOL, FALSE>(Value, Data.pNumericFloat, pFuncName);
-}
-
-template<typename IBaseInterface, BOOL IsAnnotation>
-HRESULT TFloatScalarVariable<IBaseInterface, IsAnnotation>::GetBool(BOOL *pValue)
-{
- return CopyScalarValue<ETVT_Float, ETVT_Bool, float, TRUE>(*Data.pNumericFloat, pValue, "ID3DX11EffectScalarVariable::GetBool");
-}
-
-template<typename IBaseInterface, BOOL IsAnnotation>
-HRESULT TFloatScalarVariable<IBaseInterface, IsAnnotation>::SetBoolArray(CONST BOOL *pData, UINT Offset, UINT Count)
-{
- LPCSTR pFuncName = "ID3DX11EffectScalarVariable::SetBoolArray";
- if (IsAnnotation) return AnnotationInvalidSetCall(pFuncName);
- DirtyVariable();
- return SetScalarArray<ETVT_Bool, ETVT_Float, BOOL, float>(pData, Data.pNumericFloat, Offset, Count,
- pType, GetTotalUnpackedSize(), pFuncName);
-}
-
-template<typename IBaseInterface, BOOL IsAnnotation>
-HRESULT TFloatScalarVariable<IBaseInterface, IsAnnotation>::GetBoolArray(BOOL *pData, UINT Offset, UINT Count)
-{
- return GetScalarArray<ETVT_Float, ETVT_Bool, float, BOOL>(Data.pNumericFloat, pData, Offset, Count,
- pType, GetTotalUnpackedSize(), "ID3DX11EffectScalarVariable::GetBoolArray");
-}
-
-//////////////////////////////////////////////////////////////////////////
-// ID3DX11EffectScalarVariable (TIntScalarVariable implementation)
-//////////////////////////////////////////////////////////////////////////
-
-template<typename IBaseInterface, BOOL IsAnnotation>
-struct TIntScalarVariable : public TNumericVariable<IBaseInterface, IsAnnotation>
-{
- STDMETHOD(SetFloat)(CONST float Value);
- STDMETHOD(GetFloat)(float *pValue);
-
- STDMETHOD(SetFloatArray)(CONST float *pData, UINT Offset, UINT Count);
- STDMETHOD(GetFloatArray)(float *pData, UINT Offset, UINT Count);
-
- STDMETHOD(SetInt)(CONST int Value);
- STDMETHOD(GetInt)(int *pValue);
-
- STDMETHOD(SetIntArray)(CONST int *pData, UINT Offset, UINT Count);
- STDMETHOD(GetIntArray)(int *pData, UINT Offset, UINT Count);
-
- STDMETHOD(SetBool)(CONST BOOL Value);
- STDMETHOD(GetBool)(BOOL *pValue);
-
- STDMETHOD(SetBoolArray)(CONST BOOL *pData, UINT Offset, UINT Count);
- STDMETHOD(GetBoolArray)(BOOL *pData, UINT Offset, UINT Count);
-};
-
-template<typename IBaseInterface, BOOL IsAnnotation>
-HRESULT TIntScalarVariable<IBaseInterface, IsAnnotation>::SetFloat(float Value)
-{
- LPCSTR pFuncName = "ID3DX11EffectScalarVariable::SetFloat";
- if (IsAnnotation) return AnnotationInvalidSetCall(pFuncName);
- DirtyVariable();
- return CopyScalarValue<ETVT_Float, ETVT_Int, float, FALSE>(Value, Data.pNumericInt, pFuncName);
-}
-
-template<typename IBaseInterface, BOOL IsAnnotation>
-HRESULT TIntScalarVariable<IBaseInterface, IsAnnotation>::GetFloat(float *pValue)
-{
- return CopyScalarValue<ETVT_Int, ETVT_Float, int, TRUE>(*Data.pNumericInt, pValue, "ID3DX11EffectScalarVariable::GetFloat");
-}
-
-template<typename IBaseInterface, BOOL IsAnnotation>
-HRESULT TIntScalarVariable<IBaseInterface, IsAnnotation>::SetFloatArray(CONST float *pData, UINT Offset, UINT Count)
-{
- LPCSTR pFuncName = "ID3DX11EffectScalarVariable::SetFloatArray";
- if (IsAnnotation) return AnnotationInvalidSetCall(pFuncName);
- DirtyVariable();
- return SetScalarArray<ETVT_Float, ETVT_Int, float, int>(pData, Data.pNumericInt, Offset, Count,
- pType, GetTotalUnpackedSize(), pFuncName);
-}
-
-template<typename IBaseInterface, BOOL IsAnnotation>
-HRESULT TIntScalarVariable<IBaseInterface, IsAnnotation>::GetFloatArray(float *pData, UINT Offset, UINT Count)
-{
- return GetScalarArray<ETVT_Int, ETVT_Float, int, float>(Data.pNumericInt, pData, Offset, Count,
- pType, GetTotalUnpackedSize(), "ID3DX11EffectScalarVariable::GetFloatArray");
-}
-
-template<typename IBaseInterface, BOOL IsAnnotation>
-HRESULT TIntScalarVariable<IBaseInterface, IsAnnotation>::SetInt(CONST int Value)
-{
- LPCSTR pFuncName = "ID3DX11EffectScalarVariable::SetInt";
- if (IsAnnotation) return AnnotationInvalidSetCall(pFuncName);
- DirtyVariable();
- return CopyScalarValue<ETVT_Int, ETVT_Int, int, FALSE>(Value, Data.pNumericInt, pFuncName);
-}
-
-template<typename IBaseInterface, BOOL IsAnnotation>
-HRESULT TIntScalarVariable<IBaseInterface, IsAnnotation>::GetInt(int *pValue)
-{
- return CopyScalarValue<ETVT_Int, ETVT_Int, int, TRUE>(*Data.pNumericInt, pValue, "ID3DX11EffectScalarVariable::GetInt");
-}
-
-template<typename IBaseInterface, BOOL IsAnnotation>
-HRESULT TIntScalarVariable<IBaseInterface, IsAnnotation>::SetIntArray(CONST int *pData, UINT Offset, UINT Count)
-{
- LPCSTR pFuncName = "ID3DX11EffectScalarVariable::SetIntArray";
- if (IsAnnotation) return AnnotationInvalidSetCall(pFuncName);
- DirtyVariable();
- return SetScalarArray<ETVT_Int, ETVT_Int, int, int>(pData, Data.pNumericInt, Offset, Count,
- pType, GetTotalUnpackedSize(), pFuncName);
-}
-
-template<typename IBaseInterface, BOOL IsAnnotation>
-HRESULT TIntScalarVariable<IBaseInterface, IsAnnotation>::GetIntArray(int *pData, UINT Offset, UINT Count)
-{
- return GetScalarArray<ETVT_Int, ETVT_Int, int, int>(Data.pNumericInt, pData, Offset, Count,
- pType, GetTotalUnpackedSize(), "ID3DX11EffectScalarVariable::GetIntArray");
-}
-
-template<typename IBaseInterface, BOOL IsAnnotation>
-HRESULT TIntScalarVariable<IBaseInterface, IsAnnotation>::SetBool(CONST BOOL Value)
-{
- LPCSTR pFuncName = "ID3DX11EffectScalarVariable::SetBool";
- if (IsAnnotation) return AnnotationInvalidSetCall(pFuncName);
- DirtyVariable();
- return CopyScalarValue<ETVT_Bool, ETVT_Int, BOOL, FALSE>(Value, Data.pNumericInt, pFuncName);
-}
-
-template<typename IBaseInterface, BOOL IsAnnotation>
-HRESULT TIntScalarVariable<IBaseInterface, IsAnnotation>::GetBool(BOOL *pValue)
-{
- return CopyScalarValue<ETVT_Int, ETVT_Bool, int, TRUE>(*Data.pNumericInt, pValue, "ID3DX11EffectScalarVariable::GetBool");
-}
-
-template<typename IBaseInterface, BOOL IsAnnotation>
-HRESULT TIntScalarVariable<IBaseInterface, IsAnnotation>::SetBoolArray(CONST BOOL *pData, UINT Offset, UINT Count)
-{
- LPCSTR pFuncName = "ID3DX11EffectScalarVariable::SetBoolArray";
- if (IsAnnotation) return AnnotationInvalidSetCall(pFuncName);
- DirtyVariable();
- return SetScalarArray<ETVT_Bool, ETVT_Int, BOOL, int>(pData, Data.pNumericInt, Offset, Count,
- pType, GetTotalUnpackedSize(), pFuncName);
-}
-
-template<typename IBaseInterface, BOOL IsAnnotation>
-HRESULT TIntScalarVariable<IBaseInterface, IsAnnotation>::GetBoolArray(BOOL *pData, UINT Offset, UINT Count)
-{
- return GetScalarArray<ETVT_Int, ETVT_Bool, int, BOOL>(Data.pNumericInt, pData, Offset, Count,
- pType, GetTotalUnpackedSize(), "ID3DX11EffectScalarVariable::GetBoolArray");
-}
-
-//////////////////////////////////////////////////////////////////////////
-// ID3DX11EffectScalarVariable (TBoolScalarVariable implementation)
-//////////////////////////////////////////////////////////////////////////
-
-template<typename IBaseInterface, BOOL IsAnnotation>
-struct TBoolScalarVariable : public TNumericVariable<IBaseInterface, IsAnnotation>
-{
- STDMETHOD(SetFloat)(CONST float Value);
- STDMETHOD(GetFloat)(float *pValue);
-
- STDMETHOD(SetFloatArray)(CONST float *pData, UINT Offset, UINT Count);
- STDMETHOD(GetFloatArray)(float *pData, UINT Offset, UINT Count);
-
- STDMETHOD(SetInt)(CONST int Value);
- STDMETHOD(GetInt)(int *pValue);
-
- STDMETHOD(SetIntArray)(CONST int *pData, UINT Offset, UINT Count);
- STDMETHOD(GetIntArray)(int *pData, UINT Offset, UINT Count);
-
- STDMETHOD(SetBool)(CONST BOOL Value);
- STDMETHOD(GetBool)(BOOL *pValue);
-
- STDMETHOD(SetBoolArray)(CONST BOOL *pData, UINT Offset, UINT Count);
- STDMETHOD(GetBoolArray)(BOOL *pData, UINT Offset, UINT Count);
-};
-
-template<typename IBaseInterface, BOOL IsAnnotation>
-HRESULT TBoolScalarVariable<IBaseInterface, IsAnnotation>::SetFloat(float Value)
-{
- LPCSTR pFuncName = "ID3DX11EffectScalarVariable::SetFloat";
- if (IsAnnotation) return AnnotationInvalidSetCall(pFuncName);
- DirtyVariable();
- return CopyScalarValue<ETVT_Float, ETVT_Bool, float, FALSE>(Value, Data.pNumericBool, pFuncName);
-}
-
-template<typename IBaseInterface, BOOL IsAnnotation>
-HRESULT TBoolScalarVariable<IBaseInterface, IsAnnotation>::GetFloat(float *pValue)
-{
- return CopyScalarValue<ETVT_Bool, ETVT_Float, BOOL, TRUE>(*Data.pNumericBool, pValue, "ID3DX11EffectScalarVariable::GetFloat");
-}
-
-template<typename IBaseInterface, BOOL IsAnnotation>
-HRESULT TBoolScalarVariable<IBaseInterface, IsAnnotation>::SetFloatArray(CONST float *pData, UINT Offset, UINT Count)
-{
- LPCSTR pFuncName = "ID3DX11EffectScalarVariable::SetFloatArray";
- if (IsAnnotation) return AnnotationInvalidSetCall(pFuncName);
- DirtyVariable();
- return SetScalarArray<ETVT_Float, ETVT_Bool, float, BOOL>(pData, Data.pNumericBool, Offset, Count,
- pType, GetTotalUnpackedSize(), pFuncName);
-}
-
-template<typename IBaseInterface, BOOL IsAnnotation>
-HRESULT TBoolScalarVariable<IBaseInterface, IsAnnotation>::GetFloatArray(float *pData, UINT Offset, UINT Count)
-{
- return GetScalarArray<ETVT_Bool, ETVT_Float, BOOL, float>(Data.pNumericBool, pData, Offset, Count,
- pType, GetTotalUnpackedSize(), "ID3DX11EffectScalarVariable::GetFloatArray");
-}
-
-template<typename IBaseInterface, BOOL IsAnnotation>
-HRESULT TBoolScalarVariable<IBaseInterface, IsAnnotation>::SetInt(CONST int Value)
-{
- LPCSTR pFuncName = "ID3DX11EffectScalarVariable::SetInt";
- if (IsAnnotation) return AnnotationInvalidSetCall(pFuncName);
- DirtyVariable();
- return CopyScalarValue<ETVT_Int, ETVT_Bool, int, FALSE>(Value, Data.pNumericBool, pFuncName);
-}
-
-template<typename IBaseInterface, BOOL IsAnnotation>
-HRESULT TBoolScalarVariable<IBaseInterface, IsAnnotation>::GetInt(int *pValue)
-{
- return CopyScalarValue<ETVT_Bool, ETVT_Int, BOOL, TRUE>(*Data.pNumericBool, pValue, "ID3DX11EffectScalarVariable::GetInt");
-}
-
-template<typename IBaseInterface, BOOL IsAnnotation>
-HRESULT TBoolScalarVariable<IBaseInterface, IsAnnotation>::SetIntArray(CONST int *pData, UINT Offset, UINT Count)
-{
- LPCSTR pFuncName = "ID3DX11EffectScalarVariable::SetIntArray";
- if (IsAnnotation) return AnnotationInvalidSetCall(pFuncName);
- DirtyVariable();
- return SetScalarArray<ETVT_Int, ETVT_Bool, int, BOOL>(pData, Data.pNumericBool, Offset, Count,
- pType, GetTotalUnpackedSize(), pFuncName);
-}
-
-template<typename IBaseInterface, BOOL IsAnnotation>
-HRESULT TBoolScalarVariable<IBaseInterface, IsAnnotation>::GetIntArray(int *pData, UINT Offset, UINT Count)
-{
- return GetScalarArray<ETVT_Bool, ETVT_Int, BOOL, int>(Data.pNumericBool, pData, Offset, Count,
- pType, GetTotalUnpackedSize(), "ID3DX11EffectScalarVariable::GetIntArray");
-}
-
-template<typename IBaseInterface, BOOL IsAnnotation>
-HRESULT TBoolScalarVariable<IBaseInterface, IsAnnotation>::SetBool(CONST BOOL Value)
-{
- LPCSTR pFuncName = "ID3DX11EffectScalarVariable::SetBool";
- if (IsAnnotation) return AnnotationInvalidSetCall(pFuncName);
- DirtyVariable();
- return CopyScalarValue<ETVT_Bool, ETVT_Bool, BOOL, FALSE>(Value, Data.pNumericBool, pFuncName);
-}
-
-template<typename IBaseInterface, BOOL IsAnnotation>
-HRESULT TBoolScalarVariable<IBaseInterface, IsAnnotation>::GetBool(BOOL *pValue)
-{
- return CopyScalarValue<ETVT_Bool, ETVT_Bool, BOOL, TRUE>(*Data.pNumericBool, pValue, "ID3DX11EffectScalarVariable::GetBool");
-}
-
-template<typename IBaseInterface, BOOL IsAnnotation>
-HRESULT TBoolScalarVariable<IBaseInterface, IsAnnotation>::SetBoolArray(CONST BOOL *pData, UINT Offset, UINT Count)
-{
- LPCSTR pFuncName = "ID3DX11EffectScalarVariable::SetBoolArray";
- if (IsAnnotation) return AnnotationInvalidSetCall(pFuncName);
- DirtyVariable();
- return SetScalarArray<ETVT_Bool, ETVT_Bool, BOOL, BOOL>(pData, Data.pNumericBool, Offset, Count,
- pType, GetTotalUnpackedSize(), pFuncName);
-}
-
-template<typename IBaseInterface, BOOL IsAnnotation>
-HRESULT TBoolScalarVariable<IBaseInterface, IsAnnotation>::GetBoolArray(BOOL *pData, UINT Offset, UINT Count)
-{
- return GetScalarArray<ETVT_Bool, ETVT_Bool, BOOL, BOOL>(Data.pNumericBool, pData, Offset, Count,
- pType, GetTotalUnpackedSize(), "ID3DX11EffectScalarVariable::GetBoolArray");
-}
-
-//////////////////////////////////////////////////////////////////////////
-// ID3DX11EffectVectorVariable (TVectorVariable implementation)
-//////////////////////////////////////////////////////////////////////////
-
-template<typename IBaseInterface, BOOL IsAnnotation, ETemplateVarType BaseType >
-struct TVectorVariable : public TNumericVariable<IBaseInterface, IsAnnotation>
-{
- STDMETHOD(SetBoolVector) (CONST BOOL *pData);
- STDMETHOD(SetIntVector) (CONST int *pData);
- STDMETHOD(SetFloatVector)(CONST float *pData);
-
- STDMETHOD(GetBoolVector) (BOOL *pData);
- STDMETHOD(GetIntVector) (int *pData);
- STDMETHOD(GetFloatVector)(float *pData);
-
-
- STDMETHOD(SetBoolVectorArray) (CONST BOOL *pData, UINT Offset, UINT Count);
- STDMETHOD(SetIntVectorArray) (CONST int *pData, UINT Offset, UINT Count);
- STDMETHOD(SetFloatVectorArray)(CONST float *pData, UINT Offset, UINT Count);
-
- STDMETHOD(GetBoolVectorArray) (BOOL *pData, UINT Offset, UINT Count);
- STDMETHOD(GetIntVectorArray) (int *pData, UINT Offset, UINT Count);
- STDMETHOD(GetFloatVectorArray)(float *pData, UINT Offset, UINT Count);
-};
-
-// Note that branches in this code is based on template parameters and will be compiled out
-template <ETemplateVarType DestType, ETemplateVarType SourceType>
-void __forceinline CopyDataWithTypeConversion(__out_bcount(vecCount * dstVecSize * sizeof(UINT)) void *pDest, CONST void *pSource, UINT dstVecSize, UINT srcVecSize, UINT elementCount, UINT vecCount)
-{
- UINT i, j;
-
- switch (SourceType)
- {
- case ETVT_Bool:
- switch (DestType)
- {
- case ETVT_Bool:
- for (j=0; j<vecCount; j++)
- {
- dwordMemcpy(pDest, pSource, elementCount * SType::c_ScalarSize);
-
- pDest = ((float*) pDest) + dstVecSize;
- pSource = ((float*) pSource) + srcVecSize;
- }
- break;
-
- case ETVT_Int:
- for (j=0; j<vecCount; j++)
- {
- for (i=0; i<elementCount; i++)
- ((int*)pDest)[i] = ((BOOL*)pSource)[i] ? -1 : 0;
-
- pDest = ((float*) pDest) + dstVecSize;
- pSource = ((float*) pSource) + srcVecSize;
- }
- break;
-
- case ETVT_Float:
- for (j=0; j<vecCount; j++)
- {
- for (i=0; i<elementCount; i++)
- ((float*)pDest)[i] = ((BOOL*)pSource)[i] ? -1.0f : 0.0f;
-
- pDest = ((float*) pDest) + dstVecSize;
- pSource = ((float*) pSource) + srcVecSize;
- }
- break;
-
- default:
- D3DXASSERT(0);
- }
- break;
-
-
- case ETVT_Int:
- switch (DestType)
- {
- case ETVT_Bool:
- for (j=0; j<vecCount; j++)
- {
- for (i=0; i<elementCount; i++)
- ((int*)pDest)[i] = (((int*)pSource)[i] != 0) ? -1 : 0;
-
- pDest = ((float*) pDest) + dstVecSize;
- pSource = ((float*) pSource) + srcVecSize;
- }
- break;
-
- case ETVT_Int:
- for (j=0; j<vecCount; j++)
- {
- dwordMemcpy(pDest, pSource, elementCount * SType::c_ScalarSize);
-
- pDest = ((float*) pDest) + dstVecSize;
- pSource = ((float*) pSource) + srcVecSize;
- }
- break;
-
- case ETVT_Float:
- for (j=0; j<vecCount; j++)
- {
- for (i=0; i<elementCount; i++)
- ((float*)pDest)[i] = (float)(((int*)pSource)[i]);
-
- pDest = ((float*) pDest) + dstVecSize;
- pSource = ((float*) pSource) + srcVecSize;
- }
- break;
-
- default:
- D3DXASSERT(0);
- }
- break;
-
- case ETVT_Float:
- switch (DestType)
- {
- case ETVT_Bool:
- for (j=0; j<vecCount; j++)
- {
- for (i=0; i<elementCount; i++)
- ((int*)pDest)[i] = (((float*)pSource)[i] != 0.0f) ? -1 : 0;
-
- pDest = ((float*) pDest) + dstVecSize;
- pSource = ((float*) pSource) + srcVecSize;
- }
- break;
-
- case ETVT_Int:
- for (j=0; j<vecCount; j++)
- {
- for (i=0; i<elementCount; i++)
- ((int*)pDest)[i] = (int)((float*)pSource)[i];
-
- pDest = ((float*) pDest) + dstVecSize;
- pSource = ((float*) pSource) + srcVecSize;
- }
- break;
-
- case ETVT_Float:
- for (i=0; i<vecCount; i++)
- {
- dwordMemcpy( pDest, pSource, elementCount * SType::c_ScalarSize);
-
- pDest = ((float*) pDest) + dstVecSize;
- pSource = ((float*) pSource) + srcVecSize;
- }
- break;
-
- default:
- D3DXASSERT(0);
- }
- break;
-
- default:
- D3DXASSERT(0);
- }
-}
-
-// Float Vector
-
-template<typename IBaseInterface, BOOL IsAnnotation, ETemplateVarType BaseType>
-HRESULT TVectorVariable<IBaseInterface, IsAnnotation, BaseType >::SetFloatVector(CONST float *pData)
-{
- HRESULT hr = S_OK;
- LPCSTR pFuncName = "ID3DX11EffectVectorVariable::SetFloatVector";
-
-#ifdef _DEBUG
- VERIFYPARAMETER(pData);
-#endif
-
- if (IsAnnotation) return AnnotationInvalidSetCall(pFuncName);
- DirtyVariable();
- CopyDataWithTypeConversion<BaseType, ETVT_Float>(Data.pVector, pData, 4, pType->NumericType.Columns, pType->NumericType.Columns, 1);
-
-lExit:
- return hr;
-}
-
-template<typename IBaseInterface, BOOL IsAnnotation, ETemplateVarType BaseType>
-HRESULT TVectorVariable<IBaseInterface, IsAnnotation, BaseType>::GetFloatVector(float *pData)
-{
- HRESULT hr = S_OK;
- LPCSTR pFuncName = "ID3DX11EffectVectorVariable::GetFloatVector";
-
-#ifdef _DEBUG
- VERIFYPARAMETER(pData);
-#endif
-
- CopyDataWithTypeConversion<ETVT_Float, BaseType>(pData, Data.pVector, pType->NumericType.Columns, 4, pType->NumericType.Columns, 1);
-
-lExit:
- return hr;
-}
-
-// Int Vector
-
-template<typename IBaseInterface, BOOL IsAnnotation, ETemplateVarType BaseType>
-HRESULT TVectorVariable<IBaseInterface, IsAnnotation, BaseType >::SetIntVector(CONST int *pData)
-{
- HRESULT hr = S_OK;
- LPCSTR pFuncName = "ID3DX11EffectVectorVariable::SetIntVector";
-
-#ifdef _DEBUG
- VERIFYPARAMETER(pData);
-#endif
-
- if (IsAnnotation) return AnnotationInvalidSetCall(pFuncName);
- DirtyVariable();
- CopyDataWithTypeConversion<BaseType, ETVT_Int>(Data.pVector, pData, 4, pType->NumericType.Columns, pType->NumericType.Columns, 1);
-
-lExit:
- return hr;
-}
-
-template<typename IBaseInterface, BOOL IsAnnotation, ETemplateVarType BaseType>
-HRESULT TVectorVariable<IBaseInterface, IsAnnotation, BaseType>::GetIntVector(int *pData)
-{
- HRESULT hr = S_OK;
- LPCSTR pFuncName = "ID3DX11EffectVectorVariable::GetIntVector";
-
-#ifdef _DEBUG
- VERIFYPARAMETER(pData);
-#endif
-
- CopyDataWithTypeConversion<ETVT_Int, BaseType>(pData, Data.pVector, pType->NumericType.Columns, 4, pType->NumericType.Columns, 1);
-
-lExit:
- return hr;
-}
-
-// Bool Vector
-
-template<typename IBaseInterface, BOOL IsAnnotation, ETemplateVarType BaseType>
-HRESULT TVectorVariable<IBaseInterface, IsAnnotation, BaseType >::SetBoolVector(CONST BOOL *pData)
-{
- HRESULT hr = S_OK;
- LPCSTR pFuncName = "ID3DX11EffectVectorVariable::SetBoolVector";
-
-#ifdef _DEBUG
- VERIFYPARAMETER(pData);
-#endif
-
- if (IsAnnotation) return AnnotationInvalidSetCall(pFuncName);
- DirtyVariable();
- CopyDataWithTypeConversion<BaseType, ETVT_Bool>(Data.pVector, pData, 4, pType->NumericType.Columns, pType->NumericType.Columns, 1);
-
-lExit:
- return hr;
-}
-
-template<typename IBaseInterface, BOOL IsAnnotation, ETemplateVarType BaseType>
-HRESULT TVectorVariable<IBaseInterface, IsAnnotation, BaseType>::GetBoolVector(BOOL *pData)
-{
- HRESULT hr = S_OK;
- LPCSTR pFuncName = "ID3DX11EffectVectorVariable::GetBoolVector";
-
-#ifdef _DEBUG
- VERIFYPARAMETER(pData);
-#endif
-
- CopyDataWithTypeConversion<ETVT_Bool, BaseType>(pData, Data.pVector, pType->NumericType.Columns, 4, pType->NumericType.Columns, 1);
-
-lExit:
- return hr;
-}
-
-// Vector Arrays /////////////////////////////////////////////////////////
-
-template<typename IBaseInterface, BOOL IsAnnotation, ETemplateVarType BaseType>
-HRESULT TVectorVariable<IBaseInterface, IsAnnotation, BaseType>::SetFloatVectorArray(CONST float *pData, UINT Offset, UINT Count)
-{
- HRESULT hr = S_OK;
- LPCSTR pFuncName = "ID3DX11EffectVectorVariable::SetFloatVectorArray";
-
-#ifdef _DEBUG
- if (!AreBoundsValid(Offset, Count, pData, pType, GetTotalUnpackedSize()))
- {
- DPF(0, "%s: Invalid range specified", pFuncName);
- VH(E_INVALIDARG);
- }
-#endif
-
- if (IsAnnotation) return AnnotationInvalidSetCall(pFuncName);
- DirtyVariable();
- // ensure we don't write over the padding at the end of the vector array
- CopyDataWithTypeConversion<BaseType, ETVT_Float>(Data.pVector + Offset, pData, 4, pType->NumericType.Columns, pType->NumericType.Columns, max(min((int)Count, (int)pType->Elements - (int)Offset), 0));
-
-lExit:
- return hr;
-}
-
-template<typename IBaseInterface, BOOL IsAnnotation, ETemplateVarType BaseType>
-HRESULT TVectorVariable<IBaseInterface, IsAnnotation, BaseType>::GetFloatVectorArray(float *pData, UINT Offset, UINT Count)
-{
- HRESULT hr = S_OK;
- LPCSTR pFuncName = "ID3DX11EffectVectorVariable::GetFloatVectorArray";
-
-#ifdef _DEBUG
- if (!AreBoundsValid(Offset, Count, pData, pType, GetTotalUnpackedSize()))
- {
- DPF(0, "%s: Invalid range specified", pFuncName);
- VH(E_INVALIDARG);
- }
-#endif
-
- // ensure we don't read past the end of the vector array
- CopyDataWithTypeConversion<ETVT_Float, BaseType>(pData, Data.pVector + Offset, pType->NumericType.Columns, 4, pType->NumericType.Columns, max(min((int)Count, (int)pType->Elements - (int)Offset), 0));
-
-lExit:
- return hr;
-}
-
-// int
-
-template<typename IBaseInterface, BOOL IsAnnotation, ETemplateVarType BaseType>
-HRESULT TVectorVariable<IBaseInterface, IsAnnotation, BaseType>::SetIntVectorArray(CONST int *pData, UINT Offset, UINT Count)
-{
- HRESULT hr = S_OK;
- LPCSTR pFuncName = "ID3DX11EffectVectorVariable::SetIntVectorArray";
-
-#ifdef _DEBUG
- if (!AreBoundsValid(Offset, Count, pData, pType, GetTotalUnpackedSize()))
- {
- DPF(0, "%s: Invalid range specified", pFuncName);
- VH(E_INVALIDARG);
- }
-#endif
-
- if (IsAnnotation) return AnnotationInvalidSetCall(pFuncName);
- DirtyVariable();
- // ensure we don't write over the padding at the end of the vector array
- CopyDataWithTypeConversion<BaseType, ETVT_Int>(Data.pVector + Offset, pData, 4, pType->NumericType.Columns, pType->NumericType.Columns, max(min((int)Count, (int)pType->Elements - (int)Offset), 0));
-
-lExit:
- return hr;
-}
-
-template<typename IBaseInterface, BOOL IsAnnotation, ETemplateVarType BaseType>
-HRESULT TVectorVariable<IBaseInterface, IsAnnotation, BaseType>::GetIntVectorArray(int *pData, UINT Offset, UINT Count)
-{
- HRESULT hr = S_OK;
- LPCSTR pFuncName = "ID3DX11EffectVectorVariable::GetIntVectorArray";
-
-#ifdef _DEBUG
- if (!AreBoundsValid(Offset, Count, pData, pType, GetTotalUnpackedSize()))
- {
- DPF(0, "%s: Invalid range specified", pFuncName);
- VH(E_INVALIDARG);
- }
-#endif
-
- // ensure we don't read past the end of the vector array
- CopyDataWithTypeConversion<ETVT_Int, BaseType>(pData, Data.pVector + Offset, pType->NumericType.Columns, 4, pType->NumericType.Columns, max(min((int)Count, (int)pType->Elements - (int)Offset), 0));
-
-lExit:
- return hr;
-}
-
-// bool
-
-template<typename IBaseInterface, BOOL IsAnnotation, ETemplateVarType BaseType>
-HRESULT TVectorVariable<IBaseInterface, IsAnnotation, BaseType>::SetBoolVectorArray(CONST BOOL *pData, UINT Offset, UINT Count)
-{
- HRESULT hr = S_OK;
- LPCSTR pFuncName = "ID3DX11EffectVectorVariable::SetBoolVectorArray";
-
-#ifdef _DEBUG
- if (!AreBoundsValid(Offset, Count, pData, pType, GetTotalUnpackedSize()))
- {
- DPF(0, "%s: Invalid range specified", pFuncName);
- VH(E_INVALIDARG);
- }
-#endif
-
- if (IsAnnotation) return AnnotationInvalidSetCall(pFuncName);
- DirtyVariable();
- // ensure we don't write over the padding at the end of the vector array
- CopyDataWithTypeConversion<BaseType, ETVT_Bool>(Data.pVector + Offset, pData, 4, pType->NumericType.Columns, pType->NumericType.Columns, max(min((int)Count, (int)pType->Elements - (int)Offset), 0));
-
-lExit:
- return hr;
-}
-
-template<typename IBaseInterface, BOOL IsAnnotation, ETemplateVarType BaseType>
-HRESULT TVectorVariable<IBaseInterface, IsAnnotation, BaseType>::GetBoolVectorArray(BOOL *pData, UINT Offset, UINT Count)
-{
- HRESULT hr = S_OK;
- LPCSTR pFuncName = "ID3DX11EffectVectorVariable::GetBoolVectorArray";
-
-#ifdef _DEBUG
- if (!AreBoundsValid(Offset, Count, pData, pType, GetTotalUnpackedSize()))
- {
- DPF(0, "%s: Invalid range specified", pFuncName);
- VH(E_INVALIDARG);
- }
-#endif
-
- // ensure we don't read past the end of the vector array
- CopyDataWithTypeConversion<ETVT_Bool, BaseType>(pData, Data.pVector + Offset, pType->NumericType.Columns, 4, pType->NumericType.Columns, max(min((int)Count, (int)pType->Elements - (int)Offset), 0));
-
-lExit:
- return hr;
-}
-
-//////////////////////////////////////////////////////////////////////////
-// ID3DX11EffectVector4Variable (TVectorVariable implementation) [OPTIMIZED]
-//////////////////////////////////////////////////////////////////////////
-
-template<typename IBaseInterface>
-struct TVector4Variable : public TVectorVariable<IBaseInterface, FALSE, ETVT_Float>
-{
- STDMETHOD(SetFloatVector)(CONST float *pData);
- STDMETHOD(GetFloatVector)(float *pData);
-
- STDMETHOD(SetFloatVectorArray)(CONST float *pData, UINT Offset, UINT Count);
- STDMETHOD(GetFloatVectorArray)(float *pData, UINT Offset, UINT Count);
-};
-
-template<typename IBaseInterface>
-HRESULT TVector4Variable<IBaseInterface>::SetFloatVector(CONST float *pData)
-{
- HRESULT hr = S_OK;
- LPCSTR pFuncName = "ID3DX11EffectVectorVariable::SetFloatVector";
-
-#ifdef _DEBUG
- VERIFYPARAMETER(pData);
-#endif
-
- DirtyVariable();
- Data.pVector[0] = ((CEffectVector4*) pData)[0];
-
-lExit:
- return hr;
-}
-
-template<typename IBaseInterface>
-HRESULT TVector4Variable<IBaseInterface>::GetFloatVector(float *pData)
-{
- HRESULT hr = S_OK;
- LPCSTR pFuncName = "ID3DX11EffectVectorVariable::GetFloatVector";
-
-#ifdef _DEBUG
- VERIFYPARAMETER(pData);
-#endif
-
- dwordMemcpy(pData, Data.pVector, pType->NumericType.Columns * SType::c_ScalarSize);
-
-lExit:
- return hr;
-}
-
-template<typename IBaseInterface>
-HRESULT TVector4Variable<IBaseInterface>::SetFloatVectorArray(CONST float *pData, UINT Offset, UINT Count)
-{
- HRESULT hr = S_OK;
- LPCSTR pFuncName = "ID3DX11EffectVectorVariable::SetFloatVectorArray";
-
-#ifdef _DEBUG
- if (!AreBoundsValid(Offset, Count, pData, pType, GetTotalUnpackedSize()))
- {
- DPF(0, "%s: Invalid range specified", pFuncName);
- VH(E_INVALIDARG);
- }
-#endif
-
- DirtyVariable();
- // ensure we don't write over the padding at the end of the vector array
- dwordMemcpy(Data.pVector + Offset, pData, min((Offset + Count) * sizeof(CEffectVector4), pType->TotalSize));
-
-lExit:
- return hr;
-}
-
-template<typename IBaseInterface>
-HRESULT TVector4Variable<IBaseInterface>::GetFloatVectorArray(float *pData, UINT Offset, UINT Count)
-{
- HRESULT hr = S_OK;
- LPCSTR pFuncName = "ID3DX11EffectVectorVariable::GetFloatVectorArray";
-
-#ifdef _DEBUG
- if (!AreBoundsValid(Offset, Count, pData, pType, GetTotalUnpackedSize()))
- {
- DPF(0, "%s: Invalid range specified", pFuncName);
- VH(E_INVALIDARG);
- }
-#endif
-
- // ensure we don't read past the end of the vector array
- dwordMemcpy(pData, Data.pVector + Offset, min((Offset + Count) * sizeof(CEffectVector4), pType->TotalSize));
-
-lExit:
- return hr;
-}
-
-
-//////////////////////////////////////////////////////////////////////////
-// ID3DX11EffectMatrixVariable (TMatrixVariable implementation)
-//////////////////////////////////////////////////////////////////////////
-
-template<typename IBaseInterface, BOOL IsAnnotation>
-struct TMatrixVariable : public TNumericVariable<IBaseInterface, IsAnnotation>
-{
- STDMETHOD(SetMatrix)(CONST float *pData);
- STDMETHOD(GetMatrix)(float *pData);
-
- STDMETHOD(SetMatrixArray)(CONST float *pData, UINT Offset, UINT Count);
- STDMETHOD(GetMatrixArray)(float *pData, UINT Offset, UINT Count);
-
- STDMETHOD(SetMatrixPointerArray)(CONST float **ppData, UINT Offset, UINT Count);
- STDMETHOD(GetMatrixPointerArray)(float **ppData, UINT Offset, UINT Count);
-
- STDMETHOD(SetMatrixTranspose)(CONST float *pData);
- STDMETHOD(GetMatrixTranspose)(float *pData);
-
- STDMETHOD(SetMatrixTransposeArray)(CONST float *pData, UINT Offset, UINT Count);
- STDMETHOD(GetMatrixTransposeArray)(float *pData, UINT Offset, UINT Count);
-
- STDMETHOD(SetMatrixTransposePointerArray)(CONST float **ppData, UINT Offset, UINT Count);
- STDMETHOD(GetMatrixTransposePointerArray)(float **ppData, UINT Offset, UINT Count);
-};
-
-template<BOOL Transpose>
-static void SetMatrixTransposeHelper(SType *pType, __out_bcount(64) BYTE *pDestData, CONST float* pMatrix)
-{
- UINT i, j;
- UINT registers, entries;
-
- if (Transpose)
- {
- // row major
- registers = pType->NumericType.Rows;
- entries = pType->NumericType.Columns;
- }
- else
- {
- // column major
- registers = pType->NumericType.Columns;
- entries = pType->NumericType.Rows;
- }
- __analysis_assume( registers <= 4 );
- __analysis_assume( entries <= 4 );
-
- for (i = 0; i < registers; ++ i)
- {
- for (j = 0; j < entries; ++ j)
- {
-#pragma prefast(suppress:__WARNING_UNRELATED_LOOP_TERMINATION, "regs / entries <= 4")
- ((float*)pDestData)[j] = ((float*)pMatrix)[j * 4 + i];
- }
- pDestData += SType::c_RegisterSize;
- }
-}
-
-template<BOOL Transpose>
-static void GetMatrixTransposeHelper(SType *pType, __in_bcount(64) BYTE *pSrcData, __out_ecount(16) float* pMatrix)
-{
- UINT i, j;
- UINT registers, entries;
-
- if (Transpose)
- {
- // row major
- registers = pType->NumericType.Rows;
- entries = pType->NumericType.Columns;
- }
- else
- {
- // column major
- registers = pType->NumericType.Columns;
- entries = pType->NumericType.Rows;
- }
- __analysis_assume( registers <= 4 );
- __analysis_assume( entries <= 4 );
-
- for (i = 0; i < registers; ++ i)
- {
- for (j = 0; j < entries; ++ j)
- {
- ((float*)pMatrix)[j * 4 + i] = ((float*)pSrcData)[j];
- }
- pSrcData += SType::c_RegisterSize;
- }
-}
-
-template<BOOL Transpose, BOOL IsSetting, BOOL ExtraIndirection>
-HRESULT DoMatrixArrayInternal(SType *pType, UINT TotalUnpackedSize, BYTE *pEffectData, void *pMatrixData, UINT Offset, UINT Count, LPCSTR pFuncName)
-{
- HRESULT hr = S_OK;
-
-#ifdef _DEBUG
- if (!AreBoundsValid(Offset, Count, pMatrixData, pType, TotalUnpackedSize))
- {
- DPF(0, "%s: Invalid range specified", pFuncName);
- VH(E_INVALIDARG);
- }
-#endif
-
- UINT i;
-
- if ((pType->NumericType.IsColumnMajor && Transpose) || (!pType->NumericType.IsColumnMajor && !Transpose))
- {
- // fast path
- UINT dataSize;
- if (Transpose)
- {
- dataSize = ((pType->NumericType.Columns - 1) * 4 + pType->NumericType.Rows) * SType::c_ScalarSize;
- }
- else
- {
- dataSize = ((pType->NumericType.Rows - 1) * 4 + pType->NumericType.Columns) * SType::c_ScalarSize;
- }
-
- for (i = 0; i < Count; ++ i)
- {
- CEffectMatrix *pMatrix;
- if (ExtraIndirection)
- {
- pMatrix = ((CEffectMatrix **)pMatrixData)[i];
- if (!pMatrix)
- {
- continue;
- }
- }
- else
- {
- pMatrix = ((CEffectMatrix *)pMatrixData) + i;
- }
-
- if (IsSetting)
- {
- dwordMemcpy(pEffectData + pType->Stride * (i + Offset), pMatrix, dataSize);
- }
- else
- {
- dwordMemcpy(pMatrix, pEffectData + pType->Stride * (i + Offset), dataSize);
- }
- }
- }
- else
- {
- // slow path
- for (i = 0; i < Count; ++ i)
- {
- CEffectMatrix *pMatrix;
- if (ExtraIndirection)
- {
- pMatrix = ((CEffectMatrix **)pMatrixData)[i];
- if (!pMatrix)
- {
- continue;
- }
- }
- else
- {
- pMatrix = ((CEffectMatrix *)pMatrixData) + i;
- }
-
- if (IsSetting)
- {
- SetMatrixTransposeHelper<Transpose>(pType, pEffectData + pType->Stride * (i + Offset), (float*) pMatrix);
- }
- else
- {
- GetMatrixTransposeHelper<Transpose>(pType, pEffectData + pType->Stride * (i + Offset), (float*) pMatrix);
- }
- }
- }
-
-lExit:
- return hr;
-}
-
-template<typename IBaseInterface, BOOL IsAnnotation>
-HRESULT TMatrixVariable<IBaseInterface, IsAnnotation>::SetMatrix(CONST float *pData)
-{
- LPCSTR pFuncName = "ID3DX11EffectMatrixVariable::SetMatrix";
- if (IsAnnotation) return AnnotationInvalidSetCall(pFuncName);
- DirtyVariable();
- return DoMatrixArrayInternal<FALSE, TRUE, FALSE>(pType, GetTotalUnpackedSize(),
- Data.pNumeric, const_cast<float*>(pData), 0, 1, pFuncName);
-}
-
-template<typename IBaseInterface, BOOL IsAnnotation>
-HRESULT TMatrixVariable<IBaseInterface, IsAnnotation>::GetMatrix(float *pData)
-{
- return DoMatrixArrayInternal<FALSE, FALSE, FALSE>(pType, GetTotalUnpackedSize(),
- Data.pNumeric, pData, 0, 1, "ID3DX11EffectMatrixVariable::GetMatrix");
-}
-
-template<typename IBaseInterface, BOOL IsAnnotation>
-HRESULT TMatrixVariable<IBaseInterface, IsAnnotation>::SetMatrixArray(CONST float *pData, UINT Offset, UINT Count)
-{
- LPCSTR pFuncName = "ID3DX11EffectMatrixVariable::SetMatrixArray";
- if (IsAnnotation) return AnnotationInvalidSetCall(pFuncName);
- DirtyVariable();
- return DoMatrixArrayInternal<FALSE, TRUE, FALSE>(pType, GetTotalUnpackedSize(),
- Data.pNumeric, const_cast<float*>(pData), Offset, Count, "ID3DX11EffectMatrixVariable::SetMatrixArray");
-}
-
-template<typename IBaseInterface, BOOL IsAnnotation>
-HRESULT TMatrixVariable<IBaseInterface, IsAnnotation>::GetMatrixArray(float *pData, UINT Offset, UINT Count)
-{
- return DoMatrixArrayInternal<FALSE, FALSE, FALSE>(pType, GetTotalUnpackedSize(),
- Data.pNumeric, pData, Offset, Count, "ID3DX11EffectMatrixVariable::GetMatrixArray");
-}
-
-template<typename IBaseInterface, BOOL IsAnnotation>
-HRESULT TMatrixVariable<IBaseInterface, IsAnnotation>::SetMatrixPointerArray(CONST float **ppData, UINT Offset, UINT Count)
-{
- LPCSTR pFuncName = "ID3DX11EffectMatrixVariable::SetMatrixPointerArray";
- if (IsAnnotation) return AnnotationInvalidSetCall(pFuncName);
- DirtyVariable();
- return DoMatrixArrayInternal<FALSE, TRUE, TRUE>(pType, GetTotalUnpackedSize(),
- Data.pNumeric, const_cast<float**>(ppData), Offset, Count, "ID3DX11EffectMatrixVariable::SetMatrixPointerArray");
-}
-
-template<typename IBaseInterface, BOOL IsAnnotation>
-HRESULT TMatrixVariable<IBaseInterface, IsAnnotation>::GetMatrixPointerArray(float **ppData, UINT Offset, UINT Count)
-{
- return DoMatrixArrayInternal<FALSE, FALSE, TRUE>(pType, GetTotalUnpackedSize(),
- Data.pNumeric, ppData, Offset, Count, "ID3DX11EffectMatrixVariable::GetMatrixPointerArray");
-}
-
-template<typename IBaseInterface, BOOL IsAnnotation>
-HRESULT TMatrixVariable<IBaseInterface, IsAnnotation>::SetMatrixTranspose(CONST float *pData)
-{
- LPCSTR pFuncName = "ID3DX11EffectMatrixVariable::SetMatrixTranspose";
- if (IsAnnotation) return AnnotationInvalidSetCall(pFuncName);
- DirtyVariable();
- return DoMatrixArrayInternal<TRUE, TRUE, FALSE>(pType, GetTotalUnpackedSize(),
- Data.pNumeric, const_cast<float*>(pData), 0, 1, "ID3DX11EffectMatrixVariable::SetMatrixTranspose");
-}
-
-template<typename IBaseInterface, BOOL IsAnnotation>
-HRESULT TMatrixVariable<IBaseInterface, IsAnnotation>::GetMatrixTranspose(float *pData)
-{
- return DoMatrixArrayInternal<TRUE, FALSE, FALSE>(pType, GetTotalUnpackedSize(),
- Data.pNumeric, pData, 0, 1, "ID3DX11EffectMatrixVariable::GetMatrixTranspose");
-}
-
-template<typename IBaseInterface, BOOL IsAnnotation>
-HRESULT TMatrixVariable<IBaseInterface, IsAnnotation>::SetMatrixTransposeArray(CONST float *pData, UINT Offset, UINT Count)
-{
- LPCSTR pFuncName = "ID3DX11EffectMatrixVariable::SetMatrixTransposeArray";
- if (IsAnnotation) return AnnotationInvalidSetCall(pFuncName);
- DirtyVariable();
- return DoMatrixArrayInternal<TRUE, TRUE, FALSE>(pType, GetTotalUnpackedSize(),
- Data.pNumeric, const_cast<float*>(pData), Offset, Count, "ID3DX11EffectMatrixVariable::SetMatrixTransposeArray");
-}
-
-template<typename IBaseInterface, BOOL IsAnnotation>
-HRESULT TMatrixVariable<IBaseInterface, IsAnnotation>::GetMatrixTransposeArray(float *pData, UINT Offset, UINT Count)
-{
- return DoMatrixArrayInternal<TRUE, FALSE, FALSE>(pType, GetTotalUnpackedSize(),
- Data.pNumeric, pData, Offset, Count, "ID3DX11EffectMatrixVariable::GetMatrixTransposeArray");
-}
-
-template<typename IBaseInterface, BOOL IsAnnotation>
-HRESULT TMatrixVariable<IBaseInterface, IsAnnotation>::SetMatrixTransposePointerArray(CONST float **ppData, UINT Offset, UINT Count)
-{
- LPCSTR pFuncName = "ID3DX11EffectMatrixVariable::SetMatrixTransposePointerArray";
- if (IsAnnotation) return AnnotationInvalidSetCall(pFuncName);
- DirtyVariable();
- return DoMatrixArrayInternal<TRUE, TRUE, TRUE>(pType, GetTotalUnpackedSize(),
- Data.pNumeric, const_cast<float**>(ppData), Offset, Count, "ID3DX11EffectMatrixVariable::SetMatrixTransposePointerArray");
-}
-
-template<typename IBaseInterface, BOOL IsAnnotation>
-HRESULT TMatrixVariable<IBaseInterface, IsAnnotation>::GetMatrixTransposePointerArray(float **ppData, UINT Offset, UINT Count)
-{
- return DoMatrixArrayInternal<TRUE, FALSE, TRUE>(pType, GetTotalUnpackedSize(),
- Data.pNumeric, ppData, Offset, Count, "ID3DX11EffectMatrixVariable::GetMatrixTransposePointerArray");
-}
-
-// Optimize commonly used fast paths
-// (non-annotations only!)
-template<typename IBaseInterface, BOOL IsColumnMajor>
-struct TMatrix4x4Variable : public TMatrixVariable<IBaseInterface, FALSE>
-{
- STDMETHOD(SetMatrix)(CONST float *pData);
- STDMETHOD(GetMatrix)(float *pData);
-
- STDMETHOD(SetMatrixArray)(CONST float *pData, UINT Offset, UINT Count);
- STDMETHOD(GetMatrixArray)(float *pData, UINT Offset, UINT Count);
-
- STDMETHOD(SetMatrixTranspose)(CONST float *pData);
- STDMETHOD(GetMatrixTranspose)(float *pData);
-
- STDMETHOD(SetMatrixTransposeArray)(CONST float *pData, UINT Offset, UINT Count);
- STDMETHOD(GetMatrixTransposeArray)(float *pData, UINT Offset, UINT Count);
-};
-
-D3DX11INLINE static void Matrix4x4TransposeHelper(CONST void *pSrc, void *pDst)
-{
- BYTE *pDestData = (BYTE*)pDst;
- UINT *pMatrix = (UINT*)pSrc;
-
- ((UINT*)pDestData)[0 * 4 + 0] = pMatrix[0 * 4 + 0];
- ((UINT*)pDestData)[0 * 4 + 1] = pMatrix[1 * 4 + 0];
- ((UINT*)pDestData)[0 * 4 + 2] = pMatrix[2 * 4 + 0];
- ((UINT*)pDestData)[0 * 4 + 3] = pMatrix[3 * 4 + 0];
-
- ((UINT*)pDestData)[1 * 4 + 0] = pMatrix[0 * 4 + 1];
- ((UINT*)pDestData)[1 * 4 + 1] = pMatrix[1 * 4 + 1];
- ((UINT*)pDestData)[1 * 4 + 2] = pMatrix[2 * 4 + 1];
- ((UINT*)pDestData)[1 * 4 + 3] = pMatrix[3 * 4 + 1];
-
- ((UINT*)pDestData)[2 * 4 + 0] = pMatrix[0 * 4 + 2];
- ((UINT*)pDestData)[2 * 4 + 1] = pMatrix[1 * 4 + 2];
- ((UINT*)pDestData)[2 * 4 + 2] = pMatrix[2 * 4 + 2];
- ((UINT*)pDestData)[2 * 4 + 3] = pMatrix[3 * 4 + 2];
-
- ((UINT*)pDestData)[3 * 4 + 0] = pMatrix[0 * 4 + 3];
- ((UINT*)pDestData)[3 * 4 + 1] = pMatrix[1 * 4 + 3];
- ((UINT*)pDestData)[3 * 4 + 2] = pMatrix[2 * 4 + 3];
- ((UINT*)pDestData)[3 * 4 + 3] = pMatrix[3 * 4 + 3];
-}
-
-D3DX11INLINE static void Matrix4x4Copy(CONST void *pSrc, void *pDst)
-{
-#if 1
- // In tests, this path ended up generating faster code both on x86 and x64
- // T1 - Matrix4x4Copy - this path
- // T2 - Matrix4x4Transpose
- // T1: 1.88 T2: 1.92 - with 32 bit copies
- // T1: 1.85 T2: 1.80 - with 64 bit copies
-
- UINT64 *pDestData = (UINT64*)pDst;
- UINT64 *pMatrix = (UINT64*)pSrc;
-
- pDestData[0 * 4 + 0] = pMatrix[0 * 4 + 0];
- pDestData[0 * 4 + 1] = pMatrix[0 * 4 + 1];
- pDestData[0 * 4 + 2] = pMatrix[0 * 4 + 2];
- pDestData[0 * 4 + 3] = pMatrix[0 * 4 + 3];
-
- pDestData[1 * 4 + 0] = pMatrix[1 * 4 + 0];
- pDestData[1 * 4 + 1] = pMatrix[1 * 4 + 1];
- pDestData[1 * 4 + 2] = pMatrix[1 * 4 + 2];
- pDestData[1 * 4 + 3] = pMatrix[1 * 4 + 3];
-#else
- UINT *pDestData = (UINT*)pDst;
- UINT *pMatrix = (UINT*)pSrc;
-
- pDestData[0 * 4 + 0] = pMatrix[0 * 4 + 0];
- pDestData[0 * 4 + 1] = pMatrix[0 * 4 + 1];
- pDestData[0 * 4 + 2] = pMatrix[0 * 4 + 2];
- pDestData[0 * 4 + 3] = pMatrix[0 * 4 + 3];
-
- pDestData[1 * 4 + 0] = pMatrix[1 * 4 + 0];
- pDestData[1 * 4 + 1] = pMatrix[1 * 4 + 1];
- pDestData[1 * 4 + 2] = pMatrix[1 * 4 + 2];
- pDestData[1 * 4 + 3] = pMatrix[1 * 4 + 3];
-
- pDestData[2 * 4 + 0] = pMatrix[2 * 4 + 0];
- pDestData[2 * 4 + 1] = pMatrix[2 * 4 + 1];
- pDestData[2 * 4 + 2] = pMatrix[2 * 4 + 2];
- pDestData[2 * 4 + 3] = pMatrix[2 * 4 + 3];
-
- pDestData[3 * 4 + 0] = pMatrix[3 * 4 + 0];
- pDestData[3 * 4 + 1] = pMatrix[3 * 4 + 1];
- pDestData[3 * 4 + 2] = pMatrix[3 * 4 + 2];
- pDestData[3 * 4 + 3] = pMatrix[3 * 4 + 3];
-#endif
-}
-
-
-// Note that branches in this code is based on template parameters and will be compiled out
-template<BOOL IsColumnMajor, BOOL Transpose, BOOL IsSetting>
-D3DX11INLINE HRESULT DoMatrix4x4ArrayInternal(BYTE *pEffectData, void *pMatrixData, UINT Offset, UINT Count
-
-#ifdef _DEBUG
- , SType *pType, UINT TotalUnpackedSize, LPCSTR pFuncName)
-#else
- )
-#endif
-{
- HRESULT hr = S_OK;
-
-#ifdef _DEBUG
- if (!AreBoundsValid(Offset, Count, pMatrixData, pType, TotalUnpackedSize))
- {
- DPF(0, "%s: Invalid range specified", pFuncName);
- VH(E_INVALIDARG);
- }
-
- D3DXASSERT(pType->NumericType.IsColumnMajor == IsColumnMajor && pType->Stride == (4 * SType::c_RegisterSize));
-#endif
-
- UINT i;
-
- if ((IsColumnMajor && Transpose) || (!IsColumnMajor && !Transpose))
- {
- // fast path
- for (i = 0; i < Count; ++ i)
- {
- CEffectMatrix *pMatrix = ((CEffectMatrix *)pMatrixData) + i;
-
- if (IsSetting)
- {
- Matrix4x4Copy(pMatrix, pEffectData + 4 * SType::c_RegisterSize * (i + Offset));
- }
- else
- {
- Matrix4x4Copy(pEffectData + 4 * SType::c_RegisterSize * (i + Offset), pMatrix);
- }
- }
- }
- else
- {
- // slow path
- for (i = 0; i < Count; ++ i)
- {
- CEffectMatrix *pMatrix = ((CEffectMatrix *)pMatrixData) + i;
-
- if (IsSetting)
- {
- Matrix4x4TransposeHelper((float*) pMatrix, pEffectData + 4 * SType::c_RegisterSize * (i + Offset));
- }
- else
- {
- Matrix4x4TransposeHelper(pEffectData + 4 * SType::c_RegisterSize * (i + Offset), (float*) pMatrix);
- }
- }
- }
-
-lExit:
- return hr;
-}
-
-template<typename IBaseInterface, BOOL IsColumnMajor>
-HRESULT TMatrix4x4Variable<IBaseInterface, IsColumnMajor>::SetMatrix(CONST float *pData)
-{
- DirtyVariable();
- return DoMatrix4x4ArrayInternal<IsColumnMajor, FALSE, TRUE>(Data.pNumeric, const_cast<float*>(pData), 0, 1
-#ifdef _DEBUG
- , pType, GetTotalUnpackedSize(), "ID3DX11EffectMatrixVariable::SetMatrix");
-#else
- );
-#endif
-}
-
-template<typename IBaseInterface, BOOL IsColumnMajor>
-HRESULT TMatrix4x4Variable<IBaseInterface, IsColumnMajor>::GetMatrix(float *pData)
-{
- return DoMatrix4x4ArrayInternal<IsColumnMajor, FALSE, FALSE>(Data.pNumeric, pData, 0, 1
-#ifdef _DEBUG
- , pType, GetTotalUnpackedSize(), "ID3DX11EffectMatrixVariable::GetMatrix");
-#else
- );
-#endif
-}
-
-template<typename IBaseInterface, BOOL IsColumnMajor>
-HRESULT TMatrix4x4Variable<IBaseInterface, IsColumnMajor>::SetMatrixArray(CONST float *pData, UINT Offset, UINT Count)
-{
- DirtyVariable();
- return DoMatrix4x4ArrayInternal<IsColumnMajor, FALSE, TRUE>(Data.pNumeric, const_cast<float*>(pData), Offset, Count
-#ifdef _DEBUG
- , pType, GetTotalUnpackedSize(), "ID3DX11EffectMatrixVariable::SetMatrixArray");
-#else
- );
-#endif
-}
-
-template<typename IBaseInterface, BOOL IsColumnMajor>
-HRESULT TMatrix4x4Variable<IBaseInterface, IsColumnMajor>::GetMatrixArray(float *pData, UINT Offset, UINT Count)
-{
- return DoMatrix4x4ArrayInternal<IsColumnMajor, FALSE, FALSE>(Data.pNumeric, pData, Offset, Count
-#ifdef _DEBUG
- , pType, GetTotalUnpackedSize(), "ID3DX11EffectMatrixVariable::GetMatrixArray");
-#else
- );
-#endif
-}
-
-template<typename IBaseInterface, BOOL IsColumnMajor>
-HRESULT TMatrix4x4Variable<IBaseInterface, IsColumnMajor>::SetMatrixTranspose(CONST float *pData)
-{
- DirtyVariable();
- return DoMatrix4x4ArrayInternal<IsColumnMajor, TRUE, TRUE>(Data.pNumeric, const_cast<float*>(pData), 0, 1
-#ifdef _DEBUG
- , pType, GetTotalUnpackedSize(), "ID3DX11EffectMatrixVariable::SetMatrixTranspose");
-#else
- );
-#endif
-}
-
-template<typename IBaseInterface, BOOL IsColumnMajor>
-HRESULT TMatrix4x4Variable<IBaseInterface, IsColumnMajor>::GetMatrixTranspose(float *pData)
-{
- return DoMatrix4x4ArrayInternal<IsColumnMajor, TRUE, FALSE>(Data.pNumeric, pData, 0, 1
-#ifdef _DEBUG
- , pType, GetTotalUnpackedSize(), "ID3DX11EffectMatrixVariable::GetMatrixTranspose");
-#else
- );
-#endif
-}
-
-template<typename IBaseInterface, BOOL IsColumnMajor>
-HRESULT TMatrix4x4Variable<IBaseInterface, IsColumnMajor>::SetMatrixTransposeArray(CONST float *pData, UINT Offset, UINT Count)
-{
- DirtyVariable();
- return DoMatrix4x4ArrayInternal<IsColumnMajor, TRUE, TRUE>(Data.pNumeric, const_cast<float*>(pData), Offset, Count
-#ifdef _DEBUG
- , pType, GetTotalUnpackedSize(), "ID3DX11EffectMatrixVariable::SetMatrixTransposeArray");
-#else
- );
-#endif
-}
-
-template<typename IBaseInterface, BOOL IsColumnMajor>
-HRESULT TMatrix4x4Variable<IBaseInterface, IsColumnMajor>::GetMatrixTransposeArray(float *pData, UINT Offset, UINT Count)
-{
- return DoMatrix4x4ArrayInternal<IsColumnMajor, TRUE, FALSE>(Data.pNumeric, pData, Offset, Count
-#ifdef _DEBUG
- , pType, GetTotalUnpackedSize(), "ID3DX11EffectMatrixVariable::GetMatrixTransposeArray");
-#else
- );
-#endif
-}
-
-#ifdef _DEBUG
-
-// Useful object macro to check bounds and parameters
-#define CHECK_OBJECT_ARRAY_BOUNDS(Offset, Count, Pointer) \
- HRESULT hr = S_OK; \
- VERIFYPARAMETER(Pointer) \
- UINT elements = IsArray() ? pType->Elements : 1; \
- \
- if ((Offset + Count < Offset) || (elements < Offset + Count)) \
- { \
- DPF(0, "%s: Invalid range specified", pFuncName); \
- VH(E_INVALIDARG); \
- } \
-
-#define CHECK_OBJECT_SCALAR_BOUNDS(Index, Pointer) \
- HRESULT hr = S_OK; \
- VERIFYPARAMETER(Pointer) \
- UINT elements = IsArray() ? pType->Elements : 1; \
- \
- if (Index >= elements) \
- { \
- DPF(0, "%s: Invalid index specified", pFuncName); \
- VH(E_INVALIDARG); \
- } \
-
-#define CHECK_SCALAR_BOUNDS(Index) \
- HRESULT hr = S_OK; \
- UINT elements = IsArray() ? pType->Elements : 1; \
- \
- if (Index >= elements) \
-{ \
- DPF(0, "%s: Invalid index specified", pFuncName); \
- VH(E_INVALIDARG); \
-} \
-
-#else // _DEBUG
-
-#define CHECK_OBJECT_ARRAY_BOUNDS(Offset, Count, Pointer) \
- HRESULT hr = S_OK; \
-
-#define CHECK_OBJECT_SCALAR_BOUNDS(Index, Pointer) \
- HRESULT hr = S_OK; \
-
-#define CHECK_SCALAR_BOUNDS(Index) \
- HRESULT hr = S_OK; \
-
-#endif // _DEBUG
-
-//////////////////////////////////////////////////////////////////////////
-// ID3DX11EffectStringVariable (TStringVariable implementation)
-//////////////////////////////////////////////////////////////////////////
-
-template<typename IBaseInterface, BOOL IsAnnotation>
-struct TStringVariable : public IBaseInterface
-{
- STDMETHOD(GetString)(LPCSTR *ppString);
- STDMETHOD(GetStringArray)( __out_ecount(Count) LPCSTR *ppStrings, UINT Offset, UINT Count );
-};
-
-template<typename IBaseInterface, BOOL IsAnnotation>
-HRESULT TStringVariable<IBaseInterface, IsAnnotation>::GetString(LPCSTR *ppString)
-{
- HRESULT hr = S_OK;
- LPCSTR pFuncName = "ID3DX11EffectStringVariable::GetString";
-
- VERIFYPARAMETER(ppString);
-
- if (GetTopLevelEntity()->pEffect->IsOptimized())
- {
- DPF(0, "%s: Effect has been Optimize()'ed; all string/reflection data has been deleted", pFuncName);
- return D3DERR_INVALIDCALL;
- }
-
- D3DXASSERT(NULL != Data.pString);
-
- *ppString = Data.pString->pString;
-
-lExit:
- return hr;
-}
-
-template<typename IBaseInterface, BOOL IsAnnotation>
-HRESULT TStringVariable<IBaseInterface, IsAnnotation>::GetStringArray( __out_ecount(Count) LPCSTR *ppStrings, UINT Offset, UINT Count)
-{
- LPCSTR pFuncName = "ID3DX11EffectStringVariable::GetStringArray";
-
- CHECK_OBJECT_ARRAY_BOUNDS(Offset, Count, ppStrings);
-
- if (GetTopLevelEntity()->pEffect->IsOptimized())
- {
- DPF(0, "%s: Effect has been Optimize()'ed; all string/reflection data has been deleted", pFuncName);
- return D3DERR_INVALIDCALL;
- }
-
- D3DXASSERT(NULL != Data.pString);
-
- UINT i;
- for (i = 0; i < Count; ++ i)
- {
- ppStrings[i] = (Data.pString + Offset + i)->pString;
- }
-
-lExit:
- return hr;
-}
-
-//////////////////////////////////////////////////////////////////////////
-// ID3DX11EffectClassInstanceVariable (TClassInstanceVariable implementation)
-//////////////////////////////////////////////////////////////////////////
-
-template<typename IBaseInterface>
-struct TClassInstanceVariable : public IBaseInterface
-{
- STDMETHOD(GetClassInstance)(ID3D11ClassInstance **ppClassInstance);
-};
-
-template<typename IBaseClassInstance>
-HRESULT TClassInstanceVariable<IBaseClassInstance>::GetClassInstance(ID3D11ClassInstance** ppClassInstance)
-{
- HRESULT hr = S_OK;
- LPCSTR pFuncName = "ID3DX11EffectClassInstanceVariable::GetClassInstance";
-
- D3DXASSERT( pMemberData != NULL );
- *ppClassInstance = pMemberData->Data.pD3DClassInstance;
- SAFE_ADDREF(*ppClassInstance);
-
-lExit:
- return hr;
-}
-
-//////////////////////////////////////////////////////////////////////////
-// ID3DX11EffectInterfaceeVariable (TInterfaceVariable implementation)
-//////////////////////////////////////////////////////////////////////////
-
-template<typename IBaseInterface>
-struct TInterfaceVariable : public IBaseInterface
-{
- STDMETHOD(SetClassInstance)(ID3DX11EffectClassInstanceVariable *pEffectClassInstance);
- STDMETHOD(GetClassInstance)(ID3DX11EffectClassInstanceVariable **ppEffectClassInstance);
-};
-
-template<typename IBaseInterface>
-HRESULT TInterfaceVariable<IBaseInterface>::SetClassInstance(ID3DX11EffectClassInstanceVariable *pEffectClassInstance)
-{
- HRESULT hr = S_OK;
- LPCSTR pFuncName = "ID3DX11EffectInterfaceVariable::SetClassInstance";
-
- // Note that we don't check if the types are compatible. The debug layer will complain if it is.
- // IsValid() will not catch type mismatches.
- SClassInstanceGlobalVariable* pCI = (SClassInstanceGlobalVariable*)pEffectClassInstance;
- Data.pInterface->pClassInstance = pCI;
-
-lExit:
- return hr;
-}
-
-template<typename IBaseInterface>
-HRESULT TInterfaceVariable<IBaseInterface>::GetClassInstance(ID3DX11EffectClassInstanceVariable **ppEffectClassInstance)
-{
- HRESULT hr = S_OK;
- LPCSTR pFuncName = "ID3DX11EffectInterfaceVariable::GetClassInstance";
-
-#ifdef _DEBUG
- VERIFYPARAMETER(ppEffectClassInstance);
-#endif
-
- *ppEffectClassInstance = Data.pInterface->pClassInstance;
-
-lExit:
- return hr;
-}
-
-//////////////////////////////////////////////////////////////////////////
-// ID3DX11EffectShaderResourceVariable (TShaderResourceVariable implementation)
-//////////////////////////////////////////////////////////////////////////
-
-template<typename IBaseInterface>
-struct TShaderResourceVariable : public IBaseInterface
-{
- STDMETHOD(SetResource)(ID3D11ShaderResourceView *pResource);
- STDMETHOD(GetResource)(ID3D11ShaderResourceView **ppResource);
-
- STDMETHOD(SetResourceArray)(ID3D11ShaderResourceView **ppResources, UINT Offset, UINT Count);
- STDMETHOD(GetResourceArray)(ID3D11ShaderResourceView **ppResources, UINT Offset, UINT Count);
-};
-
-static LPCSTR GetTextureTypeNameFromEnum(EObjectType ObjectType)
-{
- switch (ObjectType)
- {
- case EOT_Buffer:
- return "Buffer";
- case EOT_Texture:
- return "texture";
- case EOT_Texture1D:
- case EOT_Texture1DArray:
- return "Texture1D";
- case EOT_Texture2DMS:
- case EOT_Texture2DMSArray:
- return "Texture2DMS";
- case EOT_Texture2D:
- case EOT_Texture2DArray:
- return "Texture2D";
- case EOT_Texture3D:
- return "Texture3D";
- case EOT_TextureCube:
- return "TextureCube";
- case EOT_TextureCubeArray:
- return "TextureCubeArray";
- case EOT_RWTexture1D:
- case EOT_RWTexture1DArray:
- return "RWTexture1D";
- case EOT_RWTexture2D:
- case EOT_RWTexture2DArray:
- return "RWTexture2D";
- case EOT_RWTexture3D:
- return "RWTexture3D";
- case EOT_RWBuffer:
- return "RWBuffer";
- case EOT_ByteAddressBuffer:
- return "ByteAddressBuffer";
- case EOT_RWByteAddressBuffer:
- return "RWByteAddressBuffer";
- case EOT_StructuredBuffer:
- return "StructuredBuffe";
- case EOT_RWStructuredBuffer:
- return "RWStructuredBuffer";
- case EOT_RWStructuredBufferAlloc:
- return "RWStructuredBufferAlloc";
- case EOT_RWStructuredBufferConsume:
- return "RWStructuredBufferConsume";
- case EOT_AppendStructuredBuffer:
- return "AppendStructuredBuffer";
- case EOT_ConsumeStructuredBuffer:
- return "ConsumeStructuredBuffer";
- }
- return "<unknown texture format>";
-}
-
-static LPCSTR GetResourceDimensionNameFromEnum(D3D11_RESOURCE_DIMENSION ResourceDimension)
-{
- switch (ResourceDimension)
- {
- case D3D11_RESOURCE_DIMENSION_BUFFER:
- return "Buffer";
- case D3D11_RESOURCE_DIMENSION_TEXTURE1D:
- return "Texture1D";
- case D3D11_RESOURCE_DIMENSION_TEXTURE2D:
- return "Texture2D";
- case D3D11_RESOURCE_DIMENSION_TEXTURE3D:
- return "Texture3D";
- }
- return "<unknown texture format>";
-}
-
-static LPCSTR GetSRVDimensionNameFromEnum(D3D11_SRV_DIMENSION ViewDimension)
-{
- switch (ViewDimension)
- {
- case D3D11_SRV_DIMENSION_BUFFER:
- case D3D11_SRV_DIMENSION_BUFFEREX:
- return "Buffer";
- case D3D11_SRV_DIMENSION_TEXTURE1D:
- return "Texture1D";
- case D3D11_SRV_DIMENSION_TEXTURE1DARRAY:
- return "Texture1DArray";
- case D3D11_SRV_DIMENSION_TEXTURE2D:
- return "Texture2D";
- case D3D11_SRV_DIMENSION_TEXTURE2DARRAY:
- return "Texture2DArray";
- case D3D11_SRV_DIMENSION_TEXTURE2DMS:
- return "Texture2DMS";
- case D3D11_SRV_DIMENSION_TEXTURE2DMSARRAY:
- return "Texture2DMSArray";
- case D3D11_SRV_DIMENSION_TEXTURE3D:
- return "Texture3D";
- case D3D11_SRV_DIMENSION_TEXTURECUBE:
- return "TextureCube";
- }
- return "<unknown texture format>";
-}
-
-static LPCSTR GetUAVDimensionNameFromEnum(D3D11_UAV_DIMENSION ViewDimension)
-{
- switch (ViewDimension)
- {
- case D3D11_UAV_DIMENSION_BUFFER:
- return "Buffer";
- case D3D11_UAV_DIMENSION_TEXTURE1D:
- return "RWTexture1D";
- case D3D11_UAV_DIMENSION_TEXTURE1DARRAY:
- return "RWTexture1DArray";
- case D3D11_UAV_DIMENSION_TEXTURE2D:
- return "RWTexture2D";
- case D3D11_UAV_DIMENSION_TEXTURE2DARRAY:
- return "RWTexture2DArray";
- case D3D11_UAV_DIMENSION_TEXTURE3D:
- return "RWTexture3D";
- }
- return "<unknown texture format>";
-}
-
-static LPCSTR GetRTVDimensionNameFromEnum(D3D11_RTV_DIMENSION ViewDimension)
-{
- switch (ViewDimension)
- {
- case D3D11_RTV_DIMENSION_BUFFER:
- return "Buffer";
- case D3D11_RTV_DIMENSION_TEXTURE1D:
- return "Texture1D";
- case D3D11_RTV_DIMENSION_TEXTURE1DARRAY:
- return "Texture1DArray";
- case D3D11_RTV_DIMENSION_TEXTURE2D:
- return "Texture2D";
- case D3D11_RTV_DIMENSION_TEXTURE2DARRAY:
- return "Texture2DArray";
- case D3D11_RTV_DIMENSION_TEXTURE2DMS:
- return "Texture2DMS";
- case D3D11_RTV_DIMENSION_TEXTURE2DMSARRAY:
- return "Texture2DMSArray";
- case D3D11_RTV_DIMENSION_TEXTURE3D:
- return "Texture3D";
- }
- return "<unknown texture format>";
-}
-
-static LPCSTR GetDSVDimensionNameFromEnum(D3D11_DSV_DIMENSION ViewDimension)
-{
- switch (ViewDimension)
- {
- case D3D11_DSV_DIMENSION_TEXTURE1D:
- return "Texture1D";
- case D3D11_DSV_DIMENSION_TEXTURE1DARRAY:
- return "Texture1DArray";
- case D3D11_DSV_DIMENSION_TEXTURE2D:
- return "Texture2D";
- case D3D11_DSV_DIMENSION_TEXTURE2DARRAY:
- return "Texture2DArray";
- case D3D11_DSV_DIMENSION_TEXTURE2DMS:
- return "Texture2DMS";
- case D3D11_DSV_DIMENSION_TEXTURE2DMSARRAY:
- return "Texture2DMSArray";
- }
- return "<unknown texture format>";
-}
-
-static HRESULT ValidateTextureType(ID3D11ShaderResourceView *pView, EObjectType ObjectType, LPCSTR pFuncName)
-{
- if (NULL != pView)
- {
- D3D11_SHADER_RESOURCE_VIEW_DESC desc;
- pView->GetDesc(&desc);
- switch (ObjectType)
- {
- case EOT_Texture:
- if (desc.ViewDimension != D3D11_SRV_DIMENSION_BUFFER && desc.ViewDimension != D3D11_SRV_DIMENSION_BUFFEREX)
- return S_OK;
- break;
- case EOT_Buffer:
- if (desc.ViewDimension != D3D11_SRV_DIMENSION_BUFFER && desc.ViewDimension != D3D11_SRV_DIMENSION_BUFFEREX)
- break;
- if (desc.ViewDimension == D3D11_SRV_DIMENSION_BUFFEREX && (desc.BufferEx.Flags & D3D11_BUFFEREX_SRV_FLAG_RAW))
- {
- DPF(0, "%s: Resource type mismatch; %s expected, ByteAddressBuffer provided.", pFuncName, GetTextureTypeNameFromEnum(ObjectType));
- return E_INVALIDARG;
- }
- else
- {
- ID3D11Buffer* pBuffer = NULL;
- pView->GetResource( (ID3D11Resource**)&pBuffer );
- D3DXASSERT( pBuffer != NULL );
- D3D11_BUFFER_DESC BufDesc;
- pBuffer->GetDesc( &BufDesc );
- SAFE_RELEASE( pBuffer );
- if( BufDesc.MiscFlags & D3D11_RESOURCE_MISC_BUFFER_STRUCTURED )
- {
- DPF(0, "%s: Resource type mismatch; %s expected, StructuredBuffer provided.", pFuncName, GetTextureTypeNameFromEnum(ObjectType));
- return E_INVALIDARG;
- }
- else
- {
- return S_OK;
- }
- }
- break;
- case EOT_Texture1D:
- case EOT_Texture1DArray:
- if (desc.ViewDimension == D3D11_SRV_DIMENSION_TEXTURE1D ||
- desc.ViewDimension == D3D11_SRV_DIMENSION_TEXTURE1DARRAY)
- return S_OK;
- break;
- case EOT_Texture2D:
- case EOT_Texture2DArray:
- if (desc.ViewDimension == D3D11_SRV_DIMENSION_TEXTURE2D ||
- desc.ViewDimension == D3D11_SRV_DIMENSION_TEXTURE2DARRAY)
- return S_OK;
- break;
- case EOT_Texture2DMS:
- case EOT_Texture2DMSArray:
- if (desc.ViewDimension == D3D11_SRV_DIMENSION_TEXTURE2DMS ||
- desc.ViewDimension == D3D11_SRV_DIMENSION_TEXTURE2DMSARRAY)
- return S_OK;
- break;
- case EOT_Texture3D:
- if (desc.ViewDimension == D3D11_SRV_DIMENSION_TEXTURE3D)
- return S_OK;
- break;
- case EOT_TextureCube:
- case EOT_TextureCubeArray:
- if (desc.ViewDimension == D3D11_SRV_DIMENSION_TEXTURECUBE ||
- desc.ViewDimension == D3D11_SRV_DIMENSION_TEXTURECUBEARRAY)
- return S_OK;
- break;
- case EOT_ByteAddressBuffer:
- if (desc.ViewDimension == D3D11_SRV_DIMENSION_BUFFEREX && (desc.BufferEx.Flags & D3D11_BUFFEREX_SRV_FLAG_RAW))
- return S_OK;
- break;
- case EOT_StructuredBuffer:
- if (desc.ViewDimension == D3D11_SRV_DIMENSION_BUFFEREX || desc.ViewDimension == D3D11_SRV_DIMENSION_BUFFER)
- {
- ID3D11Buffer* pBuffer = NULL;
- pView->GetResource( (ID3D11Resource**)&pBuffer );
- D3DXASSERT( pBuffer != NULL );
- D3D11_BUFFER_DESC BufDesc;
- pBuffer->GetDesc( &BufDesc );
- SAFE_RELEASE( pBuffer );
- if( BufDesc.MiscFlags & D3D11_RESOURCE_MISC_BUFFER_STRUCTURED )
- {
- return S_OK;
- }
- else
- {
- DPF(0, "%s: Resource type mismatch; %s expected, non-structured Buffer provided.", pFuncName, GetTextureTypeNameFromEnum(ObjectType));
- return E_INVALIDARG;
- }
- }
- break;
- default:
- D3DXASSERT(0); // internal error, should never get here
- return E_FAIL;
- }
-
-
- DPF(0, "%s: Resource type mismatch; %s expected, %s provided.", pFuncName, GetTextureTypeNameFromEnum(ObjectType), GetSRVDimensionNameFromEnum(desc.ViewDimension));
- return E_INVALIDARG;
- }
- return S_OK;
-}
-
-template<typename IBaseInterface>
-HRESULT TShaderResourceVariable<IBaseInterface>::SetResource(ID3D11ShaderResourceView *pResource)
-{
- HRESULT hr = S_OK;
-
-#ifdef _DEBUG
- LPCSTR pFuncName = "ID3DX11EffectShaderResourceVariable::SetResource";
-
- VH(ValidateTextureType(pResource, pType->ObjectType, pFuncName));
-#endif
-
- // Texture variables don't need to be dirtied.
- SAFE_ADDREF(pResource);
- SAFE_RELEASE(Data.pShaderResource->pShaderResource);
- Data.pShaderResource->pShaderResource = pResource;
-
-lExit:
- return hr;
-}
-
-template<typename IBaseInterface>
-HRESULT TShaderResourceVariable<IBaseInterface>::GetResource(ID3D11ShaderResourceView **ppResource)
-{
- HRESULT hr = S_OK;
-
-#ifdef _DEBUG
- LPCSTR pFuncName = "ID3DX11EffectShaderResourceVariable::GetResource";
-
- VERIFYPARAMETER(ppResource);
-#endif
-
- *ppResource = Data.pShaderResource->pShaderResource;
- SAFE_ADDREF(*ppResource);
-
-lExit:
- return hr;
-}
-
-template<typename IBaseInterface>
-HRESULT TShaderResourceVariable<IBaseInterface>::SetResourceArray(ID3D11ShaderResourceView **ppResources, UINT Offset, UINT Count)
-{
- LPCSTR pFuncName = "ID3DX11EffectShaderResourceVariable::SetResourceArray";
- UINT i;
-
- CHECK_OBJECT_ARRAY_BOUNDS(Offset, Count, ppResources);
-
-#ifdef _DEBUG
- for (i = 0; i < Count; ++ i)
- {
- VH(ValidateTextureType(ppResources[i], pType->ObjectType, pFuncName));
- }
-#endif
-
- // Texture variables don't need to be dirtied.
- for (i = 0; i < Count; ++ i)
- {
- SShaderResource *pResourceBlock = Data.pShaderResource + Offset + i;
- SAFE_ADDREF(ppResources[i]);
- SAFE_RELEASE(pResourceBlock->pShaderResource);
- pResourceBlock->pShaderResource = ppResources[i];
- }
-
-lExit:
- return hr;
-}
-
-template<typename IBaseInterface>
-HRESULT TShaderResourceVariable<IBaseInterface>::GetResourceArray(ID3D11ShaderResourceView **ppResources, UINT Offset, UINT Count)
-{
- LPCSTR pFuncName = "ID3DX11EffectShaderResourceVariable::GetResourceArray";
-
- CHECK_OBJECT_ARRAY_BOUNDS(Offset, Count, ppResources);
-
- UINT i;
- for (i = 0; i < Count; ++ i)
- {
- ppResources[i] = (Data.pShaderResource + Offset + i)->pShaderResource;
- SAFE_ADDREF(ppResources[i]);
- }
-
-lExit:
- return hr;
-}
-
-//////////////////////////////////////////////////////////////////////////
-// ID3DX11EffectUnorderedAccessViewVariable (TUnorderedAccessViewVariable implementation)
-//////////////////////////////////////////////////////////////////////////
-
-template<typename IBaseInterface>
-struct TUnorderedAccessViewVariable : public IBaseInterface
-{
- STDMETHOD(SetUnorderedAccessView)(ID3D11UnorderedAccessView *pResource);
- STDMETHOD(GetUnorderedAccessView)(ID3D11UnorderedAccessView **ppResource);
-
- STDMETHOD(SetUnorderedAccessViewArray)(ID3D11UnorderedAccessView **ppResources, UINT Offset, UINT Count);
- STDMETHOD(GetUnorderedAccessViewArray)(ID3D11UnorderedAccessView **ppResources, UINT Offset, UINT Count);
-};
-
-static HRESULT ValidateTextureType(ID3D11UnorderedAccessView *pView, EObjectType ObjectType, LPCSTR pFuncName)
-{
- if (NULL != pView)
- {
- D3D11_UNORDERED_ACCESS_VIEW_DESC desc;
- pView->GetDesc(&desc);
- switch (ObjectType)
- {
- case EOT_RWBuffer:
- if (desc.ViewDimension != D3D11_UAV_DIMENSION_BUFFER)
- break;
- if (desc.Buffer.Flags & D3D11_BUFFER_UAV_FLAG_RAW)
- {
- DPF(0, "%s: Resource type mismatch; %s expected, RWByteAddressBuffer provided.", pFuncName, GetTextureTypeNameFromEnum(ObjectType));
- return E_INVALIDARG;
- }
- else
- {
- ID3D11Buffer* pBuffer = NULL;
- pView->GetResource( (ID3D11Resource**)&pBuffer );
- D3DXASSERT( pBuffer != NULL );
- D3D11_BUFFER_DESC BufDesc;
- pBuffer->GetDesc( &BufDesc );
- SAFE_RELEASE( pBuffer );
- if( BufDesc.MiscFlags & D3D11_RESOURCE_MISC_BUFFER_STRUCTURED )
- {
- DPF(0, "%s: Resource type mismatch; %s expected, an RWStructuredBuffer provided.", pFuncName, GetTextureTypeNameFromEnum(ObjectType));
- return E_INVALIDARG;
- }
- else
- {
- return S_OK;
- }
- }
- break;
- case EOT_RWTexture1D:
- case EOT_RWTexture1DArray:
- if (desc.ViewDimension == D3D11_UAV_DIMENSION_TEXTURE1D ||
- desc.ViewDimension == D3D11_UAV_DIMENSION_TEXTURE1DARRAY)
- return S_OK;
- break;
- case EOT_RWTexture2D:
- case EOT_RWTexture2DArray:
- if (desc.ViewDimension == D3D11_UAV_DIMENSION_TEXTURE2D ||
- desc.ViewDimension == D3D11_UAV_DIMENSION_TEXTURE2DARRAY)
- return S_OK;
- break;
- case EOT_RWTexture3D:
- if (desc.ViewDimension == D3D11_UAV_DIMENSION_TEXTURE3D)
- return S_OK;
- break;
- case EOT_RWByteAddressBuffer:
- if (desc.ViewDimension == D3D11_UAV_DIMENSION_BUFFER && (desc.Buffer.Flags & D3D11_BUFFER_UAV_FLAG_RAW))
- return S_OK;
- break;
- case EOT_RWStructuredBuffer:
- if (desc.ViewDimension == D3D11_UAV_DIMENSION_BUFFER)
- {
- ID3D11Buffer* pBuffer = NULL;
- pView->GetResource( (ID3D11Resource**)&pBuffer );
- D3DXASSERT( pBuffer != NULL );
- D3D11_BUFFER_DESC BufDesc;
- pBuffer->GetDesc( &BufDesc );
- SAFE_RELEASE( pBuffer );
- if( BufDesc.MiscFlags & D3D11_RESOURCE_MISC_BUFFER_STRUCTURED )
- {
- return S_OK;
- }
- else
- {
- DPF(0, "%s: Resource type mismatch; %s expected, non-structured Buffer provided.", pFuncName, GetTextureTypeNameFromEnum(ObjectType));
- return E_INVALIDARG;
- }
- }
- break;
- case EOT_RWStructuredBufferAlloc:
- case EOT_RWStructuredBufferConsume:
- if (desc.ViewDimension != D3D11_UAV_DIMENSION_BUFFER)
- break;
- if (desc.Buffer.Flags & D3D11_BUFFER_UAV_FLAG_COUNTER)
- {
- return S_OK;
- }
- else
- {
- DPF(0, "%s: Resource type mismatch; %s expected, non-Counter buffer provided.", pFuncName, GetTextureTypeNameFromEnum(ObjectType));
- return E_INVALIDARG;
- }
- break;
- case EOT_AppendStructuredBuffer:
- case EOT_ConsumeStructuredBuffer:
- if (desc.ViewDimension != D3D11_UAV_DIMENSION_BUFFER)
- break;
- if (desc.Buffer.Flags & D3D11_BUFFER_UAV_FLAG_APPEND)
- {
- return S_OK;
- }
- else
- {
- DPF(0, "%s: Resource type mismatch; %s expected, non-Append buffer provided.", pFuncName, GetTextureTypeNameFromEnum(ObjectType));
- return E_INVALIDARG;
- }
- break;
- default:
- D3DXASSERT(0); // internal error, should never get here
- return E_FAIL;
- }
-
-
- DPF(0, "%s: Resource type mismatch; %s expected, %s provided.", pFuncName, GetTextureTypeNameFromEnum(ObjectType), GetUAVDimensionNameFromEnum(desc.ViewDimension));
- return E_INVALIDARG;
- }
- return S_OK;
-}
-
-template<typename IBaseInterface>
-HRESULT TUnorderedAccessViewVariable<IBaseInterface>::SetUnorderedAccessView(ID3D11UnorderedAccessView *pResource)
-{
- HRESULT hr = S_OK;
-
-#ifdef _DEBUG
- LPCSTR pFuncName = "ID3DX11EffectUnorderedAccessViewVariable::SetUnorderedAccessView";
-
- VH(ValidateTextureType(pResource, pType->ObjectType, pFuncName));
-#endif
-
- // UAV variables don't need to be dirtied.
- SAFE_ADDREF(pResource);
- SAFE_RELEASE(Data.pUnorderedAccessView->pUnorderedAccessView);
- Data.pUnorderedAccessView->pUnorderedAccessView = pResource;
-
-lExit:
- return hr;
-}
-
-template<typename IBaseInterface>
-HRESULT TUnorderedAccessViewVariable<IBaseInterface>::GetUnorderedAccessView(ID3D11UnorderedAccessView **ppResource)
-{
- HRESULT hr = S_OK;
-
-#ifdef _DEBUG
- LPCSTR pFuncName = "ID3DX11EffectUnorderedAccessViewVariable::GetUnorderedAccessView";
-
- VERIFYPARAMETER(ppResource);
-#endif
-
- *ppResource = Data.pUnorderedAccessView->pUnorderedAccessView;
- SAFE_ADDREF(*ppResource);
-
-lExit:
- return hr;
-}
-
-template<typename IBaseInterface>
-HRESULT TUnorderedAccessViewVariable<IBaseInterface>::SetUnorderedAccessViewArray(ID3D11UnorderedAccessView **ppResources, UINT Offset, UINT Count)
-{
- LPCSTR pFuncName = "ID3DX11EffectUnorderedAccessViewVariable::SetUnorderedAccessViewArray";
- UINT i;
-
- CHECK_OBJECT_ARRAY_BOUNDS(Offset, Count, ppResources);
-
-#ifdef _DEBUG
- for (i = 0; i < Count; ++ i)
- {
- VH(ValidateTextureType(ppResources[i], pType->ObjectType, pFuncName));
- }
-#endif
-
- // Texture variables don't need to be dirtied.
- for (i = 0; i < Count; ++ i)
- {
- SUnorderedAccessView *pResourceBlock = Data.pUnorderedAccessView + Offset + i;
- SAFE_ADDREF(ppResources[i]);
- SAFE_RELEASE(pResourceBlock->pUnorderedAccessView);
- pResourceBlock->pUnorderedAccessView = ppResources[i];
- }
-
-lExit:
- return hr;
-}
-
-template<typename IBaseInterface>
-HRESULT TUnorderedAccessViewVariable<IBaseInterface>::GetUnorderedAccessViewArray(ID3D11UnorderedAccessView **ppResources, UINT Offset, UINT Count)
-{
- LPCSTR pFuncName = "ID3DX11EffectUnorderedAccessViewVariable::GetUnorderedAccessViewArray";
-
- CHECK_OBJECT_ARRAY_BOUNDS(Offset, Count, ppResources);
-
- UINT i;
- for (i = 0; i < Count; ++ i)
- {
- ppResources[i] = (Data.pUnorderedAccessView + Offset + i)->pUnorderedAccessView;
- SAFE_ADDREF(ppResources[i]);
- }
-
-lExit:
- return hr;
-}
-
-//////////////////////////////////////////////////////////////////////////
-// ID3DX11EffectRenderTargetViewVariable (TRenderTargetViewVariable implementation)
-//////////////////////////////////////////////////////////////////////////
-
-template<typename IBaseInterface>
-struct TRenderTargetViewVariable : public IBaseInterface
-{
- STDMETHOD(SetRenderTarget)(ID3D11RenderTargetView *pResource);
- STDMETHOD(GetRenderTarget)(ID3D11RenderTargetView **ppResource);
-
- STDMETHOD(SetRenderTargetArray)(ID3D11RenderTargetView **ppResources, UINT Offset, UINT Count);
- STDMETHOD(GetRenderTargetArray)(ID3D11RenderTargetView **ppResources, UINT Offset, UINT Count);
-};
-
-
-template<typename IBaseInterface>
-HRESULT TRenderTargetViewVariable<IBaseInterface>::SetRenderTarget(ID3D11RenderTargetView *pResource)
-{
- HRESULT hr = S_OK;
-
-#ifdef _DEBUG
- LPCSTR pFuncName = "ID3DX11EffectRenderTargetVariable::SetRenderTarget";
-
-#endif
-
- // Texture variables don't need to be dirtied.
- SAFE_ADDREF(pResource);
- SAFE_RELEASE(Data.pRenderTargetView->pRenderTargetView);
- Data.pRenderTargetView->pRenderTargetView = pResource;
-
-lExit:
- return hr;
-}
-
-template<typename IBaseInterface>
-HRESULT TRenderTargetViewVariable<IBaseInterface>::GetRenderTarget(ID3D11RenderTargetView **ppResource)
-{
- HRESULT hr = S_OK;
-
- *ppResource = Data.pRenderTargetView->pRenderTargetView;
- SAFE_ADDREF(*ppResource);
-
-lExit:
- return hr;
-}
-
-template<typename IBaseInterface>
-HRESULT TRenderTargetViewVariable<IBaseInterface>::SetRenderTargetArray(ID3D11RenderTargetView **ppResources, UINT Offset, UINT Count)
-{
- LPCSTR pFuncName = "ID3DX11EffectRenderTargetVariable::SetRenderTargetArray";
- UINT i;
-
- CHECK_OBJECT_ARRAY_BOUNDS(Offset, Count, ppResources);
-
- // Texture variables don't need to be dirtied.
- for (i = 0; i < Count; ++ i)
- {
- SRenderTargetView *pResourceBlock = Data.pRenderTargetView + Offset + i;
- SAFE_ADDREF(ppResources[i]);
- SAFE_RELEASE(pResourceBlock->pRenderTargetView);
- pResourceBlock->pRenderTargetView = ppResources[i];
- }
-
-lExit:
- return hr;
-}
-
-template<typename IBaseInterface>
-HRESULT TRenderTargetViewVariable<IBaseInterface>::GetRenderTargetArray(ID3D11RenderTargetView **ppResources, UINT Offset, UINT Count)
-{
- LPCSTR pFuncName = "ID3DX11EffectRenderTargetVariable::GetRenderTargetArray";
-
- CHECK_OBJECT_ARRAY_BOUNDS(Offset, Count, ppResources);
-
- UINT i;
- for (i = 0; i < Count; ++ i)
- {
- ppResources[i] = (Data.pRenderTargetView + Offset + i)->pRenderTargetView;
- SAFE_ADDREF(ppResources[i]);
- }
-
-lExit:
- return hr;
-}
-
-//////////////////////////////////////////////////////////////////////////
-// ID3DX11EffectDepthStencilViewVariable (TDepthStencilViewVariable implementation)
-//////////////////////////////////////////////////////////////////////////
-
-template<typename IBaseInterface>
-struct TDepthStencilViewVariable : public IBaseInterface
-{
- STDMETHOD(SetDepthStencil)(ID3D11DepthStencilView *pResource);
- STDMETHOD(GetDepthStencil)(ID3D11DepthStencilView **ppResource);
-
- STDMETHOD(SetDepthStencilArray)(ID3D11DepthStencilView **ppResources, UINT Offset, UINT Count);
- STDMETHOD(GetDepthStencilArray)(ID3D11DepthStencilView **ppResources, UINT Offset, UINT Count);
-};
-
-
-template<typename IBaseInterface>
-HRESULT TDepthStencilViewVariable<IBaseInterface>::SetDepthStencil(ID3D11DepthStencilView *pResource)
-{
- HRESULT hr = S_OK;
-
-#ifdef _DEBUG
- LPCSTR pFuncName = "ID3D11DepthStencilViewVariable::SetDepthStencil";
-
-#endif
-
- // Texture variables don't need to be dirtied.
- SAFE_ADDREF(pResource);
- SAFE_RELEASE(Data.pDepthStencilView->pDepthStencilView);
- Data.pDepthStencilView->pDepthStencilView = pResource;
-
-lExit:
- return hr;
-}
-
-template<typename IBaseInterface>
-HRESULT TDepthStencilViewVariable<IBaseInterface>::GetDepthStencil(ID3D11DepthStencilView **ppResource)
-{
- HRESULT hr = S_OK;
-
-#ifdef _DEBUG
- LPCSTR pFuncName = "ID3D11DepthStencilViewVariable::GetDepthStencil";
-
- VERIFYPARAMETER(ppResource);
-#endif
-
- *ppResource = Data.pDepthStencilView->pDepthStencilView;
- SAFE_ADDREF(*ppResource);
-
-lExit:
- return hr;
-}
-
-template<typename IBaseInterface>
-HRESULT TDepthStencilViewVariable<IBaseInterface>::SetDepthStencilArray(ID3D11DepthStencilView **ppResources, UINT Offset, UINT Count)
-{
- LPCSTR pFuncName = "ID3D11DepthStencilViewVariable::SetDepthStencilArray";
- UINT i;
-
- CHECK_OBJECT_ARRAY_BOUNDS(Offset, Count, ppResources);
-
- // Texture variables don't need to be dirtied.
- for (i = 0; i < Count; ++ i)
- {
- SDepthStencilView *pResourceBlock = Data.pDepthStencilView + Offset + i;
- SAFE_ADDREF(ppResources[i]);
- SAFE_RELEASE(pResourceBlock->pDepthStencilView);
- pResourceBlock->pDepthStencilView = ppResources[i];
- }
-
-lExit:
- return hr;
-}
-
-template<typename IBaseInterface>
-HRESULT TDepthStencilViewVariable<IBaseInterface>::GetDepthStencilArray(ID3D11DepthStencilView **ppResources, UINT Offset, UINT Count)
-{
- LPCSTR pFuncName = "ID3D11DepthStencilViewVariable::GetDepthStencilArray";
-
- CHECK_OBJECT_ARRAY_BOUNDS(Offset, Count, ppResources);
-
- UINT i;
- for (i = 0; i < Count; ++ i)
- {
- ppResources[i] = (Data.pDepthStencilView + Offset + i)->pDepthStencilView;
- SAFE_ADDREF(ppResources[i]);
- }
-
-lExit:
- return hr;
-}
-
-
-
-////////////////////////////////////////////////////////////////////////////////
-// ID3DX11EffectShaderVariable (TShaderVariable implementation)
-////////////////////////////////////////////////////////////////////////////////
-
-template<typename IBaseInterface>
-struct TShaderVariable : public IBaseInterface
-{
- STDMETHOD(GetShaderDesc)(UINT ShaderIndex, D3DX11_EFFECT_SHADER_DESC *pDesc);
-
- STDMETHOD(GetVertexShader)(UINT ShaderIndex, ID3D11VertexShader **ppVS);
- STDMETHOD(GetGeometryShader)(UINT ShaderIndex, ID3D11GeometryShader **ppGS);
- STDMETHOD(GetPixelShader)(UINT ShaderIndex, ID3D11PixelShader **ppPS);
- STDMETHOD(GetHullShader)(UINT ShaderIndex, ID3D11HullShader **ppPS);
- STDMETHOD(GetDomainShader)(UINT ShaderIndex, ID3D11DomainShader **ppPS);
- STDMETHOD(GetComputeShader)(UINT ShaderIndex, ID3D11ComputeShader **ppPS);
-
- STDMETHOD(GetInputSignatureElementDesc)(UINT ShaderIndex, UINT Element, D3D11_SIGNATURE_PARAMETER_DESC *pDesc);
- STDMETHOD(GetOutputSignatureElementDesc)(UINT ShaderIndex, UINT Element, D3D11_SIGNATURE_PARAMETER_DESC *pDesc);
- STDMETHOD(GetPatchConstantSignatureElementDesc)(UINT ShaderIndex, UINT Element, D3D11_SIGNATURE_PARAMETER_DESC *pDesc);
-
- STDMETHOD_(BOOL, IsValid)();
-};
-
-template<typename IBaseInterface>
-HRESULT TShaderVariable<IBaseInterface>::GetShaderDesc(UINT ShaderIndex, D3DX11_EFFECT_SHADER_DESC *pDesc)
-{
- LPCSTR pFuncName = "ID3DX11EffectShaderVariable::GetShaderDesc";
-
- CHECK_OBJECT_SCALAR_BOUNDS(ShaderIndex, pDesc);
-
- Data.pShader[ShaderIndex].GetShaderDesc(pDesc, FALSE);
-
-lExit:
- return hr;
-}
-
-template<typename IBaseInterface>
-HRESULT TShaderVariable<IBaseInterface>::GetVertexShader(UINT ShaderIndex, ID3D11VertexShader **ppVS)
-{
- LPCSTR pFuncName = "ID3DX11EffectShaderVariable::GetVertexShader";
-
- CHECK_OBJECT_SCALAR_BOUNDS(ShaderIndex, ppVS);
-
- VH( Data.pShader[ShaderIndex].GetVertexShader(ppVS) );
-
-lExit:
- return hr;
-}
-
-template<typename IBaseInterface>
-HRESULT TShaderVariable<IBaseInterface>::GetGeometryShader(UINT ShaderIndex, ID3D11GeometryShader **ppGS)
-{
- LPCSTR pFuncName = "ID3DX11EffectShaderVariable::GetGeometryShader";
-
- CHECK_OBJECT_SCALAR_BOUNDS(ShaderIndex, ppGS);
-
- VH( Data.pShader[ShaderIndex].GetGeometryShader(ppGS) );
-
-lExit:
- return hr;
-}
-
-template<typename IBaseInterface>
-HRESULT TShaderVariable<IBaseInterface>::GetPixelShader(UINT ShaderIndex, ID3D11PixelShader **ppPS)
-{
- LPCSTR pFuncName = "ID3DX11EffectShaderVariable::GetPixelShader";
-
- CHECK_OBJECT_SCALAR_BOUNDS(ShaderIndex, ppPS);
-
- VH( Data.pShader[ShaderIndex].GetPixelShader(ppPS) );
-
-lExit:
- return hr;
-}
-
-template<typename IBaseInterface>
-HRESULT TShaderVariable<IBaseInterface>::GetHullShader(UINT ShaderIndex, ID3D11HullShader **ppHS)
-{
- LPCSTR pFuncName = "ID3DX11EffectShaderVariable::GetHullShader";
-
- CHECK_OBJECT_SCALAR_BOUNDS(ShaderIndex, ppHS);
-
- VH( Data.pShader[ShaderIndex].GetHullShader(ppHS) );
-
-lExit:
- return hr;
-}
-
-template<typename IBaseInterface>
-HRESULT TShaderVariable<IBaseInterface>::GetDomainShader(UINT ShaderIndex, ID3D11DomainShader **ppDS)
-{
- LPCSTR pFuncName = "ID3DX11EffectShaderVariable::GetDomainShader";
-
- CHECK_OBJECT_SCALAR_BOUNDS(ShaderIndex, ppDS);
-
- VH( Data.pShader[ShaderIndex].GetDomainShader(ppDS) );
-
-lExit:
- return hr;
-}
-
-template<typename IBaseInterface>
-HRESULT TShaderVariable<IBaseInterface>::GetComputeShader(UINT ShaderIndex, ID3D11ComputeShader **ppCS)
-{
- LPCSTR pFuncName = "ID3DX11EffectShaderVariable::GetComputeShader";
-
- CHECK_OBJECT_SCALAR_BOUNDS(ShaderIndex, ppCS);
-
- VH( Data.pShader[ShaderIndex].GetComputeShader(ppCS) );
-
-lExit:
- return hr;
-}
-
-template<typename IBaseInterface>
-HRESULT TShaderVariable<IBaseInterface>::GetInputSignatureElementDesc(UINT ShaderIndex, UINT Element, D3D11_SIGNATURE_PARAMETER_DESC *pDesc)
-{
- LPCSTR pFuncName = "ID3DX11EffectShaderVariable::GetInputSignatureElementDesc";
-
- CHECK_OBJECT_SCALAR_BOUNDS(ShaderIndex, pDesc);
-
- VH( Data.pShader[ShaderIndex].GetSignatureElementDesc(SShaderBlock::ST_Input, Element, pDesc) );
-
-lExit:
- return hr;
-}
-
-template<typename IBaseInterface>
-HRESULT TShaderVariable<IBaseInterface>::GetOutputSignatureElementDesc(UINT ShaderIndex, UINT Element, D3D11_SIGNATURE_PARAMETER_DESC *pDesc)
-{
- LPCSTR pFuncName = "ID3DX11EffectShaderVariable::GetOutputSignatureElementDesc";
-
- CHECK_OBJECT_SCALAR_BOUNDS(ShaderIndex, pDesc);
-
- VH( Data.pShader[ShaderIndex].GetSignatureElementDesc(SShaderBlock::ST_Output, Element, pDesc) );
-
-lExit:
- return hr;
-}
-
-template<typename IBaseInterface>
-HRESULT TShaderVariable<IBaseInterface>::GetPatchConstantSignatureElementDesc(UINT ShaderIndex, UINT Element, D3D11_SIGNATURE_PARAMETER_DESC *pDesc)
-{
- LPCSTR pFuncName = "ID3DX11EffectShaderVariable::GetPatchConstantSignatureElementDesc";
-
- CHECK_OBJECT_SCALAR_BOUNDS(ShaderIndex, pDesc);
-
- VH( Data.pShader[ShaderIndex].GetSignatureElementDesc(SShaderBlock::ST_PatchConstant, Element, pDesc) );
-
-lExit:
- return hr;
-}
-
-template<typename IBaseInterface>
-BOOL TShaderVariable<IBaseInterface>::IsValid()
-{
- UINT numElements = IsArray()? pType->Elements : 1;
- BOOL valid = TRUE;
- while( numElements > 0 && ( valid = Data.pShader[ numElements-1 ].IsValid ) )
- numElements--;
- return valid;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// ID3DX11EffectBlendVariable (TBlendVariable implementation)
-////////////////////////////////////////////////////////////////////////////////
-
-template<typename IBaseInterface>
-struct TBlendVariable : public IBaseInterface
-{
-public:
- STDMETHOD(GetBlendState)(UINT Index, ID3D11BlendState **ppBlendState);
- STDMETHOD(SetBlendState)(UINT Index, ID3D11BlendState *pBlendState);
- STDMETHOD(UndoSetBlendState)(UINT Index);
- STDMETHOD(GetBackingStore)(UINT Index, D3D11_BLEND_DESC *pBlendDesc);
- STDMETHOD_(BOOL, IsValid)();
-};
-
-template<typename IBaseInterface>
-HRESULT TBlendVariable<IBaseInterface>::GetBlendState(UINT Index, ID3D11BlendState **ppBlendState)
-{
- LPCSTR pFuncName = "ID3DX11EffectBlendVariable::GetBlendState";
-
- CHECK_OBJECT_SCALAR_BOUNDS(Index, ppBlendState);
-
- *ppBlendState = Data.pBlend[Index].pBlendObject;
- SAFE_ADDREF(*ppBlendState);
-
-lExit:
- return hr;
-}
-
-template<typename IBaseInterface>
-HRESULT TBlendVariable<IBaseInterface>::SetBlendState(UINT Index, ID3D11BlendState *pBlendState)
-{
- LPCSTR pFuncName = "ID3DX11EffectBlendState::SetBlendState";
-
- CHECK_SCALAR_BOUNDS(Index);
-
- if( !Data.pBlend[Index].IsUserManaged )
- {
- // Save original state object in case we UndoSet
- D3DXASSERT( pMemberData[Index].Type == MDT_BlendState );
- VB( pMemberData[Index].Data.pD3DEffectsManagedBlendState == NULL );
- pMemberData[Index].Data.pD3DEffectsManagedBlendState = Data.pBlend[Index].pBlendObject;
- Data.pBlend[Index].pBlendObject = NULL;
- Data.pBlend[Index].IsUserManaged = TRUE;
- }
-
- SAFE_ADDREF( pBlendState );
- SAFE_RELEASE( Data.pBlend[Index].pBlendObject );
- Data.pBlend[Index].pBlendObject = pBlendState;
- Data.pBlend[Index].IsValid = TRUE;
-lExit:
- return hr;
-}
-
-template<typename IBaseInterface>
-HRESULT TBlendVariable<IBaseInterface>::UndoSetBlendState(UINT Index)
-{
- LPCSTR pFuncName = "ID3DX11EffectBlendState::UndoSetBlendState";
-
- CHECK_SCALAR_BOUNDS(Index);
-
- if( !Data.pBlend[Index].IsUserManaged )
- {
- return S_FALSE;
- }
-
- // Revert to original state object
- SAFE_RELEASE( Data.pBlend[Index].pBlendObject );
- Data.pBlend[Index].pBlendObject = pMemberData[Index].Data.pD3DEffectsManagedBlendState;
- pMemberData[Index].Data.pD3DEffectsManagedBlendState = NULL;
- Data.pBlend[Index].IsUserManaged = FALSE;
-
-lExit:
- return hr;
-}
-
-template<typename IBaseInterface>
-HRESULT TBlendVariable<IBaseInterface>::GetBackingStore(UINT Index, D3D11_BLEND_DESC *pBlendDesc)
-{
- LPCSTR pFuncName = "ID3DX11EffectBlendVariable::GetBackingStore";
-
- CHECK_OBJECT_SCALAR_BOUNDS(Index, pBlendDesc);
-
- if( Data.pBlend[Index].IsUserManaged )
- {
- if( Data.pBlend[Index].pBlendObject )
- {
- Data.pBlend[Index].pBlendObject->GetDesc( pBlendDesc );
- }
- else
- {
- *pBlendDesc = CD3D11_BLEND_DESC( D3D11_DEFAULT );
- }
- }
- else
- {
- SBlendBlock *pBlock = Data.pBlend + Index;
- if (pBlock->ApplyAssignments(GetTopLevelEntity()->pEffect))
- {
- pBlock->pAssignments[0].LastRecomputedTime = 0; // Force a recreate of this block the next time ApplyRenderStateBlock is called
- }
-
- memcpy( pBlendDesc, &pBlock->BackingStore, sizeof(D3D11_BLEND_DESC) );
- }
-
-lExit:
- return hr;
-}
-
-template<typename IBaseInterface>
-BOOL TBlendVariable<IBaseInterface>::IsValid()
-{
- UINT numElements = IsArray()? pType->Elements : 1;
- BOOL valid = TRUE;
- while( numElements > 0 && ( valid = Data.pBlend[ numElements-1 ].IsValid ) )
- numElements--;
- return valid;
-}
-
-
-////////////////////////////////////////////////////////////////////////////////
-// ID3DX11EffectDepthStencilVariable (TDepthStencilVariable implementation)
-////////////////////////////////////////////////////////////////////////////////
-
-template<typename IBaseInterface>
-struct TDepthStencilVariable : public IBaseInterface
-{
-public:
- STDMETHOD(GetDepthStencilState)(UINT Index, ID3D11DepthStencilState **ppDepthStencilState);
- STDMETHOD(SetDepthStencilState)(UINT Index, ID3D11DepthStencilState *pDepthStencilState);
- STDMETHOD(UndoSetDepthStencilState)(UINT Index);
- STDMETHOD(GetBackingStore)(UINT Index, D3D11_DEPTH_STENCIL_DESC *pDepthStencilDesc);
- STDMETHOD_(BOOL, IsValid)();
-};
-
-template<typename IBaseInterface>
-HRESULT TDepthStencilVariable<IBaseInterface>::GetDepthStencilState(UINT Index, ID3D11DepthStencilState **ppDepthStencilState)
-{
- LPCSTR pFuncName = "ID3DX11EffectDepthStencilVariable::GetDepthStencilState";
-
- CHECK_OBJECT_SCALAR_BOUNDS(Index, ppDepthStencilState);
-
- *ppDepthStencilState = Data.pDepthStencil[Index].pDSObject;
- SAFE_ADDREF(*ppDepthStencilState);
-
-lExit:
- return hr;
-}
-
-template<typename IBaseInterface>
-HRESULT TDepthStencilVariable<IBaseInterface>::SetDepthStencilState(UINT Index, ID3D11DepthStencilState *pDepthStencilState)
-{
- LPCSTR pFuncName = "ID3DX11EffectDepthStencilState::SetDepthStencilState";
-
- CHECK_SCALAR_BOUNDS(Index);
-
- if( !Data.pDepthStencil[Index].IsUserManaged )
- {
- // Save original state object in case we UndoSet
- D3DXASSERT( pMemberData[Index].Type == MDT_DepthStencilState );
- VB( pMemberData[Index].Data.pD3DEffectsManagedDepthStencilState == NULL );
- pMemberData[Index].Data.pD3DEffectsManagedDepthStencilState = Data.pDepthStencil[Index].pDSObject;
- Data.pDepthStencil[Index].pDSObject = NULL;
- Data.pDepthStencil[Index].IsUserManaged = TRUE;
- }
-
- SAFE_ADDREF( pDepthStencilState );
- SAFE_RELEASE( Data.pDepthStencil[Index].pDSObject );
- Data.pDepthStencil[Index].pDSObject = pDepthStencilState;
- Data.pDepthStencil[Index].IsValid = TRUE;
-lExit:
- return hr;
-}
-
-template<typename IBaseInterface>
-HRESULT TDepthStencilVariable<IBaseInterface>::UndoSetDepthStencilState(UINT Index)
-{
- LPCSTR pFuncName = "ID3DX11EffectDepthStencilState::UndoSetDepthStencilState";
-
- CHECK_SCALAR_BOUNDS(Index);
-
- if( !Data.pDepthStencil[Index].IsUserManaged )
- {
- return S_FALSE;
- }
-
- // Revert to original state object
- SAFE_RELEASE( Data.pDepthStencil[Index].pDSObject );
- Data.pDepthStencil[Index].pDSObject = pMemberData[Index].Data.pD3DEffectsManagedDepthStencilState;
- pMemberData[Index].Data.pD3DEffectsManagedDepthStencilState = NULL;
- Data.pDepthStencil[Index].IsUserManaged = FALSE;
-
-lExit:
- return hr;
-}
-
-template<typename IBaseInterface>
-HRESULT TDepthStencilVariable<IBaseInterface>::GetBackingStore(UINT Index, D3D11_DEPTH_STENCIL_DESC *pDepthStencilDesc)
-{
- LPCSTR pFuncName = "ID3DX11EffectDepthStencilVariable::GetBackingStore";
-
- CHECK_OBJECT_SCALAR_BOUNDS(Index, pDepthStencilDesc);
-
- if( Data.pDepthStencil[Index].IsUserManaged )
- {
- if( Data.pDepthStencil[Index].pDSObject )
- {
- Data.pDepthStencil[Index].pDSObject->GetDesc( pDepthStencilDesc );
- }
- else
- {
- *pDepthStencilDesc = CD3D11_DEPTH_STENCIL_DESC( D3D11_DEFAULT );
- }
- }
- else
- {
- SDepthStencilBlock *pBlock = Data.pDepthStencil + Index;
- if (pBlock->ApplyAssignments(GetTopLevelEntity()->pEffect))
- {
- pBlock->pAssignments[0].LastRecomputedTime = 0; // Force a recreate of this block the next time ApplyRenderStateBlock is called
- }
-
- memcpy(pDepthStencilDesc, &pBlock->BackingStore, sizeof(D3D11_DEPTH_STENCIL_DESC));
- }
-
-lExit:
- return hr;
-}
-
-template<typename IBaseInterface>
-BOOL TDepthStencilVariable<IBaseInterface>::IsValid()
-{
- UINT numElements = IsArray()? pType->Elements : 1;
- BOOL valid = TRUE;
- while( numElements > 0 && ( valid = Data.pDepthStencil[ numElements-1 ].IsValid ) )
- numElements--;
- return valid;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// ID3DX11EffectRasterizerVariable (TRasterizerVariable implementation)
-////////////////////////////////////////////////////////////////////////////////
-
-template<typename IBaseInterface>
-struct TRasterizerVariable : public IBaseInterface
-{
-public:
-
- STDMETHOD(GetRasterizerState)(UINT Index, ID3D11RasterizerState **ppRasterizerState);
- STDMETHOD(SetRasterizerState)(UINT Index, ID3D11RasterizerState *pRasterizerState);
- STDMETHOD(UndoSetRasterizerState)(UINT Index);
- STDMETHOD(GetBackingStore)(UINT Index, D3D11_RASTERIZER_DESC *pRasterizerDesc);
- STDMETHOD_(BOOL, IsValid)();
-};
-
-template<typename IBaseInterface>
-HRESULT TRasterizerVariable<IBaseInterface>::GetRasterizerState(UINT Index, ID3D11RasterizerState **ppRasterizerState)
-{
- LPCSTR pFuncName = "ID3DX11EffectRasterizerVariable::GetRasterizerState";
-
- CHECK_OBJECT_SCALAR_BOUNDS(Index, ppRasterizerState);
-
- *ppRasterizerState = Data.pRasterizer[Index].pRasterizerObject;
- SAFE_ADDREF(*ppRasterizerState);
-
-lExit:
- return hr;
-}
-
-template<typename IBaseInterface>
-HRESULT TRasterizerVariable<IBaseInterface>::SetRasterizerState(UINT Index, ID3D11RasterizerState *pRasterizerState)
-{
- LPCSTR pFuncName = "ID3DX11EffectRasterizerState::SetRasterizerState";
-
- CHECK_SCALAR_BOUNDS(Index);
-
- if( !Data.pRasterizer[Index].IsUserManaged )
- {
- // Save original state object in case we UndoSet
- D3DXASSERT( pMemberData[Index].Type == MDT_RasterizerState );
- VB( pMemberData[Index].Data.pD3DEffectsManagedRasterizerState == NULL );
- pMemberData[Index].Data.pD3DEffectsManagedRasterizerState = Data.pRasterizer[Index].pRasterizerObject;
- Data.pRasterizer[Index].pRasterizerObject = NULL;
- Data.pRasterizer[Index].IsUserManaged = TRUE;
- }
-
- SAFE_ADDREF( pRasterizerState );
- SAFE_RELEASE( Data.pRasterizer[Index].pRasterizerObject );
- Data.pRasterizer[Index].pRasterizerObject = pRasterizerState;
- Data.pRasterizer[Index].IsValid = TRUE;
-lExit:
- return hr;
-}
-
-template<typename IBaseInterface>
-HRESULT TRasterizerVariable<IBaseInterface>::UndoSetRasterizerState(UINT Index)
-{
- LPCSTR pFuncName = "ID3DX11EffectRasterizerState::UndoSetRasterizerState";
-
- CHECK_SCALAR_BOUNDS(Index);
-
- if( !Data.pRasterizer[Index].IsUserManaged )
- {
- return S_FALSE;
- }
-
- // Revert to original state object
- SAFE_RELEASE( Data.pRasterizer[Index].pRasterizerObject );
- Data.pRasterizer[Index].pRasterizerObject = pMemberData[Index].Data.pD3DEffectsManagedRasterizerState;
- pMemberData[Index].Data.pD3DEffectsManagedRasterizerState = NULL;
- Data.pRasterizer[Index].IsUserManaged = FALSE;
-
-lExit:
- return hr;
-}
-
-template<typename IBaseInterface>
-HRESULT TRasterizerVariable<IBaseInterface>::GetBackingStore(UINT Index, D3D11_RASTERIZER_DESC *pRasterizerDesc)
-{
- LPCSTR pFuncName = "ID3DX11EffectRasterizerVariable::GetBackingStore";
-
- CHECK_OBJECT_SCALAR_BOUNDS(Index, pRasterizerDesc);
-
- if( Data.pRasterizer[Index].IsUserManaged )
- {
- if( Data.pRasterizer[Index].pRasterizerObject )
- {
- Data.pRasterizer[Index].pRasterizerObject->GetDesc( pRasterizerDesc );
- }
- else
- {
- *pRasterizerDesc = CD3D11_RASTERIZER_DESC( D3D11_DEFAULT );
- }
- }
- else
- {
- SRasterizerBlock *pBlock = Data.pRasterizer + Index;
- if (pBlock->ApplyAssignments(GetTopLevelEntity()->pEffect))
- {
- pBlock->pAssignments[0].LastRecomputedTime = 0; // Force a recreate of this block the next time ApplyRenderStateBlock is called
- }
-
- memcpy(pRasterizerDesc, &pBlock->BackingStore, sizeof(D3D11_RASTERIZER_DESC));
- }
-
-lExit:
- return hr;
-}
-
-template<typename IBaseInterface>
-BOOL TRasterizerVariable<IBaseInterface>::IsValid()
-{
- UINT numElements = IsArray()? pType->Elements : 1;
- BOOL valid = TRUE;
- while( numElements > 0 && ( valid = Data.pRasterizer[ numElements-1 ].IsValid ) )
- numElements--;
- return valid;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// ID3DX11EffectSamplerVariable (TSamplerVariable implementation)
-////////////////////////////////////////////////////////////////////////////////
-
-template<typename IBaseInterface>
-struct TSamplerVariable : public IBaseInterface
-{
-public:
-
- STDMETHOD(GetSampler)(UINT Index, ID3D11SamplerState **ppSampler);
- STDMETHOD(SetSampler)(UINT Index, ID3D11SamplerState *pSampler);
- STDMETHOD(UndoSetSampler)(UINT Index);
- STDMETHOD(GetBackingStore)(UINT Index, D3D11_SAMPLER_DESC *pSamplerDesc);
-};
-
-template<typename IBaseInterface>
-HRESULT TSamplerVariable<IBaseInterface>::GetSampler(UINT Index, ID3D11SamplerState **ppSampler)
-{
- LPCSTR pFuncName = "ID3DX11EffectSamplerVariable::GetSampler";
-
- CHECK_OBJECT_SCALAR_BOUNDS(Index, ppSampler);
-
- *ppSampler = Data.pSampler[Index].pD3DObject;
- SAFE_ADDREF(*ppSampler);
-
-lExit:
- return hr;
-}
-
-template<typename IBaseInterface>
-HRESULT TSamplerVariable<IBaseInterface>::SetSampler(UINT Index, ID3D11SamplerState *pSampler)
-{
- LPCSTR pFuncName = "ID3DX11EffectSamplerState::SetSampler";
-
- CHECK_SCALAR_BOUNDS(Index);
-
- // Replace all references to the old shader block with this one
- GetEffect()->ReplaceSamplerReference(&Data.pSampler[Index], pSampler);
-
- if( !Data.pSampler[Index].IsUserManaged )
- {
- // Save original state object in case we UndoSet
- D3DXASSERT( pMemberData[Index].Type == MDT_SamplerState );
- VB( pMemberData[Index].Data.pD3DEffectsManagedSamplerState == NULL );
- pMemberData[Index].Data.pD3DEffectsManagedSamplerState = Data.pSampler[Index].pD3DObject;
- Data.pSampler[Index].pD3DObject = NULL;
- Data.pSampler[Index].IsUserManaged = TRUE;
- }
-
- SAFE_ADDREF( pSampler );
- SAFE_RELEASE( Data.pSampler[Index].pD3DObject );
- Data.pSampler[Index].pD3DObject = pSampler;
-lExit:
- return hr;
-}
-
-template<typename IBaseInterface>
-HRESULT TSamplerVariable<IBaseInterface>::UndoSetSampler(UINT Index)
-{
- LPCSTR pFuncName = "ID3DX11EffectSamplerState::UndoSetSampler";
-
- CHECK_SCALAR_BOUNDS(Index);
-
- if( !Data.pSampler[Index].IsUserManaged )
- {
- return S_FALSE;
- }
-
- // Replace all references to the old shader block with this one
- GetEffect()->ReplaceSamplerReference(&Data.pSampler[Index], pMemberData[Index].Data.pD3DEffectsManagedSamplerState);
-
- // Revert to original state object
- SAFE_RELEASE( Data.pSampler[Index].pD3DObject );
- Data.pSampler[Index].pD3DObject = pMemberData[Index].Data.pD3DEffectsManagedSamplerState;
- pMemberData[Index].Data.pD3DEffectsManagedSamplerState = NULL;
- Data.pSampler[Index].IsUserManaged = FALSE;
-
-lExit:
- return hr;
-}
-
-template<typename IBaseInterface>
-HRESULT TSamplerVariable<IBaseInterface>::GetBackingStore(UINT Index, D3D11_SAMPLER_DESC *pSamplerDesc)
-{
- LPCSTR pFuncName = "ID3DX11EffectSamplerVariable::GetBackingStore";
-
- CHECK_OBJECT_SCALAR_BOUNDS(Index, pSamplerDesc);
-
- if( Data.pSampler[Index].IsUserManaged )
- {
- if( Data.pSampler[Index].pD3DObject )
- {
- Data.pSampler[Index].pD3DObject->GetDesc( pSamplerDesc );
- }
- else
- {
- *pSamplerDesc = CD3D11_SAMPLER_DESC( D3D11_DEFAULT );
- }
- }
- else
- {
- SSamplerBlock *pBlock = Data.pSampler + Index;
- if (pBlock->ApplyAssignments(GetTopLevelEntity()->pEffect))
- {
- pBlock->pAssignments[0].LastRecomputedTime = 0; // Force a recreate of this block the next time ApplyRenderStateBlock is called
- }
-
- memcpy(pSamplerDesc, &pBlock->BackingStore.SamplerDesc, sizeof(D3D11_SAMPLER_DESC));
- }
-
-lExit:
- return hr;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// TUncastableVariable
-////////////////////////////////////////////////////////////////////////////////
-
-template<typename IBaseInterface>
-struct TUncastableVariable : public IBaseInterface
-{
- STDMETHOD_(ID3DX11EffectScalarVariable*, AsScalar)();
- STDMETHOD_(ID3DX11EffectVectorVariable*, AsVector)();
- STDMETHOD_(ID3DX11EffectMatrixVariable*, AsMatrix)();
- STDMETHOD_(ID3DX11EffectStringVariable*, AsString)();
- STDMETHOD_(ID3DX11EffectClassInstanceVariable*, AsClassInstance)();
- STDMETHOD_(ID3DX11EffectInterfaceVariable*, AsInterface)();
- STDMETHOD_(ID3DX11EffectShaderResourceVariable*, AsShaderResource)();
- STDMETHOD_(ID3DX11EffectUnorderedAccessViewVariable*, AsUnorderedAccessView)();
- STDMETHOD_(ID3DX11EffectRenderTargetViewVariable*, AsRenderTargetView)();
- STDMETHOD_(ID3DX11EffectDepthStencilViewVariable*, AsDepthStencilView)();
- STDMETHOD_(ID3DX11EffectConstantBuffer*, AsConstantBuffer)();
- STDMETHOD_(ID3DX11EffectShaderVariable*, AsShader)();
- STDMETHOD_(ID3DX11EffectBlendVariable*, AsBlend)();
- STDMETHOD_(ID3DX11EffectDepthStencilVariable*, AsDepthStencil)();
- STDMETHOD_(ID3DX11EffectRasterizerVariable*, AsRasterizer)();
- STDMETHOD_(ID3DX11EffectSamplerVariable*, AsSampler)();
-};
-
-template<typename IBaseInterface>
-ID3DX11EffectScalarVariable * TUncastableVariable<IBaseInterface>::AsScalar()
-{
- LPCSTR pFuncName = "ID3DX11EffectVariable::AsScalar";
- DPF(0, "%s: Invalid typecast", pFuncName);
- return &g_InvalidScalarVariable;
-}
-
-template<typename IBaseInterface>
-ID3DX11EffectVectorVariable * TUncastableVariable<IBaseInterface>::AsVector()
-{
- LPCSTR pFuncName = "ID3DX11EffectVariable::AsVector";
- DPF(0, "%s: Invalid typecast", pFuncName);
- return &g_InvalidVectorVariable;
-}
-
-template<typename IBaseInterface>
-ID3DX11EffectMatrixVariable * TUncastableVariable<IBaseInterface>::AsMatrix()
-{
- LPCSTR pFuncName = "ID3DX11EffectVariable::AsMatrix";
- DPF(0, "%s: Invalid typecast", pFuncName);
- return &g_InvalidMatrixVariable;
-}
-
-template<typename IBaseInterface>
-ID3DX11EffectStringVariable * TUncastableVariable<IBaseInterface>::AsString()
-{
- LPCSTR pFuncName = "ID3DX11EffectVariable::AsString";
- DPF(0, "%s: Invalid typecast", pFuncName);
- return &g_InvalidStringVariable;
-}
-
-template<typename IBaseClassInstance>
-ID3DX11EffectClassInstanceVariable * TUncastableVariable<IBaseClassInstance>::AsClassInstance()
-{
- LPCSTR pFuncName = "ID3DX11EffectVariable::AsClassInstance";
- DPF(0, "%s: Invalid typecast", pFuncName);
- return &g_InvalidClassInstanceVariable;
-}
-
-template<typename IBaseInterface>
-ID3DX11EffectInterfaceVariable * TUncastableVariable<IBaseInterface>::AsInterface()
-{
- LPCSTR pFuncName = "ID3DX11EffectVariable::AsInterface";
- DPF(0, "%s: Invalid typecast", pFuncName);
- return &g_InvalidInterfaceVariable;
-}
-
-template<typename IBaseInterface>
-ID3DX11EffectShaderResourceVariable * TUncastableVariable<IBaseInterface>::AsShaderResource()
-{
- LPCSTR pFuncName = "ID3DX11EffectVariable::AsShaderResource";
- DPF(0, "%s: Invalid typecast", pFuncName);
- return &g_InvalidShaderResourceVariable;
-}
-
-template<typename IBaseInterface>
-ID3DX11EffectUnorderedAccessViewVariable * TUncastableVariable<IBaseInterface>::AsUnorderedAccessView()
-{
- LPCSTR pFuncName = "ID3DX11EffectVariable::AsUnorderedAccessView";
- DPF(0, "%s: Invalid typecast", pFuncName);
- return &g_InvalidUnorderedAccessViewVariable;
-}
-
-template<typename IBaseInterface>
-ID3DX11EffectRenderTargetViewVariable * TUncastableVariable<IBaseInterface>::AsRenderTargetView()
-{
- LPCSTR pFuncName = "ID3DX11EffectVariable::AsRenderTargetView";
- DPF(0, "%s: Invalid typecast", pFuncName);
- return &g_InvalidRenderTargetViewVariable;
-}
-
-template<typename IBaseInterface>
-ID3DX11EffectDepthStencilViewVariable * TUncastableVariable<IBaseInterface>::AsDepthStencilView()
-{
- LPCSTR pFuncName = "ID3DX11EffectVariable::AsDepthStencilView";
- DPF(0, "%s: Invalid typecast", pFuncName);
- return &g_InvalidDepthStencilViewVariable;
-}
-
-template<typename IBaseInterface>
-ID3DX11EffectConstantBuffer * TUncastableVariable<IBaseInterface>::AsConstantBuffer()
-{
- LPCSTR pFuncName = "ID3DX11EffectVariable::AsConstantBuffer";
- DPF(0, "%s: Invalid typecast", pFuncName);
- return &g_InvalidConstantBuffer;
-}
-
-template<typename IBaseInterface>
-ID3DX11EffectShaderVariable * TUncastableVariable<IBaseInterface>::AsShader()
-{
- LPCSTR pFuncName = "ID3DX11EffectVariable::AsShader";
- DPF(0, "%s: Invalid typecast", pFuncName);
- return &g_InvalidShaderVariable;
-}
-
-template<typename IBaseInterface>
-ID3DX11EffectBlendVariable * TUncastableVariable<IBaseInterface>::AsBlend()
-{
- LPCSTR pFuncName = "ID3DX11EffectVariable::AsBlend";
- DPF(0, "%s: Invalid typecast", pFuncName);
- return &g_InvalidBlendVariable;
-}
-
-template<typename IBaseInterface>
-ID3DX11EffectDepthStencilVariable * TUncastableVariable<IBaseInterface>::AsDepthStencil()
-{
- LPCSTR pFuncName = "ID3DX11EffectVariable::AsDepthStencil";
- DPF(0, "%s: Invalid typecast", pFuncName);
- return &g_InvalidDepthStencilVariable;
-}
-
-template<typename IBaseInterface>
-ID3DX11EffectRasterizerVariable * TUncastableVariable<IBaseInterface>::AsRasterizer()
-{
- LPCSTR pFuncName = "ID3DX11EffectVariable::AsRasterizer";
- DPF(0, "%s: Invalid typecast", pFuncName);
- return &g_InvalidRasterizerVariable;
-}
-
-template<typename IBaseInterface>
-ID3DX11EffectSamplerVariable * TUncastableVariable<IBaseInterface>::AsSampler()
-{
- LPCSTR pFuncName = "ID3DX11EffectVariable::AsSampler";
- DPF(0, "%s: Invalid typecast", pFuncName);
- return &g_InvalidSamplerVariable;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// Macros to instantiate the myriad templates
-////////////////////////////////////////////////////////////////////////////////
-
-// generates a global variable, annotation, global variable member, and annotation member of each struct type
-#define GenerateReflectionClasses(Type, BaseInterface) \
-struct S##Type##GlobalVariable : public T##Type##Variable<TGlobalVariable<BaseInterface>, FALSE> { }; \
-struct S##Type##Annotation : public T##Type##Variable<TAnnotation<BaseInterface>, TRUE> { }; \
-struct S##Type##GlobalVariableMember : public T##Type##Variable<TVariable<TMember<BaseInterface> >, FALSE> { }; \
-struct S##Type##AnnotationMember : public T##Type##Variable<TVariable<TMember<BaseInterface> >, TRUE> { };
-
-#define GenerateVectorReflectionClasses(Type, BaseType, BaseInterface) \
-struct S##Type##GlobalVariable : public TVectorVariable<TGlobalVariable<BaseInterface>, FALSE, BaseType> { }; \
-struct S##Type##Annotation : public TVectorVariable<TAnnotation<BaseInterface>, TRUE, BaseType> { }; \
-struct S##Type##GlobalVariableMember : public TVectorVariable<TVariable<TMember<BaseInterface> >, FALSE, BaseType> { }; \
-struct S##Type##AnnotationMember : public TVectorVariable<TVariable<TMember<BaseInterface> >, TRUE, BaseType> { };
-
-#define GenerateReflectionGlobalOnlyClasses(Type) \
-struct S##Type##GlobalVariable : public T##Type##Variable<TGlobalVariable<ID3DX11Effect##Type##Variable> > { }; \
-struct S##Type##GlobalVariableMember : public T##Type##Variable<TVariable<TMember<ID3DX11Effect##Type##Variable> > > { }; \
-
-GenerateReflectionClasses(Numeric, ID3DX11EffectVariable);
-GenerateReflectionClasses(FloatScalar, ID3DX11EffectScalarVariable);
-GenerateReflectionClasses(IntScalar, ID3DX11EffectScalarVariable);
-GenerateReflectionClasses(BoolScalar, ID3DX11EffectScalarVariable);
-GenerateVectorReflectionClasses(FloatVector, ETVT_Float, ID3DX11EffectVectorVariable);
-GenerateVectorReflectionClasses(BoolVector, ETVT_Bool, ID3DX11EffectVectorVariable);
-GenerateVectorReflectionClasses(IntVector, ETVT_Int, ID3DX11EffectVectorVariable);
-GenerateReflectionClasses(Matrix, ID3DX11EffectMatrixVariable);
-GenerateReflectionClasses(String, ID3DX11EffectStringVariable);
-GenerateReflectionGlobalOnlyClasses(ClassInstance);
-GenerateReflectionGlobalOnlyClasses(Interface);
-GenerateReflectionGlobalOnlyClasses(ShaderResource);
-GenerateReflectionGlobalOnlyClasses(UnorderedAccessView);
-GenerateReflectionGlobalOnlyClasses(RenderTargetView);
-GenerateReflectionGlobalOnlyClasses(DepthStencilView);
-GenerateReflectionGlobalOnlyClasses(Shader);
-GenerateReflectionGlobalOnlyClasses(Blend);
-GenerateReflectionGlobalOnlyClasses(DepthStencil);
-GenerateReflectionGlobalOnlyClasses(Rasterizer);
-GenerateReflectionGlobalOnlyClasses(Sampler);
-
-// Optimized matrix classes
-struct SMatrix4x4ColumnMajorGlobalVariable : public TMatrix4x4Variable<TGlobalVariable<ID3DX11EffectMatrixVariable>, TRUE> { };
-struct SMatrix4x4RowMajorGlobalVariable : public TMatrix4x4Variable<TGlobalVariable<ID3DX11EffectMatrixVariable>, FALSE> { };
-
-struct SMatrix4x4ColumnMajorGlobalVariableMember : public TMatrix4x4Variable<TVariable<TMember<ID3DX11EffectMatrixVariable> >, TRUE> { };
-struct SMatrix4x4RowMajorGlobalVariableMember : public TMatrix4x4Variable<TVariable<TMember<ID3DX11EffectMatrixVariable> >, FALSE> { };
-
-// Optimized vector classes
-struct SFloatVector4GlobalVariable : public TVector4Variable<TGlobalVariable<ID3DX11EffectVectorVariable> > { };
-struct SFloatVector4GlobalVariableMember : public TVector4Variable<TVariable<TMember<ID3DX11EffectVectorVariable> > > { };
-
-// These 3 classes should never be used directly
-
-// The "base" global variable struct (all global variables should be the same size in bytes,
-// but we pick this as the default).
-struct SGlobalVariable : public TGlobalVariable<ID3DX11EffectVariable>
-{
-
-};
-
-// The "base" annotation struct (all annotations should be the same size in bytes,
-// but we pick this as the default).
-struct SAnnotation : public TAnnotation<ID3DX11EffectVariable>
-{
-
-};
-
-// The "base" variable member struct (all annotation/global variable members should be the
-// same size in bytes, but we pick this as the default).
-struct SMember : public TVariable<TMember<ID3DX11EffectVariable> >
-{
-
-};
-
-// creates a new variable of the appropriate polymorphic type where pVar was
-HRESULT PlacementNewVariable(void *pVar, SType *pType, BOOL IsAnnotation);
-SMember * CreateNewMember(SType *pType, BOOL IsAnnotation);
-
-
diff --git a/sample/d3d11/Effects11/Inc/d3dx11dbg.h b/sample/d3d11/Effects11/Inc/d3dx11dbg.h
deleted file mode 100644
index 49ed3b3..0000000
--- a/sample/d3d11/Effects11/Inc/d3dx11dbg.h
+++ /dev/null
@@ -1,66 +0,0 @@
-//////////////////////////////////////////////////////////////////////////////
-//
-// Copyright (C) Microsoft Corporation. All Rights Reserved.
-//
-// File: d3dx11dbg.h
-// Content: D3DX11 debugging functions
-//
-//////////////////////////////////////////////////////////////////////////////
-
-
-#ifndef __D3DX11DBG_H__
-#define __D3DX11DBG_H__
-
-#ifndef _PREFAST_
-
-#pragma warning( disable: 4068 )
-
-#endif
-
-
-#include <strsafe.h>
-#include <new>
-
-#undef NEW
-#undef DELETE
-
-#define NEW new (std::nothrow)
-#define NEW_PROTO_ARGS size_t s, const std::nothrow_t& t
-
-
-
-typedef signed char INT8;
-typedef signed short INT16;
-typedef unsigned char UINT8;
-typedef unsigned short UINT16;
-
-
-//----------------------------------------------------------------------------
-// DPF
-//----------------------------------------------------------------------------
-
-#ifdef FXDPF
-void cdecl D3DXDebugPrintf(UINT lvl, LPCSTR szFormat, ...);
-#define DPF D3DXDebugPrintf
-#else // !FXDPF
-#pragma warning(disable:4002)
-#define DPF() 0
-#endif // !FXDPF
-
-
-//----------------------------------------------------------------------------
-// D3DXASSERT
-//----------------------------------------------------------------------------
-
-#if _DEBUG
-int WINAPI D3DXDebugAssert(LPCSTR szFile, int nLine, LPCSTR szCondition);
-#define D3DXASSERT(condition) \
- do { if(!(condition)) D3DXDebugAssert(__FILE__, __LINE__, #condition); } while(0)
-#else // !_DEBUG
-#define D3DXASSERT(condition) 0
-#endif // !_DEBUG
-
-
-
-#endif // __D3DX11DBG_H__
-
diff --git a/sample/d3d11/Effects11/Inc/d3dx11effect.h b/sample/d3d11/Effects11/Inc/d3dx11effect.h
deleted file mode 100644
index fc162fc..0000000
--- a/sample/d3d11/Effects11/Inc/d3dx11effect.h
+++ /dev/null
@@ -1,1566 +0,0 @@
-//////////////////////////////////////////////////////////////////////////////
-//
-// Copyright (c) Microsoft Corporation. All rights reserved.
-//
-// File: D3DX11Effect.h
-// Content: D3DX11 Effect Types & APIs Header
-//
-//////////////////////////////////////////////////////////////////////////////
-
-#ifndef __D3DX11EFFECT_H__
-#define __D3DX11EFFECT_H__
-
-#include "d3d11.h"
-#include "d3d11shader.h"
-
-//////////////////////////////////////////////////////////////////////////////
-// File contents:
-//
-// 1) Stateblock enums, structs, interfaces, flat APIs
-// 2) Effect enums, structs, interfaces, flat APIs
-//////////////////////////////////////////////////////////////////////////////
-
-#ifndef D3DX11_BYTES_FROM_BITS
-#define D3DX11_BYTES_FROM_BITS(x) (((x) + 7) / 8)
-#endif // D3DX11_BYTES_FROM_BITS
-
-typedef struct _D3DX11_STATE_BLOCK_MASK
-{
- BYTE VS;
- BYTE VSSamplers[D3DX11_BYTES_FROM_BITS(D3D11_COMMONSHADER_SAMPLER_SLOT_COUNT)];
- BYTE VSShaderResources[D3DX11_BYTES_FROM_BITS(D3D11_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT)];
- BYTE VSConstantBuffers[D3DX11_BYTES_FROM_BITS(D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT)];
- BYTE VSInterfaces[D3DX11_BYTES_FROM_BITS(D3D11_SHADER_MAX_INTERFACES)];
-
- BYTE HS;
- BYTE HSSamplers[D3DX11_BYTES_FROM_BITS(D3D11_COMMONSHADER_SAMPLER_SLOT_COUNT)];
- BYTE HSShaderResources[D3DX11_BYTES_FROM_BITS(D3D11_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT)];
- BYTE HSConstantBuffers[D3DX11_BYTES_FROM_BITS(D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT)];
- BYTE HSInterfaces[D3DX11_BYTES_FROM_BITS(D3D11_SHADER_MAX_INTERFACES)];
-
- BYTE DS;
- BYTE DSSamplers[D3DX11_BYTES_FROM_BITS(D3D11_COMMONSHADER_SAMPLER_SLOT_COUNT)];
- BYTE DSShaderResources[D3DX11_BYTES_FROM_BITS(D3D11_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT)];
- BYTE DSConstantBuffers[D3DX11_BYTES_FROM_BITS(D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT)];
- BYTE DSInterfaces[D3DX11_BYTES_FROM_BITS(D3D11_SHADER_MAX_INTERFACES)];
-
- BYTE GS;
- BYTE GSSamplers[D3DX11_BYTES_FROM_BITS(D3D11_COMMONSHADER_SAMPLER_SLOT_COUNT)];
- BYTE GSShaderResources[D3DX11_BYTES_FROM_BITS(D3D11_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT)];
- BYTE GSConstantBuffers[D3DX11_BYTES_FROM_BITS(D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT)];
- BYTE GSInterfaces[D3DX11_BYTES_FROM_BITS(D3D11_SHADER_MAX_INTERFACES)];
-
- BYTE PS;
- BYTE PSSamplers[D3DX11_BYTES_FROM_BITS(D3D11_COMMONSHADER_SAMPLER_SLOT_COUNT)];
- BYTE PSShaderResources[D3DX11_BYTES_FROM_BITS(D3D11_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT)];
- BYTE PSConstantBuffers[D3DX11_BYTES_FROM_BITS(D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT)];
- BYTE PSInterfaces[D3DX11_BYTES_FROM_BITS(D3D11_SHADER_MAX_INTERFACES)];
- BYTE PSUnorderedAccessViews;
-
- BYTE CS;
- BYTE CSSamplers[D3DX11_BYTES_FROM_BITS(D3D11_COMMONSHADER_SAMPLER_SLOT_COUNT)];
- BYTE CSShaderResources[D3DX11_BYTES_FROM_BITS(D3D11_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT)];
- BYTE CSConstantBuffers[D3DX11_BYTES_FROM_BITS(D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT)];
- BYTE CSInterfaces[D3DX11_BYTES_FROM_BITS(D3D11_SHADER_MAX_INTERFACES)];
- BYTE CSUnorderedAccessViews;
-
- BYTE IAVertexBuffers[D3DX11_BYTES_FROM_BITS(D3D11_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT)];
- BYTE IAIndexBuffer;
- BYTE IAInputLayout;
- BYTE IAPrimitiveTopology;
-
- BYTE OMRenderTargets;
- BYTE OMDepthStencilState;
- BYTE OMBlendState;
-
- BYTE RSViewports;
- BYTE RSScissorRects;
- BYTE RSRasterizerState;
-
- BYTE SOBuffers;
-
- BYTE Predication;
-} D3DX11_STATE_BLOCK_MASK;
-
-//----------------------------------------------------------------------------
-// D3DX11_EFFECT flags:
-// -------------------------------------
-//
-// These flags are passed in when creating an effect, and affect
-// the runtime effect behavior:
-//
-// (Currently none)
-//
-//
-// These flags are set by the effect runtime:
-//
-// D3DX11_EFFECT_OPTIMIZED
-// This effect has been optimized. Reflection functions that rely on
-// names/semantics/strings should fail. This is set when Optimize() is
-// called, but CEffect::IsOptimized() should be used to test for this.
-//
-// D3DX11_EFFECT_CLONE
-// This effect is a clone of another effect. Single CBs will never be
-// updated when internal variable values are changed.
-// This flag is not set when the D3DX11_EFFECT_CLONE_FORCE_NONSINGLE flag
-// is used in cloning.
-//
-//----------------------------------------------------------------------------
-
-#define D3DX11_EFFECT_OPTIMIZED (1 << 21)
-#define D3DX11_EFFECT_CLONE (1 << 22)
-
-// These are the only valid parameter flags to D3DX11CreateEffect*
-#define D3DX11_EFFECT_RUNTIME_VALID_FLAGS (0)
-
-//----------------------------------------------------------------------------
-// D3DX11_EFFECT_VARIABLE flags:
-// ----------------------------
-//
-// These flags describe an effect variable (global or annotation),
-// and are returned in D3DX11_EFFECT_VARIABLE_DESC::Flags.
-//
-// D3DX11_EFFECT_VARIABLE_ANNOTATION
-// Indicates that this is an annotation on a technique, pass, or global
-// variable. Otherwise, this is a global variable. Annotations cannot
-// be shared.
-//
-// D3DX11_EFFECT_VARIABLE_EXPLICIT_BIND_POINT
-// Indicates that the variable has been explicitly bound using the
-// register keyword.
-//----------------------------------------------------------------------------
-
-#define D3DX11_EFFECT_VARIABLE_ANNOTATION (1 << 1)
-#define D3DX11_EFFECT_VARIABLE_EXPLICIT_BIND_POINT (1 << 2)
-
-//----------------------------------------------------------------------------
-// D3DX11_EFFECT_CLONE flags:
-// ----------------------------
-//
-// These flags modify the effect cloning process and are passed into Clone.
-//
-// D3DX11_EFFECT_CLONE_FORCE_NONSINGLE
-// Ignore all "single" qualifiers on cbuffers. All cbuffers will have their
-// own ID3D11Buffer's created in the cloned effect.
-//----------------------------------------------------------------------------
-
-#define D3DX11_EFFECT_CLONE_FORCE_NONSINGLE (1 << 0)
-
-//----------------------------------------------------------------------------
-// D3DX11_EFFECT_PASS flags:
-// ----------------------------
-//
-// These flags modify the effect cloning process and are passed into Clone.
-//
-// D3DX11_EFFECT_PASS_COMMIT_CHANGES
-// This flag tells the effect runtime to assume that the device state was
-// not modified outside of effects, so that only updated state needs to
-// be set.
-//
-// D3DX11_EFFECT_PASS_OMIT_*
-// When applying a pass, do not set the state indicated in the flag name.
-//----------------------------------------------------------------------------
-
-#define D3DX11_EFFECT_PASS_COMMIT_CHANGES (1 << 0) // TODO: not yet implemented
-#define D3DX11_EFFECT_PASS_OMIT_SHADERS_AND_INTERFACES (1 << 1) // TODO: not yet implemented
-#define D3DX11_EFFECT_PASS_OMIT_STATE_OBJECTS (1 << 2) // TODO: not yet implemented
-#define D3DX11_EFFECT_PASS_OMIT_RTVS_AND_DSVS (1 << 3) // TODO: not yet implemented
-#define D3DX11_EFFECT_PASS_OMIT_SAMPLERS (1 << 4) // TODO: not yet implemented
-#define D3DX11_EFFECT_PASS_OMIT_CBS (1 << 5) // TODO: not yet implemented
-#define D3DX11_EFFECT_PASS_OMIT_SRVS (1 << 6) // TODO: not yet implemented
-#define D3DX11_EFFECT_PASS_OMIT_UAVS (1 << 7) // TODO: not yet implemented
-
-#define D3DX11_EFFECT_PASS_ONLY_SET_SHADERS_AND_CBS ( D3DX11_EFFECT_PASS_OMIT_STATE_OBJECTS | \
- D3DX11_EFFECT_PASS_OMIT_RTVS_AND_DSVS | \
- D3DX11_EFFECT_PASS_OMIT_SAMPLERS | \
- D3DX11_EFFECT_PASS_OMIT_SRVS | \
- D3DX11_EFFECT_PASS_OMIT_UAVS );
-
-//////////////////////////////////////////////////////////////////////////////
-// ID3DX11EffectType //////////////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////////
-
-//----------------------------------------------------------------------------
-// D3DX11_EFFECT_TYPE_DESC:
-//
-// Retrieved by ID3DX11EffectType::GetDesc()
-//----------------------------------------------------------------------------
-
-typedef struct _D3DX11_EFFECT_TYPE_DESC
-{
- LPCSTR TypeName; // Name of the type
- // (e.g. "float4" or "MyStruct")
-
- D3D10_SHADER_VARIABLE_CLASS Class; // (e.g. scalar, vector, object, etc.)
- D3D10_SHADER_VARIABLE_TYPE Type; // (e.g. float, texture, vertexshader, etc.)
-
- UINT Elements; // Number of elements in this type
- // (0 if not an array)
- UINT Members; // Number of members
- // (0 if not a structure)
- UINT Rows; // Number of rows in this type
- // (0 if not a numeric primitive)
- UINT Columns; // Number of columns in this type
- // (0 if not a numeric primitive)
-
- UINT PackedSize; // Number of bytes required to represent
- // this data type, when tightly packed
- UINT UnpackedSize; // Number of bytes occupied by this data
- // type, when laid out in a constant buffer
- UINT Stride; // Number of bytes to seek between elements,
- // when laid out in a constant buffer
-} D3DX11_EFFECT_TYPE_DESC;
-
-typedef interface ID3DX11EffectType ID3DX11EffectType;
-typedef interface ID3DX11EffectType *LPD3D11EFFECTTYPE;
-
-// {4250D721-D5E5-491F-B62B-587C43186285}
-DEFINE_GUID(IID_ID3DX11EffectType,
- 0x4250d721, 0xd5e5, 0x491f, 0xb6, 0x2b, 0x58, 0x7c, 0x43, 0x18, 0x62, 0x85);
-
-#undef INTERFACE
-#define INTERFACE ID3DX11EffectType
-
-DECLARE_INTERFACE(ID3DX11EffectType)
-{
- STDMETHOD_(BOOL, IsValid)(THIS) PURE;
- STDMETHOD(GetDesc)(THIS_ D3DX11_EFFECT_TYPE_DESC *pDesc) PURE;
- STDMETHOD_(ID3DX11EffectType*, GetMemberTypeByIndex)(THIS_ UINT Index) PURE;
- STDMETHOD_(ID3DX11EffectType*, GetMemberTypeByName)(THIS_ LPCSTR Name) PURE;
- STDMETHOD_(ID3DX11EffectType*, GetMemberTypeBySemantic)(THIS_ LPCSTR Semantic) PURE;
- STDMETHOD_(LPCSTR, GetMemberName)(THIS_ UINT Index) PURE;
- STDMETHOD_(LPCSTR, GetMemberSemantic)(THIS_ UINT Index) PURE;
-};
-
-//////////////////////////////////////////////////////////////////////////////
-// ID3DX11EffectVariable //////////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////////
-
-//----------------------------------------------------------------------------
-// D3DX11_EFFECT_VARIABLE_DESC:
-//
-// Retrieved by ID3DX11EffectVariable::GetDesc()
-//----------------------------------------------------------------------------
-
-typedef struct _D3DX11_EFFECT_VARIABLE_DESC
-{
- LPCSTR Name; // Name of this variable, annotation,
- // or structure member
- LPCSTR Semantic; // Semantic string of this variable
- // or structure member (NULL for
- // annotations or if not present)
-
- UINT Flags; // D3DX11_EFFECT_VARIABLE_* flags
- UINT Annotations; // Number of annotations on this variable
- // (always 0 for annotations)
-
- UINT BufferOffset; // Offset into containing cbuffer or tbuffer
- // (always 0 for annotations or variables
- // not in constant buffers)
-
- UINT ExplicitBindPoint; // Used if the variable has been explicitly bound
- // using the register keyword. Check Flags for
- // D3DX11_EFFECT_VARIABLE_EXPLICIT_BIND_POINT;
-} D3DX11_EFFECT_VARIABLE_DESC;
-
-typedef interface ID3DX11EffectVariable ID3DX11EffectVariable;
-typedef interface ID3DX11EffectVariable *LPD3D11EFFECTVARIABLE;
-
-// {036A777D-B56E-4B25-B313-CC3DDAB71873}
-DEFINE_GUID(IID_ID3DX11EffectVariable,
- 0x036a777d, 0xb56e, 0x4b25, 0xb3, 0x13, 0xcc, 0x3d, 0xda, 0xb7, 0x18, 0x73);
-
-#undef INTERFACE
-#define INTERFACE ID3DX11EffectVariable
-
-// Forward defines
-typedef interface ID3DX11EffectScalarVariable ID3DX11EffectScalarVariable;
-typedef interface ID3DX11EffectVectorVariable ID3DX11EffectVectorVariable;
-typedef interface ID3DX11EffectMatrixVariable ID3DX11EffectMatrixVariable;
-typedef interface ID3DX11EffectStringVariable ID3DX11EffectStringVariable;
-typedef interface ID3DX11EffectClassInstanceVariable ID3DX11EffectClassInstanceVariable;
-typedef interface ID3DX11EffectInterfaceVariable ID3DX11EffectInterfaceVariable;
-typedef interface ID3DX11EffectShaderResourceVariable ID3DX11EffectShaderResourceVariable;
-typedef interface ID3DX11EffectUnorderedAccessViewVariable ID3DX11EffectUnorderedAccessViewVariable;
-typedef interface ID3DX11EffectRenderTargetViewVariable ID3DX11EffectRenderTargetViewVariable;
-typedef interface ID3DX11EffectDepthStencilViewVariable ID3DX11EffectDepthStencilViewVariable;
-typedef interface ID3DX11EffectConstantBuffer ID3DX11EffectConstantBuffer;
-typedef interface ID3DX11EffectShaderVariable ID3DX11EffectShaderVariable;
-typedef interface ID3DX11EffectBlendVariable ID3DX11EffectBlendVariable;
-typedef interface ID3DX11EffectDepthStencilVariable ID3DX11EffectDepthStencilVariable;
-typedef interface ID3DX11EffectRasterizerVariable ID3DX11EffectRasterizerVariable;
-typedef interface ID3DX11EffectSamplerVariable ID3DX11EffectSamplerVariable;
-
-DECLARE_INTERFACE(ID3DX11EffectVariable)
-{
- STDMETHOD_(BOOL, IsValid)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectType*, GetType)(THIS) PURE;
- STDMETHOD(GetDesc)(THIS_ D3DX11_EFFECT_VARIABLE_DESC *pDesc) PURE;
-
- STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByIndex)(THIS_ UINT Index) PURE;
- STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByName)(THIS_ LPCSTR Name) PURE;
-
- STDMETHOD_(ID3DX11EffectVariable*, GetMemberByIndex)(THIS_ UINT Index) PURE;
- STDMETHOD_(ID3DX11EffectVariable*, GetMemberByName)(THIS_ LPCSTR Name) PURE;
- STDMETHOD_(ID3DX11EffectVariable*, GetMemberBySemantic)(THIS_ LPCSTR Semantic) PURE;
-
- STDMETHOD_(ID3DX11EffectVariable*, GetElement)(THIS_ UINT Index) PURE;
-
- STDMETHOD_(ID3DX11EffectConstantBuffer*, GetParentConstantBuffer)(THIS) PURE;
-
- STDMETHOD_(ID3DX11EffectScalarVariable*, AsScalar)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectVectorVariable*, AsVector)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectMatrixVariable*, AsMatrix)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectStringVariable*, AsString)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectClassInstanceVariable*, AsClassInstance)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectInterfaceVariable*, AsInterface)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectShaderResourceVariable*, AsShaderResource)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectUnorderedAccessViewVariable*, AsUnorderedAccessView)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectRenderTargetViewVariable*, AsRenderTargetView)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectDepthStencilViewVariable*, AsDepthStencilView)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectConstantBuffer*, AsConstantBuffer)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectShaderVariable*, AsShader)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectBlendVariable*, AsBlend)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectDepthStencilVariable*, AsDepthStencil)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectRasterizerVariable*, AsRasterizer)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectSamplerVariable*, AsSampler)(THIS) PURE;
-
- STDMETHOD(SetRawValue)(THIS_ CONST void *pData, UINT Offset, UINT Count) PURE;
- STDMETHOD(GetRawValue)(THIS_ void *pData, UINT Offset, UINT Count) PURE;
-};
-
-//////////////////////////////////////////////////////////////////////////////
-// ID3DX11EffectScalarVariable ////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////////
-
-typedef interface ID3DX11EffectScalarVariable ID3DX11EffectScalarVariable;
-typedef interface ID3DX11EffectScalarVariable *LPD3D11EFFECTSCALARVARIABLE;
-
-// {921EF2E5-A65D-4E92-9FC6-4E9CC09A4ADE}
-DEFINE_GUID(IID_ID3DX11EffectScalarVariable,
- 0x921ef2e5, 0xa65d, 0x4e92, 0x9f, 0xc6, 0x4e, 0x9c, 0xc0, 0x9a, 0x4a, 0xde);
-
-#undef INTERFACE
-#define INTERFACE ID3DX11EffectScalarVariable
-
-DECLARE_INTERFACE_(ID3DX11EffectScalarVariable, ID3DX11EffectVariable)
-{
- STDMETHOD_(BOOL, IsValid)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectType*, GetType)(THIS) PURE;
- STDMETHOD(GetDesc)(THIS_ D3DX11_EFFECT_VARIABLE_DESC *pDesc) PURE;
-
- STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByIndex)(THIS_ UINT Index) PURE;
- STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByName)(THIS_ LPCSTR Name) PURE;
-
- STDMETHOD_(ID3DX11EffectVariable*, GetMemberByIndex)(THIS_ UINT Index) PURE;
- STDMETHOD_(ID3DX11EffectVariable*, GetMemberByName)(THIS_ LPCSTR Name) PURE;
- STDMETHOD_(ID3DX11EffectVariable*, GetMemberBySemantic)(THIS_ LPCSTR Semantic) PURE;
-
- STDMETHOD_(ID3DX11EffectVariable*, GetElement)(THIS_ UINT Index) PURE;
-
- STDMETHOD_(ID3DX11EffectConstantBuffer*, GetParentConstantBuffer)(THIS) PURE;
-
- STDMETHOD_(ID3DX11EffectScalarVariable*, AsScalar)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectVectorVariable*, AsVector)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectMatrixVariable*, AsMatrix)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectStringVariable*, AsString)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectClassInstanceVariable*, AsClassInstance)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectInterfaceVariable*, AsInterface)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectShaderResourceVariable*, AsShaderResource)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectUnorderedAccessViewVariable*, AsUnorderedAccessView)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectRenderTargetViewVariable*, AsRenderTargetView)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectDepthStencilViewVariable*, AsDepthStencilView)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectConstantBuffer*, AsConstantBuffer)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectShaderVariable*, AsShader)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectBlendVariable*, AsBlend)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectDepthStencilVariable*, AsDepthStencil)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectRasterizerVariable*, AsRasterizer)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectSamplerVariable*, AsSampler)(THIS) PURE;
-
- STDMETHOD(SetRawValue)(THIS_ CONST void *pData, UINT ByteOffset, UINT ByteCount) PURE;
- STDMETHOD(GetRawValue)(THIS_ void *pData, UINT ByteOffset, UINT ByteCount) PURE;
-
- STDMETHOD(SetFloat)(THIS_ CONST float Value) PURE;
- STDMETHOD(GetFloat)(THIS_ float *pValue) PURE;
-
- STDMETHOD(SetFloatArray)(THIS_ CONST float *pData, UINT Offset, UINT Count) PURE;
- STDMETHOD(GetFloatArray)(THIS_ float *pData, UINT Offset, UINT Count) PURE;
-
- STDMETHOD(SetInt)(THIS_ CONST int Value) PURE;
- STDMETHOD(GetInt)(THIS_ int *pValue) PURE;
-
- STDMETHOD(SetIntArray)(THIS_ CONST int *pData, UINT Offset, UINT Count) PURE;
- STDMETHOD(GetIntArray)(THIS_ int *pData, UINT Offset, UINT Count) PURE;
-
- STDMETHOD(SetBool)(THIS_ CONST BOOL Value) PURE;
- STDMETHOD(GetBool)(THIS_ BOOL *pValue) PURE;
-
- STDMETHOD(SetBoolArray)(THIS_ CONST BOOL *pData, UINT Offset, UINT Count) PURE;
- STDMETHOD(GetBoolArray)(THIS_ BOOL *pData, UINT Offset, UINT Count) PURE;
-};
-
-//////////////////////////////////////////////////////////////////////////////
-// ID3DX11EffectVectorVariable ////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////////
-
-typedef interface ID3DX11EffectVectorVariable ID3DX11EffectVectorVariable;
-typedef interface ID3DX11EffectVectorVariable *LPD3D11EFFECTVECTORVARIABLE;
-
-// {5E785D4A-D87B-48D8-B6E6-0F8CA7E7467A}
-DEFINE_GUID(IID_ID3DX11EffectVectorVariable,
- 0x5e785d4a, 0xd87b, 0x48d8, 0xb6, 0xe6, 0x0f, 0x8c, 0xa7, 0xe7, 0x46, 0x7a);
-
-#undef INTERFACE
-#define INTERFACE ID3DX11EffectVectorVariable
-
-DECLARE_INTERFACE_(ID3DX11EffectVectorVariable, ID3DX11EffectVariable)
-{
- STDMETHOD_(BOOL, IsValid)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectType*, GetType)(THIS) PURE;
- STDMETHOD(GetDesc)(THIS_ D3DX11_EFFECT_VARIABLE_DESC *pDesc) PURE;
-
- STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByIndex)(THIS_ UINT Index) PURE;
- STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByName)(THIS_ LPCSTR Name) PURE;
-
- STDMETHOD_(ID3DX11EffectVariable*, GetMemberByIndex)(THIS_ UINT Index) PURE;
- STDMETHOD_(ID3DX11EffectVariable*, GetMemberByName)(THIS_ LPCSTR Name) PURE;
- STDMETHOD_(ID3DX11EffectVariable*, GetMemberBySemantic)(THIS_ LPCSTR Semantic) PURE;
-
- STDMETHOD_(ID3DX11EffectVariable*, GetElement)(THIS_ UINT Index) PURE;
-
- STDMETHOD_(ID3DX11EffectConstantBuffer*, GetParentConstantBuffer)(THIS) PURE;
-
- STDMETHOD_(ID3DX11EffectScalarVariable*, AsScalar)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectVectorVariable*, AsVector)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectMatrixVariable*, AsMatrix)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectStringVariable*, AsString)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectClassInstanceVariable*, AsClassInstance)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectInterfaceVariable*, AsInterface)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectShaderResourceVariable*, AsShaderResource)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectUnorderedAccessViewVariable*, AsUnorderedAccessView)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectRenderTargetViewVariable*, AsRenderTargetView)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectDepthStencilViewVariable*, AsDepthStencilView)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectConstantBuffer*, AsConstantBuffer)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectShaderVariable*, AsShader)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectBlendVariable*, AsBlend)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectDepthStencilVariable*, AsDepthStencil)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectRasterizerVariable*, AsRasterizer)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectSamplerVariable*, AsSampler)(THIS) PURE;
-
- STDMETHOD(SetRawValue)(THIS_ CONST void *pData, UINT ByteOffset, UINT ByteCount) PURE;
- STDMETHOD(GetRawValue)(THIS_ void *pData, UINT ByteOffset, UINT ByteCount) PURE;
-
- STDMETHOD(SetBoolVector) (THIS_ CONST BOOL *pData) PURE;
- STDMETHOD(SetIntVector) (THIS_ CONST int *pData) PURE;
- STDMETHOD(SetFloatVector)(THIS_ CONST float *pData) PURE;
-
- STDMETHOD(GetBoolVector) (THIS_ BOOL *pData) PURE;
- STDMETHOD(GetIntVector) (THIS_ int *pData) PURE;
- STDMETHOD(GetFloatVector)(THIS_ float *pData) PURE;
-
- STDMETHOD(SetBoolVectorArray) (THIS_ CONST BOOL *pData, UINT Offset, UINT Count) PURE;
- STDMETHOD(SetIntVectorArray) (THIS_ CONST int *pData, UINT Offset, UINT Count) PURE;
- STDMETHOD(SetFloatVectorArray)(THIS_ CONST float *pData, UINT Offset, UINT Count) PURE;
-
- STDMETHOD(GetBoolVectorArray) (THIS_ BOOL *pData, UINT Offset, UINT Count) PURE;
- STDMETHOD(GetIntVectorArray) (THIS_ int *pData, UINT Offset, UINT Count) PURE;
- STDMETHOD(GetFloatVectorArray)(THIS_ float *pData, UINT Offset, UINT Count) PURE;
-};
-
-//////////////////////////////////////////////////////////////////////////////
-// ID3DX11EffectMatrixVariable ////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////////
-
-typedef interface ID3DX11EffectMatrixVariable ID3DX11EffectMatrixVariable;
-typedef interface ID3DX11EffectMatrixVariable *LPD3D11EFFECTMATRIXVARIABLE;
-
-// {E1096CF4-C027-419A-8D86-D29173DC803E}
-DEFINE_GUID(IID_ID3DX11EffectMatrixVariable,
- 0xe1096cf4, 0xc027, 0x419a, 0x8d, 0x86, 0xd2, 0x91, 0x73, 0xdc, 0x80, 0x3e);
-
-#undef INTERFACE
-#define INTERFACE ID3DX11EffectMatrixVariable
-
-DECLARE_INTERFACE_(ID3DX11EffectMatrixVariable, ID3DX11EffectVariable)
-{
- STDMETHOD_(BOOL, IsValid)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectType*, GetType)(THIS) PURE;
- STDMETHOD(GetDesc)(THIS_ D3DX11_EFFECT_VARIABLE_DESC *pDesc) PURE;
-
- STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByIndex)(THIS_ UINT Index) PURE;
- STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByName)(THIS_ LPCSTR Name) PURE;
-
- STDMETHOD_(ID3DX11EffectVariable*, GetMemberByIndex)(THIS_ UINT Index) PURE;
- STDMETHOD_(ID3DX11EffectVariable*, GetMemberByName)(THIS_ LPCSTR Name) PURE;
- STDMETHOD_(ID3DX11EffectVariable*, GetMemberBySemantic)(THIS_ LPCSTR Semantic) PURE;
-
- STDMETHOD_(ID3DX11EffectVariable*, GetElement)(THIS_ UINT Index) PURE;
-
- STDMETHOD_(ID3DX11EffectConstantBuffer*, GetParentConstantBuffer)(THIS) PURE;
-
- STDMETHOD_(ID3DX11EffectScalarVariable*, AsScalar)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectVectorVariable*, AsVector)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectMatrixVariable*, AsMatrix)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectStringVariable*, AsString)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectClassInstanceVariable*, AsClassInstance)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectInterfaceVariable*, AsInterface)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectShaderResourceVariable*, AsShaderResource)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectUnorderedAccessViewVariable*, AsUnorderedAccessView)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectRenderTargetViewVariable*, AsRenderTargetView)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectDepthStencilViewVariable*, AsDepthStencilView)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectConstantBuffer*, AsConstantBuffer)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectShaderVariable*, AsShader)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectBlendVariable*, AsBlend)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectDepthStencilVariable*, AsDepthStencil)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectRasterizerVariable*, AsRasterizer)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectSamplerVariable*, AsSampler)(THIS) PURE;
-
- STDMETHOD(SetRawValue)(THIS_ CONST void *pData, UINT ByteOffset, UINT ByteCount) PURE;
- STDMETHOD(GetRawValue)(THIS_ void *pData, UINT ByteOffset, UINT ByteCount) PURE;
-
- STDMETHOD(SetMatrix)(THIS_ CONST float *pData) PURE;
- STDMETHOD(GetMatrix)(THIS_ float *pData) PURE;
-
- STDMETHOD(SetMatrixArray)(THIS_ CONST float *pData, UINT Offset, UINT Count) PURE;
- STDMETHOD(GetMatrixArray)(THIS_ float *pData, UINT Offset, UINT Count) PURE;
-
- STDMETHOD(SetMatrixTranspose)(THIS_ CONST float *pData) PURE;
- STDMETHOD(GetMatrixTranspose)(THIS_ float *pData) PURE;
-
- STDMETHOD(SetMatrixTransposeArray)(THIS_ CONST float *pData, UINT Offset, UINT Count) PURE;
- STDMETHOD(GetMatrixTransposeArray)(THIS_ float *pData, UINT Offset, UINT Count) PURE;
-};
-
-//////////////////////////////////////////////////////////////////////////////
-// ID3DX11EffectStringVariable ////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////////
-
-typedef interface ID3DX11EffectStringVariable ID3DX11EffectStringVariable;
-typedef interface ID3DX11EffectStringVariable *LPD3D11EFFECTSTRINGVARIABLE;
-
-// {F355C818-01BE-4653-A7CC-60FFFEDDC76D}
-DEFINE_GUID(IID_ID3DX11EffectStringVariable,
- 0xf355c818, 0x01be, 0x4653, 0xa7, 0xcc, 0x60, 0xff, 0xfe, 0xdd, 0xc7, 0x6d);
-
-#undef INTERFACE
-#define INTERFACE ID3DX11EffectStringVariable
-
-DECLARE_INTERFACE_(ID3DX11EffectStringVariable, ID3DX11EffectVariable)
-{
- STDMETHOD_(BOOL, IsValid)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectType*, GetType)(THIS) PURE;
- STDMETHOD(GetDesc)(THIS_ D3DX11_EFFECT_VARIABLE_DESC *pDesc) PURE;
-
- STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByIndex)(THIS_ UINT Index) PURE;
- STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByName)(THIS_ LPCSTR Name) PURE;
-
- STDMETHOD_(ID3DX11EffectVariable*, GetMemberByIndex)(THIS_ UINT Index) PURE;
- STDMETHOD_(ID3DX11EffectVariable*, GetMemberByName)(THIS_ LPCSTR Name) PURE;
- STDMETHOD_(ID3DX11EffectVariable*, GetMemberBySemantic)(THIS_ LPCSTR Semantic) PURE;
-
- STDMETHOD_(ID3DX11EffectVariable*, GetElement)(THIS_ UINT Index) PURE;
-
- STDMETHOD_(ID3DX11EffectConstantBuffer*, GetParentConstantBuffer)(THIS) PURE;
-
- STDMETHOD_(ID3DX11EffectScalarVariable*, AsScalar)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectVectorVariable*, AsVector)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectMatrixVariable*, AsMatrix)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectStringVariable*, AsString)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectClassInstanceVariable*, AsClassInstance)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectInterfaceVariable*, AsInterface)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectShaderResourceVariable*, AsShaderResource)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectUnorderedAccessViewVariable*, AsUnorderedAccessView)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectRenderTargetViewVariable*, AsRenderTargetView)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectDepthStencilViewVariable*, AsDepthStencilView)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectConstantBuffer*, AsConstantBuffer)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectShaderVariable*, AsShader)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectBlendVariable*, AsBlend)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectDepthStencilVariable*, AsDepthStencil)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectRasterizerVariable*, AsRasterizer)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectSamplerVariable*, AsSampler)(THIS) PURE;
-
- STDMETHOD(SetRawValue)(THIS_ CONST void *pData, UINT Offset, UINT Count) PURE;
- STDMETHOD(GetRawValue)(THIS_ void *pData, UINT Offset, UINT Count) PURE;
-
- STDMETHOD(GetString)(THIS_ LPCSTR *ppString) PURE;
- STDMETHOD(GetStringArray)(THIS_ LPCSTR *ppStrings, UINT Offset, UINT Count) PURE;
-};
-
-//////////////////////////////////////////////////////////////////////////////
-// ID3DX11EffectClassInstanceVariable ////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////////
-
-typedef interface ID3DX11EffectClassInstanceVariable ID3DX11EffectClassInstanceVariable;
-typedef interface ID3DX11EffectClassInstanceVariable *LPD3D11EFFECTCLASSINSTANCEVARIABLE;
-
-// {926A8053-2A39-4DB4-9BDE-CF649ADEBDC1}
-DEFINE_GUID(IID_ID3DX11EffectClassInstanceVariable,
- 0x926a8053, 0x2a39, 0x4db4, 0x9b, 0xde, 0xcf, 0x64, 0x9a, 0xde, 0xbd, 0xc1);
-
-#undef INTERFACE
-#define INTERFACE ID3DX11EffectClassInstanceVariable
-
-DECLARE_INTERFACE_(ID3DX11EffectClassInstanceVariable, ID3DX11EffectVariable)
-{
- STDMETHOD_(BOOL, IsValid)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectType*, GetType)(THIS) PURE;
- STDMETHOD(GetDesc)(THIS_ D3DX11_EFFECT_VARIABLE_DESC *pDesc) PURE;
-
- STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByIndex)(THIS_ UINT Index) PURE;
- STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByName)(THIS_ LPCSTR Name) PURE;
-
- STDMETHOD_(ID3DX11EffectVariable*, GetMemberByIndex)(THIS_ UINT Index) PURE;
- STDMETHOD_(ID3DX11EffectVariable*, GetMemberByName)(THIS_ LPCSTR Name) PURE;
- STDMETHOD_(ID3DX11EffectVariable*, GetMemberBySemantic)(THIS_ LPCSTR Semantic) PURE;
-
- STDMETHOD_(ID3DX11EffectVariable*, GetElement)(THIS_ UINT Index) PURE;
-
- STDMETHOD_(ID3DX11EffectConstantBuffer*, GetParentConstantBuffer)(THIS) PURE;
-
- STDMETHOD_(ID3DX11EffectScalarVariable*, AsScalar)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectVectorVariable*, AsVector)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectMatrixVariable*, AsMatrix)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectStringVariable*, AsString)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectClassInstanceVariable*, AsClassInstance)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectInterfaceVariable*, AsInterface)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectUnorderedAccessViewVariable*, AsUnorderedAccessView)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectRenderTargetViewVariable*, AsRenderTargetView)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectDepthStencilViewVariable*, AsDepthStencilView)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectConstantBuffer*, AsConstantBuffer)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectShaderVariable*, AsShader)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectBlendVariable*, AsBlend)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectDepthStencilVariable*, AsDepthStencil)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectRasterizerVariable*, AsRasterizer)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectSamplerVariable*, AsSampler)(THIS) PURE;
-
- STDMETHOD(SetRawValue)(THIS_ CONST void *pData, UINT Offset, UINT Count) PURE;
- STDMETHOD(GetRawValue)(THIS_ void *pData, UINT Offset, UINT Count) PURE;
-
- STDMETHOD(GetClassInstance)(ID3D11ClassInstance** ppClassInstance) PURE;
-};
-
-//////////////////////////////////////////////////////////////////////////////
-// ID3DX11EffectInterfaceVariable ////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////////
-
-typedef interface ID3DX11EffectInterfaceVariable ID3DX11EffectInterfaceVariable;
-typedef interface ID3DX11EffectInterfaceVariable *LPD3D11EFFECTINTERFACEVARIABLE;
-
-// {516C8CD8-1C80-40A4-B19B-0688792F11A5}
-DEFINE_GUID(IID_ID3DX11EffectInterfaceVariable,
- 0x516c8cd8, 0x1c80, 0x40a4, 0xb1, 0x9b, 0x06, 0x88, 0x79, 0x2f, 0x11, 0xa5);
-
-#undef INTERFACE
-#define INTERFACE ID3DX11EffectInterfaceVariable
-
-DECLARE_INTERFACE_(ID3DX11EffectInterfaceVariable, ID3DX11EffectVariable)
-{
- STDMETHOD_(BOOL, IsValid)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectType*, GetType)(THIS) PURE;
- STDMETHOD(GetDesc)(THIS_ D3DX11_EFFECT_VARIABLE_DESC *pDesc) PURE;
-
- STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByIndex)(THIS_ UINT Index) PURE;
- STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByName)(THIS_ LPCSTR Name) PURE;
-
- STDMETHOD_(ID3DX11EffectVariable*, GetMemberByIndex)(THIS_ UINT Index) PURE;
- STDMETHOD_(ID3DX11EffectVariable*, GetMemberByName)(THIS_ LPCSTR Name) PURE;
- STDMETHOD_(ID3DX11EffectVariable*, GetMemberBySemantic)(THIS_ LPCSTR Semantic) PURE;
-
- STDMETHOD_(ID3DX11EffectVariable*, GetElement)(THIS_ UINT Index) PURE;
-
- STDMETHOD_(ID3DX11EffectConstantBuffer*, GetParentConstantBuffer)(THIS) PURE;
-
- STDMETHOD_(ID3DX11EffectScalarVariable*, AsScalar)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectVectorVariable*, AsVector)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectMatrixVariable*, AsMatrix)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectStringVariable*, AsString)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectClassInstanceVariable*, AsClassInstance)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectInterfaceVariable*, AsInterface)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectUnorderedAccessViewVariable*, AsUnorderedAccessView)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectRenderTargetViewVariable*, AsRenderTargetView)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectDepthStencilViewVariable*, AsDepthStencilView)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectConstantBuffer*, AsConstantBuffer)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectShaderVariable*, AsShader)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectBlendVariable*, AsBlend)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectDepthStencilVariable*, AsDepthStencil)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectRasterizerVariable*, AsRasterizer)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectSamplerVariable*, AsSampler)(THIS) PURE;
-
- STDMETHOD(SetRawValue)(THIS_ CONST void *pData, UINT Offset, UINT Count) PURE;
- STDMETHOD(GetRawValue)(THIS_ void *pData, UINT Offset, UINT Count) PURE;
-
- STDMETHOD(SetClassInstance)(ID3DX11EffectClassInstanceVariable *pEffectClassInstance) PURE;
- STDMETHOD(GetClassInstance)(ID3DX11EffectClassInstanceVariable **ppEffectClassInstance) PURE;
-};
-
-//////////////////////////////////////////////////////////////////////////////
-// ID3DX11EffectShaderResourceVariable ////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////////
-
-typedef interface ID3DX11EffectShaderResourceVariable ID3DX11EffectShaderResourceVariable;
-typedef interface ID3DX11EffectShaderResourceVariable *LPD3D11EFFECTSHADERRESOURCEVARIABLE;
-
-// {350DB233-BBE0-485C-9BFE-C0026B844F89}
-DEFINE_GUID(IID_ID3DX11EffectShaderResourceVariable,
- 0x350db233, 0xbbe0, 0x485c, 0x9b, 0xfe, 0xc0, 0x02, 0x6b, 0x84, 0x4f, 0x89);
-
-#undef INTERFACE
-#define INTERFACE ID3DX11EffectShaderResourceVariable
-
-DECLARE_INTERFACE_(ID3DX11EffectShaderResourceVariable, ID3DX11EffectVariable)
-{
- STDMETHOD_(BOOL, IsValid)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectType*, GetType)(THIS) PURE;
- STDMETHOD(GetDesc)(THIS_ D3DX11_EFFECT_VARIABLE_DESC *pDesc) PURE;
-
- STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByIndex)(THIS_ UINT Index) PURE;
- STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByName)(THIS_ LPCSTR Name) PURE;
-
- STDMETHOD_(ID3DX11EffectVariable*, GetMemberByIndex)(THIS_ UINT Index) PURE;
- STDMETHOD_(ID3DX11EffectVariable*, GetMemberByName)(THIS_ LPCSTR Name) PURE;
- STDMETHOD_(ID3DX11EffectVariable*, GetMemberBySemantic)(THIS_ LPCSTR Semantic) PURE;
-
- STDMETHOD_(ID3DX11EffectVariable*, GetElement)(THIS_ UINT Index) PURE;
-
- STDMETHOD_(ID3DX11EffectConstantBuffer*, GetParentConstantBuffer)(THIS) PURE;
-
- STDMETHOD_(ID3DX11EffectScalarVariable*, AsScalar)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectVectorVariable*, AsVector)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectMatrixVariable*, AsMatrix)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectStringVariable*, AsString)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectClassInstanceVariable*, AsClassInstance)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectInterfaceVariable*, AsInterface)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectShaderResourceVariable*, AsShaderResource)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectUnorderedAccessViewVariable*, AsUnorderedAccessView)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectRenderTargetViewVariable*, AsRenderTargetView)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectDepthStencilViewVariable*, AsDepthStencilView)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectConstantBuffer*, AsConstantBuffer)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectShaderVariable*, AsShader)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectBlendVariable*, AsBlend)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectDepthStencilVariable*, AsDepthStencil)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectRasterizerVariable*, AsRasterizer)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectSamplerVariable*, AsSampler)(THIS) PURE;
-
- STDMETHOD(SetRawValue)(THIS_ CONST void *pData, UINT Offset, UINT Count) PURE;
- STDMETHOD(GetRawValue)(THIS_ void *pData, UINT Offset, UINT Count) PURE;
-
- STDMETHOD(SetResource)(THIS_ ID3D11ShaderResourceView *pResource) PURE;
- STDMETHOD(GetResource)(THIS_ ID3D11ShaderResourceView **ppResource) PURE;
-
- STDMETHOD(SetResourceArray)(THIS_ ID3D11ShaderResourceView **ppResources, UINT Offset, UINT Count) PURE;
- STDMETHOD(GetResourceArray)(THIS_ ID3D11ShaderResourceView **ppResources, UINT Offset, UINT Count) PURE;
-};
-
-//////////////////////////////////////////////////////////////////////////////
-// ID3DX11EffectUnorderedAccessViewVariable ////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////////
-
-typedef interface ID3DX11EffectUnorderedAccessViewVariable ID3DX11EffectUnorderedAccessViewVariable;
-typedef interface ID3DX11EffectUnorderedAccessViewVariable *LPD3D11EFFECTUNORDEREDACCESSVIEWVARIABLE;
-
-// {79B4AC8C-870A-47D2-B05A-8BD5CC3EE6C9}
-DEFINE_GUID(IID_ID3DX11EffectUnorderedAccessViewVariable,
- 0x79b4ac8c, 0x870a, 0x47d2, 0xb0, 0x5a, 0x8b, 0xd5, 0xcc, 0x3e, 0xe6, 0xc9);
-
-#undef INTERFACE
-#define INTERFACE ID3DX11EffectUnorderedAccessViewVariable
-
-DECLARE_INTERFACE_(ID3DX11EffectUnorderedAccessViewVariable, ID3DX11EffectVariable)
-{
- STDMETHOD_(BOOL, IsValid)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectType*, GetType)(THIS) PURE;
- STDMETHOD(GetDesc)(THIS_ D3DX11_EFFECT_VARIABLE_DESC *pDesc) PURE;
-
- STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByIndex)(THIS_ UINT Index) PURE;
- STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByName)(THIS_ LPCSTR Name) PURE;
-
- STDMETHOD_(ID3DX11EffectVariable*, GetMemberByIndex)(THIS_ UINT Index) PURE;
- STDMETHOD_(ID3DX11EffectVariable*, GetMemberByName)(THIS_ LPCSTR Name) PURE;
- STDMETHOD_(ID3DX11EffectVariable*, GetMemberBySemantic)(THIS_ LPCSTR Semantic) PURE;
-
- STDMETHOD_(ID3DX11EffectVariable*, GetElement)(THIS_ UINT Index) PURE;
-
- STDMETHOD_(ID3DX11EffectConstantBuffer*, GetParentConstantBuffer)(THIS) PURE;
-
- STDMETHOD_(ID3DX11EffectScalarVariable*, AsScalar)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectVectorVariable*, AsVector)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectMatrixVariable*, AsMatrix)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectStringVariable*, AsString)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectClassInstanceVariable*, AsClassInstance)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectInterfaceVariable*, AsInterface)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectShaderResourceVariable*, AsShaderResource)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectUnorderedAccessViewVariable*, AsUnorderedAccessView)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectRenderTargetViewVariable*, AsRenderTargetView)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectDepthStencilViewVariable*, AsDepthStencilView)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectConstantBuffer*, AsConstantBuffer)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectShaderVariable*, AsShader)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectBlendVariable*, AsBlend)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectDepthStencilVariable*, AsDepthStencil)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectRasterizerVariable*, AsRasterizer)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectSamplerVariable*, AsSampler)(THIS) PURE;
-
- STDMETHOD(SetRawValue)(THIS_ CONST void *pData, UINT Offset, UINT Count) PURE;
- STDMETHOD(GetRawValue)(THIS_ void *pData, UINT Offset, UINT Count) PURE;
-
- STDMETHOD(SetUnorderedAccessView)(THIS_ ID3D11UnorderedAccessView *pResource) PURE;
- STDMETHOD(GetUnorderedAccessView)(THIS_ ID3D11UnorderedAccessView **ppResource) PURE;
-
- STDMETHOD(SetUnorderedAccessViewArray)(THIS_ ID3D11UnorderedAccessView **ppResources, UINT Offset, UINT Count) PURE;
- STDMETHOD(GetUnorderedAccessViewArray)(THIS_ ID3D11UnorderedAccessView **ppResources, UINT Offset, UINT Count) PURE;
-};
-
-//////////////////////////////////////////////////////////////////////////////
-// ID3DX11EffectRenderTargetViewVariable //////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////////
-
-typedef interface ID3DX11EffectRenderTargetViewVariable ID3DX11EffectRenderTargetViewVariable;
-typedef interface ID3DX11EffectRenderTargetViewVariable *LPD3D11EFFECTRENDERTARGETVIEWVARIABLE;
-
-// {D5066909-F40C-43F8-9DB5-057C2A208552}
-DEFINE_GUID(IID_ID3DX11EffectRenderTargetViewVariable,
- 0xd5066909, 0xf40c, 0x43f8, 0x9d, 0xb5, 0x05, 0x7c, 0x2a, 0x20, 0x85, 0x52);
-
-#undef INTERFACE
-#define INTERFACE ID3DX11EffectRenderTargetViewVariable
-
-DECLARE_INTERFACE_(ID3DX11EffectRenderTargetViewVariable, ID3DX11EffectVariable)
-{
- STDMETHOD_(BOOL, IsValid)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectType*, GetType)(THIS) PURE;
- STDMETHOD(GetDesc)(THIS_ D3DX11_EFFECT_VARIABLE_DESC *pDesc) PURE;
-
- STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByIndex)(THIS_ UINT Index) PURE;
- STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByName)(THIS_ LPCSTR Name) PURE;
-
- STDMETHOD_(ID3DX11EffectVariable*, GetMemberByIndex)(THIS_ UINT Index) PURE;
- STDMETHOD_(ID3DX11EffectVariable*, GetMemberByName)(THIS_ LPCSTR Name) PURE;
- STDMETHOD_(ID3DX11EffectVariable*, GetMemberBySemantic)(THIS_ LPCSTR Semantic) PURE;
-
- STDMETHOD_(ID3DX11EffectVariable*, GetElement)(THIS_ UINT Index) PURE;
-
- STDMETHOD_(ID3DX11EffectConstantBuffer*, GetParentConstantBuffer)(THIS) PURE;
-
- STDMETHOD_(ID3DX11EffectScalarVariable*, AsScalar)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectVectorVariable*, AsVector)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectMatrixVariable*, AsMatrix)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectStringVariable*, AsString)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectClassInstanceVariable*, AsClassInstance)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectInterfaceVariable*, AsInterface)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectShaderResourceVariable*, AsShaderResource)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectUnorderedAccessViewVariable*, AsUnorderedAccessView)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectRenderTargetViewVariable*, AsRenderTargetView)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectDepthStencilViewVariable*, AsDepthStencilView)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectConstantBuffer*, AsConstantBuffer)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectShaderVariable*, AsShader)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectBlendVariable*, AsBlend)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectDepthStencilVariable*, AsDepthStencil)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectRasterizerVariable*, AsRasterizer)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectSamplerVariable*, AsSampler)(THIS) PURE;
-
- STDMETHOD(SetRawValue)(THIS_ CONST void *pData, UINT Offset, UINT Count) PURE;
- STDMETHOD(GetRawValue)(THIS_ void *pData, UINT Offset, UINT Count) PURE;
-
- STDMETHOD(SetRenderTarget)(THIS_ ID3D11RenderTargetView *pResource) PURE;
- STDMETHOD(GetRenderTarget)(THIS_ ID3D11RenderTargetView **ppResource) PURE;
-
- STDMETHOD(SetRenderTargetArray)(THIS_ ID3D11RenderTargetView **ppResources, UINT Offset, UINT Count) PURE;
- STDMETHOD(GetRenderTargetArray)(THIS_ ID3D11RenderTargetView **ppResources, UINT Offset, UINT Count) PURE;
-};
-
-//////////////////////////////////////////////////////////////////////////////
-// ID3DX11EffectDepthStencilViewVariable //////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////////
-
-typedef interface ID3DX11EffectDepthStencilViewVariable ID3DX11EffectDepthStencilViewVariable;
-typedef interface ID3DX11EffectDepthStencilViewVariable *LPD3D11EFFECTDEPTHSTENCILVIEWVARIABLE;
-
-// {33C648AC-2E9E-4A2E-9CD6-DE31ACC5B347}
-DEFINE_GUID(IID_ID3DX11EffectDepthStencilViewVariable,
- 0x33c648ac, 0x2e9e, 0x4a2e, 0x9c, 0xd6, 0xde, 0x31, 0xac, 0xc5, 0xb3, 0x47);
-
-#undef INTERFACE
-#define INTERFACE ID3DX11EffectDepthStencilViewVariable
-
-DECLARE_INTERFACE_(ID3DX11EffectDepthStencilViewVariable, ID3DX11EffectVariable)
-{
- STDMETHOD_(BOOL, IsValid)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectType*, GetType)(THIS) PURE;
- STDMETHOD(GetDesc)(THIS_ D3DX11_EFFECT_VARIABLE_DESC *pDesc) PURE;
-
- STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByIndex)(THIS_ UINT Index) PURE;
- STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByName)(THIS_ LPCSTR Name) PURE;
-
- STDMETHOD_(ID3DX11EffectVariable*, GetMemberByIndex)(THIS_ UINT Index) PURE;
- STDMETHOD_(ID3DX11EffectVariable*, GetMemberByName)(THIS_ LPCSTR Name) PURE;
- STDMETHOD_(ID3DX11EffectVariable*, GetMemberBySemantic)(THIS_ LPCSTR Semantic) PURE;
-
- STDMETHOD_(ID3DX11EffectVariable*, GetElement)(THIS_ UINT Index) PURE;
-
- STDMETHOD_(ID3DX11EffectConstantBuffer*, GetParentConstantBuffer)(THIS) PURE;
-
- STDMETHOD_(ID3DX11EffectScalarVariable*, AsScalar)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectVectorVariable*, AsVector)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectMatrixVariable*, AsMatrix)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectStringVariable*, AsString)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectClassInstanceVariable*, AsClassInstance)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectInterfaceVariable*, AsInterface)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectShaderResourceVariable*, AsShaderResource)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectUnorderedAccessViewVariable*, AsUnorderedAccessView)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectRenderTargetViewVariable*, AsRenderTargetView)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectDepthStencilViewVariable*, AsDepthStencilView)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectConstantBuffer*, AsConstantBuffer)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectShaderVariable*, AsShader)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectBlendVariable*, AsBlend)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectDepthStencilVariable*, AsDepthStencil)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectRasterizerVariable*, AsRasterizer)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectSamplerVariable*, AsSampler)(THIS) PURE;
-
- STDMETHOD(SetRawValue)(THIS_ CONST void *pData, UINT Offset, UINT Count) PURE;
- STDMETHOD(GetRawValue)(THIS_ void *pData, UINT Offset, UINT Count) PURE;
-
- STDMETHOD(SetDepthStencil)(THIS_ ID3D11DepthStencilView *pResource) PURE;
- STDMETHOD(GetDepthStencil)(THIS_ ID3D11DepthStencilView **ppResource) PURE;
-
- STDMETHOD(SetDepthStencilArray)(THIS_ ID3D11DepthStencilView **ppResources, UINT Offset, UINT Count) PURE;
- STDMETHOD(GetDepthStencilArray)(THIS_ ID3D11DepthStencilView **ppResources, UINT Offset, UINT Count) PURE;
-};
-
-//////////////////////////////////////////////////////////////////////////////
-// ID3DX11EffectConstantBuffer ////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////////
-
-typedef interface ID3DX11EffectConstantBuffer ID3DX11EffectConstantBuffer;
-typedef interface ID3DX11EffectConstantBuffer *LPD3D11EFFECTCONSTANTBUFFER;
-
-// {2CB6C733-82D2-4000-B3DA-6219D9A99BF2}
-DEFINE_GUID(IID_ID3DX11EffectConstantBuffer,
- 0x2cb6c733, 0x82d2, 0x4000, 0xb3, 0xda, 0x62, 0x19, 0xd9, 0xa9, 0x9b, 0xf2);
-
-#undef INTERFACE
-#define INTERFACE ID3DX11EffectConstantBuffer
-
-DECLARE_INTERFACE_(ID3DX11EffectConstantBuffer, ID3DX11EffectVariable)
-{
- STDMETHOD_(ID3DX11EffectType*, GetType)(THIS) PURE;
- STDMETHOD(GetDesc)(THIS_ D3DX11_EFFECT_VARIABLE_DESC *pDesc) PURE;
-
- STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByIndex)(THIS_ UINT Index) PURE;
- STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByName)(THIS_ LPCSTR Name) PURE;
-
- STDMETHOD_(ID3DX11EffectVariable*, GetMemberByIndex)(THIS_ UINT Index) PURE;
- STDMETHOD_(ID3DX11EffectVariable*, GetMemberByName)(THIS_ LPCSTR Name) PURE;
- STDMETHOD_(ID3DX11EffectVariable*, GetMemberBySemantic)(THIS_ LPCSTR Semantic) PURE;
-
- STDMETHOD_(ID3DX11EffectVariable*, GetElement)(THIS_ UINT Index) PURE;
-
- STDMETHOD_(ID3DX11EffectConstantBuffer*, GetParentConstantBuffer)(THIS) PURE;
-
- STDMETHOD_(ID3DX11EffectScalarVariable*, AsScalar)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectVectorVariable*, AsVector)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectMatrixVariable*, AsMatrix)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectStringVariable*, AsString)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectClassInstanceVariable*, AsClassInstance)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectInterfaceVariable*, AsInterface)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectShaderResourceVariable*, AsShaderResource)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectUnorderedAccessViewVariable*, AsUnorderedAccessView)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectRenderTargetViewVariable*, AsRenderTargetView)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectDepthStencilViewVariable*, AsDepthStencilView)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectConstantBuffer*, AsConstantBuffer)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectShaderVariable*, AsShader)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectBlendVariable*, AsBlend)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectDepthStencilVariable*, AsDepthStencil)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectRasterizerVariable*, AsRasterizer)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectSamplerVariable*, AsSampler)(THIS) PURE;
-
- STDMETHOD(SetRawValue)(THIS_ CONST void *pData, UINT Offset, UINT Count) PURE;
- STDMETHOD(GetRawValue)(THIS_ void *pData, UINT Offset, UINT Count) PURE;
-
- STDMETHOD(SetConstantBuffer)(THIS_ ID3D11Buffer *pConstantBuffer) PURE;
- STDMETHOD(UndoSetConstantBuffer)(THIS) PURE;
- STDMETHOD(GetConstantBuffer)(THIS_ ID3D11Buffer **ppConstantBuffer) PURE;
-
- STDMETHOD(SetTextureBuffer)(THIS_ ID3D11ShaderResourceView *pTextureBuffer) PURE;
- STDMETHOD(UndoSetTextureBuffer)(THIS) PURE;
- STDMETHOD(GetTextureBuffer)(THIS_ ID3D11ShaderResourceView **ppTextureBuffer) PURE;
-};
-
-//////////////////////////////////////////////////////////////////////////////
-// ID3DX11EffectShaderVariable ////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////////
-
-//----------------------------------------------------------------------------
-// D3DX11_EFFECT_SHADER_DESC:
-//
-// Retrieved by ID3DX11EffectShaderVariable::GetShaderDesc()
-//----------------------------------------------------------------------------
-
-typedef struct _D3DX11_EFFECT_SHADER_DESC
-{
- CONST BYTE *pInputSignature; // Passed into CreateInputLayout,
- // valid on VS and GS only
-
- BOOL IsInline; // Is this an anonymous shader variable
- // resulting from an inline shader assignment?
-
-
- // -- The following fields are not valid after Optimize() --
- CONST BYTE *pBytecode; // Shader bytecode
- UINT BytecodeLength;
-
- LPCSTR SODecls[D3D11_SO_STREAM_COUNT]; // Stream out declaration string (for GS with SO)
- UINT RasterizedStream;
-
- UINT NumInputSignatureEntries; // Number of entries in the input signature
- UINT NumOutputSignatureEntries; // Number of entries in the output signature
- UINT NumPatchConstantSignatureEntries; // Number of entries in the patch constant signature
-} D3DX11_EFFECT_SHADER_DESC;
-
-
-typedef interface ID3DX11EffectShaderVariable ID3DX11EffectShaderVariable;
-typedef interface ID3DX11EffectShaderVariable *LPD3D11EFFECTSHADERVARIABLE;
-
-// {7508B344-020A-4EC7-9118-62CDD36C88D7}
-DEFINE_GUID(IID_ID3DX11EffectShaderVariable,
- 0x7508b344, 0x020a, 0x4ec7, 0x91, 0x18, 0x62, 0xcd, 0xd3, 0x6c, 0x88, 0xd7);
-
-#undef INTERFACE
-#define INTERFACE ID3DX11EffectShaderVariable
-
-DECLARE_INTERFACE_(ID3DX11EffectShaderVariable, ID3DX11EffectVariable)
-{
- STDMETHOD_(ID3DX11EffectType*, GetType)(THIS) PURE;
- STDMETHOD(GetDesc)(THIS_ D3DX11_EFFECT_VARIABLE_DESC *pDesc) PURE;
-
- STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByIndex)(THIS_ UINT Index) PURE;
- STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByName)(THIS_ LPCSTR Name) PURE;
-
- STDMETHOD_(ID3DX11EffectVariable*, GetMemberByIndex)(THIS_ UINT Index) PURE;
- STDMETHOD_(ID3DX11EffectVariable*, GetMemberByName)(THIS_ LPCSTR Name) PURE;
- STDMETHOD_(ID3DX11EffectVariable*, GetMemberBySemantic)(THIS_ LPCSTR Semantic) PURE;
-
- STDMETHOD_(ID3DX11EffectVariable*, GetElement)(THIS_ UINT Index) PURE;
-
- STDMETHOD_(ID3DX11EffectConstantBuffer*, GetParentConstantBuffer)(THIS) PURE;
-
- STDMETHOD_(ID3DX11EffectScalarVariable*, AsScalar)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectVectorVariable*, AsVector)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectMatrixVariable*, AsMatrix)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectStringVariable*, AsString)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectClassInstanceVariable*, AsClassInstance)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectInterfaceVariable*, AsInterface)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectShaderResourceVariable*, AsShaderResource)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectUnorderedAccessViewVariable*, AsUnorderedAccessView)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectRenderTargetViewVariable*, AsRenderTargetView)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectDepthStencilViewVariable*, AsDepthStencilView)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectConstantBuffer*, AsConstantBuffer)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectShaderVariable*, AsShader)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectBlendVariable*, AsBlend)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectDepthStencilVariable*, AsDepthStencil)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectRasterizerVariable*, AsRasterizer)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectSamplerVariable*, AsSampler)(THIS) PURE;
-
- STDMETHOD(SetRawValue)(THIS_ CONST void *pData, UINT Offset, UINT Count) PURE;
- STDMETHOD(GetRawValue)(THIS_ void *pData, UINT Offset, UINT Count) PURE;
-
- STDMETHOD(GetShaderDesc)(THIS_ UINT ShaderIndex, D3DX11_EFFECT_SHADER_DESC *pDesc) PURE;
-
- STDMETHOD(GetVertexShader)(THIS_ UINT ShaderIndex, ID3D11VertexShader **ppVS) PURE;
- STDMETHOD(GetGeometryShader)(THIS_ UINT ShaderIndex, ID3D11GeometryShader **ppGS) PURE;
- STDMETHOD(GetPixelShader)(THIS_ UINT ShaderIndex, ID3D11PixelShader **ppPS) PURE;
- STDMETHOD(GetHullShader)(THIS_ UINT ShaderIndex, ID3D11HullShader **ppPS) PURE;
- STDMETHOD(GetDomainShader)(THIS_ UINT ShaderIndex, ID3D11DomainShader **ppPS) PURE;
- STDMETHOD(GetComputeShader)(THIS_ UINT ShaderIndex, ID3D11ComputeShader **ppPS) PURE;
-
- STDMETHOD(GetInputSignatureElementDesc)(THIS_ UINT ShaderIndex, UINT Element, D3D11_SIGNATURE_PARAMETER_DESC *pDesc) PURE;
- STDMETHOD(GetOutputSignatureElementDesc)(THIS_ UINT ShaderIndex, UINT Element, D3D11_SIGNATURE_PARAMETER_DESC *pDesc) PURE;
- STDMETHOD(GetPatchConstantSignatureElementDesc)(THIS_ UINT ShaderIndex, UINT Element, D3D11_SIGNATURE_PARAMETER_DESC *pDesc) PURE;
-};
-
-//////////////////////////////////////////////////////////////////////////////
-// ID3DX11EffectBlendVariable /////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////////
-
-typedef interface ID3DX11EffectBlendVariable ID3DX11EffectBlendVariable;
-typedef interface ID3DX11EffectBlendVariable *LPD3D11EFFECTBLENDVARIABLE;
-
-// {D664F4D7-3B81-4805-B277-C1DF58C39F53}
-DEFINE_GUID(IID_ID3DX11EffectBlendVariable,
- 0xd664f4d7, 0x3b81, 0x4805, 0xb2, 0x77, 0xc1, 0xdf, 0x58, 0xc3, 0x9f, 0x53);
-
-#undef INTERFACE
-#define INTERFACE ID3DX11EffectBlendVariable
-
-DECLARE_INTERFACE_(ID3DX11EffectBlendVariable, ID3DX11EffectVariable)
-{
- STDMETHOD_(ID3DX11EffectType*, GetType)(THIS) PURE;
- STDMETHOD(GetDesc)(THIS_ D3DX11_EFFECT_VARIABLE_DESC *pDesc) PURE;
-
- STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByIndex)(THIS_ UINT Index) PURE;
- STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByName)(THIS_ LPCSTR Name) PURE;
-
- STDMETHOD_(ID3DX11EffectVariable*, GetMemberByIndex)(THIS_ UINT Index) PURE;
- STDMETHOD_(ID3DX11EffectVariable*, GetMemberByName)(THIS_ LPCSTR Name) PURE;
- STDMETHOD_(ID3DX11EffectVariable*, GetMemberBySemantic)(THIS_ LPCSTR Semantic) PURE;
-
- STDMETHOD_(ID3DX11EffectVariable*, GetElement)(THIS_ UINT Index) PURE;
-
- STDMETHOD_(ID3DX11EffectConstantBuffer*, GetParentConstantBuffer)(THIS) PURE;
-
- STDMETHOD_(ID3DX11EffectScalarVariable*, AsScalar)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectVectorVariable*, AsVector)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectMatrixVariable*, AsMatrix)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectStringVariable*, AsString)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectClassInstanceVariable*, AsClassInstance)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectInterfaceVariable*, AsInterface)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectShaderResourceVariable*, AsShaderResource)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectUnorderedAccessViewVariable*, AsUnorderedAccessView)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectRenderTargetViewVariable*, AsRenderTargetView)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectDepthStencilViewVariable*, AsDepthStencilView)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectConstantBuffer*, AsConstantBuffer)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectShaderVariable*, AsShader)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectBlendVariable*, AsBlend)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectDepthStencilVariable*, AsDepthStencil)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectRasterizerVariable*, AsRasterizer)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectSamplerVariable*, AsSampler)(THIS) PURE;
-
- STDMETHOD(SetRawValue)(THIS_ CONST void *pData, UINT Offset, UINT Count) PURE;
- STDMETHOD(GetRawValue)(THIS_ void *pData, UINT Offset, UINT Count) PURE;
-
- STDMETHOD(GetBlendState)(THIS_ UINT Index, ID3D11BlendState **ppBlendState) PURE;
- STDMETHOD(SetBlendState)(THIS_ UINT Index, ID3D11BlendState *pBlendState) PURE;
- STDMETHOD(UndoSetBlendState)(THIS_ UINT Index) PURE;
- STDMETHOD(GetBackingStore)(THIS_ UINT Index, D3D11_BLEND_DESC *pBlendDesc) PURE;
-};
-
-//////////////////////////////////////////////////////////////////////////////
-// ID3DX11EffectDepthStencilVariable //////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////////
-
-typedef interface ID3DX11EffectDepthStencilVariable ID3DX11EffectDepthStencilVariable;
-typedef interface ID3DX11EffectDepthStencilVariable *LPD3D11EFFECTDEPTHSTENCILVARIABLE;
-
-// {69B5751B-61A5-48E5-BD41-D93988111563}
-DEFINE_GUID(IID_ID3DX11EffectDepthStencilVariable,
- 0x69b5751b, 0x61a5, 0x48e5, 0xbd, 0x41, 0xd9, 0x39, 0x88, 0x11, 0x15, 0x63);
-
-#undef INTERFACE
-#define INTERFACE ID3DX11EffectDepthStencilVariable
-
-DECLARE_INTERFACE_(ID3DX11EffectDepthStencilVariable, ID3DX11EffectVariable)
-{
- STDMETHOD_(ID3DX11EffectType*, GetType)(THIS) PURE;
- STDMETHOD(GetDesc)(THIS_ D3DX11_EFFECT_VARIABLE_DESC *pDesc) PURE;
-
- STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByIndex)(THIS_ UINT Index) PURE;
- STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByName)(THIS_ LPCSTR Name) PURE;
-
- STDMETHOD_(ID3DX11EffectVariable*, GetMemberByIndex)(THIS_ UINT Index) PURE;
- STDMETHOD_(ID3DX11EffectVariable*, GetMemberByName)(THIS_ LPCSTR Name) PURE;
- STDMETHOD_(ID3DX11EffectVariable*, GetMemberBySemantic)(THIS_ LPCSTR Semantic) PURE;
-
- STDMETHOD_(ID3DX11EffectVariable*, GetElement)(THIS_ UINT Index) PURE;
-
- STDMETHOD_(ID3DX11EffectConstantBuffer*, GetParentConstantBuffer)(THIS) PURE;
-
- STDMETHOD_(ID3DX11EffectScalarVariable*, AsScalar)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectVectorVariable*, AsVector)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectMatrixVariable*, AsMatrix)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectStringVariable*, AsString)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectClassInstanceVariable*, AsClassInstance)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectInterfaceVariable*, AsInterface)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectShaderResourceVariable*, AsShaderResource)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectUnorderedAccessViewVariable*, AsUnorderedAccessView)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectRenderTargetViewVariable*, AsRenderTargetView)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectDepthStencilViewVariable*, AsDepthStencilView)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectConstantBuffer*, AsConstantBuffer)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectShaderVariable*, AsShader)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectBlendVariable*, AsBlend)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectDepthStencilVariable*, AsDepthStencil)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectRasterizerVariable*, AsRasterizer)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectSamplerVariable*, AsSampler)(THIS) PURE;
-
- STDMETHOD(SetRawValue)(THIS_ CONST void *pData, UINT Offset, UINT Count) PURE;
- STDMETHOD(GetRawValue)(THIS_ void *pData, UINT Offset, UINT Count) PURE;
-
- STDMETHOD(GetDepthStencilState)(THIS_ UINT Index, ID3D11DepthStencilState **ppDepthStencilState) PURE;
- STDMETHOD(SetDepthStencilState)(THIS_ UINT Index, ID3D11DepthStencilState *pDepthStencilState) PURE;
- STDMETHOD(UndoSetDepthStencilState)(THIS_ UINT Index) PURE;
- STDMETHOD(GetBackingStore)(THIS_ UINT Index, D3D11_DEPTH_STENCIL_DESC *pDepthStencilDesc) PURE;
-};
-
-//////////////////////////////////////////////////////////////////////////////
-// ID3DX11EffectRasterizerVariable ////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////////
-
-typedef interface ID3DX11EffectRasterizerVariable ID3DX11EffectRasterizerVariable;
-typedef interface ID3DX11EffectRasterizerVariable *LPD3D11EFFECTRASTERIZERVARIABLE;
-
-// {53A262F6-5F74-4151-A132-E3DD19A62C9D}
-DEFINE_GUID(IID_ID3DX11EffectRasterizerVariable,
- 0x53a262f6, 0x5f74, 0x4151, 0xa1, 0x32, 0xe3, 0xdd, 0x19, 0xa6, 0x2c, 0x9d);
-
-#undef INTERFACE
-#define INTERFACE ID3DX11EffectRasterizerVariable
-
-DECLARE_INTERFACE_(ID3DX11EffectRasterizerVariable, ID3DX11EffectVariable)
-{
- STDMETHOD_(ID3DX11EffectType*, GetType)(THIS) PURE;
- STDMETHOD(GetDesc)(THIS_ D3DX11_EFFECT_VARIABLE_DESC *pDesc) PURE;
-
- STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByIndex)(THIS_ UINT Index) PURE;
- STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByName)(THIS_ LPCSTR Name) PURE;
-
- STDMETHOD_(ID3DX11EffectVariable*, GetMemberByIndex)(THIS_ UINT Index) PURE;
- STDMETHOD_(ID3DX11EffectVariable*, GetMemberByName)(THIS_ LPCSTR Name) PURE;
- STDMETHOD_(ID3DX11EffectVariable*, GetMemberBySemantic)(THIS_ LPCSTR Semantic) PURE;
-
- STDMETHOD_(ID3DX11EffectVariable*, GetElement)(THIS_ UINT Index) PURE;
-
- STDMETHOD_(ID3DX11EffectConstantBuffer*, GetParentConstantBuffer)(THIS) PURE;
-
- STDMETHOD_(ID3DX11EffectScalarVariable*, AsScalar)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectVectorVariable*, AsVector)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectMatrixVariable*, AsMatrix)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectStringVariable*, AsString)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectClassInstanceVariable*, AsClassInstance)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectInterfaceVariable*, AsInterface)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectShaderResourceVariable*, AsShaderResource)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectUnorderedAccessViewVariable*, AsUnorderedAccessView)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectRenderTargetViewVariable*, AsRenderTargetView)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectDepthStencilViewVariable*, AsDepthStencilView)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectConstantBuffer*, AsConstantBuffer)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectShaderVariable*, AsShader)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectBlendVariable*, AsBlend)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectDepthStencilVariable*, AsDepthStencil)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectRasterizerVariable*, AsRasterizer)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectSamplerVariable*, AsSampler)(THIS) PURE;
-
- STDMETHOD(SetRawValue)(THIS_ CONST void *pData, UINT Offset, UINT Count) PURE;
- STDMETHOD(GetRawValue)(THIS_ void *pData, UINT Offset, UINT Count) PURE;
-
- STDMETHOD(GetRasterizerState)(THIS_ UINT Index, ID3D11RasterizerState **ppRasterizerState) PURE;
- STDMETHOD(SetRasterizerState)(THIS_ UINT Index, ID3D11RasterizerState *pRasterizerState) PURE;
- STDMETHOD(UndoSetRasterizerState)(THIS_ UINT Index) PURE;
- STDMETHOD(GetBackingStore)(THIS_ UINT Index, D3D11_RASTERIZER_DESC *pRasterizerDesc) PURE;
-};
-
-//////////////////////////////////////////////////////////////////////////////
-// ID3DX11EffectSamplerVariable ///////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////////
-
-typedef interface ID3DX11EffectSamplerVariable ID3DX11EffectSamplerVariable;
-typedef interface ID3DX11EffectSamplerVariable *LPD3D11EFFECTSAMPLERVARIABLE;
-
-// {C6402E55-1095-4D95-8931-F92660513DD9}
-DEFINE_GUID(IID_ID3DX11EffectSamplerVariable,
- 0xc6402e55, 0x1095, 0x4d95, 0x89, 0x31, 0xf9, 0x26, 0x60, 0x51, 0x3d, 0xd9);
-
-#undef INTERFACE
-#define INTERFACE ID3DX11EffectSamplerVariable
-
-DECLARE_INTERFACE_(ID3DX11EffectSamplerVariable, ID3DX11EffectVariable)
-{
- STDMETHOD_(ID3DX11EffectType*, GetType)(THIS) PURE;
- STDMETHOD(GetDesc)(THIS_ D3DX11_EFFECT_VARIABLE_DESC *pDesc) PURE;
-
- STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByIndex)(THIS_ UINT Index) PURE;
- STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByName)(THIS_ LPCSTR Name) PURE;
-
- STDMETHOD_(ID3DX11EffectVariable*, GetMemberByIndex)(THIS_ UINT Index) PURE;
- STDMETHOD_(ID3DX11EffectVariable*, GetMemberByName)(THIS_ LPCSTR Name) PURE;
- STDMETHOD_(ID3DX11EffectVariable*, GetMemberBySemantic)(THIS_ LPCSTR Semantic) PURE;
-
- STDMETHOD_(ID3DX11EffectVariable*, GetElement)(THIS_ UINT Index) PURE;
-
- STDMETHOD_(ID3DX11EffectConstantBuffer*, GetParentConstantBuffer)(THIS) PURE;
-
- STDMETHOD_(ID3DX11EffectScalarVariable*, AsScalar)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectVectorVariable*, AsVector)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectMatrixVariable*, AsMatrix)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectStringVariable*, AsString)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectClassInstanceVariable*, AsClassInstance)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectInterfaceVariable*, AsInterface)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectShaderResourceVariable*, AsShaderResource)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectUnorderedAccessViewVariable*, AsUnorderedAccessView)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectRenderTargetViewVariable*, AsRenderTargetView)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectDepthStencilViewVariable*, AsDepthStencilView)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectConstantBuffer*, AsConstantBuffer)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectShaderVariable*, AsShader)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectBlendVariable*, AsBlend)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectDepthStencilVariable*, AsDepthStencil)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectRasterizerVariable*, AsRasterizer)(THIS) PURE;
- STDMETHOD_(ID3DX11EffectSamplerVariable*, AsSampler)(THIS) PURE;
-
- STDMETHOD(SetRawValue)(THIS_ CONST void *pData, UINT Offset, UINT Count) PURE;
- STDMETHOD(GetRawValue)(THIS_ void *pData, UINT Offset, UINT Count) PURE;
-
- STDMETHOD(GetSampler)(THIS_ UINT Index, ID3D11SamplerState **ppSampler) PURE;
- STDMETHOD(SetSampler)(THIS_ UINT Index, ID3D11SamplerState *pSampler) PURE;
- STDMETHOD(UndoSetSampler)(THIS_ UINT Index) PURE;
- STDMETHOD(GetBackingStore)(THIS_ UINT Index, D3D11_SAMPLER_DESC *pSamplerDesc) PURE;
-};
-
-//////////////////////////////////////////////////////////////////////////////
-// ID3DX11EffectPass //////////////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////////
-
-//----------------------------------------------------------------------------
-// D3DX11_PASS_DESC:
-//
-// Retrieved by ID3DX11EffectPass::GetDesc()
-//----------------------------------------------------------------------------
-
-typedef struct _D3DX11_PASS_DESC
-{
- LPCSTR Name; // Name of this pass (NULL if not anonymous)
- UINT Annotations; // Number of annotations on this pass
-
- BYTE *pIAInputSignature; // Signature from VS or GS (if there is no VS)
- // or NULL if neither exists
- SIZE_T IAInputSignatureSize; // Singature size in bytes
-
- UINT StencilRef; // Specified in SetDepthStencilState()
- UINT SampleMask; // Specified in SetBlendState()
- FLOAT BlendFactor[4]; // Specified in SetBlendState()
-} D3DX11_PASS_DESC;
-
-//----------------------------------------------------------------------------
-// D3DX11_PASS_SHADER_DESC:
-//
-// Retrieved by ID3DX11EffectPass::Get**ShaderDesc()
-//----------------------------------------------------------------------------
-
-typedef struct _D3DX11_PASS_SHADER_DESC
-{
- ID3DX11EffectShaderVariable *pShaderVariable; // The variable that this shader came from.
- // If this is an inline shader assignment,
- // the returned interface will be an
- // anonymous shader variable, which is
- // not retrievable any other way. It's
- // name in the variable description will
- // be "$Anonymous".
- // If there is no assignment of this type in
- // the pass block, pShaderVariable != NULL,
- // but pShaderVariable->IsValid() == FALSE.
-
- UINT ShaderIndex; // The element of pShaderVariable (if an array)
- // or 0 if not applicable
-} D3DX11_PASS_SHADER_DESC;
-
-typedef interface ID3DX11EffectPass ID3DX11EffectPass;
-typedef interface ID3DX11EffectPass *LPD3D11EFFECTPASS;
-
-// {3437CEC4-4AC1-4D87-8916-F4BD5A41380C}
-DEFINE_GUID(IID_ID3DX11EffectPass,
- 0x3437cec4, 0x4ac1, 0x4d87, 0x89, 0x16, 0xf4, 0xbd, 0x5a, 0x41, 0x38, 0x0c);
-
-#undef INTERFACE
-#define INTERFACE ID3DX11EffectPass
-
-DECLARE_INTERFACE(ID3DX11EffectPass)
-{
- STDMETHOD_(BOOL, IsValid)(THIS) PURE;
- STDMETHOD(GetDesc)(THIS_ D3DX11_PASS_DESC *pDesc) PURE;
-
- STDMETHOD(GetVertexShaderDesc)(THIS_ D3DX11_PASS_SHADER_DESC *pDesc) PURE;
- STDMETHOD(GetGeometryShaderDesc)(THIS_ D3DX11_PASS_SHADER_DESC *pDesc) PURE;
- STDMETHOD(GetPixelShaderDesc)(THIS_ D3DX11_PASS_SHADER_DESC *pDesc) PURE;
- STDMETHOD(GetHullShaderDesc)(THIS_ D3DX11_PASS_SHADER_DESC *pDesc) PURE;
- STDMETHOD(GetDomainShaderDesc)(THIS_ D3DX11_PASS_SHADER_DESC *pDesc) PURE;
- STDMETHOD(GetComputeShaderDesc)(THIS_ D3DX11_PASS_SHADER_DESC *pDesc) PURE;
-
- STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByIndex)(THIS_ UINT Index) PURE;
- STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByName)(THIS_ LPCSTR Name) PURE;
-
- STDMETHOD(Apply)(THIS_ UINT Flags, ID3D11DeviceContext* pContext) PURE;
-
- STDMETHOD(ComputeStateBlockMask)(THIS_ D3DX11_STATE_BLOCK_MASK *pStateBlockMask) PURE;
-};
-
-//////////////////////////////////////////////////////////////////////////////
-// ID3DX11EffectTechnique /////////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////////
-
-//----------------------------------------------------------------------------
-// D3DX11_TECHNIQUE_DESC:
-//
-// Retrieved by ID3DX11EffectTechnique::GetDesc()
-//----------------------------------------------------------------------------
-
-typedef struct _D3DX11_TECHNIQUE_DESC
-{
- LPCSTR Name; // Name of this technique (NULL if not anonymous)
- UINT Passes; // Number of passes contained within
- UINT Annotations; // Number of annotations on this technique
-} D3DX11_TECHNIQUE_DESC;
-
-typedef interface ID3DX11EffectTechnique ID3DX11EffectTechnique;
-typedef interface ID3DX11EffectTechnique *LPD3D11EFFECTTECHNIQUE;
-
-// {51198831-1F1D-4F47-BD76-41CB0835B1DE}
-DEFINE_GUID(IID_ID3DX11EffectTechnique,
- 0x51198831, 0x1f1d, 0x4f47, 0xbd, 0x76, 0x41, 0xcb, 0x08, 0x35, 0xb1, 0xde);
-
-#undef INTERFACE
-#define INTERFACE ID3DX11EffectTechnique
-
-DECLARE_INTERFACE(ID3DX11EffectTechnique)
-{
- STDMETHOD_(BOOL, IsValid)(THIS) PURE;
- STDMETHOD(GetDesc)(THIS_ D3DX11_TECHNIQUE_DESC *pDesc) PURE;
-
- STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByIndex)(THIS_ UINT Index) PURE;
- STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByName)(THIS_ LPCSTR Name) PURE;
-
- STDMETHOD_(ID3DX11EffectPass*, GetPassByIndex)(THIS_ UINT Index) PURE;
- STDMETHOD_(ID3DX11EffectPass*, GetPassByName)(THIS_ LPCSTR Name) PURE;
-
- STDMETHOD(ComputeStateBlockMask)(THIS_ D3DX11_STATE_BLOCK_MASK *pStateBlockMask) PURE;
-};
-
-//////////////////////////////////////////////////////////////////////////////
-// ID3DX11EffectTechnique /////////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////////
-
-//----------------------------------------------------------------------------
-// D3DX11_GROUP_DESC:
-//
-// Retrieved by ID3DX11EffectTechnique::GetDesc()
-//----------------------------------------------------------------------------
-
-typedef struct _D3DX11_GROUP_DESC
-{
- LPCSTR Name; // Name of this group (only NULL if global)
- UINT Techniques; // Number of techniques contained within
- UINT Annotations; // Number of annotations on this group
-} D3DX11_GROUP_DESC;
-
-typedef interface ID3DX11EffectGroup ID3DX11EffectGroup;
-typedef interface ID3DX11EffectGroup *LPD3D11EFFECTGROUP;
-
-// {03074acf-97de-485f-b201-cb775264afd6}
-DEFINE_GUID(IID_ID3DX11EffectGroup,
- 0x03074acf, 0x97de, 0x485f, 0xb2, 0x01, 0xcb, 0x77, 0x52, 0x64, 0xaf, 0xd6);
-
-#undef INTERFACE
-#define INTERFACE ID3DX11EffectGroup
-
-DECLARE_INTERFACE(ID3DX11EffectGroup)
-{
- STDMETHOD_(BOOL, IsValid)(THIS) PURE;
- STDMETHOD(GetDesc)(THIS_ D3DX11_GROUP_DESC *pDesc) PURE;
-
- STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByIndex)(THIS_ UINT Index) PURE;
- STDMETHOD_(ID3DX11EffectVariable*, GetAnnotationByName)(THIS_ LPCSTR Name) PURE;
-
- STDMETHOD_(ID3DX11EffectTechnique*, GetTechniqueByIndex)(THIS_ UINT Index) PURE;
- STDMETHOD_(ID3DX11EffectTechnique*, GetTechniqueByName)(THIS_ LPCSTR Name) PURE;
-};
-
-//////////////////////////////////////////////////////////////////////////////
-// ID3DX11Effect //////////////////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////////
-
-//----------------------------------------------------------------------------
-// D3DX11_EFFECT_DESC:
-//
-// Retrieved by ID3DX11Effect::GetDesc()
-//----------------------------------------------------------------------------
-
-typedef struct _D3DX11_EFFECT_DESC
-{
- UINT ConstantBuffers; // Number of constant buffers in this effect
- UINT GlobalVariables; // Number of global variables in this effect
- UINT InterfaceVariables; // Number of global interfaces in this effect
- UINT Techniques; // Number of techniques in this effect
- UINT Groups; // Number of groups in this effect
-} D3DX11_EFFECT_DESC;
-
-typedef interface ID3DX11Effect ID3DX11Effect;
-typedef interface ID3DX11Effect *LPD3D11EFFECT;
-
-// {FA61CA24-E4BA-4262-9DB8-B132E8CAE319}
-DEFINE_GUID(IID_ID3DX11Effect,
- 0xfa61ca24, 0xe4ba, 0x4262, 0x9d, 0xb8, 0xb1, 0x32, 0xe8, 0xca, 0xe3, 0x19);
-
-#undef INTERFACE
-#define INTERFACE ID3DX11Effect
-
-DECLARE_INTERFACE_(ID3DX11Effect, IUnknown)
-{
- // IUnknown
- STDMETHOD(QueryInterface)(THIS_ REFIID iid, LPVOID *ppv) PURE;
- STDMETHOD_(ULONG, AddRef)(THIS) PURE;
- STDMETHOD_(ULONG, Release)(THIS) PURE;
-
- STDMETHOD_(BOOL, IsValid)(THIS) PURE;
-
- // Managing D3D Device
- STDMETHOD(GetDevice)(THIS_ ID3D11Device** ppDevice) PURE;
-
- // New Reflection APIs
- STDMETHOD(GetDesc)(THIS_ D3DX11_EFFECT_DESC *pDesc) PURE;
-
- STDMETHOD_(ID3DX11EffectConstantBuffer*, GetConstantBufferByIndex)(THIS_ UINT Index) PURE;
- STDMETHOD_(ID3DX11EffectConstantBuffer*, GetConstantBufferByName)(THIS_ LPCSTR Name) PURE;
-
- STDMETHOD_(ID3DX11EffectVariable*, GetVariableByIndex)(THIS_ UINT Index) PURE;
- STDMETHOD_(ID3DX11EffectVariable*, GetVariableByName)(THIS_ LPCSTR Name) PURE;
- STDMETHOD_(ID3DX11EffectVariable*, GetVariableBySemantic)(THIS_ LPCSTR Semantic) PURE;
-
- STDMETHOD_(ID3DX11EffectGroup*, GetGroupByIndex)(THIS_ UINT Index) PURE;
- STDMETHOD_(ID3DX11EffectGroup*, GetGroupByName)(THIS_ LPCSTR Name) PURE;
-
- STDMETHOD_(ID3DX11EffectTechnique*, GetTechniqueByIndex)(THIS_ UINT Index) PURE;
- STDMETHOD_(ID3DX11EffectTechnique*, GetTechniqueByName)(THIS_ LPCSTR Name) PURE;
-
- STDMETHOD_(ID3D11ClassLinkage*, GetClassLinkage)(THIS) PURE;
-
- STDMETHOD(CloneEffect)(THIS_ UINT Flags, ID3DX11Effect** ppClonedEffect ) PURE;
- STDMETHOD(Optimize)(THIS) PURE;
- STDMETHOD_(BOOL, IsOptimized)(THIS) PURE;
-};
-
-//////////////////////////////////////////////////////////////////////////////
-// APIs //////////////////////////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////////
-
-#ifdef __cplusplus
-extern "C" {
-#endif //__cplusplus
-
-//----------------------------------------------------------------------------
-// D3DX11CreateEffectFromMemory:
-// --------------------------
-// Creates an effect from a binary effect or file
-//
-// Parameters:
-//
-// [in]
-//
-//
-// pData
-// Blob of compiled effect data
-// DataLength
-// Length of the data blob
-// FXFlags
-// Compilation flags pertaining to Effect compilation, honored
-// by the Effect compiler
-// pDevice
-// Pointer to the D3D11 device on which to create Effect resources
-//
-// [out]
-//
-// ppEffect
-// Address of the newly created Effect interface
-//
-//----------------------------------------------------------------------------
-
-HRESULT WINAPI D3DX11CreateEffectFromMemory(CONST void *pData, SIZE_T DataLength, UINT FXFlags, ID3D11Device *pDevice, ID3DX11Effect **ppEffect);
-
-#ifdef __cplusplus
-}
-#endif //__cplusplus
-
-#endif //__D3DX11EFFECT_H__
-
diff --git a/sample/d3d11/Effects11/Inc/d3dxGlobal.h b/sample/d3d11/Effects11/Inc/d3dxGlobal.h
deleted file mode 100644
index 3b5cdf8..0000000
--- a/sample/d3d11/Effects11/Inc/d3dxGlobal.h
+++ /dev/null
@@ -1,1337 +0,0 @@
-//////////////////////////////////////////////////////////////////////////////
-//
-// Copyright (C) Microsoft Corporation. All Rights Reserved.
-//
-// File: D3DXGlobal.h
-// Content: D3DX11 Effects helper defines and data structures
-//
-//////////////////////////////////////////////////////////////////////////////
-
-#pragma once
-
-#pragma warning(disable : 4100 4127 4189 4201 4245 4389 4505 4701 4706)
-
-namespace D3DX11Debug
-{
-}
-
-using namespace D3DX11Debug;
-
-#include "d3dx11dbg.h"
-
-#define SAFE_RELEASE(p) { if (p) { (p)->Release(); (p) = NULL; } }
-#define SAFE_ADDREF(p) { if (p) { (p)->AddRef(); } }
-
-#define SAFE_DELETE_ARRAY(p) { delete [](p); p = NULL; }
-#define SAFE_DELETE(p) { delete (p); p = NULL; }
-
-#if FXDEBUG
-#define __BREAK_ON_FAIL { __debugbreak(); }
-#else
-#define __BREAK_ON_FAIL
-#endif
-
-#define VA(x, action) { hr = (x); if (FAILED(hr)) { action; __BREAK_ON_FAIL; return hr; } }
-#define VNA(x,action) { if (!(x)) { action; __BREAK_ON_FAIL; hr = E_OUTOFMEMORY; goto lExit; } }
-#define VBA(x,action) { if (!(x)) { action; __BREAK_ON_FAIL; hr = E_FAIL; goto lExit; } }
-#define VHA(x,action) { hr = (x); if (FAILED(hr)) { action; __BREAK_ON_FAIL; goto lExit; } }
-
-#define V(x) { VA (x, 0) }
-#define VN(x) { VNA(x, 0) }
-#define VB(x) { VBA(x, 0) }
-#define VH(x) { VHA(x, 0) }
-
-#define VBD(x,str) { VBA(x, DPF(1,str)) }
-#define VHD(x,str) { VHA(x, DPF(1,str)) }
-
-#define VEASSERT(x) { hr = (x); if (FAILED(hr)) { __BREAK_ON_FAIL; D3DXASSERT(!#x); goto lExit; } }
-#define VNASSERT(x) { if (!(x)) { __BREAK_ON_FAIL; D3DXASSERT(!#x); hr = E_OUTOFMEMORY; goto lExit; } }
-
-#define ANALYSIS_ASSUME(x) { D3DXASSERT(x); __analysis_assume(x); __assume(x); }
-
-#define D3DX11FLTASSIGN(a,b) { *reinterpret_cast< UINT32* >(&(a)) = *reinterpret_cast< UINT32* >(&(b)); }
-
-// Preferred data alignment -- must be a power of 2!
-static const UINT c_DataAlignment = sizeof(UINT_PTR);
-
-D3DX11INLINE UINT AlignToPowerOf2(UINT Value, UINT Alignment)
-{
- D3DXASSERT((Alignment & (Alignment - 1)) == 0);
- // to align to 2^N, add 2^N - 1 and AND with all but lowest N bits set
- ANALYSIS_ASSUME(Alignment > 0 && Value < MAXDWORD - Alignment);
- return (Value + Alignment - 1) & (~(Alignment - 1));
-}
-
-D3DX11INLINE void * AlignToPowerOf2(void *pValue, UINT_PTR Alignment)
-{
- D3DXASSERT((Alignment & (Alignment - 1)) == 0);
- // to align to 2^N, add 2^N - 1 and AND with all but lowest N bits set
- return (void *)(((UINT_PTR)pValue + Alignment - 1) & (~((UINT_PTR)Alignment - 1)));
-}
-
-
-// Fast memcpy
-D3DX11INLINE void dwordMemcpy( __out_bcount(uByteCount) void * __restrict pDest, __in_bcount(uByteCount) CONST void * __restrict pSource, UINT uByteCount)
-{
- UINT i;
- D3DXASSERT(uByteCount % 4 == 0);
-#ifdef _AMD64_
- const UINT qwordCount = uByteCount >> 3;
-
- __int64* src64 = (__int64*) pSource;
- __int64* dst64 = (__int64*) pDest;
-
- for (i=0; i<(qwordCount & 0x3); i++)
- {
- *(dst64) = *(src64);
- dst64++;
- src64++;
- }
-
- for (; i<qwordCount; i+= 4)
- {
- *(dst64 ) = *(src64 );
- *(dst64 + 1 ) = *(src64 + 1 );
- *(dst64 + 2 ) = *(src64 + 2 );
- *(dst64 + 3 ) = *(src64 + 3 );
- dst64 += 4;
- src64 += 4;
- }
-
- ANALYSIS_ASSUME( dst64 - static_cast< __int64* >(pDest) <= uByteCount - 4 );
- ANALYSIS_ASSUME( src64 - static_cast< const __int64* >(pSource) <= uByteCount - 4 );
- if( uByteCount & 0x4 )
- {
- *((UINT*)dst64) = *((UINT*)src64);
- }
-#else
- const UINT dwordCount = uByteCount >> 2;
-
- for (i=0; i<(dwordCount & 0x3); i++)
- {
-#pragma prefast(suppress: __WARNING_UNRELATED_LOOP_TERMINATION, "(dwordCount & 03) < dwordCount")
- ((UINT*)pDest)[i ] = ((UINT*)pSource)[i ];
- }
- for (; i<dwordCount; i+= 4)
- {
- ((UINT*)pDest)[i ] = ((UINT*)pSource)[i ];
- ((UINT*)pDest)[i+1] = ((UINT*)pSource)[i+1];
- ((UINT*)pDest)[i+2] = ((UINT*)pSource)[i+2];
- ((UINT*)pDest)[i+3] = ((UINT*)pSource)[i+3];
- }
-#endif
-}
-
-
-namespace D3DX11Core
-{
-
-//////////////////////////////////////////////////////////////////////////
-// CMemoryStream - A class to simplify reading binary data
-//////////////////////////////////////////////////////////////////////////
-class CMemoryStream
-{
- BYTE *m_pData;
- SIZE_T m_cbData;
- SIZE_T m_readPtr;
-
-public:
- HRESULT SetData(const void *pData, SIZE_T size);
-
- HRESULT Read(UINT *pUint);
- HRESULT Read(void **ppData, SIZE_T size);
- HRESULT Read(LPCSTR *ppString);
-
- HRESULT ReadAtOffset(SIZE_T offset, SIZE_T size, void **ppData);
- HRESULT ReadAtOffset(SIZE_T offset, LPCSTR *ppString);
-
- SIZE_T GetPosition();
- HRESULT Seek(SIZE_T offset);
-
- CMemoryStream();
- ~CMemoryStream();
-};
-
-}
-
-#if FXDEBUG
-
-namespace D3DX11Debug
-{
-
-// This variable indicates how many ticks to go before rolling over
-// all of the timer variables in the FX system.
-// It is read from the system registry in debug builds; in retail the high bit is simply tested.
-
-_declspec(selectany) unsigned int g_TimerRolloverCount = 0x80000000;
-}
-
-#endif // FXDEBUG
-
-
-//////////////////////////////////////////////////////////////////////////
-// CEffectVector - A vector implementation
-//////////////////////////////////////////////////////////////////////////
-
-template<class T> class CEffectVector
-{
-protected:
-#if _DEBUG
- T *m_pCastData; // makes debugging easier to have a casted version of the data
-#endif // _DEBUG
-
- BYTE *m_pData;
- UINT m_MaxSize;
- UINT m_CurSize;
-
- HRESULT Grow()
- {
- return Reserve(m_CurSize + 1);
- }
-
- HRESULT Reserve(UINT DesiredSize)
- {
- if (DesiredSize > m_MaxSize)
- {
- BYTE *pNewData;
- UINT newSize = max(m_MaxSize * 2, DesiredSize);
-
- if (newSize < 16)
- newSize = 16;
-
- if ((newSize < m_MaxSize) || (newSize < m_CurSize) || (newSize >= UINT_MAX / sizeof(T)))
- {
- m_hLastError = E_OUTOFMEMORY;
- return m_hLastError;
- }
-
- pNewData = NEW BYTE[newSize * sizeof(T)];
- if (pNewData == NULL)
- {
- m_hLastError = E_OUTOFMEMORY;
- return m_hLastError;
- }
-
- if (m_pData)
- {
- memcpy(pNewData, m_pData, m_CurSize * sizeof(T));
- delete []m_pData;
- }
-
- m_pData = pNewData;
- m_MaxSize = newSize;
- }
-#if _DEBUG
- m_pCastData = (T*) m_pData;
-#endif // _DEBUG
- return S_OK;
- }
-
-public:
- HRESULT m_hLastError;
-
- CEffectVector<T>()
- {
- m_hLastError = S_OK;
-#if _DEBUG
- m_pCastData = NULL;
-#endif // _DEBUG
- m_pData = NULL;
- m_CurSize = m_MaxSize = 0;
- }
-
- ~CEffectVector<T>()
- {
- Clear();
- }
-
- // cleanly swaps two vectors -- useful for when you want
- // to reallocate a vector and copy data over, then swap them back
- void SwapVector(CEffectVector<T> &vOther)
- {
- BYTE tempData[sizeof(*this)];
-
- memcpy(tempData, this, sizeof(*this));
- memcpy(this, &vOther, sizeof(*this));
- memcpy(&vOther, tempData, sizeof(*this));
- }
-
- HRESULT CopyFrom(CEffectVector<T> &vOther)
- {
- HRESULT hr = S_OK;
- Clear();
- VN( m_pData = NEW BYTE[vOther.m_MaxSize * sizeof(T)] );
-
- m_CurSize = vOther.m_CurSize;
- m_MaxSize = vOther.m_MaxSize;
- m_hLastError = vOther.m_hLastError;
-
- UINT i;
- for (i = 0; i < m_CurSize; ++ i)
- {
- ((T*)m_pData)[i] = ((T*)vOther.m_pData)[i];
- }
-
-lExit:
-
-#if _DEBUG
- m_pCastData = (T*) m_pData;
-#endif // _DEBUG
-
- return hr;
- }
-
- void Clear()
- {
- Empty();
- SAFE_DELETE_ARRAY(m_pData);
- m_MaxSize = 0;
-#if _DEBUG
- m_pCastData = NULL;
-#endif // _DEBUG
- }
-
- void ClearWithoutDestructor()
- {
- m_CurSize = 0;
- m_hLastError = S_OK;
- SAFE_DELETE_ARRAY(m_pData);
- m_MaxSize = 0;
-
-#if _DEBUG
- m_pCastData = NULL;
-#endif // _DEBUG
- }
-
- void Empty()
- {
- UINT i;
-
- // manually invoke destructor on all elements
- for (i = 0; i < m_CurSize; ++ i)
- {
- ((T*)m_pData + i)->~T();
- }
- m_CurSize = 0;
- m_hLastError = S_OK;
- }
-
- T* Add()
- {
- if (FAILED(Grow()))
- return NULL;
-
- // placement new
- return new((T*)m_pData + (m_CurSize ++)) T;
- }
-
- T* AddRange(UINT count)
- {
- if (m_CurSize + count < m_CurSize)
- {
- m_hLastError = E_OUTOFMEMORY;
- return NULL;
- }
-
- if (FAILED(Reserve(m_CurSize + count)))
- return NULL;
-
- T *pData = (T*)m_pData + m_CurSize;
- UINT i;
- for (i = 0; i < count; ++ i)
- {
- new(pData + i) T;
- }
- m_CurSize += count;
- return pData;
- }
-
- HRESULT Add(const T& var)
- {
- if (FAILED(Grow()))
- return m_hLastError;
-
- memcpy((T*)m_pData + m_CurSize, &var, sizeof(T));
- m_CurSize++;
-
- return S_OK;
- }
-
- HRESULT AddRange(const T *pVar, UINT count)
- {
- if (m_CurSize + count < m_CurSize)
- {
- m_hLastError = E_OUTOFMEMORY;
- return m_hLastError;
- }
-
- if (FAILED(Reserve(m_CurSize + count)))
- return m_hLastError;
-
- memcpy((T*)m_pData + m_CurSize, pVar, count * sizeof(T));
- m_CurSize += count;
-
- return S_OK;
- }
-
- HRESULT Insert(const T& var, UINT index)
- {
- D3DXASSERT(index < m_CurSize);
-
- if (FAILED(Grow()))
- return m_hLastError;
-
- memmove((T*)m_pData + index + 1, (T*)m_pData + index, (m_CurSize - index) * sizeof(T));
- memcpy((T*)m_pData + index, &var, sizeof(T));
- m_CurSize++;
-
- return S_OK;
- }
-
- HRESULT InsertRange(const T *pVar, UINT index, UINT count)
- {
- D3DXASSERT(index < m_CurSize);
-
- if (m_CurSize + count < m_CurSize)
- {
- m_hLastError = E_OUTOFMEMORY;
- return m_hLastError;
- }
-
- if (FAILED(Reserve(m_CurSize + count)))
- return m_hLastError;
-
- memmove((T*)m_pData + index + count, (T*)m_pData + index, (m_CurSize - index) * sizeof(T));
- memcpy((T*)m_pData + index, pVar, count * sizeof(T));
- m_CurSize += count;
-
- return S_OK;
- }
-
- inline T& operator[](UINT index)
- {
- D3DXASSERT(index < m_CurSize);
- return ((T*)m_pData)[index];
- }
-
- // Deletes element at index and shifts all other values down
- void Delete(UINT index)
- {
- D3DXASSERT(index < m_CurSize);
-
- -- m_CurSize;
- memmove((T*)m_pData + index, (T*)m_pData + index + 1, (m_CurSize - index) * sizeof(T));
- }
-
- // Deletes element at index and moves the last element into its place
- void QuickDelete(UINT index)
- {
- D3DXASSERT(index < m_CurSize);
-
- -- m_CurSize;
- memcpy((T*)m_pData + index, (T*)m_pData + m_CurSize, sizeof(T));
- }
-
- inline UINT GetSize() const
- {
- return m_CurSize;
- }
-
- inline T* GetData() const
- {
- return (T*)m_pData;
- }
-
- UINT FindIndexOf(void *pEntry) const
- {
- UINT i;
-
- for (i = 0; i < m_CurSize; ++ i)
- {
- if (((T*)m_pData + i) == pEntry)
- return i;
- }
-
- return -1;
- }
-
- void Sort(int (__cdecl *pfnCompare)(const void *pElem1, const void *pElem2))
- {
- qsort(m_pData, m_CurSize, sizeof(T), pfnCompare);
- }
-};
-
-//////////////////////////////////////////////////////////////////////////
-// CEffectVectorOwner - implements a vector of ptrs to objects. The vector owns the objects.
-//////////////////////////////////////////////////////////////////////////
-template<class T> class CEffectVectorOwner : public CEffectVector<T*>
-{
-public:
- ~CEffectVectorOwner<T>()
- {
- Clear();
- UINT i;
-
- for (i=0; i<m_CurSize; i++)
- SAFE_DELETE(((T**)m_pData)[i]);
-
- SAFE_DELETE_ARRAY(m_pData);
- }
-
- void Clear()
- {
- Empty();
- SAFE_DELETE_ARRAY(m_pData);
- m_MaxSize = 0;
- }
-
- void Empty()
- {
- UINT i;
-
- // manually invoke destructor on all elements
- for (i = 0; i < m_CurSize; ++ i)
- {
- SAFE_DELETE(((T**)m_pData)[i]);
- }
- m_CurSize = 0;
- m_hLastError = S_OK;
- }
-
- void Delete(UINT index)
- {
- D3DXASSERT(index < m_CurSize);
-
- SAFE_DELETE(((T**)m_pData)[index]);
-
- CEffectVector<T*>::Delete(index);
- }
-};
-
-
-//////////////////////////////////////////////////////////////////////////
-// Checked UINT, DWORD64
-// Use CheckedNumber only with UINT and DWORD64
-//////////////////////////////////////////////////////////////////////////
-template <class T, T MaxValue> class CheckedNumber
-{
- T m_Value;
- BOOL m_bValid;
-
-public:
- CheckedNumber<T, MaxValue>()
- {
- m_Value = 0;
- m_bValid = TRUE;
- }
-
- CheckedNumber<T, MaxValue>(const T &value)
- {
- m_Value = value;
- m_bValid = TRUE;
- }
-
- CheckedNumber<T, MaxValue>(const CheckedNumber<T, MaxValue> &value)
- {
- m_bValid = value.m_bValid;
- m_Value = value.m_Value;
- }
-
- CheckedNumber<T, MaxValue> &operator+(const CheckedNumber<T, MaxValue> &other)
- {
- CheckedNumber<T, MaxValue> Res(*this);
- return Res+=other;
- }
-
- CheckedNumber<T, MaxValue> &operator+=(const CheckedNumber<T, MaxValue> &other)
- {
- if (!other.m_bValid)
- {
- m_bValid = FALSE;
- }
- else
- {
- m_Value += other.m_Value;
-
- if (m_Value < other.m_Value)
- m_bValid = FALSE;
- }
-
- return *this;
- }
-
- CheckedNumber<T, MaxValue> &operator*(const CheckedNumber<T, MaxValue> &other)
- {
- CheckedNumber<T, MaxValue> Res(*this);
- return Res*=other;
- }
-
- CheckedNumber<T, MaxValue> &operator*=(const CheckedNumber<T, MaxValue> &other)
- {
- if (!other.m_bValid)
- {
- m_bValid = FALSE;
- }
- else
- {
- if (other.m_Value != 0)
- {
- if (m_Value > MaxValue / other.m_Value)
- {
- m_bValid = FALSE;
- }
- }
- m_Value *= other.m_Value;
- }
-
- return *this;
- }
-
- HRESULT GetValue(T *pValue)
- {
- if (!m_bValid)
- {
- *pValue = -1;
- return E_FAIL;
- }
-
- *pValue = m_Value;
- return S_OK;
- }
-};
-
-typedef CheckedNumber<UINT, _UI32_MAX> CCheckedDword;
-typedef CheckedNumber<DWORD64, _UI64_MAX> CCheckedDword64;
-
-
-//////////////////////////////////////////////////////////////////////////
-// Data Block Store - A linked list of allocations
-//////////////////////////////////////////////////////////////////////////
-
-class CDataBlock
-{
-protected:
- UINT m_size;
- UINT m_maxSize;
- BYTE *m_pData;
- CDataBlock *m_pNext;
-
- BOOL m_IsAligned; // Whether or not to align the data to c_DataAlignment
-
-public:
- // AddData appends an existing use buffer to the data block
- HRESULT AddData(const void *pNewData, UINT bufferSize, CDataBlock **ppBlock);
-
- // Allocate reserves bufferSize bytes of contiguous memory and returns a pointer to the user
- void* Allocate(UINT bufferSize, CDataBlock **ppBlock);
-
- void EnableAlignment();
-
- CDataBlock();
- ~CDataBlock();
-
- friend class CDataBlockStore;
-};
-
-
-class CDataBlockStore
-{
-protected:
- CDataBlock *m_pFirst;
- CDataBlock *m_pLast;
- UINT m_Size;
- UINT m_Offset; // m_Offset gets added to offsets returned from AddData & AddString. Use this to set a global for the entire string block
- BOOL m_IsAligned; // Whether or not to align the data to c_DataAlignment
-
-public:
-#if _DEBUG
- UINT m_cAllocations;
-#endif
-
-public:
- HRESULT AddString(LPCSTR pString, UINT *pOffset); // Writes a null-terminated string to buffer
- HRESULT AddData(const void *pNewData, UINT bufferSize, UINT *pOffset); // Writes data block to buffer
-
- void* Allocate(UINT buffferSize); // Memory allocator support
- UINT GetSize();
- void EnableAlignment();
-
- CDataBlockStore();
- ~CDataBlockStore();
-};
-
-// Custom allocator that uses CDataBlockStore
-// The trick is that we never free, so we don't have to keep as much state around
-// Use PRIVATENEW in CEffectLoader
-
-static void* __cdecl operator new(size_t s, CDataBlockStore &pAllocator)
-{
- D3DXASSERT( s <= 0xffffffff );
- return pAllocator.Allocate( (UINT)s );
-}
-
-static void __cdecl operator delete(void* p, CDataBlockStore &pAllocator)
-{
-}
-
-
-//////////////////////////////////////////////////////////////////////////
-// Hash table
-//////////////////////////////////////////////////////////////////////////
-
-#define HASH_MIX(a,b,c) \
-{ \
- a -= b; a -= c; a ^= (c>>13); \
- b -= c; b -= a; b ^= (a<<8); \
- c -= a; c -= b; c ^= (b>>13); \
- a -= b; a -= c; a ^= (c>>12); \
- b -= c; b -= a; b ^= (a<<16); \
- c -= a; c -= b; c ^= (b>>5); \
- a -= b; a -= c; a ^= (c>>3); \
- b -= c; b -= a; b ^= (a<<10); \
- c -= a; c -= b; c ^= (b>>15); \
-}
-
-static UINT ComputeHash(BYTE *pb, UINT cbToHash)
-{
- UINT a;
- UINT b;
- UINT c;
- UINT cbLeft;
-
- cbLeft = cbToHash;
-
- a = b = 0x9e3779b9; // the golden ratio; an arbitrary value
- c = 0;
-
- while (cbLeft >= 12)
- {
- UINT *pdw = reinterpret_cast<UINT *>(pb);
-
- a += pdw[0];
- b += pdw[1];
- c += pdw[2];
-
- HASH_MIX(a,b,c);
- pb += 12;
- cbLeft -= 12;
- }
-
- c += cbToHash;
-
- switch(cbLeft) // all the case statements fall through
- {
- case 11: c+=((UINT) pb[10] << 24);
- case 10: c+=((UINT) pb[9] << 16);
- case 9 : c+=((UINT) pb[8] << 8);
- // the first byte of c is reserved for the length
- case 8 : b+=((UINT) pb[7] << 24);
- case 7 : b+=((UINT) pb[6] << 16);
- case 6 : b+=((UINT) pb[5] << 8);
- case 5 : b+=pb[4];
- case 4 : a+=((UINT) pb[3] << 24);
- case 3 : a+=((UINT) pb[2] << 16);
- case 2 : a+=((UINT) pb[1] << 8);
- case 1 : a+=pb[0];
- }
-
- HASH_MIX(a,b,c);
-
- return c;
-}
-
-static UINT ComputeHashLower(BYTE *pb, UINT cbToHash)
-{
- UINT a;
- UINT b;
- UINT c;
- UINT cbLeft;
-
- cbLeft = cbToHash;
-
- a = b = 0x9e3779b9; // the golden ratio; an arbitrary value
- c = 0;
-
- while (cbLeft >= 12)
- {
- BYTE pbT[12];
- for( UINT i = 0; i < 12; i++ )
- pbT[i] = (BYTE)tolower(pb[i]);
-
- UINT *pdw = reinterpret_cast<UINT *>(pbT);
-
- a += pdw[0];
- b += pdw[1];
- c += pdw[2];
-
- HASH_MIX(a,b,c);
- pb += 12;
- cbLeft -= 12;
- }
-
- c += cbToHash;
-
- BYTE pbT[12];
- for( UINT i = 0; i < cbLeft; i++ )
- pbT[i] = (BYTE)tolower(pb[i]);
-
- switch(cbLeft) // all the case statements fall through
- {
- case 11: c+=((UINT) pbT[10] << 24);
- case 10: c+=((UINT) pbT[9] << 16);
- case 9 : c+=((UINT) pbT[8] << 8);
- // the first byte of c is reserved for the length
- case 8 : b+=((UINT) pbT[7] << 24);
- case 7 : b+=((UINT) pbT[6] << 16);
- case 6 : b+=((UINT) pbT[5] << 8);
- case 5 : b+=pbT[4];
- case 4 : a+=((UINT) pbT[3] << 24);
- case 3 : a+=((UINT) pbT[2] << 16);
- case 2 : a+=((UINT) pbT[1] << 8);
- case 1 : a+=pbT[0];
- }
-
- HASH_MIX(a,b,c);
-
- return c;
-}
-
-
-static UINT ComputeHash(LPCSTR pString)
-{
- return ComputeHash((BYTE*) pString, (UINT)strlen(pString));
-}
-
-
-// 1) these numbers are prime
-// 2) each is slightly less than double the last
-// 4) each is roughly in between two powers of 2;
-// (2^n hash table sizes are VERY BAD; they effectively truncate your
-// precision down to the n least significant bits of the hash)
-static const UINT c_PrimeSizes[] =
-{
- 11,
- 23,
- 53,
- 97,
- 193,
- 389,
- 769,
- 1543,
- 3079,
- 6151,
- 12289,
- 24593,
- 49157,
- 98317,
- 196613,
- 393241,
- 786433,
- 1572869,
- 3145739,
- 6291469,
- 12582917,
- 25165843,
- 50331653,
- 100663319,
- 201326611,
- 402653189,
- 805306457,
- 1610612741,
-};
-
-static const UINT c_NumPrimes = sizeof(c_PrimeSizes) / sizeof(UINT);
-
-template<typename T, BOOL (*pfnIsEqual)(const T &Data1, const T &Data2)>
-class CEffectHashTable
-{
-protected:
-
- struct SHashEntry
- {
- UINT Hash;
- T Data;
- SHashEntry *pNext;
- };
-
- // Array of hash entries
- SHashEntry **m_rgpHashEntries;
- UINT m_NumHashSlots;
- UINT m_NumEntries;
- bool m_bOwnHashEntryArray;
-
-public:
- class CIterator
- {
- friend class CEffectHashTable;
-
- protected:
- SHashEntry **ppHashSlot;
- SHashEntry *pHashEntry;
-
- public:
- T GetData()
- {
- D3DXASSERT(NULL != pHashEntry);
- return pHashEntry->Data;
- }
-
- UINT GetHash()
- {
- D3DXASSERT(NULL != pHashEntry);
- return pHashEntry->Hash;
- }
- };
-
- CEffectHashTable()
- {
- m_rgpHashEntries = NULL;
- m_NumHashSlots = 0;
- m_NumEntries = 0;
- m_bOwnHashEntryArray = false;
- }
-
- HRESULT Initialize(CEffectHashTable *pOther)
- {
- HRESULT hr = S_OK;
- SHashEntry **rgpNewHashEntries = NULL;
- SHashEntry ***rgppListEnds = NULL;
- UINT i;
- UINT valuesMigrated = 0;
- UINT actualSize;
-
- Cleanup();
-
- actualSize = pOther->m_NumHashSlots;
- VN( rgpNewHashEntries = NEW SHashEntry*[actualSize] );
-
- ZeroMemory(rgpNewHashEntries, sizeof(SHashEntry*) * actualSize);
-
- // Expensive operation: rebuild the hash table
- CIterator iter, nextIter;
- pOther->GetFirstEntry(&iter);
- while (!pOther->PastEnd(&iter))
- {
- UINT index = iter.GetHash() % actualSize;
-
- // we need to advance to the next element
- // before we seize control of this element and move
- // it to the new table
- nextIter = iter;
- pOther->GetNextEntry(&nextIter);
-
- // seize this hash entry, migrate it to the new table
- SHashEntry *pNewEntry;
- VN( pNewEntry = NEW SHashEntry );
-
- pNewEntry->pNext = rgpNewHashEntries[index];
- pNewEntry->Data = iter.pHashEntry->Data;
- pNewEntry->Hash = iter.pHashEntry->Hash;
- rgpNewHashEntries[index] = pNewEntry;
-
- iter = nextIter;
- ++ valuesMigrated;
- }
-
- D3DXASSERT(valuesMigrated == pOther->m_NumEntries);
-
- m_rgpHashEntries = rgpNewHashEntries;
- m_NumHashSlots = actualSize;
- m_NumEntries = pOther->m_NumEntries;
- m_bOwnHashEntryArray = true;
- rgpNewHashEntries = NULL;
-
-lExit:
- SAFE_DELETE_ARRAY( rgpNewHashEntries );
- return hr;
- }
-
-protected:
- void CleanArray()
- {
- if (m_bOwnHashEntryArray)
- {
- SAFE_DELETE_ARRAY(m_rgpHashEntries);
- m_bOwnHashEntryArray = false;
- }
- }
-
-public:
- void Cleanup()
- {
- UINT i;
- for (i = 0; i < m_NumHashSlots; ++ i)
- {
- SHashEntry *pCurrentEntry = m_rgpHashEntries[i];
- SHashEntry *pTempEntry;
- while (NULL != pCurrentEntry)
- {
- pTempEntry = pCurrentEntry->pNext;
- SAFE_DELETE(pCurrentEntry);
- pCurrentEntry = pTempEntry;
- -- m_NumEntries;
- }
- }
- CleanArray();
- m_NumHashSlots = 0;
- D3DXASSERT(m_NumEntries == 0);
- }
-
- ~CEffectHashTable()
- {
- Cleanup();
- }
-
- static UINT GetNextHashTableSize(__in UINT DesiredSize)
- {
- // figure out the next logical size to use
- for (UINT i = 0; i < c_NumPrimes; ++ i)
- {
- if (c_PrimeSizes[i] >= DesiredSize)
- {
- return c_PrimeSizes[i];
- }
- }
-
- return DesiredSize;
- }
-
- // O(n) function
- // Grows to the next suitable size (based off of the prime number table)
- // DesiredSize is merely a suggestion
- HRESULT Grow(__in UINT DesiredSize,
- __in UINT ProvidedArraySize = 0,
- __in_ecount_opt(ProvidedArraySize)
- void** ProvidedArray = NULL,
- __in bool OwnProvidedArray = false)
- {
- HRESULT hr = S_OK;
- SHashEntry **rgpNewHashEntries = NULL;
- SHashEntry ***rgppListEnds = NULL;
- UINT valuesMigrated = 0;
- UINT actualSize;
-
- VB( DesiredSize > m_NumHashSlots );
-
- actualSize = GetNextHashTableSize(DesiredSize);
-
- if (ProvidedArray &&
- ProvidedArraySize >= actualSize)
- {
- rgpNewHashEntries = reinterpret_cast<SHashEntry**>(ProvidedArray);
- }
- else
- {
- OwnProvidedArray = true;
-
- VN( rgpNewHashEntries = NEW SHashEntry*[actualSize] );
- }
-
- ZeroMemory(rgpNewHashEntries, sizeof(SHashEntry*) * actualSize);
-
- // Expensive operation: rebuild the hash table
- CIterator iter, nextIter;
- GetFirstEntry(&iter);
- while (!PastEnd(&iter))
- {
- UINT index = iter.GetHash() % actualSize;
-
- // we need to advance to the next element
- // before we seize control of this element and move
- // it to the new table
- nextIter = iter;
- GetNextEntry(&nextIter);
-
- // seize this hash entry, migrate it to the new table
- iter.pHashEntry->pNext = rgpNewHashEntries[index];
- rgpNewHashEntries[index] = iter.pHashEntry;
-
- iter = nextIter;
- ++ valuesMigrated;
- }
-
- D3DXASSERT(valuesMigrated == m_NumEntries);
-
- CleanArray();
- m_rgpHashEntries = rgpNewHashEntries;
- m_NumHashSlots = actualSize;
- m_bOwnHashEntryArray = OwnProvidedArray;
-
-lExit:
- return hr;
- }
-
- HRESULT AutoGrow()
- {
- // arbitrary heuristic -- grow if 1:1
- if (m_NumEntries >= m_NumHashSlots)
- {
- // grows this hash table so that it is roughly 50% full
- return Grow(m_NumEntries * 2 + 1);
- }
- return S_OK;
- }
-
-#if _DEBUG
- void PrintHashTableStats()
- {
- if (m_NumHashSlots == 0)
- {
- DPF(0, "Uninitialized hash table!");
- return;
- }
-
- UINT i;
- float variance = 0.0f;
- float mean = (float)m_NumEntries / (float)m_NumHashSlots;
- UINT unusedSlots = 0;
-
- DPF(0, "Hash table slots: %d, Entries in table: %d", m_NumHashSlots, m_NumEntries);
-
- for (i = 0; i < m_NumHashSlots; ++ i)
- {
- UINT entries = 0;
- SHashEntry *pCurrentEntry = m_rgpHashEntries[i];
-
- while (NULL != pCurrentEntry)
- {
- SHashEntry *pCurrentEntry2 = m_rgpHashEntries[i];
-
- // check other hash entries in this slot for hash collisions or duplications
- while (pCurrentEntry2 != pCurrentEntry)
- {
- if (pCurrentEntry->Hash == pCurrentEntry2->Hash)
- {
- if (pfnIsEqual(pCurrentEntry->Data, pCurrentEntry2->Data))
- {
- D3DXASSERT(0);
- DPF(0, "Duplicate entry (identical hash, identical data) found!");
- }
- else
- {
- DPF(0, "Hash collision (hash: %d)", pCurrentEntry->Hash);
- }
- }
- pCurrentEntry2 = pCurrentEntry2->pNext;
- }
-
- pCurrentEntry = pCurrentEntry->pNext;
- ++ entries;
- }
-
- if (0 == entries)
- {
- ++ unusedSlots;
- }
-
- // mean must be greater than 0 at this point
- variance += (float)entries * (float)entries / mean;
- }
-
- variance /= max(1.0f, (m_NumHashSlots - 1));
- variance -= (mean * mean);
-
- DPF(0, "Mean number of entries per slot: %f, Standard deviation: %f, Unused slots; %d", mean, variance, unusedSlots);
- }
-#endif // _DEBUG
-
- // S_OK if element is found, E_FAIL otherwise
- HRESULT FindValueWithHash(T Data, UINT Hash, CIterator *pIterator)
- {
- D3DXASSERT(m_NumHashSlots > 0);
-
- UINT index = Hash % m_NumHashSlots;
- SHashEntry *pEntry = m_rgpHashEntries[index];
- while (NULL != pEntry)
- {
- if (Hash == pEntry->Hash && pfnIsEqual(pEntry->Data, Data))
- {
- pIterator->ppHashSlot = m_rgpHashEntries + index;
- pIterator->pHashEntry = pEntry;
- return S_OK;
- }
- pEntry = pEntry->pNext;
- }
- return E_FAIL;
- }
-
- // S_OK if element is found, E_FAIL otherwise
- HRESULT FindFirstMatchingValue(UINT Hash, CIterator *pIterator)
- {
- D3DXASSERT(m_NumHashSlots > 0);
-
- UINT index = Hash % m_NumHashSlots;
- SHashEntry *pEntry = m_rgpHashEntries[index];
- while (NULL != pEntry)
- {
- if (Hash == pEntry->Hash)
- {
- pIterator->ppHashSlot = m_rgpHashEntries + index;
- pIterator->pHashEntry = pEntry;
- return S_OK;
- }
- pEntry = pEntry->pNext;
- }
- return E_FAIL;
- }
-
- // Adds data at the specified hash slot without checking for existence
- HRESULT AddValueWithHash(T Data, UINT Hash)
- {
- HRESULT hr = S_OK;
-
- D3DXASSERT(m_NumHashSlots > 0);
-
- SHashEntry *pHashEntry;
- UINT index = Hash % m_NumHashSlots;
-
- VN( pHashEntry = NEW SHashEntry );
- pHashEntry->pNext = m_rgpHashEntries[index];
- pHashEntry->Data = Data;
- pHashEntry->Hash = Hash;
- m_rgpHashEntries[index] = pHashEntry;
-
- ++ m_NumEntries;
-
-lExit:
- return hr;
- }
-
- // Iterator code:
- //
- // CMyHashTable::CIterator myIt;
- // for (myTable.GetFirstEntry(&myIt); !myTable.PastEnd(&myIt); myTable.GetNextEntry(&myIt)
- // { myTable.GetData(&myIt); }
- void GetFirstEntry(CIterator *pIterator)
- {
- SHashEntry **ppEnd = m_rgpHashEntries + m_NumHashSlots;
- pIterator->ppHashSlot = m_rgpHashEntries;
- while (pIterator->ppHashSlot < ppEnd)
- {
- if (NULL != *(pIterator->ppHashSlot))
- {
- pIterator->pHashEntry = *(pIterator->ppHashSlot);
- return;
- }
- ++ pIterator->ppHashSlot;
- }
- }
-
- BOOL PastEnd(CIterator *pIterator)
- {
- SHashEntry **ppEnd = m_rgpHashEntries + m_NumHashSlots;
- D3DXASSERT(pIterator->ppHashSlot >= m_rgpHashEntries && pIterator->ppHashSlot <= ppEnd);
- return (pIterator->ppHashSlot == ppEnd);
- }
-
- void GetNextEntry(CIterator *pIterator)
- {
- SHashEntry **ppEnd = m_rgpHashEntries + m_NumHashSlots;
- D3DXASSERT(pIterator->ppHashSlot >= m_rgpHashEntries && pIterator->ppHashSlot <= ppEnd);
- D3DXASSERT(NULL != pIterator->pHashEntry);
-
- pIterator->pHashEntry = pIterator->pHashEntry->pNext;
- if (NULL != pIterator->pHashEntry)
- {
- return;
- }
-
- ++ pIterator->ppHashSlot;
- while (pIterator->ppHashSlot < ppEnd)
- {
- pIterator->pHashEntry = *(pIterator->ppHashSlot);
- if (NULL != pIterator->pHashEntry)
- {
- return;
- }
- ++ pIterator->ppHashSlot;
- }
- // hit the end of the list, ppHashSlot == ppEnd
- }
-
- void RemoveEntry(CIterator *pIterator)
- {
- SHashEntry *pTemp;
- SHashEntry **ppPrev;
- SHashEntry **ppEnd = m_rgpHashEntries + m_NumHashSlots;
-
- D3DXASSERT(pIterator && !PastEnd(pIterator));
- ppPrev = pIterator->ppHashSlot;
- pTemp = *ppPrev;
- while (pTemp)
- {
- if (pTemp == pIterator->pHashEntry)
- {
- *ppPrev = pTemp->pNext;
- pIterator->ppHashSlot = ppEnd;
- delete pTemp;
- return;
- }
- ppPrev = &pTemp->pNext;
- pTemp = pTemp->pNext;
- }
-
- // Should never get here
- D3DXASSERT(0);
- }
-
-};
-
-// Allocates the hash slots on the regular heap (since the
-// hash table can grow), but all hash entries are allocated on
-// a private heap
-
-template<typename T, BOOL (*pfnIsEqual)(const T &Data1, const T &Data2)>
-class CEffectHashTableWithPrivateHeap : public CEffectHashTable<T, pfnIsEqual>
-{
-protected:
- CDataBlockStore *m_pPrivateHeap;
-
-public:
- CEffectHashTableWithPrivateHeap()
- {
- m_pPrivateHeap = NULL;
- }
-
- void Cleanup()
- {
- CleanArray();
- m_NumHashSlots = 0;
- m_NumEntries = 0;
- }
-
- ~CEffectHashTableWithPrivateHeap()
- {
- Cleanup();
- }
-
- // Call this only once
- void SetPrivateHeap(CDataBlockStore *pPrivateHeap)
- {
- D3DXASSERT(NULL == m_pPrivateHeap);
- m_pPrivateHeap = pPrivateHeap;
- }
-
- // Adds data at the specified hash slot without checking for existence
- HRESULT AddValueWithHash(T Data, UINT Hash)
- {
- HRESULT hr = S_OK;
-
- D3DXASSERT(NULL != m_pPrivateHeap);
- D3DXASSERT(m_NumHashSlots > 0);
-
- SHashEntry *pHashEntry;
- UINT index = Hash % m_NumHashSlots;
-
- VN( pHashEntry = new(*m_pPrivateHeap) SHashEntry );
- pHashEntry->pNext = m_rgpHashEntries[index];
- pHashEntry->Data = Data;
- pHashEntry->Hash = Hash;
- m_rgpHashEntries[index] = pHashEntry;
-
- ++ m_NumEntries;
-
-lExit:
- return hr;
- }
-};
diff --git a/sample/d3d11/Effects11/d3dx11dbg.cpp b/sample/d3d11/Effects11/d3dx11dbg.cpp
deleted file mode 100644
index 330e8d9..0000000
--- a/sample/d3d11/Effects11/d3dx11dbg.cpp
+++ /dev/null
@@ -1,62 +0,0 @@
-///////////////////////////////////////////////////////////////////////////
-//
-// Copyright (C) Microsoft Corporation. All Rights Reserved.
-//
-// File: d3dx11dbg.cpp
-// Content: D3DX11 Effects debugging functions
-//
-///////////////////////////////////////////////////////////////////////////
-
-#include "pchfx.h"
-
-
-#ifdef FXDPF
-
-//
-// DPF
-//
-
-void cdecl D3DXDebugPrintf(UINT lvl, LPCSTR szFormat, ...)
-{
- static UINT uDebugLevel = (UINT) -1;
-
- char strA[4096];
- char strB[4096];
-
- va_list ap;
- va_start(ap, szFormat);
- StringCchVPrintfA(strA, sizeof(strA), szFormat, ap);
- strA[4095] = '\0';
- va_end(ap);
-
- StringCchPrintfA(strB, sizeof(strB), "Effects11: %s\r\n", strA);
-
- strB[4095] = '\0';
-
- OutputDebugStringA(strB);
-}
-#else
-// This is defined so warning LNK4211 is not generated (object file has no public symbols)
-void cdecl D3DXDebugPrintf(UINT lvl, LPCSTR szFormat, ...) {}
-#endif
-
-
-//
-// D3DXASSERT
-//
-
-#ifdef _DEBUG
-
-int WINAPI D3DXDebugAssert(LPCSTR szFile, int nLine, LPCSTR szCondition)
-{
- char str[512];
-
- // Print message to debug console
- StringCchPrintfA(str, sizeof(str), "Assertion failure! (%s %d): %s\r\n", szFile, nLine, szCondition);
- str[511] = 0;
- OutputDebugStringA(str);
-
- return 0;
-}
-#endif
-
diff --git a/sample/d3d11/Effects11/d3dxGlobal.cpp b/sample/d3d11/Effects11/d3dxGlobal.cpp
deleted file mode 100644
index 72f4efb..0000000
--- a/sample/d3d11/Effects11/d3dxGlobal.cpp
+++ /dev/null
@@ -1,351 +0,0 @@
-//////////////////////////////////////////////////////////////////////////////
-//
-// Copyright (C) Microsoft Corporation. All Rights Reserved.
-//
-// File: d3dxGlobal.cpp
-// Content: D3DX11 Effects implementation for helper data structures
-//
-//////////////////////////////////////////////////////////////////////////////
-
-#include "pchfx.h"
-#include <intsafe.h>
-
-namespace D3DX11Core
-{
-
-//////////////////////////////////////////////////////////////////////////
-// CMemoryStream - A class to simplify reading binary data
-//////////////////////////////////////////////////////////////////////////
-
-CMemoryStream::CMemoryStream()
-{
- m_pData = NULL;
- m_cbData = 0;
- m_readPtr = 0;
-}
-
-CMemoryStream::~CMemoryStream()
-{
-}
-
-HRESULT CMemoryStream::SetData(const void *pData, SIZE_T size)
-{
- m_pData = (BYTE*) pData;
- m_cbData = size;
- m_readPtr = 0;
-
- return S_OK;
-}
-
-HRESULT CMemoryStream::ReadAtOffset(SIZE_T offset, SIZE_T size, void **ppData)
-{
- if (offset >= m_cbData)
- return E_FAIL;
-
- m_readPtr = offset;
- return Read(ppData, size);
-}
-
-HRESULT CMemoryStream::ReadAtOffset(SIZE_T offset, LPCSTR *ppString)
-{
- if (offset >= m_cbData)
- return E_FAIL;
-
- m_readPtr = offset;
- return Read(ppString);
-}
-
-HRESULT CMemoryStream::Read(void **ppData, SIZE_T size)
-{
- SIZE_T temp = m_readPtr + size;
-
- if (temp < m_readPtr || temp > m_cbData)
- return E_FAIL;
-
- *ppData = m_pData + m_readPtr;
- m_readPtr = temp;
- return S_OK;
-}
-
-HRESULT CMemoryStream::Read(UINT *pDword)
-{
- UINT *pTempDword;
- HRESULT hr;
-
- hr = Read((void**) &pTempDword, sizeof(UINT));
- if (FAILED(hr))
- return E_FAIL;
-
- *pDword = *pTempDword;
- return S_OK;
-}
-
-HRESULT CMemoryStream::Read(LPCSTR *ppString)
-{
- SIZE_T iChar;
-
- for(iChar=m_readPtr; m_pData[iChar]; iChar++)
- {
- if (iChar > m_cbData)
- return E_FAIL;
- }
-
- *ppString = (LPCSTR) (m_pData + m_readPtr);
- m_readPtr = iChar;
-
- return S_OK;
-}
-
-SIZE_T CMemoryStream::GetPosition()
-{
- return m_readPtr;
-}
-
-HRESULT CMemoryStream::Seek(SIZE_T offset)
-{
- if (offset > m_cbData)
- return E_FAIL;
-
- m_readPtr = offset;
- return S_OK;
-}
-
-}
-
-//////////////////////////////////////////////////////////////////////////
-// CDataBlock - used to dynamically build up the effect file in memory
-//////////////////////////////////////////////////////////////////////////
-
-CDataBlock::CDataBlock()
-{
- m_size = 0;
- m_maxSize = 0;
- m_pData = NULL;
- m_pNext = NULL;
- m_IsAligned = FALSE;
-}
-
-CDataBlock::~CDataBlock()
-{
- SAFE_DELETE_ARRAY(m_pData);
- SAFE_DELETE(m_pNext);
-}
-
-void CDataBlock::EnableAlignment()
-{
- m_IsAligned = TRUE;
-}
-
-HRESULT CDataBlock::AddData(const void *pvNewData, UINT bufferSize, CDataBlock **ppBlock)
-{
- HRESULT hr = S_OK;
- UINT bytesToCopy;
- const BYTE *pNewData = (const BYTE*) pvNewData;
-
- if (m_maxSize == 0)
- {
- // This is a brand new DataBlock, fill it up
- m_maxSize = max(8192, bufferSize);
-
- VN( m_pData = NEW BYTE[m_maxSize] );
- }
-
- D3DXASSERT(m_pData == AlignToPowerOf2(m_pData, c_DataAlignment));
-
- bytesToCopy = min(m_maxSize - m_size, bufferSize);
- memcpy(m_pData + m_size, pNewData, bytesToCopy);
- pNewData += bytesToCopy;
-
- if (m_IsAligned)
- {
- D3DXASSERT(m_size == AlignToPowerOf2(m_size, c_DataAlignment));
- m_size += AlignToPowerOf2(bytesToCopy, c_DataAlignment);
- }
- else
- {
- m_size += bytesToCopy;
- }
-
- bufferSize -= bytesToCopy;
- *ppBlock = this;
-
- if (bufferSize != 0)
- {
- D3DXASSERT(NULL == m_pNext); // make sure we're not overwriting anything
-
- // Couldn't fit all data into this block, spill over into next
- VN( m_pNext = NEW CDataBlock() );
- if (m_IsAligned)
- {
- m_pNext->EnableAlignment();
- }
- VH( m_pNext->AddData(pNewData, bufferSize, ppBlock) );
- }
-
-lExit:
- return hr;
-}
-
-void* CDataBlock::Allocate(UINT bufferSize, CDataBlock **ppBlock)
-{
- void *pRetValue;
- UINT temp = m_size + bufferSize;
-
- if (temp < m_size)
- return NULL;
-
- *ppBlock = this;
-
- if (m_maxSize == 0)
- {
- // This is a brand new DataBlock, fill it up
- m_maxSize = max(8192, bufferSize);
-
- m_pData = NEW BYTE[m_maxSize];
- if (!m_pData)
- return NULL;
- memset(m_pData, 0xDD, m_maxSize);
- }
- else if (temp > m_maxSize)
- {
- D3DXASSERT(NULL == m_pNext); // make sure we're not overwriting anything
-
- // Couldn't fit data into this block, spill over into next
- m_pNext = NEW CDataBlock();
- if (!m_pNext)
- return NULL;
- if (m_IsAligned)
- {
- m_pNext->EnableAlignment();
- }
-
- return m_pNext->Allocate(bufferSize, ppBlock);
- }
-
- D3DXASSERT(m_pData == AlignToPowerOf2(m_pData, c_DataAlignment));
-
- pRetValue = m_pData + m_size;
- if (m_IsAligned)
- {
- D3DXASSERT(m_size == AlignToPowerOf2(m_size, c_DataAlignment));
- m_size = AlignToPowerOf2(temp, c_DataAlignment);
- }
- else
- {
- m_size = temp;
- }
-
- return pRetValue;
-}
-
-
-//////////////////////////////////////////////////////////////////////////
-
-CDataBlockStore::CDataBlockStore()
-{
- m_pFirst = NULL;
- m_pLast = NULL;
- m_Size = 0;
- m_Offset = 0;
- m_IsAligned = FALSE;
-
-#if _DEBUG
- m_cAllocations = 0;
-#endif
-}
-
-CDataBlockStore::~CDataBlockStore()
-{
- // Can't just do SAFE_DELETE(m_pFirst) since it blows the stack when deleting long chains of data
- CDataBlock* pData = m_pFirst;
- while(pData)
- {
- CDataBlock* pCurrent = pData;
- pData = pData->m_pNext;
- pCurrent->m_pNext = NULL;
- delete pCurrent;
- }
-
- // m_pLast will be deleted automatically
-}
-
-void CDataBlockStore::EnableAlignment()
-{
- m_IsAligned = TRUE;
-}
-
-HRESULT CDataBlockStore::AddString(LPCSTR pString, UINT *pOffset)
-{
- size_t strSize = strlen(pString) + 1;
- D3DXASSERT( strSize <= 0xffffffff );
- return AddData(pString, (UINT)strSize, pOffset);
-}
-
-HRESULT CDataBlockStore::AddData(const void *pNewData, UINT bufferSize, UINT *pCurOffset)
-{
- HRESULT hr = S_OK;
-
- if (bufferSize == 0)
- {
- if (pCurOffset)
- {
- *pCurOffset = 0;
- }
- goto lExit;
- }
-
- if (!m_pFirst)
- {
- VN( m_pFirst = NEW CDataBlock() );
- if (m_IsAligned)
- {
- m_pFirst->EnableAlignment();
- }
- m_pLast = m_pFirst;
- }
-
- if (pCurOffset)
- *pCurOffset = m_Size + m_Offset;
-
- VH( m_pLast->AddData(pNewData, bufferSize, &m_pLast) );
- m_Size += bufferSize;
-
-lExit:
- return hr;
-}
-
-void* CDataBlockStore::Allocate(UINT bufferSize)
-{
- void *pRetValue = NULL;
-
-#if _DEBUG
- m_cAllocations++;
-#endif
-
- if (!m_pFirst)
- {
- m_pFirst = NEW CDataBlock();
- if (!m_pFirst)
- return NULL;
-
- if (m_IsAligned)
- {
- m_pFirst->EnableAlignment();
- }
- m_pLast = m_pFirst;
- }
-
- if (FAILED(UIntAdd(m_Size, bufferSize, &m_Size)))
- return NULL;
-
- pRetValue = m_pLast->Allocate(bufferSize, &m_pLast);
- if (!pRetValue)
- return NULL;
-
- return pRetValue;
-}
-
-UINT CDataBlockStore::GetSize()
-{
- return m_Size;
-}
diff --git a/sample/d3d11/Effects11/pchfx.h b/sample/d3d11/Effects11/pchfx.h
deleted file mode 100644
index a374084..0000000
--- a/sample/d3d11/Effects11/pchfx.h
+++ /dev/null
@@ -1,44 +0,0 @@
-//////////////////////////////////////////////////////////////////////////////
-//
-// Copyright (C) Microsoft Corporation. All Rights Reserved.
-//
-// File: pchfx.h
-// Content: D3D shader effects precompiled header
-//
-//////////////////////////////////////////////////////////////////////////////
-
-#ifndef __D3DX11_PCHFX_H__
-#define __D3DX11_PCHFX_H__
-
-#define WIN32_LEAN_AND_MEAN
-
-#include "d3d11.h"
-#include "d3dx11.h"
-#undef DEFINE_GUID
-#include "INITGUID.h"
-#include "d3dx11effect.h"
-
-#define UNUSED -1
-
-//////////////////////////////////////////////////////////////////////////
-
-#define offsetof_fx( a, b ) (UINT)offsetof( a, b )
-
-#include "d3dxGlobal.h"
-
-#include <stddef.h>
-#include <strsafe.h>
-
-#include "Effect.h"
-#include "EffectStateBase11.h"
-#include "EffectLoad.h"
-
-#include "D3DCompiler.h"
-
-//////////////////////////////////////////////////////////////////////////
-
-namespace D3DX11Effects
-{
-} // end namespace D3DX11Effects
-
-#endif // __D3DX11_PCHFX_H__