Explorar el Código

spirv: Fix image and image buffer descriptor index usage

ReinUsesLisp hace 5 años
padre
commit
d738ad4d0b
Se han modificado 1 ficheros con 7 adiciones y 5 borrados
  1. 7 5
      src/shader_recompiler/backend/spirv/emit_spirv_image.cpp

+ 7 - 5
src/shader_recompiler/backend/spirv/emit_spirv_image.cpp

@@ -162,8 +162,10 @@ Id Texture(EmitContext& ctx, IR::TextureInstInfo info, [[maybe_unused]] const IR
     }
     }
 }
 }
 
 
-Id TextureImage(EmitContext& ctx, IR::TextureInstInfo info,
-                [[maybe_unused]] const IR::Value& index) {
+Id TextureImage(EmitContext& ctx, IR::TextureInstInfo info, const IR::Value& index) {
+    if (!index.IsImmediate() || index.U32() != 0) {
+        throw NotImplementedException("Indirect image indexing");
+    }
     if (info.type == TextureType::Buffer) {
     if (info.type == TextureType::Buffer) {
         const TextureBufferDefinition& def{ctx.texture_buffers.at(info.descriptor_index)};
         const TextureBufferDefinition& def{ctx.texture_buffers.at(info.descriptor_index)};
         if (def.count > 1) {
         if (def.count > 1) {
@@ -182,14 +184,14 @@ Id TextureImage(EmitContext& ctx, IR::TextureInstInfo info,
 }
 }
 
 
 Id Image(EmitContext& ctx, const IR::Value& index, IR::TextureInstInfo info) {
 Id Image(EmitContext& ctx, const IR::Value& index, IR::TextureInstInfo info) {
-    if (!index.IsImmediate()) {
+    if (!index.IsImmediate() || index.U32() != 0) {
         throw NotImplementedException("Indirect image indexing");
         throw NotImplementedException("Indirect image indexing");
     }
     }
     if (info.type == TextureType::Buffer) {
     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 ctx.OpLoad(def.image_type, def.id);
         return ctx.OpLoad(def.image_type, def.id);
     } else {
     } else {
-        const ImageDefinition def{ctx.images.at(index.U32())};
+        const ImageDefinition def{ctx.images.at(info.descriptor_index)};
         return ctx.OpLoad(def.image_type, def.id);
         return ctx.OpLoad(def.image_type, def.id);
     }
     }
 }
 }