diff options
Diffstat (limited to 'src/shader_recompiler')
4 files changed, 16 insertions, 2 deletions
diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp index fb5799c42..c898ce12f 100644 --- a/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp +++ b/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp | |||
| @@ -436,6 +436,10 @@ Id EmitImageFetch(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id c | |||
| 436 | if (info.type == TextureType::Buffer) { | 436 | if (info.type == TextureType::Buffer) { |
| 437 | lod = Id{}; | 437 | lod = Id{}; |
| 438 | } | 438 | } |
| 439 | if (Sirit::ValidId(ms)) { | ||
| 440 | // This image is multisampled, lod must be implicit | ||
| 441 | lod = Id{}; | ||
| 442 | } | ||
| 439 | const ImageOperands operands(offset, lod, ms); | 443 | const ImageOperands operands(offset, lod, ms); |
| 440 | return Emit(&EmitContext::OpImageSparseFetch, &EmitContext::OpImageFetch, ctx, inst, ctx.F32[4], | 444 | return Emit(&EmitContext::OpImageSparseFetch, &EmitContext::OpImageFetch, ctx, inst, ctx.F32[4], |
| 441 | TextureImage(ctx, info, index), coords, operands.MaskOptional(), operands.Span()); | 445 | TextureImage(ctx, info, index), coords, operands.MaskOptional(), operands.Span()); |
diff --git a/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp b/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp index a0c155fdb..3b97721e1 100644 --- a/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp +++ b/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp | |||
| @@ -35,6 +35,7 @@ Id ImageType(EmitContext& ctx, const TextureDescriptor& desc) { | |||
| 35 | const spv::ImageFormat format{spv::ImageFormat::Unknown}; | 35 | const spv::ImageFormat format{spv::ImageFormat::Unknown}; |
| 36 | const Id type{ctx.F32[1]}; | 36 | const Id type{ctx.F32[1]}; |
| 37 | const bool depth{desc.is_depth}; | 37 | const bool depth{desc.is_depth}; |
| 38 | const bool ms{desc.is_multisample}; | ||
| 38 | switch (desc.type) { | 39 | switch (desc.type) { |
| 39 | case TextureType::Color1D: | 40 | case TextureType::Color1D: |
| 40 | return ctx.TypeImage(type, spv::Dim::Dim1D, depth, false, false, 1, format); | 41 | return ctx.TypeImage(type, spv::Dim::Dim1D, depth, false, false, 1, format); |
| @@ -42,9 +43,9 @@ Id ImageType(EmitContext& ctx, const TextureDescriptor& desc) { | |||
| 42 | return ctx.TypeImage(type, spv::Dim::Dim1D, depth, true, false, 1, format); | 43 | return ctx.TypeImage(type, spv::Dim::Dim1D, depth, true, false, 1, format); |
| 43 | case TextureType::Color2D: | 44 | case TextureType::Color2D: |
| 44 | case TextureType::Color2DRect: | 45 | case TextureType::Color2DRect: |
| 45 | return ctx.TypeImage(type, spv::Dim::Dim2D, depth, false, false, 1, format); | 46 | return ctx.TypeImage(type, spv::Dim::Dim2D, depth, false, ms, 1, format); |
| 46 | case TextureType::ColorArray2D: | 47 | case TextureType::ColorArray2D: |
| 47 | return ctx.TypeImage(type, spv::Dim::Dim2D, depth, true, false, 1, format); | 48 | return ctx.TypeImage(type, spv::Dim::Dim2D, depth, true, ms, 1, format); |
| 48 | case TextureType::Color3D: | 49 | case TextureType::Color3D: |
| 49 | return ctx.TypeImage(type, spv::Dim::Dim3D, depth, false, false, 1, format); | 50 | return ctx.TypeImage(type, spv::Dim::Dim3D, depth, false, false, 1, format); |
| 50 | case TextureType::ColorCube: | 51 | case TextureType::ColorCube: |
diff --git a/src/shader_recompiler/ir_opt/texture_pass.cpp b/src/shader_recompiler/ir_opt/texture_pass.cpp index f5c86fcb1..9718c6921 100644 --- a/src/shader_recompiler/ir_opt/texture_pass.cpp +++ b/src/shader_recompiler/ir_opt/texture_pass.cpp | |||
| @@ -524,6 +524,7 @@ void TexturePass(Environment& env, IR::Program& program, const HostTranslateInfo | |||
| 524 | 524 | ||
| 525 | const auto& cbuf{texture_inst.cbuf}; | 525 | const auto& cbuf{texture_inst.cbuf}; |
| 526 | auto flags{inst->Flags<IR::TextureInstInfo>()}; | 526 | auto flags{inst->Flags<IR::TextureInstInfo>()}; |
| 527 | bool is_multisample{false}; | ||
| 527 | switch (inst->GetOpcode()) { | 528 | switch (inst->GetOpcode()) { |
| 528 | case IR::Opcode::ImageQueryDimensions: | 529 | case IR::Opcode::ImageQueryDimensions: |
| 529 | flags.type.Assign(ReadTextureType(env, cbuf)); | 530 | flags.type.Assign(ReadTextureType(env, cbuf)); |
| @@ -538,6 +539,12 @@ void TexturePass(Environment& env, IR::Program& program, const HostTranslateInfo | |||
| 538 | } | 539 | } |
| 539 | break; | 540 | break; |
| 540 | case IR::Opcode::ImageFetch: | 541 | case IR::Opcode::ImageFetch: |
| 542 | if (flags.type == TextureType::Color2D || flags.type == TextureType::Color2DRect || | ||
| 543 | flags.type == TextureType::ColorArray2D) { | ||
| 544 | is_multisample = !inst->Arg(4).IsEmpty(); | ||
| 545 | } else { | ||
| 546 | inst->SetArg(4, IR::U32{}); | ||
| 547 | } | ||
| 541 | if (flags.type != TextureType::Color1D) { | 548 | if (flags.type != TextureType::Color1D) { |
| 542 | break; | 549 | break; |
| 543 | } | 550 | } |
| @@ -613,6 +620,7 @@ void TexturePass(Environment& env, IR::Program& program, const HostTranslateInfo | |||
| 613 | index = descriptors.Add(TextureDescriptor{ | 620 | index = descriptors.Add(TextureDescriptor{ |
| 614 | .type = flags.type, | 621 | .type = flags.type, |
| 615 | .is_depth = flags.is_depth != 0, | 622 | .is_depth = flags.is_depth != 0, |
| 623 | .is_multisample = is_multisample, | ||
| 616 | .has_secondary = cbuf.has_secondary, | 624 | .has_secondary = cbuf.has_secondary, |
| 617 | .cbuf_index = cbuf.index, | 625 | .cbuf_index = cbuf.index, |
| 618 | .cbuf_offset = cbuf.offset, | 626 | .cbuf_offset = cbuf.offset, |
diff --git a/src/shader_recompiler/shader_info.h b/src/shader_recompiler/shader_info.h index f93181e1e..d308db942 100644 --- a/src/shader_recompiler/shader_info.h +++ b/src/shader_recompiler/shader_info.h | |||
| @@ -109,6 +109,7 @@ using ImageBufferDescriptors = boost::container::small_vector<ImageBufferDescrip | |||
| 109 | struct TextureDescriptor { | 109 | struct TextureDescriptor { |
| 110 | TextureType type; | 110 | TextureType type; |
| 111 | bool is_depth; | 111 | bool is_depth; |
| 112 | bool is_multisample; | ||
| 112 | bool has_secondary; | 113 | bool has_secondary; |
| 113 | u32 cbuf_index; | 114 | u32 cbuf_index; |
| 114 | u32 cbuf_offset; | 115 | u32 cbuf_offset; |