diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp index 6c942e9d0b..62a82dce9d 100644 --- a/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp +++ b/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp @@ -16,9 +16,9 @@ namespace Shader::Backend::SPIRV { namespace { class DescriptorIndex { public: - explicit DescriptorIndex(EmitContext& ctx, const IR::Value& index, spv::Capability capability) + explicit DescriptorIndex(EmitContext& ctx, const IR::Value& index) : id{index.IsImmediate() ? ctx.Const(index.U32()) : ctx.Def(index)}, - is_non_uniform{ctx.profile.support_descriptor_nonuniform_indexing && + is_non_uniform{ctx.profile.support_sampled_image_array_nonuniform_indexing && !index.IsImmediate()} { if (!is_non_uniform) { return; @@ -27,7 +27,7 @@ public: ctx.AddExtension("SPV_EXT_descriptor_indexing"); } ctx.AddCapability(spv::Capability::ShaderNonUniform); - ctx.AddCapability(capability); + ctx.AddCapability(spv::Capability::SampledImageArrayNonUniformIndexing); Decorate(ctx, id); } @@ -221,8 +221,7 @@ private: Id Texture(EmitContext& ctx, IR::TextureInstInfo info, [[maybe_unused]] const IR::Value& index) { const TextureDefinition& def{ctx.textures.at(info.descriptor_index)}; if (def.count > 1) { - const DescriptorIndex idx{ - ctx, index, spv::Capability::SampledImageArrayNonUniformIndexing}; + const DescriptorIndex idx{ctx, index}; const Id pointer{ctx.OpAccessChain(def.pointer_type, def.id, idx.Value())}; idx.Decorate(ctx, pointer); const Id object{ctx.OpLoad(def.sampled_type, pointer)}; @@ -237,20 +236,15 @@ Id TextureImage(EmitContext& ctx, IR::TextureInstInfo info, const IR::Value& ind if (info.type == TextureType::Buffer) { const TextureBufferDefinition& def{ctx.texture_buffers.at(info.descriptor_index)}; if (def.count > 1) { - const DescriptorIndex idx{ - ctx, index, spv::Capability::UniformTexelBufferArrayNonUniformIndexing}; - const Id ptr{ctx.OpAccessChain(ctx.image_buffer_type, def.id, idx.Value())}; - idx.Decorate(ctx, ptr); - const Id object{ctx.OpLoad(ctx.image_buffer_type, ptr)}; - idx.Decorate(ctx, object); - return object; + const Id idx{index.IsImmediate() ? ctx.Const(index.U32()) : ctx.Def(index)}; + const Id ptr{ctx.OpAccessChain(ctx.image_buffer_type, def.id, idx)}; + return ctx.OpLoad(ctx.image_buffer_type, ptr); } return ctx.OpLoad(ctx.image_buffer_type, def.id); } else { const TextureDefinition& def{ctx.textures.at(info.descriptor_index)}; if (def.count > 1) { - const DescriptorIndex idx{ - ctx, index, spv::Capability::SampledImageArrayNonUniformIndexing}; + const DescriptorIndex idx{ctx, index}; const Id ptr{ctx.OpAccessChain(def.pointer_type, def.id, idx.Value())}; idx.Decorate(ctx, ptr); const Id object{ctx.OpLoad(def.sampled_type, ptr)}; @@ -267,25 +261,17 @@ std::pair Image(EmitContext& ctx, const IR::Value& index, IR::TextureI if (info.type == TextureType::Buffer) { const ImageBufferDefinition def{ctx.image_buffers.at(info.descriptor_index)}; if (def.count > 1) { - const DescriptorIndex idx{ - ctx, index, spv::Capability::StorageTexelBufferArrayNonUniformIndexing}; - const Id ptr{ctx.OpAccessChain(def.pointer_type, def.id, idx.Value())}; - idx.Decorate(ctx, ptr); - const Id object{ctx.OpLoad(def.image_type, ptr)}; - idx.Decorate(ctx, object); - return {object, def.is_integer}; + const Id idx{index.IsImmediate() ? ctx.Const(index.U32()) : ctx.Def(index)}; + const Id ptr{ctx.OpAccessChain(def.pointer_type, def.id, idx)}; + return {ctx.OpLoad(def.image_type, ptr), def.is_integer}; } return {ctx.OpLoad(def.image_type, def.id), def.is_integer}; } else { const ImageDefinition def{ctx.images.at(info.descriptor_index)}; if (def.count > 1) { - const DescriptorIndex idx{ - ctx, index, spv::Capability::StorageImageArrayNonUniformIndexing}; - const Id ptr{ctx.OpAccessChain(def.pointer_type, def.id, idx.Value())}; - idx.Decorate(ctx, ptr); - const Id object{ctx.OpLoad(def.image_type, ptr)}; - idx.Decorate(ctx, object); - return {object, def.is_integer}; + const Id idx{index.IsImmediate() ? ctx.Const(index.U32()) : ctx.Def(index)}; + const Id ptr{ctx.OpAccessChain(def.pointer_type, def.id, idx)}; + return {ctx.OpLoad(def.image_type, ptr), def.is_integer}; } return {ctx.OpLoad(def.image_type, def.id), def.is_integer}; } diff --git a/src/shader_recompiler/profile.h b/src/shader_recompiler/profile.h index 37a2d2df2b..ff19f0710f 100644 --- a/src/shader_recompiler/profile.h +++ b/src/shader_recompiler/profile.h @@ -48,7 +48,7 @@ struct Profile { bool support_scaled_attributes{}; bool support_multi_viewport{}; bool support_geometry_streams{}; - bool support_descriptor_nonuniform_indexing{}; + bool support_sampled_image_array_nonuniform_indexing{}; bool warp_size_potentially_larger_than_guest{}; diff --git a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp index dc959b1ed6..3d6cbfe94a 100644 --- a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp @@ -412,7 +412,8 @@ PipelineCache::PipelineCache(Tegra::MaxwellDeviceMemoryManager& device_memory_, .support_scaled_attributes = !device.MustEmulateScaledFormats(), .support_multi_viewport = device.SupportsMultiViewport(), .support_geometry_streams = device.AreTransformFeedbackGeometryStreamsSupported(), - .support_descriptor_nonuniform_indexing = device.IsDescriptorNonUniformIndexingSupported(), + .support_sampled_image_array_nonuniform_indexing = + device.IsSampledImageArrayNonUniformIndexingSupported(), .warp_size_potentially_larger_than_guest = device.IsWarpSizePotentiallyBiggerThanGuest(), diff --git a/src/video_core/vulkan_common/vulkan_device.h b/src/video_core/vulkan_common/vulkan_device.h index 26657a80b2..13fe1b371f 100644 --- a/src/video_core/vulkan_common/vulkan_device.h +++ b/src/video_core/vulkan_common/vulkan_device.h @@ -368,11 +368,8 @@ public: return GetDriverID() != VK_DRIVER_ID_QUALCOMM_PROPRIETARY; } - bool IsDescriptorNonUniformIndexingSupported() const { - return features.descriptor_indexing.shaderSampledImageArrayNonUniformIndexing && - features.descriptor_indexing.shaderStorageImageArrayNonUniformIndexing && - features.descriptor_indexing.shaderUniformTexelBufferArrayNonUniformIndexing && - features.descriptor_indexing.shaderStorageTexelBufferArrayNonUniformIndexing; + bool IsSampledImageArrayNonUniformIndexingSupported() const { + return features.descriptor_indexing.shaderSampledImageArrayNonUniformIndexing; } /// Returns true if the device supports float64 natively.