From 7de19f4c35db108e30d5cd8f02a1c11e12e050db Mon Sep 17 00:00:00 2001 From: baldurk Date: Thu, 9 Aug 2018 12:56:30 +0100 Subject: [PATCH] List an encoding for shader debuginfo source. Add HLSL/spvas to enum --- renderdoc/api/replay/renderdoc_tostr.inl | 3 +++ renderdoc/api/replay/replay_enums.h | 19 +++++++++++++++++++ renderdoc/api/replay/shader_types.h | 5 ++++- .../driver/gl/wrappers/gl_shader_funcs.cpp | 2 ++ .../driver/shaders/dxbc/dxbc_reflect.cpp | 2 ++ .../shaders/spirv/spirv_disassemble.cpp | 6 ++++++ renderdoc/replay/renderdoc_serialise.inl | 5 +++-- 7 files changed, 39 insertions(+), 3 deletions(-) diff --git a/renderdoc/api/replay/renderdoc_tostr.inl b/renderdoc/api/replay/renderdoc_tostr.inl index 859fb0674..4b1e8098e 100644 --- a/renderdoc/api/replay/renderdoc_tostr.inl +++ b/renderdoc/api/replay/renderdoc_tostr.inl @@ -831,9 +831,12 @@ std::string DoStringise(const ShaderEncoding &el) { BEGIN_ENUM_STRINGISE(ShaderEncoding) { + STRINGISE_ENUM_CLASS(Unknown); STRINGISE_ENUM_CLASS(DXBC); STRINGISE_ENUM_CLASS(GLSL); STRINGISE_ENUM_CLASS_NAMED(SPIRV, "SPIR-V"); + STRINGISE_ENUM_CLASS_NAMED(SPIRVAsm, "SPIR-V Asm"); + STRINGISE_ENUM_CLASS(HLSL); } END_ENUM_STRINGISE(); } diff --git a/renderdoc/api/replay/replay_enums.h b/renderdoc/api/replay/replay_enums.h index af3de8264..04b616267 100644 --- a/renderdoc/api/replay/replay_enums.h +++ b/renderdoc/api/replay/replay_enums.h @@ -1376,6 +1376,10 @@ constexpr inline bool IsD3D(GraphicsAPI api) DOCUMENT(R"(Identifies a shader encoding used to pass shader code to an API. +.. data:: Unknown + + Unknown or unprocessable format. + .. data:: DXBC DXBC binary shader, used by D3D11 and D3D12. @@ -1387,14 +1391,29 @@ DOCUMENT(R"(Identifies a shader encoding used to pass shader code to an API. .. data:: SPIRV SPIR-V binary shader, used by Vulkan and with an extension by OpenGL. + +.. data:: SPIRVAsm + + Canonical SPIR-V assembly form, used (indirectly via :data:`SPIRV`) by Vulkan and with an + extension by OpenGL. + +.. data:: HLSL + + HLSL in string format, used by D3D11, D3D12, and Vulkan/GL via compilation to SPIR-V. )"); enum class ShaderEncoding : uint32_t { + Unknown, + First = Unknown, DXBC, GLSL, SPIRV, + SPIRVAsm, + HLSL, + Count, }; +ITERABLE_OPERATORS(ShaderEncoding); DECLARE_REFLECTION_ENUM(ShaderEncoding); DOCUMENT(R"(A primitive topology used for processing vertex data. diff --git a/renderdoc/api/replay/shader_types.h b/renderdoc/api/replay/shader_types.h index 6066c189d..cfb960735 100644 --- a/renderdoc/api/replay/shader_types.h +++ b/renderdoc/api/replay/shader_types.h @@ -915,11 +915,14 @@ struct ShaderDebugInfo DOCUMENT("A :class:`ShaderCompileFlags` containing the flags used to compile this shader."); ShaderCompileFlags compileFlags; - DOCUMENT(R"(A list of :class:`ShaderSourceFile`. + DOCUMENT(R"(A list of :class:`ShaderSourceFile`, encoded in the form denoted by :data:`encoding`. The first entry in the list is always the file where the entry point is. )"); rdcarray files; + + DOCUMENT("The :class:`ShaderEncoding` of the source. See :data:`files`."); + ShaderEncoding encoding = ShaderEncoding::Unknown; }; DECLARE_REFLECTION_STRUCT(ShaderDebugInfo); diff --git a/renderdoc/driver/gl/wrappers/gl_shader_funcs.cpp b/renderdoc/driver/gl/wrappers/gl_shader_funcs.cpp index 5e3ea540b..30e367aef 100644 --- a/renderdoc/driver/gl/wrappers/gl_shader_funcs.cpp +++ b/renderdoc/driver/gl/wrappers/gl_shader_funcs.cpp @@ -274,6 +274,8 @@ void WrappedOpenGL::ShaderData::ProcessCompilation(WrappedOpenGL &drv, ResourceI reflection.stage = MakeShaderStage(type); + reflection.debugInfo.encoding = ShaderEncoding::GLSL; + reflection.debugInfo.files.resize(1); reflection.debugInfo.files[0].filename = "main.glsl"; reflection.debugInfo.files[0].contents = concatenated; diff --git a/renderdoc/driver/shaders/dxbc/dxbc_reflect.cpp b/renderdoc/driver/shaders/dxbc/dxbc_reflect.cpp index 8eb483d6d..861a452db 100644 --- a/renderdoc/driver/shaders/dxbc/dxbc_reflect.cpp +++ b/renderdoc/driver/shaders/dxbc/dxbc_reflect.cpp @@ -226,6 +226,8 @@ void MakeShaderReflection(DXBC::DXBCFile *dxbc, ShaderReflection *refl, { refl->entryPoint = dxbc->m_DebugInfo->GetEntryFunction(); + refl->debugInfo.encoding = ShaderEncoding::HLSL; + refl->debugInfo.compileFlags = DXBC::EncodeFlags(dxbc->m_DebugInfo); refl->debugInfo.files.resize(dxbc->m_DebugInfo->Files.size()); diff --git a/renderdoc/driver/shaders/spirv/spirv_disassemble.cpp b/renderdoc/driver/shaders/spirv/spirv_disassemble.cpp index 5ebc48c5d..c457680ae 100644 --- a/renderdoc/driver/shaders/spirv/spirv_disassemble.cpp +++ b/renderdoc/driver/shaders/spirv/spirv_disassemble.cpp @@ -3963,6 +3963,12 @@ void SPVModule::MakeReflection(ShaderStage stage, const string &entryPoint, // TODO sort these so that the entry point is in the first file if(!sourceFiles.empty()) { + reflection.debugInfo.encoding = ShaderEncoding::Unknown; + if(sourceLang == spv::SourceLanguageHLSL) + reflection.debugInfo.encoding = ShaderEncoding::HLSL; + else if(sourceLang == spv::SourceLanguageGLSL || sourceLang == spv::SourceLanguageESSL) + reflection.debugInfo.encoding = ShaderEncoding::GLSL; + reflection.debugInfo.files.reserve(sourceFiles.size()); for(size_t i = 0; i < sourceFiles.size(); i++) diff --git a/renderdoc/replay/renderdoc_serialise.inl b/renderdoc/replay/renderdoc_serialise.inl index bda26c436..a080e8f1d 100644 --- a/renderdoc/replay/renderdoc_serialise.inl +++ b/renderdoc/replay/renderdoc_serialise.inl @@ -288,8 +288,9 @@ void DoSerialise(SerialiserType &ser, ShaderDebugInfo &el) { SERIALISE_MEMBER(compileFlags); SERIALISE_MEMBER(files); + SERIALISE_MEMBER(encoding); - SIZE_CHECK(32); + SIZE_CHECK(40); } template @@ -319,7 +320,7 @@ void DoSerialise(SerialiserType &ser, ShaderReflection &el) SERIALISE_MEMBER(interfaces); - SIZE_CHECK(216); + SIZE_CHECK(224); } template