emit_spirv: fix incorrect use of descriptor index in image atomics
This commit is contained in:
		| @@ -7,15 +7,12 @@ | ||||
|  | ||||
| namespace Shader::Backend::SPIRV { | ||||
| namespace { | ||||
| Id Image(EmitContext& ctx, const IR::Value& index, IR::TextureInstInfo info) { | ||||
|     if (!index.IsImmediate()) { | ||||
|         throw NotImplementedException("Indirect image indexing"); | ||||
|     } | ||||
| Id Image(EmitContext& ctx, IR::TextureInstInfo info) { | ||||
|     if (info.type == TextureType::Buffer) { | ||||
|         const ImageBufferDefinition def{ctx.image_buffers.at(index.U32())}; | ||||
|         const ImageBufferDefinition def{ctx.image_buffers.at(info.descriptor_index)}; | ||||
|         return def.id; | ||||
|     } else { | ||||
|         const ImageDefinition def{ctx.images.at(index.U32())}; | ||||
|         const ImageDefinition def{ctx.images.at(info.descriptor_index)}; | ||||
|         return def.id; | ||||
|     } | ||||
| } | ||||
| @@ -28,8 +25,12 @@ 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{Image(ctx, index, info)}; | ||||
|     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], pointer, scope, semantics, value); | ||||
|   | ||||
| @@ -74,11 +74,6 @@ spv::ImageFormat GetImageFormat(ImageFormat format) { | ||||
|     throw InvalidArgument("Invalid image format {}", format); | ||||
| } | ||||
|  | ||||
| spv::ImageFormat GetImageFormatForBuffer(ImageFormat format) { | ||||
|     const auto spv_format = GetImageFormat(format); | ||||
|     return spv_format == spv::ImageFormat::Unknown ? spv::ImageFormat::R32ui : spv_format; | ||||
| } | ||||
|  | ||||
| Id ImageType(EmitContext& ctx, const ImageDescriptor& desc) { | ||||
|     const spv::ImageFormat format{GetImageFormat(desc.format)}; | ||||
|     const Id type{ctx.U32[1]}; | ||||
| @@ -1275,7 +1270,7 @@ void EmitContext::DefineImageBuffers(const Info& info, u32& binding) { | ||||
|         if (desc.count != 1) { | ||||
|             throw NotImplementedException("Array of image buffers"); | ||||
|         } | ||||
|         const spv::ImageFormat format{GetImageFormatForBuffer(desc.format)}; | ||||
|         const spv::ImageFormat format{GetImageFormat(desc.format)}; | ||||
|         const Id image_type{TypeImage(U32[1], spv::Dim::Buffer, false, false, false, 2, format)}; | ||||
|         const Id pointer_type{TypePointer(spv::StorageClass::UniformConstant, image_type)}; | ||||
|         const Id id{AddGlobalVariable(pointer_type, spv::StorageClass::UniformConstant)}; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Liam
					Liam