shader_recompiler: use one binding if the same image is read and written

This commit is contained in:
psucien 2024-09-12 22:47:54 +02:00
commit 3d2ea32dae
4 changed files with 12 additions and 6 deletions

View file

@ -157,8 +157,11 @@ Id EmitImageFetch(EmitContext& ctx, IR::Inst* inst, u32 handle, Id coords, const
ImageOperands operands; ImageOperands operands;
operands.AddOffset(ctx, offset); operands.AddOffset(ctx, offset);
operands.Add(spv::ImageOperandsMask::Lod, lod); operands.Add(spv::ImageOperandsMask::Lod, lod);
return ctx.OpBitcast( const Id texel =
ctx.F32[4], ctx.OpImageFetch(result_type, image, coords, operands.mask, operands.operands)); texture.is_storage
? ctx.OpImageRead(result_type, image, coords, operands.mask, operands.operands)
: ctx.OpImageFetch(result_type, image, coords, operands.mask, operands.operands);
return ctx.OpBitcast(ctx.F32[4], texel);
} }
Id EmitImageQueryDimensions(EmitContext& ctx, IR::Inst* inst, u32 handle, Id lod, bool skip_mips) { Id EmitImageQueryDimensions(EmitContext& ctx, IR::Inst* inst, u32 handle, Id lod, bool skip_mips) {

View file

@ -534,6 +534,7 @@ void EmitContext::DefineImagesAndSamplers() {
.sampled_type = image_desc.is_storage ? sampled_type : TypeSampledImage(image_type), .sampled_type = image_desc.is_storage ? sampled_type : TypeSampledImage(image_type),
.pointer_type = pointer_type, .pointer_type = pointer_type,
.image_type = image_type, .image_type = image_type,
.is_storage = image_desc.is_storage,
}); });
interfaces.push_back(id); interfaces.push_back(id);
++binding; ++binding;

View file

@ -200,6 +200,7 @@ public:
Id sampled_type; Id sampled_type;
Id pointer_type; Id pointer_type;
Id image_type; Id image_type;
bool is_storage = false;
}; };
struct BufferDefinition { struct BufferDefinition {
@ -216,8 +217,8 @@ public:
u32 binding; u32 binding;
Id image_type; Id image_type;
Id result_type; Id result_type;
bool is_integer; bool is_integer = false;
bool is_storage; bool is_storage = false;
}; };
u32& binding; u32& binding;

View file

@ -200,9 +200,10 @@ public:
u32 Add(const ImageResource& desc) { u32 Add(const ImageResource& desc) {
const u32 index{Add(image_resources, desc, [&desc](const auto& existing) { const u32 index{Add(image_resources, desc, [&desc](const auto& existing) {
return desc.sgpr_base == existing.sgpr_base && return desc.sgpr_base == existing.sgpr_base &&
desc.dword_offset == existing.dword_offset && desc.type == existing.type && desc.dword_offset == existing.dword_offset;
desc.is_storage == existing.is_storage;
})}; })};
auto& image = image_resources[index];
image.is_storage |= desc.is_storage;
return index; return index;
} }