|
@@ -310,11 +310,22 @@ Id EmitBoundImageWrite(EmitContext&) {
|
|
|
Id EmitImageSampleImplicitLod(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords,
|
|
Id EmitImageSampleImplicitLod(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords,
|
|
|
Id bias_lc, const IR::Value& offset) {
|
|
Id bias_lc, const IR::Value& offset) {
|
|
|
const auto info{inst->Flags<IR::TextureInstInfo>()};
|
|
const auto info{inst->Flags<IR::TextureInstInfo>()};
|
|
|
- const ImageOperands operands(ctx, info.has_bias != 0, false, info.has_lod_clamp != 0, bias_lc,
|
|
|
|
|
- offset);
|
|
|
|
|
- return Emit(&EmitContext::OpImageSparseSampleImplicitLod,
|
|
|
|
|
- &EmitContext::OpImageSampleImplicitLod, ctx, inst, ctx.F32[4], Texture(ctx, index),
|
|
|
|
|
- coords, operands.Mask(), operands.Span());
|
|
|
|
|
|
|
+ if (ctx.stage == Stage::Fragment) {
|
|
|
|
|
+ const ImageOperands operands(ctx, info.has_bias != 0, false, info.has_lod_clamp != 0,
|
|
|
|
|
+ bias_lc, offset);
|
|
|
|
|
+ return Emit(&EmitContext::OpImageSparseSampleImplicitLod,
|
|
|
|
|
+ &EmitContext::OpImageSampleImplicitLod, ctx, inst, ctx.F32[4],
|
|
|
|
|
+ Texture(ctx, index), coords, operands.Mask(), operands.Span());
|
|
|
|
|
+ } else {
|
|
|
|
|
+ // We can't use implicit lods on non-fragment stages on SPIR-V. Maxwell hardware behaves as
|
|
|
|
|
+ // if the lod was explicitly zero. This may change on Turing with implicit compute
|
|
|
|
|
+ // derivatives
|
|
|
|
|
+ const Id lod{ctx.Const(0)};
|
|
|
|
|
+ const ImageOperands operands(ctx, false, true, info.has_lod_clamp != 0, lod, offset);
|
|
|
|
|
+ return Emit(&EmitContext::OpImageSparseSampleExplicitLod,
|
|
|
|
|
+ &EmitContext::OpImageSampleExplicitLod, ctx, inst, ctx.F32[4],
|
|
|
|
|
+ Texture(ctx, index), coords, operands.Mask(), operands.Span());
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
Id EmitImageSampleExplicitLod(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords,
|
|
Id EmitImageSampleExplicitLod(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords,
|