summaryrefslogtreecommitdiff
path: root/src/shader_recompiler
diff options
context:
space:
mode:
Diffstat (limited to 'src/shader_recompiler')
-rw-r--r--src/shader_recompiler/backend/spirv/emit_spirv_image.cpp21
1 files changed, 16 insertions, 5 deletions
diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp
index 021933a8c..fea3bc112 100644
--- a/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp
+++ b/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp
@@ -310,11 +310,22 @@ Id EmitBoundImageWrite(EmitContext&) {
310Id EmitImageSampleImplicitLod(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords, 310Id EmitImageSampleImplicitLod(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords,
311 Id bias_lc, const IR::Value& offset) { 311 Id bias_lc, const IR::Value& offset) {
312 const auto info{inst->Flags<IR::TextureInstInfo>()}; 312 const auto info{inst->Flags<IR::TextureInstInfo>()};
313 const ImageOperands operands(ctx, info.has_bias != 0, false, info.has_lod_clamp != 0, bias_lc, 313 if (ctx.stage == Stage::Fragment) {
314 offset); 314 const ImageOperands operands(ctx, info.has_bias != 0, false, info.has_lod_clamp != 0,
315 return Emit(&EmitContext::OpImageSparseSampleImplicitLod, 315 bias_lc, offset);
316 &EmitContext::OpImageSampleImplicitLod, ctx, inst, ctx.F32[4], Texture(ctx, index), 316 return Emit(&EmitContext::OpImageSparseSampleImplicitLod,
317 coords, operands.Mask(), operands.Span()); 317 &EmitContext::OpImageSampleImplicitLod, ctx, inst, ctx.F32[4],
318 Texture(ctx, index), coords, operands.Mask(), operands.Span());
319 } else {
320 // We can't use implicit lods on non-fragment stages on SPIR-V. Maxwell hardware behaves as
321 // if the lod was explicitly zero. This may change on Turing with implicit compute
322 // derivatives
323 const Id lod{ctx.Const(0)};
324 const ImageOperands operands(ctx, false, true, info.has_lod_clamp != 0, lod, offset);
325 return Emit(&EmitContext::OpImageSparseSampleExplicitLod,
326 &EmitContext::OpImageSampleExplicitLod, ctx, inst, ctx.F32[4],
327 Texture(ctx, index), coords, operands.Mask(), operands.Span());
328 }
318} 329}
319 330
320Id EmitImageSampleExplicitLod(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords, 331Id EmitImageSampleExplicitLod(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords,