From 04c335a9ffa641dfd94590cfa8f74181b039ae9a Mon Sep 17 00:00:00 2001 From: baldurk Date: Thu, 13 Feb 2020 13:56:57 +0000 Subject: [PATCH] Move reflection helper functions to spirv_common.h --- .../driver/shaders/spirv/spirv_common.cpp | 96 +++++++++++++++++++ renderdoc/driver/shaders/spirv/spirv_common.h | 6 ++ .../driver/shaders/spirv/spirv_reflect.cpp | 95 ------------------ 3 files changed, 102 insertions(+), 95 deletions(-) diff --git a/renderdoc/driver/shaders/spirv/spirv_common.cpp b/renderdoc/driver/shaders/spirv/spirv_common.cpp index 1cd7fb48a..cc8d708ad 100644 --- a/renderdoc/driver/shaders/spirv/spirv_common.cpp +++ b/renderdoc/driver/shaders/spirv/spirv_common.cpp @@ -23,6 +23,7 @@ ******************************************************************************/ #include "spirv_common.h" +#include "api/replay/replay_enums.h" #include "common/common.h" #include "common/formatting.h" @@ -88,3 +89,98 @@ rdcspv::Iter &rdcspv::Iter::operator=(const Operation &op) return *this; } + +ShaderStage MakeShaderStage(rdcspv::ExecutionModel model) +{ + switch(model) + { + case rdcspv::ExecutionModel::Vertex: return ShaderStage::Vertex; + case rdcspv::ExecutionModel::TessellationControl: return ShaderStage::Tess_Control; + case rdcspv::ExecutionModel::TessellationEvaluation: return ShaderStage::Tess_Eval; + case rdcspv::ExecutionModel::Geometry: return ShaderStage::Geometry; + case rdcspv::ExecutionModel::Fragment: return ShaderStage::Fragment; + case rdcspv::ExecutionModel::GLCompute: return ShaderStage::Compute; + case rdcspv::ExecutionModel::Kernel: + case rdcspv::ExecutionModel::TaskNV: + case rdcspv::ExecutionModel::MeshNV: + case rdcspv::ExecutionModel::RayGenerationNV: + case rdcspv::ExecutionModel::IntersectionNV: + case rdcspv::ExecutionModel::AnyHitNV: + case rdcspv::ExecutionModel::ClosestHitNV: + case rdcspv::ExecutionModel::MissNV: + case rdcspv::ExecutionModel::CallableNV: + // all of these are currently unsupported + break; + case rdcspv::ExecutionModel::Invalid: + case rdcspv::ExecutionModel::Max: break; + } + + return ShaderStage::Count; +} + +ShaderBuiltin MakeShaderBuiltin(ShaderStage stage, const rdcspv::BuiltIn el) +{ + // not complete, might need to expand system attribute list + + switch(el) + { + case rdcspv::BuiltIn::Position: return ShaderBuiltin::Position; + case rdcspv::BuiltIn::PointSize: return ShaderBuiltin::PointSize; + case rdcspv::BuiltIn::ClipDistance: return ShaderBuiltin::ClipDistance; + case rdcspv::BuiltIn::CullDistance: return ShaderBuiltin::CullDistance; + case rdcspv::BuiltIn::VertexId: return ShaderBuiltin::VertexIndex; + case rdcspv::BuiltIn::InstanceId: return ShaderBuiltin::InstanceIndex; + case rdcspv::BuiltIn::PrimitiveId: return ShaderBuiltin::PrimitiveIndex; + case rdcspv::BuiltIn::InvocationId: + { + if(stage == ShaderStage::Geometry) + return ShaderBuiltin::GSInstanceIndex; + else + return ShaderBuiltin::OutputControlPointIndex; + } + case rdcspv::BuiltIn::Layer: return ShaderBuiltin::RTIndex; + case rdcspv::BuiltIn::ViewportIndex: return ShaderBuiltin::ViewportIndex; + case rdcspv::BuiltIn::TessLevelOuter: return ShaderBuiltin::OuterTessFactor; + case rdcspv::BuiltIn::TessLevelInner: return ShaderBuiltin::InsideTessFactor; + case rdcspv::BuiltIn::PatchVertices: return ShaderBuiltin::PatchNumVertices; + case rdcspv::BuiltIn::FragCoord: return ShaderBuiltin::Position; + case rdcspv::BuiltIn::FrontFacing: return ShaderBuiltin::IsFrontFace; + case rdcspv::BuiltIn::SampleId: return ShaderBuiltin::MSAASampleIndex; + case rdcspv::BuiltIn::SamplePosition: return ShaderBuiltin::MSAASamplePosition; + case rdcspv::BuiltIn::SampleMask: return ShaderBuiltin::MSAACoverage; + case rdcspv::BuiltIn::FragDepth: return ShaderBuiltin::DepthOutput; + case rdcspv::BuiltIn::VertexIndex: return ShaderBuiltin::VertexIndex; + case rdcspv::BuiltIn::InstanceIndex: return ShaderBuiltin::InstanceIndex; + case rdcspv::BuiltIn::BaseVertex: return ShaderBuiltin::BaseVertex; + case rdcspv::BuiltIn::BaseInstance: return ShaderBuiltin::BaseInstance; + case rdcspv::BuiltIn::DrawIndex: return ShaderBuiltin::DrawIndex; + case rdcspv::BuiltIn::ViewIndex: return ShaderBuiltin::ViewportIndex; + case rdcspv::BuiltIn::FragStencilRefEXT: return ShaderBuiltin::StencilReference; + case rdcspv::BuiltIn::NumWorkgroups: return ShaderBuiltin::DispatchSize; + case rdcspv::BuiltIn::GlobalInvocationId: return ShaderBuiltin::DispatchThreadIndex; + case rdcspv::BuiltIn::WorkgroupId: return ShaderBuiltin::GroupIndex; + case rdcspv::BuiltIn::LocalInvocationIndex: return ShaderBuiltin::GroupFlatIndex; + case rdcspv::BuiltIn::LocalInvocationId: return ShaderBuiltin::GroupThreadIndex; + case rdcspv::BuiltIn::TessCoord: return ShaderBuiltin::DomainLocation; + case rdcspv::BuiltIn::PointCoord: return ShaderBuiltin::PointCoord; + case rdcspv::BuiltIn::HelperInvocation: return ShaderBuiltin::IsHelper; + case rdcspv::BuiltIn::SubgroupSize: return ShaderBuiltin::SubgroupSize; + case rdcspv::BuiltIn::NumSubgroups: return ShaderBuiltin::NumSubgroups; + case rdcspv::BuiltIn::SubgroupId: return ShaderBuiltin::SubgroupIndexInWorkgroup; + case rdcspv::BuiltIn::SubgroupLocalInvocationId: return ShaderBuiltin::IndexInSubgroup; + case rdcspv::BuiltIn::SubgroupEqMask: return ShaderBuiltin::SubgroupEqualMask; + case rdcspv::BuiltIn::SubgroupGeMask: return ShaderBuiltin::SubgroupGreaterEqualMask; + case rdcspv::BuiltIn::SubgroupGtMask: return ShaderBuiltin::SubgroupGreaterMask; + case rdcspv::BuiltIn::SubgroupLeMask: return ShaderBuiltin::SubgroupLessEqualMask; + case rdcspv::BuiltIn::SubgroupLtMask: return ShaderBuiltin::SubgroupLessMask; + case rdcspv::BuiltIn::DeviceIndex: return ShaderBuiltin::DeviceIndex; + case rdcspv::BuiltIn::FullyCoveredEXT: return ShaderBuiltin::IsFullyCovered; + case rdcspv::BuiltIn::FragSizeEXT: return ShaderBuiltin::FragAreaSize; + case rdcspv::BuiltIn::FragInvocationCountEXT: return ShaderBuiltin::FragInvocationCount; + default: break; + } + + RDCWARN("Couldn't map SPIR-V built-in %s to known built-in", ToStr(el).c_str()); + + return ShaderBuiltin::Undefined; +} diff --git a/renderdoc/driver/shaders/spirv/spirv_common.h b/renderdoc/driver/shaders/spirv/spirv_common.h index cc7db5ffe..68b3d838b 100644 --- a/renderdoc/driver/shaders/spirv/spirv_common.h +++ b/renderdoc/driver/shaders/spirv/spirv_common.h @@ -229,3 +229,9 @@ struct SpecConstant }; DECLARE_STRINGISE_TYPE(rdcspv::Id); + +enum class ShaderStage : uint32_t; +enum class ShaderBuiltin : uint32_t; + +ShaderStage MakeShaderStage(rdcspv::ExecutionModel model); +ShaderBuiltin MakeShaderBuiltin(ShaderStage stage, const rdcspv::BuiltIn el); diff --git a/renderdoc/driver/shaders/spirv/spirv_reflect.cpp b/renderdoc/driver/shaders/spirv/spirv_reflect.cpp index df93bcb13..b2ae39ff0 100644 --- a/renderdoc/driver/shaders/spirv/spirv_reflect.cpp +++ b/renderdoc/driver/shaders/spirv/spirv_reflect.cpp @@ -199,101 +199,6 @@ void AddXFBAnnotations(const ShaderReflection &refl, const SPIRVPatchData &patch } } -static ShaderStage MakeShaderStage(rdcspv::ExecutionModel model) -{ - switch(model) - { - case rdcspv::ExecutionModel::Vertex: return ShaderStage::Vertex; - case rdcspv::ExecutionModel::TessellationControl: return ShaderStage::Tess_Control; - case rdcspv::ExecutionModel::TessellationEvaluation: return ShaderStage::Tess_Eval; - case rdcspv::ExecutionModel::Geometry: return ShaderStage::Geometry; - case rdcspv::ExecutionModel::Fragment: return ShaderStage::Fragment; - case rdcspv::ExecutionModel::GLCompute: return ShaderStage::Compute; - case rdcspv::ExecutionModel::Kernel: - case rdcspv::ExecutionModel::TaskNV: - case rdcspv::ExecutionModel::MeshNV: - case rdcspv::ExecutionModel::RayGenerationNV: - case rdcspv::ExecutionModel::IntersectionNV: - case rdcspv::ExecutionModel::AnyHitNV: - case rdcspv::ExecutionModel::ClosestHitNV: - case rdcspv::ExecutionModel::MissNV: - case rdcspv::ExecutionModel::CallableNV: - // all of these are currently unsupported - break; - case rdcspv::ExecutionModel::Invalid: - case rdcspv::ExecutionModel::Max: break; - } - - return ShaderStage::Count; -} - -ShaderBuiltin MakeShaderBuiltin(ShaderStage stage, const rdcspv::BuiltIn el) -{ - // not complete, might need to expand system attribute list - - switch(el) - { - case rdcspv::BuiltIn::Position: return ShaderBuiltin::Position; - case rdcspv::BuiltIn::PointSize: return ShaderBuiltin::PointSize; - case rdcspv::BuiltIn::ClipDistance: return ShaderBuiltin::ClipDistance; - case rdcspv::BuiltIn::CullDistance: return ShaderBuiltin::CullDistance; - case rdcspv::BuiltIn::VertexId: return ShaderBuiltin::VertexIndex; - case rdcspv::BuiltIn::InstanceId: return ShaderBuiltin::InstanceIndex; - case rdcspv::BuiltIn::PrimitiveId: return ShaderBuiltin::PrimitiveIndex; - case rdcspv::BuiltIn::InvocationId: - { - if(stage == ShaderStage::Geometry) - return ShaderBuiltin::GSInstanceIndex; - else - return ShaderBuiltin::OutputControlPointIndex; - } - case rdcspv::BuiltIn::Layer: return ShaderBuiltin::RTIndex; - case rdcspv::BuiltIn::ViewportIndex: return ShaderBuiltin::ViewportIndex; - case rdcspv::BuiltIn::TessLevelOuter: return ShaderBuiltin::OuterTessFactor; - case rdcspv::BuiltIn::TessLevelInner: return ShaderBuiltin::InsideTessFactor; - case rdcspv::BuiltIn::PatchVertices: return ShaderBuiltin::PatchNumVertices; - case rdcspv::BuiltIn::FragCoord: return ShaderBuiltin::Position; - case rdcspv::BuiltIn::FrontFacing: return ShaderBuiltin::IsFrontFace; - case rdcspv::BuiltIn::SampleId: return ShaderBuiltin::MSAASampleIndex; - case rdcspv::BuiltIn::SamplePosition: return ShaderBuiltin::MSAASamplePosition; - case rdcspv::BuiltIn::SampleMask: return ShaderBuiltin::MSAACoverage; - case rdcspv::BuiltIn::FragDepth: return ShaderBuiltin::DepthOutput; - case rdcspv::BuiltIn::VertexIndex: return ShaderBuiltin::VertexIndex; - case rdcspv::BuiltIn::InstanceIndex: return ShaderBuiltin::InstanceIndex; - case rdcspv::BuiltIn::BaseVertex: return ShaderBuiltin::BaseVertex; - case rdcspv::BuiltIn::BaseInstance: return ShaderBuiltin::BaseInstance; - case rdcspv::BuiltIn::DrawIndex: return ShaderBuiltin::DrawIndex; - case rdcspv::BuiltIn::ViewIndex: return ShaderBuiltin::ViewportIndex; - case rdcspv::BuiltIn::FragStencilRefEXT: return ShaderBuiltin::StencilReference; - case rdcspv::BuiltIn::NumWorkgroups: return ShaderBuiltin::DispatchSize; - case rdcspv::BuiltIn::GlobalInvocationId: return ShaderBuiltin::DispatchThreadIndex; - case rdcspv::BuiltIn::WorkgroupId: return ShaderBuiltin::GroupIndex; - case rdcspv::BuiltIn::LocalInvocationIndex: return ShaderBuiltin::GroupFlatIndex; - case rdcspv::BuiltIn::LocalInvocationId: return ShaderBuiltin::GroupThreadIndex; - case rdcspv::BuiltIn::TessCoord: return ShaderBuiltin::DomainLocation; - case rdcspv::BuiltIn::PointCoord: return ShaderBuiltin::PointCoord; - case rdcspv::BuiltIn::HelperInvocation: return ShaderBuiltin::IsHelper; - case rdcspv::BuiltIn::SubgroupSize: return ShaderBuiltin::SubgroupSize; - case rdcspv::BuiltIn::NumSubgroups: return ShaderBuiltin::NumSubgroups; - case rdcspv::BuiltIn::SubgroupId: return ShaderBuiltin::SubgroupIndexInWorkgroup; - case rdcspv::BuiltIn::SubgroupLocalInvocationId: return ShaderBuiltin::IndexInSubgroup; - case rdcspv::BuiltIn::SubgroupEqMask: return ShaderBuiltin::SubgroupEqualMask; - case rdcspv::BuiltIn::SubgroupGeMask: return ShaderBuiltin::SubgroupGreaterEqualMask; - case rdcspv::BuiltIn::SubgroupGtMask: return ShaderBuiltin::SubgroupGreaterMask; - case rdcspv::BuiltIn::SubgroupLeMask: return ShaderBuiltin::SubgroupLessEqualMask; - case rdcspv::BuiltIn::SubgroupLtMask: return ShaderBuiltin::SubgroupLessMask; - case rdcspv::BuiltIn::DeviceIndex: return ShaderBuiltin::DeviceIndex; - case rdcspv::BuiltIn::FullyCoveredEXT: return ShaderBuiltin::IsFullyCovered; - case rdcspv::BuiltIn::FragSizeEXT: return ShaderBuiltin::FragAreaSize; - case rdcspv::BuiltIn::FragInvocationCountEXT: return ShaderBuiltin::FragInvocationCount; - default: break; - } - - RDCWARN("Couldn't map SPIR-V built-in %s to known built-in", ToStr(el).c_str()); - - return ShaderBuiltin::Undefined; -} - const int32_t INVALID_BIND = -INT_MAX; template