|
@@ -355,11 +355,22 @@ Id EmitImageSampleExplicitLod(EmitContext& ctx, IR::Inst* inst, const IR::Value&
|
|
|
Id EmitImageSampleDrefImplicitLod(EmitContext& ctx, IR::Inst* inst, const IR::Value& index,
|
|
Id EmitImageSampleDrefImplicitLod(EmitContext& ctx, IR::Inst* inst, const IR::Value& index,
|
|
|
Id coords, Id dref, Id bias_lc, const IR::Value& offset) {
|
|
Id coords, Id dref, 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::OpImageSparseSampleDrefImplicitLod,
|
|
|
|
|
- &EmitContext::OpImageSampleDrefImplicitLod, ctx, inst, ctx.F32[1],
|
|
|
|
|
- Texture(ctx, info, index), coords, dref, operands.MaskOptional(), 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::OpImageSparseSampleDrefImplicitLod,
|
|
|
|
|
+ &EmitContext::OpImageSampleDrefImplicitLod, ctx, inst, ctx.F32[1],
|
|
|
|
|
+ Texture(ctx, info, index), coords, dref, operands.MaskOptional(),
|
|
|
|
|
+ operands.Span());
|
|
|
|
|
+ } else {
|
|
|
|
|
+ // Implicit lods in compute behave on hardware as if sampling from LOD 0.
|
|
|
|
|
+ // This check is to ensure all drivers behave this way.
|
|
|
|
|
+ const Id lod{ctx.Const(0.0f)};
|
|
|
|
|
+ const ImageOperands operands(ctx, false, true, false, lod, offset);
|
|
|
|
|
+ return Emit(&EmitContext::OpImageSparseSampleDrefExplicitLod,
|
|
|
|
|
+ &EmitContext::OpImageSampleDrefExplicitLod, ctx, inst, ctx.F32[1],
|
|
|
|
|
+ Texture(ctx, info, index), coords, dref, operands.Mask(), operands.Span());
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
Id EmitImageSampleDrefExplicitLod(EmitContext& ctx, IR::Inst* inst, const IR::Value& index,
|
|
Id EmitImageSampleDrefExplicitLod(EmitContext& ctx, IR::Inst* inst, const IR::Value& index,
|