mirror of
https://github.com/KytyPS5/KytyPS5.git
synced 2026-10-20 10:56:58 +02:00
shader: query dimensions through shared indirect image selection
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user