summaryrefslogtreecommitdiff
path: root/src/shader_recompiler/backend/spirv
diff options
context:
space:
mode:
Diffstat (limited to 'src/shader_recompiler/backend/spirv')
-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
4 files changed, 20 insertions, 0 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