From 184c7be0b8bd4d677dbf51b6d4a464f28506ccea Mon Sep 17 00:00:00 2001 From: baldurk Date: Fri, 22 Dec 2017 16:52:09 +0000 Subject: [PATCH] Add an enum listing how a shader's bytes are encoded. --- renderdoc/api/replay/renderdoc_tostr.inl | 12 ++++++++++ renderdoc/api/replay/replay_enums.h | 23 +++++++++++++++++++ renderdoc/api/replay/shader_types.h | 7 +++++- .../driver/gl/wrappers/gl_shader_funcs.cpp | 1 + .../driver/shaders/dxbc/dxbc_reflect.cpp | 1 + renderdoc/driver/vulkan/vk_info.cpp | 2 ++ renderdoc/replay/renderdoc_serialise.inl | 2 +- 7 files changed, 46 insertions(+), 2 deletions(-) diff --git a/renderdoc/api/replay/renderdoc_tostr.inl b/renderdoc/api/replay/renderdoc_tostr.inl index 86985255c..257c74fb9 100644 --- a/renderdoc/api/replay/renderdoc_tostr.inl +++ b/renderdoc/api/replay/renderdoc_tostr.inl @@ -781,6 +781,18 @@ std::string DoStringise(const GraphicsAPI &el) END_ENUM_STRINGISE(); } +template <> +std::string DoStringise(const ShaderEncoding &el) +{ + BEGIN_ENUM_STRINGISE(ShaderEncoding) + { + STRINGISE_ENUM_CLASS(DXBC); + STRINGISE_ENUM_CLASS(GLSL); + STRINGISE_ENUM_CLASS_NAMED(SPIRV, "SPIR-V"); + } + END_ENUM_STRINGISE(); +} + template <> std::string DoStringise(const SectionType &el) { diff --git a/renderdoc/api/replay/replay_enums.h b/renderdoc/api/replay/replay_enums.h index aa1aa7953..610ecd901 100644 --- a/renderdoc/api/replay/replay_enums.h +++ b/renderdoc/api/replay/replay_enums.h @@ -1239,6 +1239,29 @@ constexpr inline bool IsD3D(GraphicsAPI api) return api == GraphicsAPI::D3D11 || api == GraphicsAPI::D3D12; } +DOCUMENT(R"(Identifies a shader encoding used to pass shader code to an API. + +.. data:: DXBC + + DXBC binary shader, used by D3D11 and D3D12. + +.. data:: GLSL + + GLSL in string format, used by OpenGL. + +.. data:: SPIRV + + SPIR-V binary shader, used by Vulkan and with an extension by OpenGL. +)"); +enum class ShaderEncoding : uint32_t +{ + DXBC, + GLSL, + SPIRV, +}; + +DECLARE_REFLECTION_ENUM(ShaderEncoding); + DOCUMENT(R"(A primitive topology used for processing vertex data. .. data:: Unknown diff --git a/renderdoc/api/replay/shader_types.h b/renderdoc/api/replay/shader_types.h index 2584288b0..0b6445511 100644 --- a/renderdoc/api/replay/shader_types.h +++ b/renderdoc/api/replay/shader_types.h @@ -766,7 +766,12 @@ struct ShaderReflection "A :class:`ShaderDebugInfo` containing any embedded debugging information in this shader."); ShaderDebugInfo debugInfo; - DOCUMENT("A raw ``bytes`` dump of the original shader, encoded in API specific binary form."); + DOCUMENT("The :class:`ShaderEncoding` of this shader. See :data:`rawBytes`."); + ShaderEncoding encoding; + + DOCUMENT(R"(A raw ``bytes`` dump of the original shader, encoded in the form denoted by +:data:`encoding`. +)"); bytebuf rawBytes; DOCUMENT("The 3D dimensions of a compute workgroup, for compute shaders."); diff --git a/renderdoc/driver/gl/wrappers/gl_shader_funcs.cpp b/renderdoc/driver/gl/wrappers/gl_shader_funcs.cpp index db1d19781..6796cb1fa 100644 --- a/renderdoc/driver/gl/wrappers/gl_shader_funcs.cpp +++ b/renderdoc/driver/gl/wrappers/gl_shader_funcs.cpp @@ -78,6 +78,7 @@ void WrappedOpenGL::ShaderData::Compile(WrappedOpenGL &gl, ResourceId id, GLuint concatenated += sources[i]; } + reflection.encoding = ShaderEncoding::GLSL; reflection.rawBytes.assign((byte *)concatenated.c_str(), concatenated.size()); } diff --git a/renderdoc/driver/shaders/dxbc/dxbc_reflect.cpp b/renderdoc/driver/shaders/dxbc/dxbc_reflect.cpp index 56a0c6a47..30b358a83 100644 --- a/renderdoc/driver/shaders/dxbc/dxbc_reflect.cpp +++ b/renderdoc/driver/shaders/dxbc/dxbc_reflect.cpp @@ -289,6 +289,7 @@ void MakeShaderReflection(DXBC::DXBCFile *dxbc, ShaderReflection *refl, } } + refl->encoding = ShaderEncoding::DXBC; refl->rawBytes = dxbc->m_ShaderBlob; refl->dispatchThreadsDimension[0] = dxbc->DispatchThreadsDimension[0]; diff --git a/renderdoc/driver/vulkan/vk_info.cpp b/renderdoc/driver/vulkan/vk_info.cpp index aa8f0f57f..fd3240017 100644 --- a/renderdoc/driver/vulkan/vk_info.cpp +++ b/renderdoc/driver/vulkan/vk_info.cpp @@ -151,6 +151,7 @@ void VulkanCreationInfo::Pipeline::Init(VulkanResourceManager *resourceMan, Vulk if(!spv.spirv.empty()) { const std::vector &spirv = spv.spirv; + reflData.refl.encoding = ShaderEncoding::SPIRV; reflData.refl.rawBytes.assign((byte *)spirv.data(), spirv.size() * sizeof(uint32_t)); } } @@ -375,6 +376,7 @@ void VulkanCreationInfo::Pipeline::Init(VulkanResourceManager *resourceMan, Vulk if(!spv.spirv.empty()) { const vector &spirv = spv.spirv; + reflData.refl.encoding = ShaderEncoding::SPIRV; reflData.refl.rawBytes.assign((byte *)spirv.data(), spirv.size() * sizeof(uint32_t)); } } diff --git a/renderdoc/replay/renderdoc_serialise.inl b/renderdoc/replay/renderdoc_serialise.inl index 1c8295db6..2c09f21a0 100644 --- a/renderdoc/replay/renderdoc_serialise.inl +++ b/renderdoc/replay/renderdoc_serialise.inl @@ -310,7 +310,7 @@ void DoSerialise(SerialiserType &ser, ShaderReflection &el) SERIALISE_MEMBER(interfaces); - SIZE_CHECK(208); + SIZE_CHECK(216); } template