summaryrefslogtreecommitdiffstats
path: root/tools/gfx/debug-layer/debug-helper-functions.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tools/gfx/debug-layer/debug-helper-functions.cpp')
-rw-r--r--tools/gfx/debug-layer/debug-helper-functions.cpp156
1 files changed, 156 insertions, 0 deletions
diff --git a/tools/gfx/debug-layer/debug-helper-functions.cpp b/tools/gfx/debug-layer/debug-helper-functions.cpp
new file mode 100644
index 000000000..0d2c1d110
--- /dev/null
+++ b/tools/gfx/debug-layer/debug-helper-functions.cpp
@@ -0,0 +1,156 @@
+// debug-helper-functions.cpp
+#include "debug-helper-functions.h"
+
+namespace gfx
+{
+using namespace Slang;
+
+namespace debug
+{
+
+thread_local const char* _currentFunctionName = nullptr;
+
+SLANG_GFX_DEBUG_GET_INTERFACE_IMPL(Device)
+SLANG_GFX_DEBUG_GET_INTERFACE_IMPL_PARENT(BufferResource, Resource)
+SLANG_GFX_DEBUG_GET_INTERFACE_IMPL_PARENT(TextureResource, Resource)
+SLANG_GFX_DEBUG_GET_INTERFACE_IMPL(CommandBuffer)
+SLANG_GFX_DEBUG_GET_INTERFACE_IMPL(CommandQueue)
+SLANG_GFX_DEBUG_GET_INTERFACE_IMPL(Framebuffer)
+SLANG_GFX_DEBUG_GET_INTERFACE_IMPL(FramebufferLayout)
+SLANG_GFX_DEBUG_GET_INTERFACE_IMPL(InputLayout)
+SLANG_GFX_DEBUG_GET_INTERFACE_IMPL(RenderPassLayout)
+SLANG_GFX_DEBUG_GET_INTERFACE_IMPL(PipelineState)
+SLANG_GFX_DEBUG_GET_INTERFACE_IMPL(ResourceView)
+SLANG_GFX_DEBUG_GET_INTERFACE_IMPL(SamplerState)
+SLANG_GFX_DEBUG_GET_INTERFACE_IMPL(ShaderObject)
+SLANG_GFX_DEBUG_GET_INTERFACE_IMPL(ShaderProgram)
+SLANG_GFX_DEBUG_GET_INTERFACE_IMPL(Swapchain)
+SLANG_GFX_DEBUG_GET_INTERFACE_IMPL(TransientResourceHeap)
+SLANG_GFX_DEBUG_GET_INTERFACE_IMPL(QueryPool)
+SLANG_GFX_DEBUG_GET_INTERFACE_IMPL_PARENT(AccelerationStructure, ResourceView)
+SLANG_GFX_DEBUG_GET_INTERFACE_IMPL(Fence)
+SLANG_GFX_DEBUG_GET_INTERFACE_IMPL(ShaderTable)
+
+String _gfxGetFuncName(const char* input)
+{
+ UnownedStringSlice str(input);
+ auto prefixIndex = str.indexOf(UnownedStringSlice("Debug"));
+ if (prefixIndex == -1)
+ return input;
+ auto endIndex = str.lastIndexOf('(');
+ if (endIndex == -1)
+ endIndex = str.getLength();
+ auto startIndex = prefixIndex + 5;
+ StringBuilder sb;
+ sb.appendChar('I');
+ sb.append(str.subString(startIndex, endIndex - startIndex));
+ return sb.ProduceString();
+}
+
+void validateAccelerationStructureBuildInputs(
+ const IAccelerationStructure::BuildInputs& buildInputs)
+{
+ switch (buildInputs.kind)
+ {
+ case IAccelerationStructure::Kind::TopLevel:
+ if (!buildInputs.instanceDescs)
+ {
+ GFX_DIAGNOSE_ERROR("IAccelerationStructure::BuildInputs::instanceDescs cannot be null "
+ "when creating a top-level acceleration structure.");
+ }
+ break;
+ case IAccelerationStructure::Kind::BottomLevel:
+ if (!buildInputs.geometryDescs)
+ {
+ GFX_DIAGNOSE_ERROR("IAccelerationStructure::BuildInputs::geometryDescs cannot be null "
+ "when creating a bottom-level acceleration structure.");
+ }
+ for (int i = 0; i < buildInputs.descCount; i++)
+ {
+ switch (buildInputs.geometryDescs[i].type)
+ {
+ case IAccelerationStructure::GeometryType::Triangles:
+ switch (buildInputs.geometryDescs[i].content.triangles.vertexFormat)
+ {
+ case Format::R32G32B32_FLOAT:
+ case Format::R32G32_FLOAT:
+ case Format::R16G16B16A16_FLOAT:
+ case Format::R16G16_FLOAT:
+ case Format::R16G16B16A16_SNORM:
+ case Format::R16G16_SNORM:
+ break;
+ default:
+ GFX_DIAGNOSE_ERROR(
+ "Unsupported IAccelerationStructure::TriangleDesc::vertexFormat. Valid "
+ "values are R32G32B32_FLOAT, R32G32_FLOAT, R16G16B16A16_FLOAT, R16G16_FLOAT, "
+ "R16G16B16A16_SNORM or R16G16_SNORM.");
+ }
+ if (buildInputs.geometryDescs[i].content.triangles.indexCount)
+ {
+ switch (buildInputs.geometryDescs[i].content.triangles.indexFormat)
+ {
+ case Format::R32_UINT:
+ case Format::R16_UINT:
+ break;
+ default:
+ GFX_DIAGNOSE_ERROR(
+ "Unsupported IAccelerationStructure::TriangleDesc::indexFormat. Valid "
+ "values are Unknown, R32_UINT or R16_UINT.");
+ }
+ if (!buildInputs.geometryDescs[i].content.triangles.indexData)
+ {
+ GFX_DIAGNOSE_ERROR(
+ "IAccelerationStructure::TriangleDesc::indexData cannot be null if "
+ "IAccelerationStructure::TriangleDesc::indexCount is not 0");
+ }
+ }
+ if (buildInputs.geometryDescs[i].content.triangles.indexFormat != Format::Unknown)
+ {
+ if (buildInputs.geometryDescs[i].content.triangles.indexCount == 0)
+ {
+ GFX_DIAGNOSE_ERROR(
+ "IAccelerationStructure::TriangleDesc::indexCount cannot be 0 if "
+ "IAccelerationStructure::TriangleDesc::indexFormat is not Format::Unknown");
+ }
+ if (buildInputs.geometryDescs[i].content.triangles.indexData == 0)
+ {
+ GFX_DIAGNOSE_ERROR(
+ "IAccelerationStructure::TriangleDesc::indexData cannot be null if "
+ "IAccelerationStructure::TriangleDesc::indexFormat is not "
+ "Format::Unknown");
+ }
+ }
+ else
+ {
+ if (buildInputs.geometryDescs[i].content.triangles.indexCount != 0)
+ {
+ GFX_DIAGNOSE_ERROR(
+ "IAccelerationStructure::TriangleDesc::indexCount must be 0 if "
+ "IAccelerationStructure::TriangleDesc::indexFormat is "
+ "Format::Unknown");
+ }
+ if (buildInputs.geometryDescs[i].content.triangles.indexData != 0)
+ {
+ GFX_DIAGNOSE_ERROR(
+ "IAccelerationStructure::TriangleDesc::indexData must be null if "
+ "IAccelerationStructure::TriangleDesc::indexFormat is "
+ "Format::Unknown");
+ }
+ }
+ if (!buildInputs.geometryDescs[i].content.triangles.vertexData)
+ {
+ GFX_DIAGNOSE_ERROR(
+ "IAccelerationStructure::TriangleDesc::vertexData cannot be null.");
+ }
+ break;
+ }
+ }
+ break;
+ default:
+ GFX_DIAGNOSE_ERROR("Invalid value of IAccelerationStructure::Kind.");
+ break;
+ }
+}
+
+} // namespace debug
+} // namespace gfx