forked from microsoft/FX11
-
Notifications
You must be signed in to change notification settings - Fork 0
/
EffectLoad.h
156 lines (128 loc) · 7.42 KB
/
EffectLoad.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
//--------------------------------------------------------------------------------------
// File: EffectLoad.h
//
// Direct3D 11 Effects header for the FX file loader
// A CEffectLoader is created at load time to facilitate loading
//
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
// PARTICULAR PURPOSE.
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// http://go.microsoft.com/fwlink/p/?LinkId=271568
//--------------------------------------------------------------------------------------
#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
{
uint32_t start;
uint32_t last;
CEffectVector<void *> vResources; // should be (last - start) in length, resource type depends on the range type
};
// Used during load to validate assignments
D3D_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(_In_ uint32_t Flags, _Outptr_ ID3DX11Effect** ppClonedEffect );
protected:
// Load-time allocations that eventually get moved happen out of the TempHeap. This heap will grow as needed
CDataBlockStore m_BulkHeap;
uint8_t *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<uint8_t> m_HashBuffer;
uint32_t 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;
uint32_t 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;
uint32_t m_EffectMemory; // Effect private heap
uint32_t m_ReflectionMemory; // Reflection private heap
// Loader helpers
HRESULT LoadCBs();
HRESULT LoadNumericVariable(_In_ SConstantBuffer *pParentCB);
HRESULT LoadObjectVariables();
HRESULT LoadInterfaceVariables();
HRESULT LoadTypeAndAddToPool(_Outptr_ SType **ppType, _In_ uint32_t dwOffset);
HRESULT LoadStringAndAddToPool(_Outptr_result_maybenull_z_ char **ppString, _In_ uint32_t dwOffset);
HRESULT LoadAssignments( _In_ uint32_t Assignments, _Out_writes_(Assignments) SAssignment **pAssignments,
_In_ uint8_t *pBackingStore, _Out_opt_ uint32_t *pRTVAssignments, _Out_opt_ uint32_t *pFinalAssignments );
HRESULT LoadGroups();
HRESULT LoadTechnique( STechnique* pTech );
HRESULT LoadAnnotations(uint32_t *pcAnnotations, SAnnotation **ppAnnotations);
HRESULT ExecuteConstantAssignment(_In_ const SBinaryConstant *pConstant, _Out_writes_bytes_(4) void *pLHS, _In_ D3D_SHADER_VARIABLE_TYPE lhsType);
uint32_t UnpackData(uint8_t *pDestData, uint8_t *pSrcData, uint32_t PackedDataSize, SType *pType, uint32_t *pBytesRead);
// Build shader blocks
HRESULT ConvertRangesToBindings(SShaderBlock *pShaderBlock, CEffectVector<SRange> *pvRanges );
HRESULT GrabShaderData(SShaderBlock *pShaderBlock);
HRESULT BuildShaderBlock(SShaderBlock *pShaderBlock);
// Memory compactors
HRESULT InitializeReflectionDataAndMoveStrings( uint32_t KnownSize = 0 );
HRESULT ReallocateReflectionData( bool Cloning = false );
HRESULT ReallocateEffectData( bool Cloning = false );
HRESULT ReallocateShaderBlocks();
template<class T> HRESULT ReallocateBlockAssignments(T* &pBlocks, uint32_t cBlocks, T* pOldBlocks = nullptr);
HRESULT ReallocateAnnotationData(uint32_t cAnnotations, SAnnotation **ppAnnotations);
HRESULT CalculateAnnotationSize(uint32_t cAnnotations, SAnnotation *pAnnotations);
uint32_t CalculateShaderBlockSize();
template<class T> uint32_t CalculateBlockAssignmentSize(T* &pBlocks, uint32_t cBlocks);
HRESULT FixupCBPointer(_Inout_ SConstantBuffer **ppCB);
HRESULT FixupShaderPointer(_Inout_ SShaderBlock **ppShaderBlock);
HRESULT FixupDSPointer(_Inout_ SDepthStencilBlock **ppDSBlock);
HRESULT FixupABPointer(_Inout_ SBlendBlock **ppABBlock);
HRESULT FixupRSPointer(_Inout_ SRasterizerBlock **ppRSBlock);
HRESULT FixupInterfacePointer(_Inout_ SInterface **ppInterface, _In_ bool CheckBackgroundInterfaces);
HRESULT FixupShaderResourcePointer(_Inout_ SShaderResource **ppResource);
HRESULT FixupUnorderedAccessViewPointer(_Inout_ SUnorderedAccessView **ppResource);
HRESULT FixupRenderTargetViewPointer(_Inout_ SRenderTargetView **ppRenderTargetView);
HRESULT FixupDepthStencilViewPointer(_Inout_ SDepthStencilView **ppDepthStencilView);
HRESULT FixupSamplerPointer(_Inout_ SSamplerBlock **ppSampler);
HRESULT FixupVariablePointer(_Inout_ SGlobalVariable **ppVar);
HRESULT FixupStringPointer(_Inout_ SString **ppString);
HRESULT FixupMemberDataPointer(_Inout_ SMemberDataPointer **ppMemberData);
HRESULT FixupGroupPointer(_Inout_ SGroup **ppGroup);
// Methods to retrieve data from the unstructured block
// (these do not make copies; they simply return pointers into the block)
HRESULT GetStringAndAddToReflection(_In_ uint32_t offset, _Outptr_result_maybenull_z_ char **ppPointer); // Returns a string from the file string block, updates m_EffectMemory
HRESULT GetUnstructuredDataBlock(_In_ uint32_t offset, _Out_ uint32_t *pdwSize, _Outptr_result_buffer_(*pdwSize) void **ppData);
// This function makes a copy of the array of SInterfaceParameters, but not a copy of the strings
HRESULT GetInterfaceParametersAndAddToReflection( _In_ uint32_t InterfaceCount, _In_ uint32_t offset, _Outptr_result_buffer_all_maybenull_(InterfaceCount) SShaderBlock::SInterfaceParameter **ppInterfaces );
public:
HRESULT LoadEffect(_In_ CEffect *pEffect, _In_reads_bytes_(cbEffectBuffer) const void *pEffectBuffer, _In_ uint32_t cbEffectBuffer);
};
}