diff options
| author | Liam <byteslice@airmail.cc> | 2024-02-15 18:38:56 -0500 | 
|---|---|---|
| committer | Liam <byteslice@airmail.cc> | 2024-02-15 18:38:56 -0500 | 
| commit | cb29aa04731e58ee78f8e0e66239c862fe9e559b (patch) | |
| tree | df88c847eec09bf9b4ed16e6df382f7a1bac1b6b | |
| parent | a40adbc142dbf324fa4ee69d7f4655eedb5ffb24 (diff) | |
Revert "shader_recompiler: use only ConstOffset for OpImageFetch"
This reverts commit f296a9ce9a1a144d322d54d4628dba6f8a800cb7.
| -rw-r--r-- | src/shader_recompiler/backend/spirv/emit_spirv_image.cpp | 41 | ||||
| -rw-r--r-- | src/shader_recompiler/backend/spirv/emit_spirv_instructions.h | 4 | 
2 files changed, 38 insertions, 7 deletions
diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp index 44281e407..64a4e0e55 100644 --- a/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp +++ b/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp @@ -60,11 +60,10 @@ public:          Add(spv::ImageOperandsMask::ConstOffsets, offsets);      } -    explicit ImageOperands(EmitContext& ctx, const IR::Value& offset, Id lod, Id ms) { +    explicit ImageOperands(Id lod, Id ms) {          if (Sirit::ValidId(lod)) {              Add(spv::ImageOperandsMask::Lod, lod);          } -        AddOffset(ctx, offset, ImageFetchOffsetAllowed);          if (Sirit::ValidId(ms)) {              Add(spv::ImageOperandsMask::Sample, ms);          } @@ -312,6 +311,37 @@ Id ImageGatherSubpixelOffset(EmitContext& ctx, const IR::TextureInstInfo& info,          return coords;      }  } + +void AddOffsetToCoordinates(EmitContext& ctx, const IR::TextureInstInfo& info, Id& coords, +                            Id offset) { +    if (!Sirit::ValidId(offset)) { +        return; +    } + +    Id result_type{}; +    switch (info.type) { +    case TextureType::Buffer: +    case TextureType::Color1D: +    case TextureType::ColorArray1D: { +        result_type = ctx.U32[1]; +        break; +    } +    case TextureType::Color2D: +    case TextureType::Color2DRect: +    case TextureType::ColorArray2D: { +        result_type = ctx.U32[2]; +        break; +    } +    case TextureType::Color3D: { +        result_type = ctx.U32[3]; +        break; +    } +    case TextureType::ColorCube: +    case TextureType::ColorArrayCube: +        return; +    } +    coords = ctx.OpIAdd(result_type, coords, offset); +}  } // Anonymous namespace  Id EmitBindlessImageSampleImplicitLod(EmitContext&) { @@ -494,9 +524,10 @@ Id EmitImageGatherDref(EmitContext& ctx, IR::Inst* inst, const IR::Value& index,                  operands.Span());  } -Id EmitImageFetch(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords, -                  const IR::Value& offset, Id lod, Id ms) { +Id EmitImageFetch(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords, Id offset, +                  Id lod, Id ms) {      const auto info{inst->Flags<IR::TextureInstInfo>()}; +    AddOffsetToCoordinates(ctx, info, coords, offset);      if (info.type == TextureType::Buffer) {          lod = Id{};      } @@ -504,7 +535,7 @@ Id EmitImageFetch(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id c          // This image is multisampled, lod must be implicit          lod = Id{};      } -    const ImageOperands operands(ctx, offset, lod, ms); +    const ImageOperands operands(lod, ms);      return Emit(&EmitContext::OpImageSparseFetch, &EmitContext::OpImageFetch, ctx, inst, ctx.F32[4],                  TextureImage(ctx, info, index), coords, operands.MaskOptional(), operands.Span());  } diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_instructions.h b/src/shader_recompiler/backend/spirv/emit_spirv_instructions.h index 08fcabd58..5c01b1012 100644 --- a/src/shader_recompiler/backend/spirv/emit_spirv_instructions.h +++ b/src/shader_recompiler/backend/spirv/emit_spirv_instructions.h @@ -537,8 +537,8 @@ Id EmitImageGather(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id                     const IR::Value& offset, const IR::Value& offset2);  Id EmitImageGatherDref(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords,                         const IR::Value& offset, const IR::Value& offset2, Id dref); -Id EmitImageFetch(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords, -                  const IR::Value& offset, Id lod, Id ms); +Id EmitImageFetch(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords, Id offset, +                  Id lod, Id ms);  Id EmitImageQueryDimensions(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id lod,                              const IR::Value& skip_mips);  Id EmitImageQueryLod(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords);  | 
