aboutsummaryrefslogtreecommitdiff
path: root/lib/win32/Effects11/EffectLoad.h
diff options
context:
space:
mode:
Diffstat (limited to 'lib/win32/Effects11/EffectLoad.h')
-rw-r--r--lib/win32/Effects11/EffectLoad.h156
1 files changed, 156 insertions, 0 deletions
diff --git a/lib/win32/Effects11/EffectLoad.h b/lib/win32/Effects11/EffectLoad.h
new file mode 100644
index 0000000000..238a0b3ae6
--- /dev/null
+++ b/lib/win32/Effects11/EffectLoad.h
@@ -0,0 +1,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);
+};
+
+
+} \ No newline at end of file