diff options
author | bunnei <bunneidev@gmail.com> | 2020-06-01 00:40:17 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-06-01 00:40:17 +0200 |
commit | e68ee43a1a99dd62d8f6a6a469764a6737b4e0e8 (patch) | |
tree | f9714b1ff0f6dbfeb1255d7b6ec16d22327a8d0f /src/video_core/renderer_vulkan/vk_shader_decompiler.cpp | |
parent | Update CMakeLists.txt (diff) | |
parent | vk_rasterizer: Implement constant attributes (diff) | |
download | yuzu-e68ee43a1a99dd62d8f6a6a469764a6737b4e0e8.tar yuzu-e68ee43a1a99dd62d8f6a6a469764a6737b4e0e8.tar.gz yuzu-e68ee43a1a99dd62d8f6a6a469764a6737b4e0e8.tar.bz2 yuzu-e68ee43a1a99dd62d8f6a6a469764a6737b4e0e8.tar.lz yuzu-e68ee43a1a99dd62d8f6a6a469764a6737b4e0e8.tar.xz yuzu-e68ee43a1a99dd62d8f6a6a469764a6737b4e0e8.tar.zst yuzu-e68ee43a1a99dd62d8f6a6a469764a6737b4e0e8.zip |
Diffstat (limited to 'src/video_core/renderer_vulkan/vk_shader_decompiler.cpp')
-rw-r--r-- | src/video_core/renderer_vulkan/vk_shader_decompiler.cpp | 30 |
1 files changed, 20 insertions, 10 deletions
diff --git a/src/video_core/renderer_vulkan/vk_shader_decompiler.cpp b/src/video_core/renderer_vulkan/vk_shader_decompiler.cpp index 6f6dedd82..a13e8baa7 100644 --- a/src/video_core/renderer_vulkan/vk_shader_decompiler.cpp +++ b/src/video_core/renderer_vulkan/vk_shader_decompiler.cpp @@ -741,8 +741,10 @@ private: if (!IsGenericAttribute(index)) { continue; } - const u32 location = GetGenericAttributeLocation(index); + if (!IsAttributeEnabled(location)) { + continue; + } const auto type_descriptor = GetAttributeType(location); Id type; if (IsInputAttributeArray()) { @@ -986,6 +988,10 @@ private: return stage == ShaderType::TesselationControl; } + bool IsAttributeEnabled(u32 location) const { + return stage != ShaderType::Vertex || specialization.enabled_attributes[location]; + } + u32 GetNumInputVertices() const { switch (stage) { case ShaderType::Geometry: @@ -1201,16 +1207,20 @@ private: UNIMPLEMENTED_MSG("Unmanaged FrontFacing element={}", element); return {v_float_zero, Type::Float}; default: - if (IsGenericAttribute(attribute)) { - const u32 location = GetGenericAttributeLocation(attribute); - const auto type_descriptor = GetAttributeType(location); - const Type type = type_descriptor.type; - const Id attribute_id = input_attributes.at(attribute); - const std::vector elements = {element}; - const Id pointer = ArrayPass(type_descriptor.scalar, attribute_id, elements); - return {OpLoad(GetTypeDefinition(type), pointer), type}; + if (!IsGenericAttribute(attribute)) { + break; } - break; + const u32 location = GetGenericAttributeLocation(attribute); + if (!IsAttributeEnabled(location)) { + // Disabled attributes (also known as constant attributes) always return zero. + return {v_float_zero, Type::Float}; + } + const auto type_descriptor = GetAttributeType(location); + const Type type = type_descriptor.type; + const Id attribute_id = input_attributes.at(attribute); + const std::vector elements = {element}; + const Id pointer = ArrayPass(type_descriptor.scalar, attribute_id, elements); + return {OpLoad(GetTypeDefinition(type), pointer), type}; } UNIMPLEMENTED_MSG("Unhandled input attribute: {}", static_cast<u32>(attribute)); return {v_float_zero, Type::Float}; |