shader: query dimensions through shared indirect image selection

This commit is contained in:
nmzik
2026-10-18 21:35:02 +02:00
parent de81300b28
commit 09c993dfe0
4 changed files with 99 additions and 10 deletions
@@ -288,10 +288,10 @@ uint32_t ResultVector(ValueEmitContext& ctx, uint32_t value,
}
uint32_t QueryDimensions(ValueEmitContext& ctx, const IR::MemoryInfo& mem,
const IR::Inst& address) {
const auto dimension = ctx.state.program.info.images.at(mem.resource).dimension;
const IR::Inst& address, uint32_t resource, uint32_t array_index) {
const auto dimension = ctx.state.program.info.images.at(resource).dimension;
const auto& info = ImageDimensionInfoFor(dimension);
const auto image = LoadImageDescriptor(ctx.state, mem.resource);
const auto image = LoadImageDescriptor(ctx.state, resource, 0u, array_index);
const auto size = ctx.state.builder.AllocateId();
if (info.multisampled != 0u) {
ctx.state.builder.AddFunction(spv::OpImageQuerySize,
@@ -846,7 +846,10 @@ void EmitImage(ValueEmitContext& ctx, const IR::Inst& inst) {
const auto* address = ctx.ImageAddress(inst.Arg(image_info.needs_sampler ? 2 : 1));
if (op == IR::ValueOpcode::ImageQueryDimensions) {
state.builder.RequireCapability(spv::CapabilityImageQuery);
ctx.Define(inst, QueryDimensions(ctx, mem, *address));
ctx.Define(inst, EmitImageAccess(ctx, inst, TypeU32Vector(state, 4),
[&](uint32_t resource, uint32_t array_index) {
return QueryDimensions(ctx, mem, *address, resource, array_index);
}));
return;
}
if (image_info.needs_sampler &&
@@ -1972,6 +1972,7 @@ void ApplyResourceSpecialization(Program& program, const ResourceSpecialization&
EXIT_IF(image.indirect_root == memory.resource &&
inst.GetOpcode() != ValueOpcode::ImageSampleRaw &&
inst.GetOpcode() != ValueOpcode::ImageGatherRaw &&
inst.GetOpcode() != ValueOpcode::ImageQueryDimensions &&
inst.GetOpcode() != ValueOpcode::ImageRead &&
inst.GetOpcode() != ValueOpcode::ImageWrite);
}