Sfoglia il codice sorgente

emit_spirv: fix incorrect use of descriptor index in image atomics

Liam 2 anni fa
parent
commit
1e24d02434

+ 8 - 7
src/shader_recompiler/backend/spirv/emit_spirv_image_atomic.cpp

@@ -7,15 +7,12 @@
 
 namespace Shader::Backend::SPIRV {
 namespace {
-Id Image(EmitContext& ctx, const IR::Value& index, IR::TextureInstInfo info) {
-    if (!index.IsImmediate()) {
-        throw NotImplementedException("Indirect image indexing");
-    }
+Id Image(EmitContext& ctx, IR::TextureInstInfo info) {
     if (info.type == TextureType::Buffer) {
-        const ImageBufferDefinition def{ctx.image_buffers.at(index.U32())};
+        const ImageBufferDefinition def{ctx.image_buffers.at(info.descriptor_index)};
         return def.id;
     } else {
-        const ImageDefinition def{ctx.images.at(index.U32())};
+        const ImageDefinition def{ctx.images.at(info.descriptor_index)};
         return def.id;
     }
 }
@@ -28,8 +25,12 @@ std::pair<Id, Id> AtomicArgs(EmitContext& ctx) {
 
 Id ImageAtomicU32(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords, Id value,
                   Id (Sirit::Module::*atomic_func)(Id, Id, Id, Id, Id)) {
+    if (!index.IsImmediate() || index.U32() != 0) {
+        // TODO: handle layers
+        throw NotImplementedException("Image indexing");
+    }
     const auto info{inst->Flags<IR::TextureInstInfo>()};
-    const Id image{Image(ctx, index, info)};
+    const Id image{Image(ctx, info)};
     const Id pointer{ctx.OpImageTexelPointer(ctx.image_u32, image, coords, ctx.Const(0U))};
     const auto [scope, semantics]{AtomicArgs(ctx)};
     return (ctx.*atomic_func)(ctx.U32[1], pointer, scope, semantics, value);

+ 1 - 6
src/shader_recompiler/backend/spirv/spirv_emit_context.cpp

@@ -74,11 +74,6 @@ spv::ImageFormat GetImageFormat(ImageFormat format) {
     throw InvalidArgument("Invalid image format {}", format);
 }
 
-spv::ImageFormat GetImageFormatForBuffer(ImageFormat format) {
-    const auto spv_format = GetImageFormat(format);
-    return spv_format == spv::ImageFormat::Unknown ? spv::ImageFormat::R32ui : spv_format;
-}
-
 Id ImageType(EmitContext& ctx, const ImageDescriptor& desc) {
     const spv::ImageFormat format{GetImageFormat(desc.format)};
     const Id type{ctx.U32[1]};
@@ -1275,7 +1270,7 @@ void EmitContext::DefineImageBuffers(const Info& info, u32& binding) {
         if (desc.count != 1) {
             throw NotImplementedException("Array of image buffers");
         }
-        const spv::ImageFormat format{GetImageFormatForBuffer(desc.format)};
+        const spv::ImageFormat format{GetImageFormat(desc.format)};
         const Id image_type{TypeImage(U32[1], spv::Dim::Buffer, false, false, false, 2, format)};
         const Id pointer_type{TypePointer(spv::StorageClass::UniformConstant, image_type)};
         const Id id{AddGlobalVariable(pointer_type, spv::StorageClass::UniformConstant)};