diff options
| author | ameerj <52414509+ameerj@users.noreply.github.com> | 2023-01-29 13:47:30 -0500 | 
|---|---|---|
| committer | ameerj <52414509+ameerj@users.noreply.github.com> | 2023-01-29 13:47:30 -0500 | 
| commit | a63e17566ab32ab05d784f465ef38a7f3f3db919 (patch) | |
| tree | d57173548d504c0e0cb9ed17472ac53841c7988b | |
| parent | a1d8306bfdd24edd5c61761b79e72be32c5aaff4 (diff) | |
spirv: Fix TXQ with MSAA textures
3 files changed, 19 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 3b969d915..02073c420 100644 --- a/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp +++ b/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp @@ -201,6 +201,13 @@ Id Image(EmitContext& ctx, const IR::Value& index, IR::TextureInstInfo info) {      }  } +bool IsTextureMsaa(EmitContext& ctx, const IR::TextureInstInfo& info) { +    if (info.type == TextureType::Buffer) { +        return false; +    } +    return ctx.textures.at(info.descriptor_index).is_multisample; +} +  Id Decorate(EmitContext& ctx, IR::Inst* inst, Id sample) {      const auto info{inst->Flags<IR::TextureInstInfo>()};      if (info.relaxed_precision != 0) { @@ -452,24 +459,26 @@ Id EmitImageQueryDimensions(EmitContext& ctx, IR::Inst* inst, const IR::Value& i      const Id zero{ctx.u32_zero_value};      const bool skip_mips{skip_mips_val.U1()};      const auto mips{[&] { return skip_mips ? zero : ctx.OpImageQueryLevels(ctx.U32[1], image); }}; +    const bool is_msaa{IsTextureMsaa(ctx, info)}; +    const bool uses_lod{!is_msaa && info.type != TextureType::Buffer}; +    const auto query{[&](Id type) { +        return uses_lod ? ctx.OpImageQuerySizeLod(type, image, lod) +                        : ctx.OpImageQuerySize(type, image); +    }};      switch (info.type) {      case TextureType::Color1D: -        return ctx.OpCompositeConstruct(ctx.U32[4], ctx.OpImageQuerySizeLod(ctx.U32[1], image, lod), -                                        zero, zero, mips()); +        return ctx.OpCompositeConstruct(ctx.U32[4], query(ctx.U32[1]), zero, zero, mips());      case TextureType::ColorArray1D:      case TextureType::Color2D:      case TextureType::ColorCube:      case TextureType::Color2DRect: -        return ctx.OpCompositeConstruct(ctx.U32[4], ctx.OpImageQuerySizeLod(ctx.U32[2], image, lod), -                                        zero, mips()); +        return ctx.OpCompositeConstruct(ctx.U32[4], query(ctx.U32[2]), zero, mips());      case TextureType::ColorArray2D:      case TextureType::Color3D:      case TextureType::ColorArrayCube: -        return ctx.OpCompositeConstruct(ctx.U32[4], ctx.OpImageQuerySizeLod(ctx.U32[3], image, lod), -                                        mips()); +        return ctx.OpCompositeConstruct(ctx.U32[4], query(ctx.U32[3]), mips());      case TextureType::Buffer: -        return ctx.OpCompositeConstruct(ctx.U32[4], ctx.OpImageQuerySize(ctx.U32[1], image), zero, -                                        zero, mips()); +        return ctx.OpCompositeConstruct(ctx.U32[4], query(ctx.U32[1]), zero, zero, mips());      }      throw LogicError("Unspecified image type {}", info.type.Value());  } diff --git a/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp b/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp index 3b97721e1..d48d4860e 100644 --- a/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp +++ b/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp @@ -1288,6 +1288,7 @@ void EmitContext::DefineTextures(const Info& info, u32& binding, u32& scaling_in              .pointer_type = pointer_type,              .image_type = image_type,              .count = desc.count, +            .is_multisample = desc.is_multisample,          });          if (profile.supported_spirv >= 0x00010400) {              interfaces.push_back(id); diff --git a/src/shader_recompiler/backend/spirv/spirv_emit_context.h b/src/shader_recompiler/backend/spirv/spirv_emit_context.h index dbc5c55b9..768a4fbb5 100644 --- a/src/shader_recompiler/backend/spirv/spirv_emit_context.h +++ b/src/shader_recompiler/backend/spirv/spirv_emit_context.h @@ -35,6 +35,7 @@ struct TextureDefinition {      Id pointer_type;      Id image_type;      u32 count; +    bool is_multisample;  };  struct TextureBufferDefinition { | 
