From b2a6dde4380a5526e9d936f92a9e3d6ad9393bfa Mon Sep 17 00:00:00 2001
From: FengChen <vonchenplus@gmail.com>
Date: Wed, 10 Aug 2022 10:10:32 +0800
Subject: video_code: support rectangle texture

---
 src/shader_recompiler/ir_opt/texture_pass.cpp | 23 +++++++++++++++++++++++
 1 file changed, 23 insertions(+)

(limited to 'src/shader_recompiler/ir_opt/texture_pass.cpp')

diff --git a/src/shader_recompiler/ir_opt/texture_pass.cpp b/src/shader_recompiler/ir_opt/texture_pass.cpp
index ca3e306e8e..5cead5135e 100644
--- a/src/shader_recompiler/ir_opt/texture_pass.cpp
+++ b/src/shader_recompiler/ir_opt/texture_pass.cpp
@@ -362,6 +362,21 @@ private:
     TextureDescriptors& texture_descriptors;
     ImageDescriptors& image_descriptors;
 };
+
+void PatchImageSampleImplicitLod(IR::Block& block, IR::Inst& inst) {
+    IR::IREmitter ir{block, IR::Block::InstructionList::s_iterator_to(inst)};
+    const auto info{inst.Flags<IR::TextureInstInfo>()};
+    const IR::Value coord(inst.Arg(1));
+    const IR::Value handle(ir.Imm32(0));
+    const IR::U32 lod{ir.Imm32(0)};
+    const IR::Value texture_size = ir.ImageQueryDimension(handle, lod, info);
+    inst.SetArg(
+        1, ir.CompositeConstruct(
+               ir.FPMul(IR::F32(ir.CompositeExtract(coord, 0)),
+                        ir.FPRecip(ir.ConvertUToF(32, 32, ir.CompositeExtract(texture_size, 0)))),
+               ir.FPMul(IR::F32(ir.CompositeExtract(coord, 1)),
+                        ir.FPRecip(ir.ConvertUToF(32, 32, ir.CompositeExtract(texture_size, 1))))));
+}
 } // Anonymous namespace
 
 void TexturePass(Environment& env, IR::Program& program) {
@@ -399,6 +414,14 @@ void TexturePass(Environment& env, IR::Program& program) {
             flags.type.Assign(ReadTextureType(env, cbuf));
             inst->SetFlags(flags);
             break;
+        case IR::Opcode::ImageSampleImplicitLod:
+            if (flags.type == TextureType::Color2D) {
+                auto texture_type = ReadTextureType(env, cbuf);
+                if (texture_type == TextureType::Color2DRect) {
+                    PatchImageSampleImplicitLod(*texture_inst.block, *texture_inst.inst);
+                }
+            }
+            break;
         case IR::Opcode::ImageFetch:
             if (flags.type != TextureType::Color1D) {
                 break;
-- 
cgit v1.2.3-70-g09d2