mirror of
https://github.com/yuzu-mirror/yuzu
synced 2024-12-25 07:13:05 +00:00
spirv: Only add image operands mask when needed
This commit is contained in:
parent
d2e811db2e
commit
bafe9e35a9
1 changed files with 9 additions and 5 deletions
|
@ -94,6 +94,10 @@ public:
|
||||||
return std::span{operands.data(), operands.size()};
|
return std::span{operands.data(), operands.size()};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::optional<spv::ImageOperandsMask> MaskOptional() const noexcept {
|
||||||
|
return mask != spv::ImageOperandsMask{} ? std::make_optional(mask) : std::nullopt;
|
||||||
|
}
|
||||||
|
|
||||||
spv::ImageOperandsMask Mask() const noexcept {
|
spv::ImageOperandsMask Mask() const noexcept {
|
||||||
return mask;
|
return mask;
|
||||||
}
|
}
|
||||||
|
@ -318,7 +322,7 @@ Id EmitImageSampleImplicitLod(EmitContext& ctx, IR::Inst* inst, const IR::Value&
|
||||||
bias_lc, offset);
|
bias_lc, offset);
|
||||||
return Emit(&EmitContext::OpImageSparseSampleImplicitLod,
|
return Emit(&EmitContext::OpImageSparseSampleImplicitLod,
|
||||||
&EmitContext::OpImageSampleImplicitLod, ctx, inst, ctx.F32[4],
|
&EmitContext::OpImageSampleImplicitLod, ctx, inst, ctx.F32[4],
|
||||||
Texture(ctx, info, index), coords, operands.Mask(), operands.Span());
|
Texture(ctx, info, index), coords, operands.MaskOptional(), operands.Span());
|
||||||
} else {
|
} else {
|
||||||
// We can't use implicit lods on non-fragment stages on SPIR-V. Maxwell hardware behaves as
|
// 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
|
// if the lod was explicitly zero. This may change on Turing with implicit compute
|
||||||
|
@ -347,7 +351,7 @@ Id EmitImageSampleDrefImplicitLod(EmitContext& ctx, IR::Inst* inst, const IR::Va
|
||||||
offset);
|
offset);
|
||||||
return Emit(&EmitContext::OpImageSparseSampleDrefImplicitLod,
|
return Emit(&EmitContext::OpImageSparseSampleDrefImplicitLod,
|
||||||
&EmitContext::OpImageSampleDrefImplicitLod, ctx, inst, ctx.F32[1],
|
&EmitContext::OpImageSampleDrefImplicitLod, ctx, inst, ctx.F32[1],
|
||||||
Texture(ctx, info, index), coords, dref, operands.Mask(), operands.Span());
|
Texture(ctx, info, index), coords, dref, operands.MaskOptional(), operands.Span());
|
||||||
}
|
}
|
||||||
|
|
||||||
Id EmitImageSampleDrefExplicitLod(EmitContext& ctx, IR::Inst* inst, const IR::Value& index,
|
Id EmitImageSampleDrefExplicitLod(EmitContext& ctx, IR::Inst* inst, const IR::Value& index,
|
||||||
|
@ -365,7 +369,7 @@ Id EmitImageGather(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id
|
||||||
const ImageOperands operands(ctx, offset, offset2);
|
const ImageOperands operands(ctx, offset, offset2);
|
||||||
return Emit(&EmitContext::OpImageSparseGather, &EmitContext::OpImageGather, ctx, inst,
|
return Emit(&EmitContext::OpImageSparseGather, &EmitContext::OpImageGather, ctx, inst,
|
||||||
ctx.F32[4], Texture(ctx, info, index), coords, ctx.Const(info.gather_component),
|
ctx.F32[4], Texture(ctx, info, index), coords, ctx.Const(info.gather_component),
|
||||||
operands.Mask(), operands.Span());
|
operands.MaskOptional(), operands.Span());
|
||||||
}
|
}
|
||||||
|
|
||||||
Id EmitImageGatherDref(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords,
|
Id EmitImageGatherDref(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords,
|
||||||
|
@ -373,7 +377,7 @@ Id EmitImageGatherDref(EmitContext& ctx, IR::Inst* inst, const IR::Value& index,
|
||||||
const auto info{inst->Flags<IR::TextureInstInfo>()};
|
const auto info{inst->Flags<IR::TextureInstInfo>()};
|
||||||
const ImageOperands operands(ctx, offset, offset2);
|
const ImageOperands operands(ctx, offset, offset2);
|
||||||
return Emit(&EmitContext::OpImageSparseDrefGather, &EmitContext::OpImageDrefGather, ctx, inst,
|
return Emit(&EmitContext::OpImageSparseDrefGather, &EmitContext::OpImageDrefGather, ctx, inst,
|
||||||
ctx.F32[4], Texture(ctx, info, index), coords, dref, operands.Mask(),
|
ctx.F32[4], Texture(ctx, info, index), coords, dref, operands.MaskOptional(),
|
||||||
operands.Span());
|
operands.Span());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -385,7 +389,7 @@ Id EmitImageFetch(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id c
|
||||||
}
|
}
|
||||||
const ImageOperands operands(offset, lod, ms);
|
const ImageOperands operands(offset, lod, ms);
|
||||||
return Emit(&EmitContext::OpImageSparseFetch, &EmitContext::OpImageFetch, ctx, inst, ctx.F32[4],
|
return Emit(&EmitContext::OpImageSparseFetch, &EmitContext::OpImageFetch, ctx, inst, ctx.F32[4],
|
||||||
TextureImage(ctx, info, index), coords, operands.Mask(), operands.Span());
|
TextureImage(ctx, info, index), coords, operands.MaskOptional(), operands.Span());
|
||||||
}
|
}
|
||||||
|
|
||||||
Id EmitImageQueryDimensions(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id lod) {
|
Id EmitImageQueryDimensions(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id lod) {
|
||||||
|
|
Loading…
Reference in a new issue