summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/shader_recompiler/backend/spirv/emit_context.cpp1
-rw-r--r--src/shader_recompiler/backend/spirv/emit_context.h1
-rw-r--r--src/shader_recompiler/backend/spirv/emit_spirv.h3
-rw-r--r--src/shader_recompiler/backend/spirv/emit_spirv_image.cpp15
-rw-r--r--src/shader_recompiler/frontend/ir/ir_emitter.cpp6
-rw-r--r--src/shader_recompiler/frontend/ir/ir_emitter.h2
-rw-r--r--src/shader_recompiler/frontend/ir/opcodes.inc3
-rw-r--r--src/shader_recompiler/ir_opt/collect_shader_info_pass.cpp3
-rw-r--r--src/shader_recompiler/ir_opt/texture_pass.cpp5
9 files changed, 38 insertions, 1 deletions
diff --git a/src/shader_recompiler/backend/spirv/emit_context.cpp b/src/shader_recompiler/backend/spirv/emit_context.cpp
index 5cd505d99..c8ce58254 100644
--- a/src/shader_recompiler/backend/spirv/emit_context.cpp
+++ b/src/shader_recompiler/backend/spirv/emit_context.cpp
@@ -182,6 +182,7 @@ void EmitContext::DefineCommonConstants() {
182 true_value = ConstantTrue(U1); 182 true_value = ConstantTrue(U1);
183 false_value = ConstantFalse(U1); 183 false_value = ConstantFalse(U1);
184 u32_zero_value = Constant(U32[1], 0U); 184 u32_zero_value = Constant(U32[1], 0U);
185 f32_zero_value = Constant(F32[1], 0.0f);
185} 186}
186 187
187void EmitContext::DefineInterfaces(const Info& info) { 188void EmitContext::DefineInterfaces(const Info& info) {
diff --git a/src/shader_recompiler/backend/spirv/emit_context.h b/src/shader_recompiler/backend/spirv/emit_context.h
index 071e66c2a..3965869f0 100644
--- a/src/shader_recompiler/backend/spirv/emit_context.h
+++ b/src/shader_recompiler/backend/spirv/emit_context.h
@@ -70,6 +70,7 @@ public:
70 Id true_value{}; 70 Id true_value{};
71 Id false_value{}; 71 Id false_value{};
72 Id u32_zero_value{}; 72 Id u32_zero_value{};
73 Id f32_zero_value{};
73 74
74 UniformDefinitions uniform_types; 75 UniformDefinitions uniform_types;
75 76
diff --git a/src/shader_recompiler/backend/spirv/emit_spirv.h b/src/shader_recompiler/backend/spirv/emit_spirv.h
index 3d0c6f7ba..105c23745 100644
--- a/src/shader_recompiler/backend/spirv/emit_spirv.h
+++ b/src/shader_recompiler/backend/spirv/emit_spirv.h
@@ -362,6 +362,7 @@ Id EmitBindlessImageGather(EmitContext&);
362Id EmitBindlessImageGatherDref(EmitContext&); 362Id EmitBindlessImageGatherDref(EmitContext&);
363Id EmitBindlessImageFetch(EmitContext&); 363Id EmitBindlessImageFetch(EmitContext&);
364Id EmitBindlessImageQueryDimensions(EmitContext&); 364Id EmitBindlessImageQueryDimensions(EmitContext&);
365Id EmitBindlessImageQueryLod(EmitContext&);
365Id EmitBoundImageSampleImplicitLod(EmitContext&); 366Id EmitBoundImageSampleImplicitLod(EmitContext&);
366Id EmitBoundImageSampleExplicitLod(EmitContext&); 367Id EmitBoundImageSampleExplicitLod(EmitContext&);
367Id EmitBoundImageSampleDrefImplicitLod(EmitContext&); 368Id EmitBoundImageSampleDrefImplicitLod(EmitContext&);
@@ -370,6 +371,7 @@ Id EmitBoundImageGather(EmitContext&);
370Id EmitBoundImageGatherDref(EmitContext&); 371Id EmitBoundImageGatherDref(EmitContext&);
371Id EmitBoundImageFetch(EmitContext&); 372Id EmitBoundImageFetch(EmitContext&);
372Id EmitBoundImageQueryDimensions(EmitContext&); 373Id EmitBoundImageQueryDimensions(EmitContext&);
374Id EmitBoundImageQueryLod(EmitContext&);
373Id EmitImageSampleImplicitLod(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords, 375Id EmitImageSampleImplicitLod(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords,
374 Id bias_lc, Id offset); 376 Id bias_lc, Id offset);
375Id EmitImageSampleExplicitLod(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords, 377Id EmitImageSampleExplicitLod(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords,
@@ -385,6 +387,7 @@ Id EmitImageGatherDref(EmitContext& ctx, IR::Inst* inst, const IR::Value& index,
385Id EmitImageFetch(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords, Id offset, 387Id EmitImageFetch(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords, Id offset,
386 Id lod, Id ms); 388 Id lod, Id ms);
387Id EmitImageQueryDimensions(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id lod); 389Id EmitImageQueryDimensions(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id lod);
390Id EmitImageQueryLod(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords);
388Id EmitVoteAll(EmitContext& ctx, Id pred); 391Id EmitVoteAll(EmitContext& ctx, Id pred);
389Id EmitVoteAny(EmitContext& ctx, Id pred); 392Id EmitVoteAny(EmitContext& ctx, Id pred);
390Id EmitVoteEqual(EmitContext& ctx, Id pred); 393Id EmitVoteEqual(EmitContext& ctx, Id pred);
diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp
index 310cc7af7..2cd6b38c4 100644
--- a/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp
+++ b/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp
@@ -161,6 +161,10 @@ Id EmitBindlessImageQueryDimensions(EmitContext&) {
161 throw LogicError("Unreachable instruction"); 161 throw LogicError("Unreachable instruction");
162} 162}
163 163
164Id EmitBindlessImageQueryLod(EmitContext&) {
165 throw LogicError("Unreachable instruction");
166}
167
164Id EmitBoundImageSampleImplicitLod(EmitContext&) { 168Id EmitBoundImageSampleImplicitLod(EmitContext&) {
165 throw LogicError("Unreachable instruction"); 169 throw LogicError("Unreachable instruction");
166} 170}
@@ -193,6 +197,10 @@ Id EmitBoundImageQueryDimensions(EmitContext&) {
193 throw LogicError("Unreachable instruction"); 197 throw LogicError("Unreachable instruction");
194} 198}
195 199
200Id EmitBoundImageQueryLod(EmitContext&) {
201 throw LogicError("Unreachable instruction");
202}
203
196Id EmitImageSampleImplicitLod(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords, 204Id EmitImageSampleImplicitLod(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords,
197 Id bias_lc, Id offset) { 205 Id bias_lc, Id offset) {
198 const auto info{inst->Flags<IR::TextureInstInfo>()}; 206 const auto info{inst->Flags<IR::TextureInstInfo>()};
@@ -287,4 +295,11 @@ Id EmitImageQueryDimensions(EmitContext& ctx, IR::Inst* inst, const IR::Value& i
287 throw LogicError("Unspecified image type {}", info.type.Value()); 295 throw LogicError("Unspecified image type {}", info.type.Value());
288} 296}
289 297
298Id EmitImageQueryLod(EmitContext& ctx, IR::Inst*, const IR::Value& index, Id coords) {
299 const Id zero{ctx.f32_zero_value};
300 const Id image{TextureImage(ctx, index)};
301 return ctx.OpCompositeConstruct(ctx.F32[4], ctx.OpImageQueryLod(ctx.F32[2], image, coords),
302 zero, zero);
303}
304
290} // namespace Shader::Backend::SPIRV 305} // namespace Shader::Backend::SPIRV
diff --git a/src/shader_recompiler/frontend/ir/ir_emitter.cpp b/src/shader_recompiler/frontend/ir/ir_emitter.cpp
index 6e7dddead..ba9591727 100644
--- a/src/shader_recompiler/frontend/ir/ir_emitter.cpp
+++ b/src/shader_recompiler/frontend/ir/ir_emitter.cpp
@@ -1567,6 +1567,12 @@ Value IREmitter::ImageQueryDimension(const Value& handle, const IR::U32& lod) {
1567 return Inst(op, handle, lod); 1567 return Inst(op, handle, lod);
1568} 1568}
1569 1569
1570Value IREmitter::ImageQueryLod(const Value& handle, const Value& coords) {
1571 const Opcode op{handle.IsImmediate() ? Opcode::BoundImageQueryLod
1572 : Opcode::BindlessImageQueryLod};
1573 return Inst(op, handle, coords);
1574}
1575
1570U1 IREmitter::VoteAll(const U1& value) { 1576U1 IREmitter::VoteAll(const U1& value) {
1571 return Inst<U1>(Opcode::VoteAll, value); 1577 return Inst<U1>(Opcode::VoteAll, value);
1572} 1578}
diff --git a/src/shader_recompiler/frontend/ir/ir_emitter.h b/src/shader_recompiler/frontend/ir/ir_emitter.h
index 8f3325738..9e752b208 100644
--- a/src/shader_recompiler/frontend/ir/ir_emitter.h
+++ b/src/shader_recompiler/frontend/ir/ir_emitter.h
@@ -255,6 +255,8 @@ public:
255 TextureInstInfo info); 255 TextureInstInfo info);
256 [[nodiscard]] Value ImageQueryDimension(const Value& handle, const IR::U32& lod); 256 [[nodiscard]] Value ImageQueryDimension(const Value& handle, const IR::U32& lod);
257 257
258 [[nodiscard]] Value ImageQueryLod(const Value& handle, const Value& coords);
259
258 [[nodiscard]] Value ImageGather(const Value& handle, const Value& coords, const Value& offset, 260 [[nodiscard]] Value ImageGather(const Value& handle, const Value& coords, const Value& offset,
259 const Value& offset2, TextureInstInfo info); 261 const Value& offset2, TextureInstInfo info);
260 262
diff --git a/src/shader_recompiler/frontend/ir/opcodes.inc b/src/shader_recompiler/frontend/ir/opcodes.inc
index 302b8471d..49cdcd57f 100644
--- a/src/shader_recompiler/frontend/ir/opcodes.inc
+++ b/src/shader_recompiler/frontend/ir/opcodes.inc
@@ -380,6 +380,7 @@ OPCODE(BindlessImageGather, F32x4, U32,
380OPCODE(BindlessImageGatherDref, F32x4, U32, Opaque, Opaque, Opaque, F32, ) 380OPCODE(BindlessImageGatherDref, F32x4, U32, Opaque, Opaque, Opaque, F32, )
381OPCODE(BindlessImageFetch, F32x4, U32, Opaque, Opaque, Opaque, Opaque, ) 381OPCODE(BindlessImageFetch, F32x4, U32, Opaque, Opaque, Opaque, Opaque, )
382OPCODE(BindlessImageQueryDimensions, U32x4, U32, U32, ) 382OPCODE(BindlessImageQueryDimensions, U32x4, U32, U32, )
383OPCODE(BindlessImageQueryLod, F32x4, U32, Opaque, )
383 384
384OPCODE(BoundImageSampleImplicitLod, F32x4, U32, Opaque, Opaque, Opaque, ) 385OPCODE(BoundImageSampleImplicitLod, F32x4, U32, Opaque, Opaque, Opaque, )
385OPCODE(BoundImageSampleExplicitLod, F32x4, U32, Opaque, Opaque, Opaque, ) 386OPCODE(BoundImageSampleExplicitLod, F32x4, U32, Opaque, Opaque, Opaque, )
@@ -389,6 +390,7 @@ OPCODE(BoundImageGather, F32x4, U32,
389OPCODE(BoundImageGatherDref, F32x4, U32, Opaque, Opaque, Opaque, F32, ) 390OPCODE(BoundImageGatherDref, F32x4, U32, Opaque, Opaque, Opaque, F32, )
390OPCODE(BoundImageFetch, F32x4, U32, Opaque, Opaque, Opaque, Opaque, ) 391OPCODE(BoundImageFetch, F32x4, U32, Opaque, Opaque, Opaque, Opaque, )
391OPCODE(BoundImageQueryDimensions, U32x4, U32, U32, ) 392OPCODE(BoundImageQueryDimensions, U32x4, U32, U32, )
393OPCODE(BoundImageQueryLod, F32x4, U32, Opaque, )
392 394
393OPCODE(ImageSampleImplicitLod, F32x4, U32, Opaque, Opaque, Opaque, ) 395OPCODE(ImageSampleImplicitLod, F32x4, U32, Opaque, Opaque, Opaque, )
394OPCODE(ImageSampleExplicitLod, F32x4, U32, Opaque, Opaque, Opaque, ) 396OPCODE(ImageSampleExplicitLod, F32x4, U32, Opaque, Opaque, Opaque, )
@@ -398,6 +400,7 @@ OPCODE(ImageGather, F32x4, U32,
398OPCODE(ImageGatherDref, F32x4, U32, Opaque, Opaque, Opaque, F32, ) 400OPCODE(ImageGatherDref, F32x4, U32, Opaque, Opaque, Opaque, F32, )
399OPCODE(ImageFetch, F32x4, U32, Opaque, Opaque, Opaque, Opaque, ) 401OPCODE(ImageFetch, F32x4, U32, Opaque, Opaque, Opaque, Opaque, )
400OPCODE(ImageQueryDimensions, U32x4, U32, U32, ) 402OPCODE(ImageQueryDimensions, U32x4, U32, U32, )
403OPCODE(ImageQueryLod, F32x4, U32, Opaque, )
401 404
402// Warp operations 405// Warp operations
403OPCODE(VoteAll, U1, U1, ) 406OPCODE(VoteAll, U1, U1, )
diff --git a/src/shader_recompiler/ir_opt/collect_shader_info_pass.cpp b/src/shader_recompiler/ir_opt/collect_shader_info_pass.cpp
index 3b00d7c8c..04e3a4f53 100644
--- a/src/shader_recompiler/ir_opt/collect_shader_info_pass.cpp
+++ b/src/shader_recompiler/ir_opt/collect_shader_info_pass.cpp
@@ -383,7 +383,8 @@ void VisitUsages(Info& info, IR::Inst& inst) {
383 case IR::Opcode::ImageGather: 383 case IR::Opcode::ImageGather:
384 case IR::Opcode::ImageGatherDref: 384 case IR::Opcode::ImageGatherDref:
385 case IR::Opcode::ImageFetch: 385 case IR::Opcode::ImageFetch:
386 case IR::Opcode::ImageQueryDimensions: { 386 case IR::Opcode::ImageQueryDimensions:
387 case IR::Opcode::ImageQueryLod: {
387 const TextureType type{inst.Flags<IR::TextureInstInfo>().type}; 388 const TextureType type{inst.Flags<IR::TextureInstInfo>().type};
388 info.uses_sampled_1d |= type == TextureType::Color1D || type == TextureType::ColorArray1D || 389 info.uses_sampled_1d |= type == TextureType::Color1D || type == TextureType::ColorArray1D ||
389 type == TextureType::Shadow1D || type == TextureType::ShadowArray1D; 390 type == TextureType::Shadow1D || type == TextureType::ShadowArray1D;
diff --git a/src/shader_recompiler/ir_opt/texture_pass.cpp b/src/shader_recompiler/ir_opt/texture_pass.cpp
index dfacf848f..6eb286b83 100644
--- a/src/shader_recompiler/ir_opt/texture_pass.cpp
+++ b/src/shader_recompiler/ir_opt/texture_pass.cpp
@@ -57,6 +57,9 @@ IR::Opcode IndexedInstruction(const IR::Inst& inst) {
57 case IR::Opcode::BoundImageQueryDimensions: 57 case IR::Opcode::BoundImageQueryDimensions:
58 case IR::Opcode::BindlessImageQueryDimensions: 58 case IR::Opcode::BindlessImageQueryDimensions:
59 return IR::Opcode::ImageQueryDimensions; 59 return IR::Opcode::ImageQueryDimensions;
60 case IR::Opcode::BoundImageQueryLod:
61 case IR::Opcode::BindlessImageQueryLod:
62 return IR::Opcode::ImageQueryLod;
60 default: 63 default:
61 return IR::Opcode::Void; 64 return IR::Opcode::Void;
62 } 65 }
@@ -72,6 +75,7 @@ bool IsBindless(const IR::Inst& inst) {
72 case IR::Opcode::BindlessImageGatherDref: 75 case IR::Opcode::BindlessImageGatherDref:
73 case IR::Opcode::BindlessImageFetch: 76 case IR::Opcode::BindlessImageFetch:
74 case IR::Opcode::BindlessImageQueryDimensions: 77 case IR::Opcode::BindlessImageQueryDimensions:
78 case IR::Opcode::BindlessImageQueryLod:
75 return true; 79 return true;
76 case IR::Opcode::BoundImageSampleImplicitLod: 80 case IR::Opcode::BoundImageSampleImplicitLod:
77 case IR::Opcode::BoundImageSampleExplicitLod: 81 case IR::Opcode::BoundImageSampleExplicitLod:
@@ -81,6 +85,7 @@ bool IsBindless(const IR::Inst& inst) {
81 case IR::Opcode::BoundImageGatherDref: 85 case IR::Opcode::BoundImageGatherDref:
82 case IR::Opcode::BoundImageFetch: 86 case IR::Opcode::BoundImageFetch:
83 case IR::Opcode::BoundImageQueryDimensions: 87 case IR::Opcode::BoundImageQueryDimensions:
88 case IR::Opcode::BoundImageQueryLod:
84 return false; 89 return false;
85 default: 90 default:
86 throw InvalidArgument("Invalid opcode {}", inst.Opcode()); 91 throw InvalidArgument("Invalid opcode {}", inst.Opcode());