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
|
// debug-shader-object.h
#pragma once
#include "debug-base.h"
namespace gfx
{
using namespace Slang;
namespace debug
{
struct ShaderOffsetKey
{
ShaderOffset offset;
bool operator==(ShaderOffsetKey other) const
{
return offset.bindingArrayIndex == other.offset.bindingArrayIndex &&
offset.bindingRangeIndex == other.offset.bindingRangeIndex &&
offset.uniformOffset == other.offset.uniformOffset;
}
Slang::HashCode getHashCode() const
{
return Slang::combineHash(
(Slang::HashCode)offset.uniformOffset,
Slang::combineHash(
(Slang::HashCode)offset.bindingArrayIndex,
(Slang::HashCode)offset.bindingRangeIndex));
}
};
class DebugShaderObject : public DebugObject<IShaderObject>
{
public:
SLANG_COM_OBJECT_IUNKNOWN_ALL;
void checkCompleteness();
public:
IShaderObject* getInterface(const Slang::Guid& guid);
virtual SLANG_NO_THROW slang::TypeLayoutReflection* SLANG_MCALL getElementTypeLayout() override;
virtual SLANG_NO_THROW ShaderObjectContainerType SLANG_MCALL getContainerType() override;
virtual SLANG_NO_THROW GfxCount SLANG_MCALL getEntryPointCount() override;
virtual SLANG_NO_THROW Result SLANG_MCALL
getEntryPoint(GfxIndex index, IShaderObject** entryPoint) override;
virtual SLANG_NO_THROW Result SLANG_MCALL
setData(ShaderOffset const& offset, void const* data, size_t size) override;
virtual SLANG_NO_THROW Result SLANG_MCALL
getObject(ShaderOffset const& offset, IShaderObject** object) override;
virtual SLANG_NO_THROW Result SLANG_MCALL
setObject(ShaderOffset const& offset, IShaderObject* object) override;
virtual SLANG_NO_THROW Result SLANG_MCALL
setResource(ShaderOffset const& offset, IResourceView* resourceView) override;
virtual SLANG_NO_THROW Result SLANG_MCALL
setSampler(ShaderOffset const& offset, ISamplerState* sampler) override;
virtual SLANG_NO_THROW Result SLANG_MCALL setCombinedTextureSampler(
ShaderOffset const& offset,
IResourceView* textureView,
ISamplerState* sampler) override;
virtual SLANG_NO_THROW Result SLANG_MCALL setSpecializationArgs(
ShaderOffset const& offset,
const slang::SpecializationArg* args,
GfxCount count) override;
virtual SLANG_NO_THROW Result SLANG_MCALL
getCurrentVersion(ITransientResourceHeap* transientHeap, IShaderObject** outObject) override;
virtual SLANG_NO_THROW const void* SLANG_MCALL getRawData() override;
virtual SLANG_NO_THROW size_t SLANG_MCALL getSize() override;
virtual SLANG_NO_THROW Result SLANG_MCALL
setConstantBufferOverride(IBufferResource* constantBuffer) override;
public:
// Type name of an ordinary shader object.
Slang::String m_typeName;
// The slang Type of an ordinary shader object. This is null for root objects.
slang::TypeReflection* m_slangType = nullptr;
// The slang program from which a root shader object is created, this is null for ordinary
// objects.
Slang::ComPtr<slang::IComponentType> m_rootComponentType;
DebugDevice* m_device;
Slang::List<Slang::RefPtr<DebugShaderObject>> m_entryPoints;
Slang::Dictionary<ShaderOffsetKey, Slang::RefPtr<DebugShaderObject>> m_objects;
Slang::Dictionary<ShaderOffsetKey, Slang::RefPtr<DebugResourceView>> m_resources;
Slang::Dictionary<ShaderOffsetKey, Slang::RefPtr<DebugSamplerState>> m_samplers;
Slang::HashSet<SlangInt> m_initializedBindingRanges;
};
class DebugRootShaderObject : public DebugShaderObject
{
public:
virtual SLANG_NO_THROW uint32_t SLANG_MCALL addRef() override { return 1; }
virtual SLANG_NO_THROW uint32_t SLANG_MCALL release() override { return 1; }
virtual SLANG_NO_THROW Result SLANG_MCALL setSpecializationArgs(
ShaderOffset const& offset,
const slang::SpecializationArg* args,
GfxCount count) override;
void reset();
};
} // namespace debug
} // namespace gfx
|