yum-mirror/slang

Making it easier to work with shaders

git clone https://git.yummers.dev/yum-mirror/slang

Ellie Hermaszewskaformatf65d756bf

master
3.9 KiB103 linesraw
1// debug-shader-object.h
2#pragma once
3#include "debug-base.h"
4
5namespace gfx
6{
7using namespace Slang;
8
9namespace debug
10{
11
12struct ShaderOffsetKey
13{
14    ShaderOffset offset;
15    bool operator==(ShaderOffsetKey other) const
16    {
17        return offset.bindingArrayIndex == other.offset.bindingArrayIndex &&
18               offset.bindingRangeIndex == other.offset.bindingRangeIndex &&
19               offset.uniformOffset == other.offset.uniformOffset;
20    }
21    Slang::HashCode getHashCode() const
22    {
23        return Slang::combineHash(
24            (Slang::HashCode)offset.uniformOffset,
25            Slang::combineHash(
26                (Slang::HashCode)offset.bindingArrayIndex,
27                (Slang::HashCode)offset.bindingRangeIndex));
28    }
29};
30
31class DebugShaderObject : public DebugObject<IShaderObject>
32{
33public:
34    SLANG_COM_OBJECT_IUNKNOWN_ALL;
35    void checkCompleteness();
36
37public:
38    IShaderObject* getInterface(const Slang::Guid& guid);
39    virtual SLANG_NO_THROW slang::TypeLayoutReflection* SLANG_MCALL getElementTypeLayout() override;
40    virtual SLANG_NO_THROW ShaderObjectContainerType SLANG_MCALL getContainerType() override;
41    virtual SLANG_NO_THROW GfxCount SLANG_MCALL getEntryPointCount() override;
42    virtual SLANG_NO_THROW Result SLANG_MCALL
43    getEntryPoint(GfxIndex index, IShaderObject** entryPoint) override;
44    virtual SLANG_NO_THROW Result SLANG_MCALL
45    setData(ShaderOffset const& offset, void const* data, size_t size) override;
46    virtual SLANG_NO_THROW Result SLANG_MCALL
47    getObject(ShaderOffset const& offset, IShaderObject** object) override;
48    virtual SLANG_NO_THROW Result SLANG_MCALL
49    setObject(ShaderOffset const& offset, IShaderObject* object) override;
50    virtual SLANG_NO_THROW Result SLANG_MCALL
51    setResource(ShaderOffset const& offset, IResourceView* resourceView) override;
52    virtual SLANG_NO_THROW Result SLANG_MCALL
53    setSampler(ShaderOffset const& offset, ISamplerState* sampler) override;
54    virtual SLANG_NO_THROW Result SLANG_MCALL setCombinedTextureSampler(
55        ShaderOffset const& offset,
56        IResourceView* textureView,
57        ISamplerState* sampler) override;
58    virtual SLANG_NO_THROW Result SLANG_MCALL setSpecializationArgs(
59        ShaderOffset const& offset,
60        const slang::SpecializationArg* args,
61        GfxCount count) override;
62
63    virtual SLANG_NO_THROW Result SLANG_MCALL
64    getCurrentVersion(ITransientResourceHeap* transientHeap, IShaderObject** outObject) override;
65    virtual SLANG_NO_THROW const void* SLANG_MCALL getRawData() override;
66    virtual SLANG_NO_THROW size_t SLANG_MCALL getSize() override;
67    virtual SLANG_NO_THROW Result SLANG_MCALL
68    setConstantBufferOverride(IBufferResource* constantBuffer) override;
69
70public:
71    // Type name of an ordinary shader object.
72    Slang::String m_typeName;
73
74    // The slang Type of an ordinary shader object. This is null for root objects.
75    slang::TypeReflection* m_slangType = nullptr;
76
77    // The slang program from which a root shader object is created, this is null for ordinary
78    // objects.
79    Slang::ComPtr<slang::IComponentType> m_rootComponentType;
80
81    DebugDevice* m_device;
82
83    Slang::List<Slang::RefPtr<DebugShaderObject>> m_entryPoints;
84    Slang::Dictionary<ShaderOffsetKey, Slang::RefPtr<DebugShaderObject>> m_objects;
85    Slang::Dictionary<ShaderOffsetKey, Slang::RefPtr<DebugResourceView>> m_resources;
86    Slang::Dictionary<ShaderOffsetKey, Slang::RefPtr<DebugSamplerState>> m_samplers;
87    Slang::HashSet<SlangInt> m_initializedBindingRanges;
88};
89
90class DebugRootShaderObject : public DebugShaderObject
91{
92public:
93    virtual SLANG_NO_THROW uint32_t SLANG_MCALL addRef() override { return 1; }
94    virtual SLANG_NO_THROW uint32_t SLANG_MCALL release() override { return 1; }
95    virtual SLANG_NO_THROW Result SLANG_MCALL setSpecializationArgs(
96        ShaderOffset const& offset,
97        const slang::SpecializationArg* args,
98        GfxCount count) override;
99    void reset();
100};
101
102} // namespace debug
103} // namespace gfx