yum-mirror/slang

Making it easier to work with shaders

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

Ellie Hermaszewskaformatf65d756bf

master
6.2 KiB211 linesraw
1// debug-shader-object.cpp
2#include "debug-shader-object.h"
3
4#include "debug-helper-functions.h"
5#include "debug-resource-views.h"
6#include "debug-sampler-state.h"
7
8namespace gfx
9{
10using namespace Slang;
11
12namespace debug
13{
14
15ShaderObjectContainerType DebugShaderObject::getContainerType()
16{
17    SLANG_GFX_API_FUNC;
18    return baseObject->getContainerType();
19}
20
21void DebugShaderObject::checkCompleteness()
22{
23    auto layout = baseObject->getElementTypeLayout();
24    for (Index i = 0; i < layout->getBindingRangeCount(); i++)
25    {
26        if (layout->getBindingRangeBindingCount(i) != 0)
27        {
28            if (!m_initializedBindingRanges.contains(i))
29            {
30                auto var = layout->getBindingRangeLeafVariable(i);
31                GFX_DIAGNOSE_ERROR_FORMAT(
32                    "shader parameter '%s' is not initialized in the shader object of type '%s'.",
33                    var->getName(),
34                    m_slangType->getName());
35            }
36        }
37    }
38}
39
40slang::TypeLayoutReflection* DebugShaderObject::getElementTypeLayout()
41{
42    SLANG_GFX_API_FUNC;
43    return baseObject->getElementTypeLayout();
44}
45
46GfxCount DebugShaderObject::getEntryPointCount()
47{
48    SLANG_GFX_API_FUNC;
49    return baseObject->getEntryPointCount();
50}
51
52Result DebugShaderObject::getEntryPoint(GfxIndex index, IShaderObject** entryPoint)
53{
54    SLANG_GFX_API_FUNC;
55    if (m_entryPoints.getCount() == 0)
56    {
57        for (GfxIndex i = 0; i < getEntryPointCount(); i++)
58        {
59            RefPtr<DebugShaderObject> entryPointObj = new DebugShaderObject();
60            SLANG_RETURN_ON_FAIL(
61                baseObject->getEntryPoint(i, entryPointObj->baseObject.writeRef()));
62            m_entryPoints.add(entryPointObj);
63        }
64    }
65    if (index > (GfxCount)m_entryPoints.getCount())
66    {
67        GFX_DIAGNOSE_ERROR("`index` must not exceed `entryPointCount`.");
68        return SLANG_FAIL;
69    }
70    returnComPtr(entryPoint, m_entryPoints[index]);
71    return SLANG_OK;
72}
73
74Result DebugShaderObject::setData(ShaderOffset const& offset, void const* data, Size size)
75{
76    SLANG_GFX_API_FUNC;
77    return baseObject->setData(offset, data, size);
78}
79
80Result DebugShaderObject::getObject(ShaderOffset const& offset, IShaderObject** object)
81{
82    SLANG_GFX_API_FUNC;
83
84    ComPtr<IShaderObject> innerObject;
85    auto resultCode = baseObject->getObject(offset, innerObject.writeRef());
86    SLANG_RETURN_ON_FAIL(resultCode);
87    RefPtr<DebugShaderObject> debugShaderObject;
88    if (m_objects.tryGetValue(ShaderOffsetKey{offset}, debugShaderObject))
89    {
90        if (debugShaderObject->baseObject == innerObject)
91        {
92            returnComPtr(object, debugShaderObject);
93            return resultCode;
94        }
95    }
96    debugShaderObject = new DebugShaderObject();
97    debugShaderObject->baseObject = innerObject;
98    debugShaderObject->m_typeName = innerObject->getElementTypeLayout()->getName();
99    m_objects[ShaderOffsetKey{offset}] = debugShaderObject;
100    returnComPtr(object, debugShaderObject);
101    return resultCode;
102}
103
104Result DebugShaderObject::setObject(ShaderOffset const& offset, IShaderObject* object)
105{
106    SLANG_GFX_API_FUNC;
107    auto objectImpl = getDebugObj(object);
108    m_objects[ShaderOffsetKey{offset}] = objectImpl;
109    m_initializedBindingRanges.add(offset.bindingRangeIndex);
110    objectImpl->checkCompleteness();
111    return baseObject->setObject(offset, getInnerObj(object));
112}
113
114Result DebugShaderObject::setResource(ShaderOffset const& offset, IResourceView* resourceView)
115{
116    SLANG_GFX_API_FUNC;
117    auto viewImpl = getDebugObj(resourceView);
118    m_resources[ShaderOffsetKey{offset}] = viewImpl;
119    m_initializedBindingRanges.add(offset.bindingRangeIndex);
120    return baseObject->setResource(offset, getInnerObj(resourceView));
121}
122
123Result DebugShaderObject::setSampler(ShaderOffset const& offset, ISamplerState* sampler)
124{
125    SLANG_GFX_API_FUNC;
126    auto samplerImpl = getDebugObj(sampler);
127    m_samplers[ShaderOffsetKey{offset}] = samplerImpl;
128    m_initializedBindingRanges.add(offset.bindingRangeIndex);
129    return baseObject->setSampler(offset, getInnerObj(sampler));
130}
131
132Result DebugShaderObject::setCombinedTextureSampler(
133    ShaderOffset const& offset,
134    IResourceView* textureView,
135    ISamplerState* sampler)
136{
137    SLANG_GFX_API_FUNC;
138    auto samplerImpl = getDebugObj(sampler);
139    m_samplers[ShaderOffsetKey{offset}] = samplerImpl;
140    auto viewImpl = getDebugObj(textureView);
141    m_resources[ShaderOffsetKey{offset}] = viewImpl;
142    m_initializedBindingRanges.add(offset.bindingRangeIndex);
143    return baseObject->setCombinedTextureSampler(
144        offset,
145        getInnerObj(viewImpl),
146        getInnerObj(sampler));
147}
148
149Result DebugShaderObject::setSpecializationArgs(
150    ShaderOffset const& offset,
151    const slang::SpecializationArg* args,
152    GfxCount count)
153{
154    SLANG_GFX_API_FUNC;
155    return baseObject->setSpecializationArgs(offset, args, count);
156}
157
158Result DebugShaderObject::getCurrentVersion(
159    ITransientResourceHeap* transientHeap,
160    IShaderObject** outObject)
161{
162    SLANG_GFX_API_FUNC;
163    ComPtr<IShaderObject> innerObject;
164    SLANG_RETURN_ON_FAIL(
165        baseObject->getCurrentVersion(getInnerObj(transientHeap), innerObject.writeRef()));
166    RefPtr<DebugShaderObject> debugShaderObject = new DebugShaderObject();
167    debugShaderObject->baseObject = innerObject;
168    debugShaderObject->m_typeName = innerObject->getElementTypeLayout()->getName();
169    returnComPtr(outObject, debugShaderObject);
170    return SLANG_OK;
171}
172
173const void* DebugShaderObject::getRawData()
174{
175    SLANG_GFX_API_FUNC;
176    return baseObject->getRawData();
177}
178
179size_t DebugShaderObject::getSize()
180{
181    SLANG_GFX_API_FUNC;
182    return baseObject->getSize();
183}
184
185Result DebugShaderObject::setConstantBufferOverride(IBufferResource* constantBuffer)
186{
187    SLANG_GFX_API_FUNC;
188    return baseObject->setConstantBufferOverride(getInnerObj(constantBuffer));
189}
190
191Result DebugRootShaderObject::setSpecializationArgs(
192    ShaderOffset const& offset,
193    const slang::SpecializationArg* args,
194    GfxCount count)
195{
196    SLANG_GFX_API_FUNC;
197
198    return baseObject->setSpecializationArgs(offset, args, count);
199}
200
201void DebugRootShaderObject::reset()
202{
203    m_entryPoints.clear();
204    m_objects.clear();
205    m_resources.clear();
206    m_samplers.clear();
207    baseObject.detach();
208}
209
210} // namespace debug
211} // namespace gfx