From b63a32fe3bcc18b022259bc782b98465f48a74f7 Mon Sep 17 00:00:00 2001 From: baldurk Date: Mon, 3 Apr 2017 18:28:16 +0100 Subject: [PATCH] Outputs from pixel shaders are automatically colour output system values --- renderdoc/driver/shaders/spirv/spirv_common.h | 3 ++- .../driver/shaders/spirv/spirv_disassemble.cpp | 17 +++++++++++------ renderdoc/driver/vulkan/vk_info.cpp | 8 ++++---- 3 files changed, 17 insertions(+), 11 deletions(-) diff --git a/renderdoc/driver/shaders/spirv/spirv_common.h b/renderdoc/driver/shaders/spirv/spirv_common.h index 5de52f373..3aee7176d 100644 --- a/renderdoc/driver/shaders/spirv/spirv_common.h +++ b/renderdoc/driver/shaders/spirv/spirv_common.h @@ -48,6 +48,7 @@ void ShutdownSPIRVCompiler(); struct SPVInstruction; +enum ShaderStageType; struct ShaderReflection; struct ShaderBindpointMapping; @@ -86,7 +87,7 @@ struct SPVModule SPVInstruction *GetByID(uint32_t id); string Disassemble(const string &entryPoint); - void MakeReflection(const string &entryPoint, ShaderReflection *reflection, + void MakeReflection(ShaderStageType stage, const string &entryPoint, ShaderReflection *reflection, ShaderBindpointMapping *mapping); }; diff --git a/renderdoc/driver/shaders/spirv/spirv_disassemble.cpp b/renderdoc/driver/shaders/spirv/spirv_disassemble.cpp index 5c68466dc..b85493df9 100644 --- a/renderdoc/driver/shaders/spirv/spirv_disassemble.cpp +++ b/renderdoc/driver/shaders/spirv/spirv_disassemble.cpp @@ -3696,8 +3696,9 @@ struct bindpair typedef bindpair cblockpair; typedef bindpair shaderrespair; -void AddSignatureParameter(uint32_t id, uint32_t childIdx, string varName, SPVTypeData *type, - const vector &decorations, vector &sigarray) +void AddSignatureParameter(ShaderStageType stage, uint32_t id, uint32_t childIdx, string varName, + SPVTypeData *type, const vector &decorations, + vector &sigarray) { SigParameter sig; @@ -3724,6 +3725,10 @@ void AddSignatureParameter(uint32_t id, uint32_t childIdx, string varName, SPVTy rowmajor = false; } + // fragment shader outputs are implicitly colour outputs + if(stage == eShaderStage_Fragment && type->storage == spv::StorageClassOutput) + sig.systemValue = eAttr_ColourOutput; + if(type->type == SPVTypeData::ePointer) type = type->baseType; @@ -3785,7 +3790,7 @@ void AddSignatureParameter(uint32_t id, uint32_t childIdx, string varName, SPVTy string baseName = isArray ? StringFormat::Fmt("%s[%u]", varName.c_str(), a) : varName; - AddSignatureParameter(id, (uint32_t)c, baseName + "." + type->children[c].second, + AddSignatureParameter(stage, id, (uint32_t)c, baseName + "." + type->children[c].second, type->children[c].first, type->childDecorations[c], sigarray); } } @@ -3844,8 +3849,8 @@ void AddSignatureParameter(uint32_t id, uint32_t childIdx, string varName, SPVTy } } -void SPVModule::MakeReflection(const string &entryPoint, ShaderReflection *reflection, - ShaderBindpointMapping *mapping) +void SPVModule::MakeReflection(ShaderStageType stage, const string &entryPoint, + ShaderReflection *reflection, ShaderBindpointMapping *mapping) { vector inputs; vector outputs; @@ -3883,7 +3888,7 @@ void SPVModule::MakeReflection(const string &entryPoint, ShaderReflection *refle else nm = StringFormat::Fmt("sig%u", inst->id); - AddSignatureParameter(inst->id, ~0U, nm, inst->var->type, inst->decorations, *sigarray); + AddSignatureParameter(stage, inst->id, ~0U, nm, inst->var->type, inst->decorations, *sigarray); // eliminate any members of gl_PerVertex that are actually unused and just came along // for the ride (usually with gl_Position, but maybe declared globally and still unused) diff --git a/renderdoc/driver/vulkan/vk_info.cpp b/renderdoc/driver/vulkan/vk_info.cpp index a5c61564d..ec0d15046 100644 --- a/renderdoc/driver/vulkan/vk_info.cpp +++ b/renderdoc/driver/vulkan/vk_info.cpp @@ -111,8 +111,8 @@ void VulkanCreationInfo::Pipeline::Init(VulkanResourceManager *resourceMan, Vulk { reflData.entryPoint = shad.entryPoint; reflData.stage = stageIndex; - info.m_ShaderModule[id].spirv.MakeReflection(reflData.entryPoint, &reflData.refl, - &reflData.mapping); + info.m_ShaderModule[id].spirv.MakeReflection( + ShaderStageType(reflData.stage), reflData.entryPoint, &reflData.refl, &reflData.mapping); } if(pCreateInfo->pStages[i].pSpecializationInfo) @@ -325,8 +325,8 @@ void VulkanCreationInfo::Pipeline::Init(VulkanResourceManager *resourceMan, Vulk if(reflData.entryPoint.empty()) { reflData.entryPoint = shad.entryPoint; - info.m_ShaderModule[id].spirv.MakeReflection(reflData.entryPoint, &reflData.refl, - &reflData.mapping); + info.m_ShaderModule[id].spirv.MakeReflection(eShaderStage_Compute, reflData.entryPoint, + &reflData.refl, &reflData.mapping); } if(pCreateInfo->stage.pSpecializationInfo)