summaryrefslogtreecommitdiff
path: root/src/shader_recompiler/backend/glasm/emit_glasm_image.cpp
diff options
context:
space:
mode:
authorGravatar Fernando Sahmkow2023-08-18 18:30:31 +0200
committerGravatar Liam2023-08-18 22:17:02 -0400
commitc03f0b3c893f2bc2ae4f1e1825c5ac1453c36710 (patch)
tree3f7f14fad6574878a7c0f94fbe16d574b61cb95a /src/shader_recompiler/backend/glasm/emit_glasm_image.cpp
parentMerge pull request #11278 from Kelebek1/dma_sync (diff)
downloadyuzu-c03f0b3c893f2bc2ae4f1e1825c5ac1453c36710.tar.gz
yuzu-c03f0b3c893f2bc2ae4f1e1825c5ac1453c36710.tar.xz
yuzu-c03f0b3c893f2bc2ae4f1e1825c5ac1453c36710.zip
Shader Recomnpiler: implement textuzreGrad 3D emulation constant propagation
Diffstat (limited to 'src/shader_recompiler/backend/glasm/emit_glasm_image.cpp')
-rw-r--r--src/shader_recompiler/backend/glasm/emit_glasm_image.cpp23
1 files changed, 19 insertions, 4 deletions
diff --git a/src/shader_recompiler/backend/glasm/emit_glasm_image.cpp b/src/shader_recompiler/backend/glasm/emit_glasm_image.cpp
index 85ee27333..d0e308124 100644
--- a/src/shader_recompiler/backend/glasm/emit_glasm_image.cpp
+++ b/src/shader_recompiler/backend/glasm/emit_glasm_image.cpp
@@ -558,12 +558,15 @@ void EmitImageGradient(EmitContext& ctx, IR::Inst& inst, const IR::Value& index,
558 const IR::Value& coord, const IR::Value& derivatives, 558 const IR::Value& coord, const IR::Value& derivatives,
559 const IR::Value& offset, const IR::Value& lod_clamp) { 559 const IR::Value& offset, const IR::Value& lod_clamp) {
560 const auto info{inst.Flags<IR::TextureInstInfo>()}; 560 const auto info{inst.Flags<IR::TextureInstInfo>()};
561 ScopedRegister dpdx, dpdy; 561 ScopedRegister dpdx, dpdy, coords;
562 const bool multi_component{info.num_derivates > 1 || info.has_lod_clamp}; 562 const bool multi_component{info.num_derivates > 1 || info.has_lod_clamp};
563 if (multi_component) { 563 if (multi_component) {
564 // Allocate this early to avoid aliasing other registers 564 // Allocate this early to avoid aliasing other registers
565 dpdx = ScopedRegister{ctx.reg_alloc}; 565 dpdx = ScopedRegister{ctx.reg_alloc};
566 dpdy = ScopedRegister{ctx.reg_alloc}; 566 dpdy = ScopedRegister{ctx.reg_alloc};
567 if (info.num_derivates >= 3) {
568 coords = ScopedRegister{ctx.reg_alloc};
569 }
567 } 570 }
568 const auto sparse_inst{PrepareSparse(inst)}; 571 const auto sparse_inst{PrepareSparse(inst)};
569 const std::string_view sparse_mod{sparse_inst ? ".SPARSE" : ""}; 572 const std::string_view sparse_mod{sparse_inst ? ".SPARSE" : ""};
@@ -580,15 +583,27 @@ void EmitImageGradient(EmitContext& ctx, IR::Inst& inst, const IR::Value& index,
580 "MOV.F {}.y,{}.w;", 583 "MOV.F {}.y,{}.w;",
581 dpdx.reg, derivatives_vec, dpdx.reg, derivatives_vec, dpdy.reg, derivatives_vec, 584 dpdx.reg, derivatives_vec, dpdx.reg, derivatives_vec, dpdy.reg, derivatives_vec,
582 dpdy.reg, derivatives_vec); 585 dpdy.reg, derivatives_vec);
586 Register final_coord;
587 if (info.num_derivates >= 3) {
588 ctx.Add("MOV.F {}.z,{}.x;"
589 "MOV.F {}.z,{}.y;",
590 dpdx.reg, coord_vec, dpdy.reg, coord_vec);
591 ctx.Add("MOV.F {}.x,0;"
592 "MOV.F {}.y,0;",
593 "MOV.F {}.z,0;", coords.reg, coords.reg, coords.reg);
594 final_coord = coords.reg;
595 } else {
596 final_coord = coord_vec;
597 }
583 if (info.has_lod_clamp) { 598 if (info.has_lod_clamp) {
584 const ScalarF32 lod_clamp_value{ctx.reg_alloc.Consume(lod_clamp)}; 599 const ScalarF32 lod_clamp_value{ctx.reg_alloc.Consume(lod_clamp)};
585 ctx.Add("MOV.F {}.w,{};" 600 ctx.Add("MOV.F {}.w,{};"
586 "TXD.F.LODCLAMP{} {},{},{},{},{},{}{};", 601 "TXD.F.LODCLAMP{} {},{},{},{},{},{}{};",
587 dpdy.reg, lod_clamp_value, sparse_mod, ret, coord_vec, dpdx.reg, dpdy.reg, 602 dpdy.reg, lod_clamp_value, sparse_mod, ret, final_coord, dpdx.reg, dpdy.reg,
588 texture, type, offset_vec); 603 texture, type, offset_vec);
589 } else { 604 } else {
590 ctx.Add("TXD.F{} {},{},{},{},{},{}{};", sparse_mod, ret, coord_vec, dpdx.reg, dpdy.reg, 605 ctx.Add("TXD.F{} {},{},{},{},{},{}{};", sparse_mod, ret, final_coord, dpdx.reg,
591 texture, type, offset_vec); 606 dpdy.reg, texture, type, offset_vec);
592 } 607 }
593 } else { 608 } else {
594 ctx.Add("TXD.F{} {},{},{}.x,{}.y,{},{}{};", sparse_mod, ret, coord_vec, derivatives_vec, 609 ctx.Add("TXD.F{} {},{},{}.x,{}.y,{},{}{};", sparse_mod, ret, coord_vec, derivatives_vec,