From 410ada541a82413027f03cce0ad580487f91aa03 Mon Sep 17 00:00:00 2001 From: baldurk Date: Sat, 3 Oct 2015 18:23:13 +0200 Subject: [PATCH] Pass vulkan shader modules into DisassembleSPIRV --- renderdoc/driver/gl/wrappers/gl_shader_funcs.cpp | 2 +- renderdoc/driver/shaders/spirv/spirv_common.h | 3 ++- renderdoc/driver/shaders/spirv/spirv_disassemble.cpp | 7 ++++--- renderdoc/driver/vulkan/wrappers/vk_shader_funcs.cpp | 6 ++++++ 4 files changed, 13 insertions(+), 5 deletions(-) diff --git a/renderdoc/driver/gl/wrappers/gl_shader_funcs.cpp b/renderdoc/driver/gl/wrappers/gl_shader_funcs.cpp index 540e91833..b78df3497 100644 --- a/renderdoc/driver/gl/wrappers/gl_shader_funcs.cpp +++ b/renderdoc/driver/gl/wrappers/gl_shader_funcs.cpp @@ -51,7 +51,7 @@ void WrappedOpenGL::ShaderData::Compile(const GLHookSet &gl) string s = CompileSPIRV(SPIRVShaderStage(ShaderIdx(type)), sources, spirv); if(!spirv.empty()) - DisassembleSPIRV(SPIRVShaderStage(ShaderIdx(type)), spirv, s); + DisassembleSPIRV(SPIRVShaderStage(ShaderIdx(type)), &spirv.front(), spirv.size(), s); reflection.Disassembly = s; diff --git a/renderdoc/driver/shaders/spirv/spirv_common.h b/renderdoc/driver/shaders/spirv/spirv_common.h index 19d00e865..34a49bbc0 100644 --- a/renderdoc/driver/shaders/spirv/spirv_common.h +++ b/renderdoc/driver/shaders/spirv/spirv_common.h @@ -37,6 +37,7 @@ enum SPIRVShaderStage eSPIRVGeometry, eSPIRVFragment, eSPIRVCompute, + eSPIRVGeneric, eSPIRVInvalid, }; @@ -44,4 +45,4 @@ void InitSPIRVCompiler(); void ShutdownSPIRVCompiler(); string CompileSPIRV(SPIRVShaderStage shadType, const vector &sources, vector &spirv); -void DisassembleSPIRV(SPIRVShaderStage shadType, const vector &spirv, string &disasm); +void DisassembleSPIRV(SPIRVShaderStage shadType, uint32_t *spirv, size_t spirvLength, string &disasm); diff --git a/renderdoc/driver/shaders/spirv/spirv_disassemble.cpp b/renderdoc/driver/shaders/spirv/spirv_disassemble.cpp index 4a31ab099..561803ad8 100644 --- a/renderdoc/driver/shaders/spirv/spirv_disassemble.cpp +++ b/renderdoc/driver/shaders/spirv/spirv_disassemble.cpp @@ -862,6 +862,7 @@ struct SPVModule "Geometry Shader", "Fragment Shader", "Compute Shader", + "Unknown Shader Target", }; disasm = header[(int)shadType]; @@ -1410,7 +1411,7 @@ struct SPVModule } }; -void DisassembleSPIRV(SPIRVShaderStage shadType, const vector &spirv, string &disasm) +void DisassembleSPIRV(SPIRVShaderStage shadType, uint32_t *spirv, size_t spirvLength, string &disasm) { #if 1 return; @@ -1440,7 +1441,7 @@ void DisassembleSPIRV(SPIRVShaderStage shadType, const vector &spirv, SPVBlock *curBlock = NULL; size_t it = 5; - while(it < spirv.size()) + while(it < spirvLength) { uint16_t WordCount = spirv[it]>>16; @@ -2062,7 +2063,7 @@ void DisassembleSPIRV(SPIRVShaderStage shadType, const vector &spirv, // second pass now that we have all ids set up, apply decorations/names/etc it = 5; - while(it < spirv.size()) + while(it < spirvLength) { uint16_t WordCount = spirv[it]>>16; spv::Op op = spv::Op(spirv[it]&0xffff); diff --git a/renderdoc/driver/vulkan/wrappers/vk_shader_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_shader_funcs.cpp index 064eb2b3a..25a49a2aa 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_shader_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_shader_funcs.cpp @@ -24,6 +24,8 @@ #include "../vk_core.h" +#include "driver/shaders/spirv/spirv_common.h" + // Shader functions bool WrappedVulkan::Serialise_vkCreatePipelineLayout( VkDevice device, @@ -131,6 +133,10 @@ bool WrappedVulkan::Serialise_vkCreateShaderModule( { ResourceId live = GetResourceManager()->WrapResource(Unwrap(device), sh); GetResourceManager()->AddLiveResource(id, sh); + + string disasm; + RDCASSERT(info.codeSize % sizeof(uint32_t) == 0); + DisassembleSPIRV(eSPIRVGeneric, (uint32_t *)info.pCode, info.codeSize/sizeof(uint32_t), disasm); } }