summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFernando S <fsahmkow27@gmail.com>2023-09-23 13:00:31 +0200
committerGitHub <noreply@github.com>2023-09-23 13:00:31 +0200
commitace91dd0c0442e47565bcf8f66d940ab6929f60a (patch)
tree5d9e426298c5fcfa29c559d085c8bf6763dad70f
parentMerge pull request #11573 from t895/import-fix (diff)
parentemit_spirv: fix incorrect use of descriptor index in image atomics (diff)
downloadyuzu-ace91dd0c0442e47565bcf8f66d940ab6929f60a.tar
yuzu-ace91dd0c0442e47565bcf8f66d940ab6929f60a.tar.gz
yuzu-ace91dd0c0442e47565bcf8f66d940ab6929f60a.tar.bz2
yuzu-ace91dd0c0442e47565bcf8f66d940ab6929f60a.tar.lz
yuzu-ace91dd0c0442e47565bcf8f66d940ab6929f60a.tar.xz
yuzu-ace91dd0c0442e47565bcf8f66d940ab6929f60a.tar.zst
yuzu-ace91dd0c0442e47565bcf8f66d940ab6929f60a.zip
-rw-r--r--src/shader_recompiler/backend/spirv/emit_spirv_image_atomic.cpp15
-rw-r--r--src/shader_recompiler/backend/spirv/spirv_emit_context.cpp7
2 files changed, 9 insertions, 13 deletions
diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_image_atomic.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_image_atomic.cpp
index 2a12feddc..dde0f6e9c 100644
--- a/src/shader_recompiler/backend/spirv/emit_spirv_image_atomic.cpp
+++ b/src/shader_recompiler/backend/spirv/emit_spirv_image_atomic.cpp
@@ -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);
diff --git a/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp b/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp
index 72f69b7aa..57df6fc34 100644
--- a/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp
+++ b/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp
@@ -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)};