early-access version 4031

This commit is contained in:
pineappleEA
2023-12-22 03:37:42 +01:00
parent 98941608ba
commit 40960d220b
15 changed files with 224 additions and 134 deletions

View File

@@ -7,21 +7,13 @@
namespace Shader::Backend::SPIRV {
namespace {
Id ImagePointer(EmitContext& ctx, const IR::Value& index, IR::TextureInstInfo info) {
Id Image(EmitContext& ctx, IR::TextureInstInfo info) {
if (info.type == TextureType::Buffer) {
const ImageBufferDefinition def{ctx.image_buffers.at(info.descriptor_index)};
if (def.count > 1) {
return ctx.OpAccessChain(def.pointer_type, def.id, ctx.Def(index));
} else {
return def.id;
}
return def.id;
} else {
const ImageDefinition def{ctx.images.at(info.descriptor_index)};
if (def.count > 1) {
return ctx.OpAccessChain(def.pointer_type, def.id, ctx.Def(index));
} else {
return def.id;
}
return def.id;
}
}
@@ -33,12 +25,15 @@ std::pair<Id, Id> AtomicArgs(EmitContext& ctx) {
Id ImageAtomicU32(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords, Id value,
Id (Sirit::Module::*atomic_func)(Id, Id, Id, Id, Id)) {
if (!index.IsImmediate() || index.U32() != 0) {
// TODO: handle layers
throw NotImplementedException("Image indexing");
}
const auto info{inst->Flags<IR::TextureInstInfo>()};
const Id image_pointer{ImagePointer(ctx, index, info)};
const Id texel_pointer{
ctx.OpImageTexelPointer(ctx.image_u32, image_pointer, coords, ctx.Const(0U))};
const Id image{Image(ctx, info)};
const Id pointer{ctx.OpImageTexelPointer(ctx.image_u32, image, coords, ctx.Const(0U))};
const auto [scope, semantics]{AtomicArgs(ctx)};
return (ctx.*atomic_func)(ctx.U32[1], texel_pointer, scope, semantics, value);
return (ctx.*atomic_func)(ctx.U32[1], pointer, scope, semantics, value);
}
} // Anonymous namespace