@@ -120,6 +120,114 @@ enum class PublicAPI { D3D12 = 0, D3D11_47 = 1, D3D11_43 = 2, Invalid };
120120 ((D3D_SHADER_VARIABLE_CLASS)(D3D_SVC_INTERFACE_POINTER + 1 ))
121121#endif
122122
123+ class CShaderReflectionType ;
124+ class CShaderReflectionVariable ;
125+ class CShaderReflectionConstantBuffer ;
126+ class CShaderReflection ;
127+ struct D3D11_INTERNALSHADER_RESOURCE_DEF ;
128+ class CShaderReflectionType final : public ID3D12ShaderReflectionType {
129+ friend class CShaderReflectionConstantBuffer ;
130+
131+ protected:
132+ D3D12_SHADER_TYPE_DESC m_Desc;
133+ UINT m_SizeInCBuffer;
134+ std::string m_Name;
135+ std::vector<StringRef> m_MemberNames;
136+ std::vector<CShaderReflectionType *> m_MemberTypes;
137+ CShaderReflectionType *m_pSubType;
138+ CShaderReflectionType *m_pBaseClass;
139+ std::vector<CShaderReflectionType *> m_Interfaces;
140+ ULONG_PTR m_Identity;
141+
142+ public:
143+ // Internal
144+ HRESULT InitializeEmpty ();
145+ HRESULT
146+ Initialize (DxilModule &M, llvm::Type *type,
147+ DxilFieldAnnotation &typeAnnotation, unsigned int baseOffset,
148+ std::vector<std::unique_ptr<CShaderReflectionType>> &allTypes,
149+ bool isCBuffer);
150+
151+ // ID3D12ShaderReflectionType
152+ STDMETHOD (GetDesc)(D3D12_SHADER_TYPE_DESC *pDesc);
153+
154+ STDMETHOD_ (ID3D12ShaderReflectionType *, GetMemberTypeByIndex)(UINT Index);
155+ STDMETHOD_ (ID3D12ShaderReflectionType *, GetMemberTypeByName)(LPCSTR Name);
156+ STDMETHOD_ (LPCSTR, GetMemberTypeName)(UINT Index);
157+
158+ STDMETHOD (IsEqual)(ID3D12ShaderReflectionType *pType);
159+ STDMETHOD_ (ID3D12ShaderReflectionType *, GetSubType)();
160+ STDMETHOD_ (ID3D12ShaderReflectionType *, GetBaseClass)();
161+ STDMETHOD_ (UINT, GetNumInterfaces)();
162+ STDMETHOD_ (ID3D12ShaderReflectionType *, GetInterfaceByIndex)(UINT uIndex);
163+ STDMETHOD (IsOfType)(ID3D12ShaderReflectionType *pType);
164+ STDMETHOD (ImplementsInterface)(ID3D12ShaderReflectionType *pBase);
165+
166+ bool CheckEqual (CShaderReflectionType *pOther) {
167+ return m_Identity == pOther->m_Identity ;
168+ }
169+
170+ UINT GetCBufferSize () { return m_SizeInCBuffer; }
171+ };
172+
173+ class CShaderReflectionVariable final : public ID3D12ShaderReflectionVariable {
174+ protected:
175+ D3D12_SHADER_VARIABLE_DESC m_Desc;
176+ CShaderReflectionType *m_pType;
177+ CShaderReflectionConstantBuffer *m_pBuffer;
178+ BYTE *m_pDefaultValue;
179+
180+ public:
181+ void Initialize (CShaderReflectionConstantBuffer *pBuffer,
182+ D3D12_SHADER_VARIABLE_DESC *pDesc,
183+ CShaderReflectionType *pType, BYTE *pDefaultValue);
184+
185+ LPCSTR GetName () { return m_Desc.Name ; }
186+
187+ // ID3D12ShaderReflectionVariable
188+ STDMETHOD (GetDesc)(D3D12_SHADER_VARIABLE_DESC *pDesc);
189+
190+ STDMETHOD_ (ID3D12ShaderReflectionType *, GetType)();
191+ STDMETHOD_ (ID3D12ShaderReflectionConstantBuffer *, GetBuffer)();
192+
193+ STDMETHOD_ (UINT, GetInterfaceSlot)(UINT uArrayIndex);
194+ };
195+
196+ class CShaderReflectionConstantBuffer final
197+ : public ID3D12ShaderReflectionConstantBuffer {
198+ protected:
199+ D3D12_SHADER_BUFFER_DESC m_Desc;
200+ std::vector<CShaderReflectionVariable> m_Variables;
201+ // For StructuredBuffer arrays, Name will have [0] appended for each dimension
202+ // to match fxc behavior.
203+ std::string m_ReflectionName;
204+
205+ public:
206+ CShaderReflectionConstantBuffer () = default ;
207+ CShaderReflectionConstantBuffer (CShaderReflectionConstantBuffer &&other) {
208+ m_Desc = other.m_Desc ;
209+ std::swap (m_Variables, other.m_Variables );
210+ }
211+
212+ void Initialize (DxilModule &M, DxilCBuffer &CB,
213+ std::vector<std::unique_ptr<CShaderReflectionType>> &allTypes,
214+ bool bUsageInMetadata);
215+ void InitializeStructuredBuffer (
216+ DxilModule &M, DxilResource &R,
217+ std::vector<std::unique_ptr<CShaderReflectionType>> &allTypes);
218+ void InitializeTBuffer (
219+ DxilModule &M, DxilResource &R,
220+ std::vector<std::unique_ptr<CShaderReflectionType>> &allTypes,
221+ bool bUsageInMetadata);
222+ LPCSTR GetName () { return m_Desc.Name ; }
223+
224+ // ID3D12ShaderReflectionConstantBuffer
225+ STDMETHOD (GetDesc)(D3D12_SHADER_BUFFER_DESC *pDesc);
226+
227+ STDMETHOD_ (ID3D12ShaderReflectionVariable *, GetVariableByIndex)(UINT Index);
228+ STDMETHOD_ (ID3D12ShaderReflectionVariable *, GetVariableByName)(LPCSTR Name);
229+ };
230+
123231class DxilModuleReflection {
124232public:
125233 hlsl::RDAT::DxilRuntimeData m_RDAT;
@@ -541,114 +649,6 @@ void hlsl::CreateDxcContainerReflection(IDxcContainerReflection **ppResult) {
541649// /////////////////////////////////////////////////////////////////////////////
542650// DxilShaderReflection implementation - helper objects. //
543651
544- class CShaderReflectionType ;
545- class CShaderReflectionVariable ;
546- class CShaderReflectionConstantBuffer ;
547- class CShaderReflection ;
548- struct D3D11_INTERNALSHADER_RESOURCE_DEF ;
549- class CShaderReflectionType final : public ID3D12ShaderReflectionType {
550- friend class CShaderReflectionConstantBuffer ;
551-
552- protected:
553- D3D12_SHADER_TYPE_DESC m_Desc;
554- UINT m_SizeInCBuffer;
555- std::string m_Name;
556- std::vector<StringRef> m_MemberNames;
557- std::vector<CShaderReflectionType *> m_MemberTypes;
558- CShaderReflectionType *m_pSubType;
559- CShaderReflectionType *m_pBaseClass;
560- std::vector<CShaderReflectionType *> m_Interfaces;
561- ULONG_PTR m_Identity;
562-
563- public:
564- // Internal
565- HRESULT InitializeEmpty ();
566- HRESULT
567- Initialize (DxilModule &M, llvm::Type *type,
568- DxilFieldAnnotation &typeAnnotation, unsigned int baseOffset,
569- std::vector<std::unique_ptr<CShaderReflectionType>> &allTypes,
570- bool isCBuffer);
571-
572- // ID3D12ShaderReflectionType
573- STDMETHOD (GetDesc)(D3D12_SHADER_TYPE_DESC *pDesc);
574-
575- STDMETHOD_ (ID3D12ShaderReflectionType *, GetMemberTypeByIndex)(UINT Index);
576- STDMETHOD_ (ID3D12ShaderReflectionType *, GetMemberTypeByName)(LPCSTR Name);
577- STDMETHOD_ (LPCSTR, GetMemberTypeName)(UINT Index);
578-
579- STDMETHOD (IsEqual)(ID3D12ShaderReflectionType *pType);
580- STDMETHOD_ (ID3D12ShaderReflectionType *, GetSubType)();
581- STDMETHOD_ (ID3D12ShaderReflectionType *, GetBaseClass)();
582- STDMETHOD_ (UINT, GetNumInterfaces)();
583- STDMETHOD_ (ID3D12ShaderReflectionType *, GetInterfaceByIndex)(UINT uIndex);
584- STDMETHOD (IsOfType)(ID3D12ShaderReflectionType *pType);
585- STDMETHOD (ImplementsInterface)(ID3D12ShaderReflectionType *pBase);
586-
587- bool CheckEqual (CShaderReflectionType *pOther) {
588- return m_Identity == pOther->m_Identity ;
589- }
590-
591- UINT GetCBufferSize () { return m_SizeInCBuffer; }
592- };
593-
594- class CShaderReflectionVariable final : public ID3D12ShaderReflectionVariable {
595- protected:
596- D3D12_SHADER_VARIABLE_DESC m_Desc;
597- CShaderReflectionType *m_pType;
598- CShaderReflectionConstantBuffer *m_pBuffer;
599- BYTE *m_pDefaultValue;
600-
601- public:
602- void Initialize (CShaderReflectionConstantBuffer *pBuffer,
603- D3D12_SHADER_VARIABLE_DESC *pDesc,
604- CShaderReflectionType *pType, BYTE *pDefaultValue);
605-
606- LPCSTR GetName () { return m_Desc.Name ; }
607-
608- // ID3D12ShaderReflectionVariable
609- STDMETHOD (GetDesc)(D3D12_SHADER_VARIABLE_DESC *pDesc);
610-
611- STDMETHOD_ (ID3D12ShaderReflectionType *, GetType)();
612- STDMETHOD_ (ID3D12ShaderReflectionConstantBuffer *, GetBuffer)();
613-
614- STDMETHOD_ (UINT, GetInterfaceSlot)(UINT uArrayIndex);
615- };
616-
617- class CShaderReflectionConstantBuffer final
618- : public ID3D12ShaderReflectionConstantBuffer {
619- protected:
620- D3D12_SHADER_BUFFER_DESC m_Desc;
621- std::vector<CShaderReflectionVariable> m_Variables;
622- // For StructuredBuffer arrays, Name will have [0] appended for each dimension
623- // to match fxc behavior.
624- std::string m_ReflectionName;
625-
626- public:
627- CShaderReflectionConstantBuffer () = default ;
628- CShaderReflectionConstantBuffer (CShaderReflectionConstantBuffer &&other) {
629- m_Desc = other.m_Desc ;
630- std::swap (m_Variables, other.m_Variables );
631- }
632-
633- void Initialize (DxilModule &M, DxilCBuffer &CB,
634- std::vector<std::unique_ptr<CShaderReflectionType>> &allTypes,
635- bool bUsageInMetadata);
636- void InitializeStructuredBuffer (
637- DxilModule &M, DxilResource &R,
638- std::vector<std::unique_ptr<CShaderReflectionType>> &allTypes);
639- void InitializeTBuffer (
640- DxilModule &M, DxilResource &R,
641- std::vector<std::unique_ptr<CShaderReflectionType>> &allTypes,
642- bool bUsageInMetadata);
643- LPCSTR GetName () { return m_Desc.Name ; }
644-
645- // ID3D12ShaderReflectionConstantBuffer
646- STDMETHOD (GetDesc)(D3D12_SHADER_BUFFER_DESC *pDesc);
647-
648- STDMETHOD_ (ID3D12ShaderReflectionVariable *, GetVariableByIndex)(UINT Index);
649- STDMETHOD_ (ID3D12ShaderReflectionVariable *, GetVariableByName)(LPCSTR Name);
650- };
651-
652652// Invalid type sentinel definitions
653653class CInvalidSRType ;
654654class CInvalidSRVariable ;
0 commit comments