From 9e2d21f8873cab268d8e4d9b8875139d5dff0706 Mon Sep 17 00:00:00 2001 From: Lander Gallastegi Date: Wed, 23 Oct 2024 19:16:03 +0200 Subject: [PATCH] Fix multisample texture fetch --- .../backend/spirv/emit_spirv_image.cpp | 1 + .../ir/passes/resource_tracking_pass.cpp | 21 ++++++++++++------- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp index fc99b8925..40e5ea8b9 100644 --- a/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp +++ b/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp @@ -176,6 +176,7 @@ Id EmitImageFetch(EmitContext& ctx, IR::Inst* inst, u32 handle, Id coords, const ImageOperands operands; operands.AddOffset(ctx, offset); operands.Add(spv::ImageOperandsMask::Lod, lod); + operands.Add(spv::ImageOperandsMask::Sample, ms); const Id texel = texture.is_storage ? ctx.OpImageRead(result_type, image, coords, operands.mask, operands.operands) diff --git a/src/shader_recompiler/ir/passes/resource_tracking_pass.cpp b/src/shader_recompiler/ir/passes/resource_tracking_pass.cpp index aa05d3aed..59381436e 100644 --- a/src/shader_recompiler/ir/passes/resource_tracking_pass.cpp +++ b/src/shader_recompiler/ir/passes/resource_tracking_pass.cpp @@ -685,24 +685,24 @@ void PatchImageInstruction(IR::Block& block, IR::Inst& inst, Info& info, Descrip // Now that we know the image type, adjust texture coordinate vector. IR::Inst* body = inst.Arg(1).InstRecursive(); - const auto [coords, arg] = [&] -> std::pair { + const auto [coords, arg1, arg2] = [&] -> std::tuple { switch (image.GetType()) { case AmdGpu::ImageType::Color1D: // x - return {body->Arg(0), body->Arg(1)}; + return {body->Arg(0), body->Arg(1), body->Arg(2)}; case AmdGpu::ImageType::Color1DArray: // x, slice [[fallthrough]]; case AmdGpu::ImageType::Color2D: // x, y - return {ir.CompositeConstruct(body->Arg(0), body->Arg(1)), body->Arg(2)}; + [[fallthrough]]; + case AmdGpu::ImageType::Color2DMsaa: //x, y. (sample is passed on different argument) + return {ir.CompositeConstruct(body->Arg(0), body->Arg(1)), body->Arg(2), body->Arg(3)}; case AmdGpu::ImageType::Color2DArray: // x, y, slice [[fallthrough]]; - case AmdGpu::ImageType::Color2DMsaa: // x, y, frag - [[fallthrough]]; case AmdGpu::ImageType::Color3D: // x, y, z - return {ir.CompositeConstruct(body->Arg(0), body->Arg(1), body->Arg(2)), body->Arg(3)}; + return {ir.CompositeConstruct(body->Arg(0), body->Arg(1), body->Arg(2)), body->Arg(3), body->Arg(4)}; case AmdGpu::ImageType::Cube: // x, y, face return {PatchCubeCoord(ir, body->Arg(0), body->Arg(1), body->Arg(2), is_storage, inst_info.is_array), - body->Arg(3)}; + body->Arg(3), body->Arg(4)}; default: UNREACHABLE_MSG("Unknown image type {}", image.GetType()); } @@ -711,7 +711,12 @@ void PatchImageInstruction(IR::Block& block, IR::Inst& inst, Info& info, Descrip if (inst_info.has_lod) { ASSERT(inst.GetOpcode() == IR::Opcode::ImageFetch); - inst.SetArg(3, arg); + inst.SetArg(3, arg1); + if (image.GetType() == AmdGpu::ImageType::Color2DMsaa) { + inst.SetArg(4, arg2); + } + } else if (image.GetType() == AmdGpu::ImageType::Color2DMsaa) { + inst.SetArg(4, arg1); } }