summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/core/hle/service/nvdrv/devices/nvdisp_disp0.cpp6
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer_cache.cpp46
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer_cache.h2
-rw-r--r--src/video_core/renderer_opengl/gl_shader_decompiler.cpp6
-rw-r--r--src/video_core/shader/decode.cpp72
-rw-r--r--src/video_core/shader/decode/arithmetic.cpp2
-rw-r--r--src/video_core/shader/decode/arithmetic_half.cpp2
-rw-r--r--src/video_core/shader/decode/arithmetic_half_immediate.cpp2
-rw-r--r--src/video_core/shader/decode/arithmetic_immediate.cpp2
-rw-r--r--src/video_core/shader/decode/arithmetic_integer.cpp4
-rw-r--r--src/video_core/shader/decode/arithmetic_integer_immediate.cpp8
-rw-r--r--src/video_core/shader/decode/bfe.cpp2
-rw-r--r--src/video_core/shader/decode/bfi.cpp2
-rw-r--r--src/video_core/shader/decode/conversion.cpp2
-rw-r--r--src/video_core/shader/decode/ffma.cpp2
-rw-r--r--src/video_core/shader/decode/float_set.cpp2
-rw-r--r--src/video_core/shader/decode/float_set_predicate.cpp2
-rw-r--r--src/video_core/shader/decode/half_set.cpp2
-rw-r--r--src/video_core/shader/decode/half_set_predicate.cpp2
-rw-r--r--src/video_core/shader/decode/hfma2.cpp2
-rw-r--r--src/video_core/shader/decode/integer_set.cpp2
-rw-r--r--src/video_core/shader/decode/integer_set_predicate.cpp2
-rw-r--r--src/video_core/shader/decode/memory.cpp12
-rw-r--r--src/video_core/shader/decode/other.cpp2
-rw-r--r--src/video_core/shader/decode/predicate_set_predicate.cpp2
-rw-r--r--src/video_core/shader/decode/predicate_set_register.cpp2
-rw-r--r--src/video_core/shader/decode/register_set_predicate.cpp2
-rw-r--r--src/video_core/shader/decode/shift.cpp2
-rw-r--r--src/video_core/shader/decode/video.cpp2
-rw-r--r--src/video_core/shader/decode/xmad.cpp2
-rw-r--r--src/video_core/shader/shader_ir.cpp14
-rw-r--r--src/video_core/shader/shader_ir.h91
-rw-r--r--src/video_core/shader/track.cpp17
33 files changed, 185 insertions, 137 deletions
diff --git a/src/core/hle/service/nvdrv/devices/nvdisp_disp0.cpp b/src/core/hle/service/nvdrv/devices/nvdisp_disp0.cpp
index 92acc57b1..21ccfe1f8 100644
--- a/src/core/hle/service/nvdrv/devices/nvdisp_disp0.cpp
+++ b/src/core/hle/service/nvdrv/devices/nvdisp_disp0.cpp
@@ -25,9 +25,9 @@ void nvdisp_disp0::flip(u32 buffer_handle, u32 offset, u32 format, u32 width, u3
25 u32 stride, NVFlinger::BufferQueue::BufferTransformFlags transform, 25 u32 stride, NVFlinger::BufferQueue::BufferTransformFlags transform,
26 const MathUtil::Rectangle<int>& crop_rect) { 26 const MathUtil::Rectangle<int>& crop_rect) {
27 VAddr addr = nvmap_dev->GetObjectAddress(buffer_handle); 27 VAddr addr = nvmap_dev->GetObjectAddress(buffer_handle);
28 LOG_WARNING(Service, 28 LOG_TRACE(Service,
29 "Drawing from address {:X} offset {:08X} Width {} Height {} Stride {} Format {}", 29 "Drawing from address {:X} offset {:08X} Width {} Height {} Stride {} Format {}",
30 addr, offset, width, height, stride, format); 30 addr, offset, width, height, stride, format);
31 31
32 using PixelFormat = Tegra::FramebufferConfig::PixelFormat; 32 using PixelFormat = Tegra::FramebufferConfig::PixelFormat;
33 const Tegra::FramebufferConfig framebuffer{ 33 const Tegra::FramebufferConfig framebuffer{
diff --git a/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp b/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp
index 33bd9f7c1..59f671048 100644
--- a/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp
+++ b/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp
@@ -125,6 +125,9 @@ std::size_t SurfaceParams::InnerMemorySize(bool force_gl, bool layer_only,
125 125
126 params.width = Common::AlignUp(config.tic.Width(), GetCompressionFactor(params.pixel_format)); 126 params.width = Common::AlignUp(config.tic.Width(), GetCompressionFactor(params.pixel_format));
127 params.height = Common::AlignUp(config.tic.Height(), GetCompressionFactor(params.pixel_format)); 127 params.height = Common::AlignUp(config.tic.Height(), GetCompressionFactor(params.pixel_format));
128 if (!params.is_tiled) {
129 params.pitch = config.tic.Pitch();
130 }
128 params.unaligned_height = config.tic.Height(); 131 params.unaligned_height = config.tic.Height();
129 params.target = SurfaceTargetFromTextureType(config.tic.texture_type); 132 params.target = SurfaceTargetFromTextureType(config.tic.texture_type);
130 params.identity = SurfaceClass::Uploaded; 133 params.identity = SurfaceClass::Uploaded;
@@ -191,7 +194,13 @@ std::size_t SurfaceParams::InnerMemorySize(bool force_gl, bool layer_only,
191 config.format == Tegra::RenderTargetFormat::RGBA8_SRGB; 194 config.format == Tegra::RenderTargetFormat::RGBA8_SRGB;
192 params.component_type = ComponentTypeFromRenderTarget(config.format); 195 params.component_type = ComponentTypeFromRenderTarget(config.format);
193 params.type = GetFormatType(params.pixel_format); 196 params.type = GetFormatType(params.pixel_format);
194 params.width = config.width; 197 if (params.is_tiled) {
198 params.width = config.width;
199 } else {
200 params.pitch = config.width;
201 const u32 bpp = params.GetFormatBpp() / 8;
202 params.width = params.pitch / bpp;
203 }
195 params.height = config.height; 204 params.height = config.height;
196 params.unaligned_height = config.height; 205 params.unaligned_height = config.height;
197 params.target = SurfaceTarget::Texture2D; 206 params.target = SurfaceTarget::Texture2D;
@@ -694,9 +703,20 @@ void CachedSurface::LoadGLBuffer() {
694 for (u32 i = 0; i < params.max_mip_level; i++) 703 for (u32 i = 0; i < params.max_mip_level; i++)
695 SwizzleFunc(MortonSwizzleMode::MortonToLinear, params, gl_buffer[i], i); 704 SwizzleFunc(MortonSwizzleMode::MortonToLinear, params, gl_buffer[i], i);
696 } else { 705 } else {
697 const auto texture_src_data{Memory::GetPointer(params.addr)}; 706 const u32 bpp = params.GetFormatBpp() / 8;
698 const auto texture_src_data_end{texture_src_data + params.size_in_bytes_gl}; 707 const u32 copy_size = params.width * bpp;
699 gl_buffer[0].assign(texture_src_data, texture_src_data_end); 708 if (params.pitch == copy_size) {
709 std::memcpy(gl_buffer[0].data(), Memory::GetPointer(params.addr),
710 params.size_in_bytes_gl);
711 } else {
712 const u8* start = Memory::GetPointer(params.addr);
713 u8* write_to = gl_buffer[0].data();
714 for (u32 h = params.height; h > 0; h--) {
715 std::memcpy(write_to, start, copy_size);
716 start += params.pitch;
717 write_to += copy_size;
718 }
719 }
700 } 720 }
701 for (u32 i = 0; i < params.max_mip_level; i++) { 721 for (u32 i = 0; i < params.max_mip_level; i++) {
702 ConvertFormatAsNeeded_LoadGLBuffer(gl_buffer[i], params.pixel_format, params.MipWidth(i), 722 ConvertFormatAsNeeded_LoadGLBuffer(gl_buffer[i], params.pixel_format, params.MipWidth(i),
@@ -733,7 +753,19 @@ void CachedSurface::FlushGLBuffer() {
733 753
734 SwizzleFunc(MortonSwizzleMode::LinearToMorton, params, gl_buffer[0], 0); 754 SwizzleFunc(MortonSwizzleMode::LinearToMorton, params, gl_buffer[0], 0);
735 } else { 755 } else {
736 std::memcpy(Memory::GetPointer(GetAddr()), gl_buffer[0].data(), GetSizeInBytes()); 756 const u32 bpp = params.GetFormatBpp() / 8;
757 const u32 copy_size = params.width * bpp;
758 if (params.pitch == copy_size) {
759 std::memcpy(Memory::GetPointer(params.addr), gl_buffer[0].data(), GetSizeInBytes());
760 } else {
761 u8* start = Memory::GetPointer(params.addr);
762 const u8* read_to = gl_buffer[0].data();
763 for (u32 h = params.height; h > 0; h--) {
764 std::memcpy(start, read_to, copy_size);
765 start += params.pitch;
766 read_to += copy_size;
767 }
768 }
737 } 769 }
738} 770}
739 771
@@ -859,8 +891,8 @@ void CachedSurface::EnsureTextureView() {
859 constexpr GLuint min_level = 0; 891 constexpr GLuint min_level = 0;
860 892
861 glGenTextures(1, &texture_view.handle); 893 glGenTextures(1, &texture_view.handle);
862 glTextureView(texture_view.handle, target, texture.handle, gl_internal_format, 0, 894 glTextureView(texture_view.handle, target, texture.handle, gl_internal_format, min_level,
863 params.max_mip_level, 0, 1); 895 params.max_mip_level, min_layer, num_layers);
864 ApplyTextureDefaults(texture_view.handle, params.max_mip_level); 896 ApplyTextureDefaults(texture_view.handle, params.max_mip_level);
865 glTextureParameteriv(texture_view.handle, GL_TEXTURE_SWIZZLE_RGBA, 897 glTextureParameteriv(texture_view.handle, GL_TEXTURE_SWIZZLE_RGBA,
866 reinterpret_cast<const GLint*>(swizzle.data())); 898 reinterpret_cast<const GLint*>(swizzle.data()));
diff --git a/src/video_core/renderer_opengl/gl_rasterizer_cache.h b/src/video_core/renderer_opengl/gl_rasterizer_cache.h
index 2235df9c7..b81882d04 100644
--- a/src/video_core/renderer_opengl/gl_rasterizer_cache.h
+++ b/src/video_core/renderer_opengl/gl_rasterizer_cache.h
@@ -8,6 +8,7 @@
8#include <map> 8#include <map>
9#include <memory> 9#include <memory>
10#include <string> 10#include <string>
11#include <unordered_set>
11#include <vector> 12#include <vector>
12 13
13#include "common/alignment.h" 14#include "common/alignment.h"
@@ -272,6 +273,7 @@ struct SurfaceParams {
272 u32 height; 273 u32 height;
273 u32 depth; 274 u32 depth;
274 u32 unaligned_height; 275 u32 unaligned_height;
276 u32 pitch;
275 SurfaceTarget target; 277 SurfaceTarget target;
276 SurfaceClass identity; 278 SurfaceClass identity;
277 u32 max_mip_level; 279 u32 max_mip_level;
diff --git a/src/video_core/renderer_opengl/gl_shader_decompiler.cpp b/src/video_core/renderer_opengl/gl_shader_decompiler.cpp
index d84caa6db..70e124dc4 100644
--- a/src/video_core/renderer_opengl/gl_shader_decompiler.cpp
+++ b/src/video_core/renderer_opengl/gl_shader_decompiler.cpp
@@ -171,7 +171,7 @@ public:
171 code.AddLine(fmt::format("case 0x{:x}u: {{", address)); 171 code.AddLine(fmt::format("case 0x{:x}u: {{", address));
172 ++code.scope; 172 ++code.scope;
173 173
174 VisitBasicBlock(bb); 174 VisitBlock(bb);
175 175
176 --code.scope; 176 --code.scope;
177 code.AddLine('}'); 177 code.AddLine('}');
@@ -423,7 +423,7 @@ private:
423 code.AddNewLine(); 423 code.AddNewLine();
424 } 424 }
425 425
426 void VisitBasicBlock(const BasicBlock& bb) { 426 void VisitBlock(const NodeBlock& bb) {
427 for (const Node node : bb) { 427 for (const Node node : bb) {
428 if (const std::string expr = Visit(node); !expr.empty()) { 428 if (const std::string expr = Visit(node); !expr.empty()) {
429 code.AddLine(expr); 429 code.AddLine(expr);
@@ -575,7 +575,7 @@ private:
575 code.AddLine("if (" + Visit(conditional->GetCondition()) + ") {"); 575 code.AddLine("if (" + Visit(conditional->GetCondition()) + ") {");
576 ++code.scope; 576 ++code.scope;
577 577
578 VisitBasicBlock(conditional->GetCode()); 578 VisitBlock(conditional->GetCode());
579 579
580 --code.scope; 580 --code.scope;
581 code.AddLine('}'); 581 code.AddLine('}');
diff --git a/src/video_core/shader/decode.cpp b/src/video_core/shader/decode.cpp
index 812983a99..740ac3118 100644
--- a/src/video_core/shader/decode.cpp
+++ b/src/video_core/shader/decode.cpp
@@ -121,15 +121,15 @@ ExitMethod ShaderIR::Scan(u32 begin, u32 end, std::set<u32>& labels) {
121 return exit_method = ExitMethod::AlwaysReturn; 121 return exit_method = ExitMethod::AlwaysReturn;
122} 122}
123 123
124BasicBlock ShaderIR::DecodeRange(u32 begin, u32 end) { 124NodeBlock ShaderIR::DecodeRange(u32 begin, u32 end) {
125 BasicBlock basic_block; 125 NodeBlock basic_block;
126 for (u32 pc = begin; pc < (begin > end ? MAX_PROGRAM_LENGTH : end);) { 126 for (u32 pc = begin; pc < (begin > end ? MAX_PROGRAM_LENGTH : end);) {
127 pc = DecodeInstr(basic_block, pc); 127 pc = DecodeInstr(basic_block, pc);
128 } 128 }
129 return basic_block; 129 return basic_block;
130} 130}
131 131
132u32 ShaderIR::DecodeInstr(BasicBlock& bb, u32 pc) { 132u32 ShaderIR::DecodeInstr(NodeBlock& bb, u32 pc) {
133 // Ignore sched instructions when generating code. 133 // Ignore sched instructions when generating code.
134 if (IsSchedInstruction(pc, main_offset)) { 134 if (IsSchedInstruction(pc, main_offset)) {
135 return pc + 1; 135 return pc + 1;
@@ -151,39 +151,38 @@ u32 ShaderIR::DecodeInstr(BasicBlock& bb, u32 pc) {
151 UNIMPLEMENTED_IF_MSG(instr.pred.full_pred == Pred::NeverExecute, 151 UNIMPLEMENTED_IF_MSG(instr.pred.full_pred == Pred::NeverExecute,
152 "NeverExecute predicate not implemented"); 152 "NeverExecute predicate not implemented");
153 153
154 static const std::map<OpCode::Type, u32 (ShaderIR::*)(BasicBlock&, const BasicBlock&, u32)> 154 static const std::map<OpCode::Type, u32 (ShaderIR::*)(NodeBlock&, u32)> decoders = {
155 decoders = { 155 {OpCode::Type::Arithmetic, &ShaderIR::DecodeArithmetic},
156 {OpCode::Type::Arithmetic, &ShaderIR::DecodeArithmetic}, 156 {OpCode::Type::ArithmeticImmediate, &ShaderIR::DecodeArithmeticImmediate},
157 {OpCode::Type::ArithmeticImmediate, &ShaderIR::DecodeArithmeticImmediate}, 157 {OpCode::Type::Bfe, &ShaderIR::DecodeBfe},
158 {OpCode::Type::Bfe, &ShaderIR::DecodeBfe}, 158 {OpCode::Type::Bfi, &ShaderIR::DecodeBfi},
159 {OpCode::Type::Bfi, &ShaderIR::DecodeBfi}, 159 {OpCode::Type::Shift, &ShaderIR::DecodeShift},
160 {OpCode::Type::Shift, &ShaderIR::DecodeShift}, 160 {OpCode::Type::ArithmeticInteger, &ShaderIR::DecodeArithmeticInteger},
161 {OpCode::Type::ArithmeticInteger, &ShaderIR::DecodeArithmeticInteger}, 161 {OpCode::Type::ArithmeticIntegerImmediate, &ShaderIR::DecodeArithmeticIntegerImmediate},
162 {OpCode::Type::ArithmeticIntegerImmediate, &ShaderIR::DecodeArithmeticIntegerImmediate}, 162 {OpCode::Type::ArithmeticHalf, &ShaderIR::DecodeArithmeticHalf},
163 {OpCode::Type::ArithmeticHalf, &ShaderIR::DecodeArithmeticHalf}, 163 {OpCode::Type::ArithmeticHalfImmediate, &ShaderIR::DecodeArithmeticHalfImmediate},
164 {OpCode::Type::ArithmeticHalfImmediate, &ShaderIR::DecodeArithmeticHalfImmediate}, 164 {OpCode::Type::Ffma, &ShaderIR::DecodeFfma},
165 {OpCode::Type::Ffma, &ShaderIR::DecodeFfma}, 165 {OpCode::Type::Hfma2, &ShaderIR::DecodeHfma2},
166 {OpCode::Type::Hfma2, &ShaderIR::DecodeHfma2}, 166 {OpCode::Type::Conversion, &ShaderIR::DecodeConversion},
167 {OpCode::Type::Conversion, &ShaderIR::DecodeConversion}, 167 {OpCode::Type::Memory, &ShaderIR::DecodeMemory},
168 {OpCode::Type::Memory, &ShaderIR::DecodeMemory}, 168 {OpCode::Type::FloatSetPredicate, &ShaderIR::DecodeFloatSetPredicate},
169 {OpCode::Type::FloatSetPredicate, &ShaderIR::DecodeFloatSetPredicate}, 169 {OpCode::Type::IntegerSetPredicate, &ShaderIR::DecodeIntegerSetPredicate},
170 {OpCode::Type::IntegerSetPredicate, &ShaderIR::DecodeIntegerSetPredicate}, 170 {OpCode::Type::HalfSetPredicate, &ShaderIR::DecodeHalfSetPredicate},
171 {OpCode::Type::HalfSetPredicate, &ShaderIR::DecodeHalfSetPredicate}, 171 {OpCode::Type::PredicateSetRegister, &ShaderIR::DecodePredicateSetRegister},
172 {OpCode::Type::PredicateSetRegister, &ShaderIR::DecodePredicateSetRegister}, 172 {OpCode::Type::PredicateSetPredicate, &ShaderIR::DecodePredicateSetPredicate},
173 {OpCode::Type::PredicateSetPredicate, &ShaderIR::DecodePredicateSetPredicate}, 173 {OpCode::Type::RegisterSetPredicate, &ShaderIR::DecodeRegisterSetPredicate},
174 {OpCode::Type::RegisterSetPredicate, &ShaderIR::DecodeRegisterSetPredicate}, 174 {OpCode::Type::FloatSet, &ShaderIR::DecodeFloatSet},
175 {OpCode::Type::FloatSet, &ShaderIR::DecodeFloatSet}, 175 {OpCode::Type::IntegerSet, &ShaderIR::DecodeIntegerSet},
176 {OpCode::Type::IntegerSet, &ShaderIR::DecodeIntegerSet}, 176 {OpCode::Type::HalfSet, &ShaderIR::DecodeHalfSet},
177 {OpCode::Type::HalfSet, &ShaderIR::DecodeHalfSet}, 177 {OpCode::Type::Video, &ShaderIR::DecodeVideo},
178 {OpCode::Type::Video, &ShaderIR::DecodeVideo}, 178 {OpCode::Type::Xmad, &ShaderIR::DecodeXmad},
179 {OpCode::Type::Xmad, &ShaderIR::DecodeXmad}, 179 };
180 };
181 180
182 std::vector<Node> tmp_block; 181 std::vector<Node> tmp_block;
183 if (const auto decoder = decoders.find(opcode->get().GetType()); decoder != decoders.end()) { 182 if (const auto decoder = decoders.find(opcode->get().GetType()); decoder != decoders.end()) {
184 pc = (this->*decoder->second)(tmp_block, bb, pc); 183 pc = (this->*decoder->second)(tmp_block, pc);
185 } else { 184 } else {
186 pc = DecodeOther(tmp_block, bb, pc); 185 pc = DecodeOther(tmp_block, pc);
187 } 186 }
188 187
189 // Some instructions (like SSY) don't have a predicate field, they are always unconditionally 188 // Some instructions (like SSY) don't have a predicate field, they are always unconditionally
@@ -192,11 +191,14 @@ u32 ShaderIR::DecodeInstr(BasicBlock& bb, u32 pc) {
192 const auto pred_index = static_cast<u32>(instr.pred.pred_index); 191 const auto pred_index = static_cast<u32>(instr.pred.pred_index);
193 192
194 if (can_be_predicated && pred_index != static_cast<u32>(Pred::UnusedIndex)) { 193 if (can_be_predicated && pred_index != static_cast<u32>(Pred::UnusedIndex)) {
195 bb.push_back( 194 const Node conditional =
196 Conditional(GetPredicate(pred_index, instr.negate_pred != 0), std::move(tmp_block))); 195 Conditional(GetPredicate(pred_index, instr.negate_pred != 0), std::move(tmp_block));
196 global_code.push_back(conditional);
197 bb.push_back(conditional);
197 } else { 198 } else {
198 for (auto& node : tmp_block) { 199 for (auto& node : tmp_block) {
199 bb.push_back(std::move(node)); 200 global_code.push_back(node);
201 bb.push_back(node);
200 } 202 }
201 } 203 }
202 204
diff --git a/src/video_core/shader/decode/arithmetic.cpp b/src/video_core/shader/decode/arithmetic.cpp
index 51b8d55d4..3190e2d7c 100644
--- a/src/video_core/shader/decode/arithmetic.cpp
+++ b/src/video_core/shader/decode/arithmetic.cpp
@@ -13,7 +13,7 @@ using Tegra::Shader::Instruction;
13using Tegra::Shader::OpCode; 13using Tegra::Shader::OpCode;
14using Tegra::Shader::SubOp; 14using Tegra::Shader::SubOp;
15 15
16u32 ShaderIR::DecodeArithmetic(BasicBlock& bb, const BasicBlock& code, u32 pc) { 16u32 ShaderIR::DecodeArithmetic(NodeBlock& bb, u32 pc) {
17 const Instruction instr = {program_code[pc]}; 17 const Instruction instr = {program_code[pc]};
18 const auto opcode = OpCode::Decode(instr); 18 const auto opcode = OpCode::Decode(instr);
19 19
diff --git a/src/video_core/shader/decode/arithmetic_half.cpp b/src/video_core/shader/decode/arithmetic_half.cpp
index 37eef2bf2..baee89107 100644
--- a/src/video_core/shader/decode/arithmetic_half.cpp
+++ b/src/video_core/shader/decode/arithmetic_half.cpp
@@ -12,7 +12,7 @@ namespace VideoCommon::Shader {
12using Tegra::Shader::Instruction; 12using Tegra::Shader::Instruction;
13using Tegra::Shader::OpCode; 13using Tegra::Shader::OpCode;
14 14
15u32 ShaderIR::DecodeArithmeticHalf(BasicBlock& bb, const BasicBlock& code, u32 pc) { 15u32 ShaderIR::DecodeArithmeticHalf(NodeBlock& bb, u32 pc) {
16 const Instruction instr = {program_code[pc]}; 16 const Instruction instr = {program_code[pc]};
17 const auto opcode = OpCode::Decode(instr); 17 const auto opcode = OpCode::Decode(instr);
18 18
diff --git a/src/video_core/shader/decode/arithmetic_half_immediate.cpp b/src/video_core/shader/decode/arithmetic_half_immediate.cpp
index 7b4f7d284..c2164ba50 100644
--- a/src/video_core/shader/decode/arithmetic_half_immediate.cpp
+++ b/src/video_core/shader/decode/arithmetic_half_immediate.cpp
@@ -12,7 +12,7 @@ namespace VideoCommon::Shader {
12using Tegra::Shader::Instruction; 12using Tegra::Shader::Instruction;
13using Tegra::Shader::OpCode; 13using Tegra::Shader::OpCode;
14 14
15u32 ShaderIR::DecodeArithmeticHalfImmediate(BasicBlock& bb, const BasicBlock& code, u32 pc) { 15u32 ShaderIR::DecodeArithmeticHalfImmediate(NodeBlock& bb, u32 pc) {
16 const Instruction instr = {program_code[pc]}; 16 const Instruction instr = {program_code[pc]};
17 const auto opcode = OpCode::Decode(instr); 17 const auto opcode = OpCode::Decode(instr);
18 18
diff --git a/src/video_core/shader/decode/arithmetic_immediate.cpp b/src/video_core/shader/decode/arithmetic_immediate.cpp
index 4fd3db54e..0d139c0d2 100644
--- a/src/video_core/shader/decode/arithmetic_immediate.cpp
+++ b/src/video_core/shader/decode/arithmetic_immediate.cpp
@@ -12,7 +12,7 @@ namespace VideoCommon::Shader {
12using Tegra::Shader::Instruction; 12using Tegra::Shader::Instruction;
13using Tegra::Shader::OpCode; 13using Tegra::Shader::OpCode;
14 14
15u32 ShaderIR::DecodeArithmeticImmediate(BasicBlock& bb, const BasicBlock& code, u32 pc) { 15u32 ShaderIR::DecodeArithmeticImmediate(NodeBlock& bb, u32 pc) {
16 const Instruction instr = {program_code[pc]}; 16 const Instruction instr = {program_code[pc]};
17 const auto opcode = OpCode::Decode(instr); 17 const auto opcode = OpCode::Decode(instr);
18 18
diff --git a/src/video_core/shader/decode/arithmetic_integer.cpp b/src/video_core/shader/decode/arithmetic_integer.cpp
index cc9a76a19..38bb692d6 100644
--- a/src/video_core/shader/decode/arithmetic_integer.cpp
+++ b/src/video_core/shader/decode/arithmetic_integer.cpp
@@ -15,7 +15,7 @@ using Tegra::Shader::OpCode;
15using Tegra::Shader::Pred; 15using Tegra::Shader::Pred;
16using Tegra::Shader::Register; 16using Tegra::Shader::Register;
17 17
18u32 ShaderIR::DecodeArithmeticInteger(BasicBlock& bb, const BasicBlock& code, u32 pc) { 18u32 ShaderIR::DecodeArithmeticInteger(NodeBlock& bb, u32 pc) {
19 const Instruction instr = {program_code[pc]}; 19 const Instruction instr = {program_code[pc]};
20 const auto opcode = OpCode::Decode(instr); 20 const auto opcode = OpCode::Decode(instr);
21 21
@@ -242,7 +242,7 @@ u32 ShaderIR::DecodeArithmeticInteger(BasicBlock& bb, const BasicBlock& code, u3
242 return pc; 242 return pc;
243} 243}
244 244
245void ShaderIR::WriteLop3Instruction(BasicBlock& bb, Register dest, Node op_a, Node op_b, Node op_c, 245void ShaderIR::WriteLop3Instruction(NodeBlock& bb, Register dest, Node op_a, Node op_b, Node op_c,
246 Node imm_lut, bool sets_cc) { 246 Node imm_lut, bool sets_cc) {
247 constexpr u32 lop_iterations = 32; 247 constexpr u32 lop_iterations = 32;
248 const Node one = Immediate(1); 248 const Node one = Immediate(1);
diff --git a/src/video_core/shader/decode/arithmetic_integer_immediate.cpp b/src/video_core/shader/decode/arithmetic_integer_immediate.cpp
index b26a6e473..3ed5ccc5a 100644
--- a/src/video_core/shader/decode/arithmetic_integer_immediate.cpp
+++ b/src/video_core/shader/decode/arithmetic_integer_immediate.cpp
@@ -16,7 +16,7 @@ using Tegra::Shader::Pred;
16using Tegra::Shader::PredicateResultMode; 16using Tegra::Shader::PredicateResultMode;
17using Tegra::Shader::Register; 17using Tegra::Shader::Register;
18 18
19u32 ShaderIR::DecodeArithmeticIntegerImmediate(BasicBlock& bb, const BasicBlock& code, u32 pc) { 19u32 ShaderIR::DecodeArithmeticIntegerImmediate(NodeBlock& bb, u32 pc) {
20 const Instruction instr = {program_code[pc]}; 20 const Instruction instr = {program_code[pc]};
21 const auto opcode = OpCode::Decode(instr); 21 const auto opcode = OpCode::Decode(instr);
22 22
@@ -54,9 +54,9 @@ u32 ShaderIR::DecodeArithmeticIntegerImmediate(BasicBlock& bb, const BasicBlock&
54 return pc; 54 return pc;
55} 55}
56 56
57void ShaderIR::WriteLogicOperation(BasicBlock& bb, Register dest, LogicOperation logic_op, 57void ShaderIR::WriteLogicOperation(NodeBlock& bb, Register dest, LogicOperation logic_op, Node op_a,
58 Node op_a, Node op_b, PredicateResultMode predicate_mode, 58 Node op_b, PredicateResultMode predicate_mode, Pred predicate,
59 Pred predicate, bool sets_cc) { 59 bool sets_cc) {
60 const Node result = [&]() { 60 const Node result = [&]() {
61 switch (logic_op) { 61 switch (logic_op) {
62 case LogicOperation::And: 62 case LogicOperation::And:
diff --git a/src/video_core/shader/decode/bfe.cpp b/src/video_core/shader/decode/bfe.cpp
index 0734141b0..6a95dc928 100644
--- a/src/video_core/shader/decode/bfe.cpp
+++ b/src/video_core/shader/decode/bfe.cpp
@@ -12,7 +12,7 @@ namespace VideoCommon::Shader {
12using Tegra::Shader::Instruction; 12using Tegra::Shader::Instruction;
13using Tegra::Shader::OpCode; 13using Tegra::Shader::OpCode;
14 14
15u32 ShaderIR::DecodeBfe(BasicBlock& bb, const BasicBlock& code, u32 pc) { 15u32 ShaderIR::DecodeBfe(NodeBlock& bb, u32 pc) {
16 const Instruction instr = {program_code[pc]}; 16 const Instruction instr = {program_code[pc]};
17 const auto opcode = OpCode::Decode(instr); 17 const auto opcode = OpCode::Decode(instr);
18 18
diff --git a/src/video_core/shader/decode/bfi.cpp b/src/video_core/shader/decode/bfi.cpp
index 942d6729d..601d66f1f 100644
--- a/src/video_core/shader/decode/bfi.cpp
+++ b/src/video_core/shader/decode/bfi.cpp
@@ -12,7 +12,7 @@ namespace VideoCommon::Shader {
12using Tegra::Shader::Instruction; 12using Tegra::Shader::Instruction;
13using Tegra::Shader::OpCode; 13using Tegra::Shader::OpCode;
14 14
15u32 ShaderIR::DecodeBfi(BasicBlock& bb, const BasicBlock& code, u32 pc) { 15u32 ShaderIR::DecodeBfi(NodeBlock& bb, u32 pc) {
16 const Instruction instr = {program_code[pc]}; 16 const Instruction instr = {program_code[pc]};
17 const auto opcode = OpCode::Decode(instr); 17 const auto opcode = OpCode::Decode(instr);
18 18
diff --git a/src/video_core/shader/decode/conversion.cpp b/src/video_core/shader/decode/conversion.cpp
index 728a393a1..a992f73f8 100644
--- a/src/video_core/shader/decode/conversion.cpp
+++ b/src/video_core/shader/decode/conversion.cpp
@@ -13,7 +13,7 @@ using Tegra::Shader::Instruction;
13using Tegra::Shader::OpCode; 13using Tegra::Shader::OpCode;
14using Tegra::Shader::Register; 14using Tegra::Shader::Register;
15 15
16u32 ShaderIR::DecodeConversion(BasicBlock& bb, const BasicBlock& code, u32 pc) { 16u32 ShaderIR::DecodeConversion(NodeBlock& bb, u32 pc) {
17 const Instruction instr = {program_code[pc]}; 17 const Instruction instr = {program_code[pc]};
18 const auto opcode = OpCode::Decode(instr); 18 const auto opcode = OpCode::Decode(instr);
19 19
diff --git a/src/video_core/shader/decode/ffma.cpp b/src/video_core/shader/decode/ffma.cpp
index 52f39d3ff..0559cc8de 100644
--- a/src/video_core/shader/decode/ffma.cpp
+++ b/src/video_core/shader/decode/ffma.cpp
@@ -12,7 +12,7 @@ namespace VideoCommon::Shader {
12using Tegra::Shader::Instruction; 12using Tegra::Shader::Instruction;
13using Tegra::Shader::OpCode; 13using Tegra::Shader::OpCode;
14 14
15u32 ShaderIR::DecodeFfma(BasicBlock& bb, const BasicBlock& code, u32 pc) { 15u32 ShaderIR::DecodeFfma(NodeBlock& bb, u32 pc) {
16 const Instruction instr = {program_code[pc]}; 16 const Instruction instr = {program_code[pc]};
17 const auto opcode = OpCode::Decode(instr); 17 const auto opcode = OpCode::Decode(instr);
18 18
diff --git a/src/video_core/shader/decode/float_set.cpp b/src/video_core/shader/decode/float_set.cpp
index 9f9da2278..1bd6755dd 100644
--- a/src/video_core/shader/decode/float_set.cpp
+++ b/src/video_core/shader/decode/float_set.cpp
@@ -12,7 +12,7 @@ namespace VideoCommon::Shader {
12using Tegra::Shader::Instruction; 12using Tegra::Shader::Instruction;
13using Tegra::Shader::OpCode; 13using Tegra::Shader::OpCode;
14 14
15u32 ShaderIR::DecodeFloatSet(BasicBlock& bb, const BasicBlock& code, u32 pc) { 15u32 ShaderIR::DecodeFloatSet(NodeBlock& bb, u32 pc) {
16 const Instruction instr = {program_code[pc]}; 16 const Instruction instr = {program_code[pc]};
17 const auto opcode = OpCode::Decode(instr); 17 const auto opcode = OpCode::Decode(instr);
18 18
diff --git a/src/video_core/shader/decode/float_set_predicate.cpp b/src/video_core/shader/decode/float_set_predicate.cpp
index dd3aef6f2..9285b8d05 100644
--- a/src/video_core/shader/decode/float_set_predicate.cpp
+++ b/src/video_core/shader/decode/float_set_predicate.cpp
@@ -13,7 +13,7 @@ using Tegra::Shader::Instruction;
13using Tegra::Shader::OpCode; 13using Tegra::Shader::OpCode;
14using Tegra::Shader::Pred; 14using Tegra::Shader::Pred;
15 15
16u32 ShaderIR::DecodeFloatSetPredicate(BasicBlock& bb, const BasicBlock& code, u32 pc) { 16u32 ShaderIR::DecodeFloatSetPredicate(NodeBlock& bb, u32 pc) {
17 const Instruction instr = {program_code[pc]}; 17 const Instruction instr = {program_code[pc]};
18 const auto opcode = OpCode::Decode(instr); 18 const auto opcode = OpCode::Decode(instr);
19 19
diff --git a/src/video_core/shader/decode/half_set.cpp b/src/video_core/shader/decode/half_set.cpp
index dfd7cb98f..748368555 100644
--- a/src/video_core/shader/decode/half_set.cpp
+++ b/src/video_core/shader/decode/half_set.cpp
@@ -14,7 +14,7 @@ namespace VideoCommon::Shader {
14using Tegra::Shader::Instruction; 14using Tegra::Shader::Instruction;
15using Tegra::Shader::OpCode; 15using Tegra::Shader::OpCode;
16 16
17u32 ShaderIR::DecodeHalfSet(BasicBlock& bb, const BasicBlock& code, u32 pc) { 17u32 ShaderIR::DecodeHalfSet(NodeBlock& bb, u32 pc) {
18 const Instruction instr = {program_code[pc]}; 18 const Instruction instr = {program_code[pc]};
19 const auto opcode = OpCode::Decode(instr); 19 const auto opcode = OpCode::Decode(instr);
20 20
diff --git a/src/video_core/shader/decode/half_set_predicate.cpp b/src/video_core/shader/decode/half_set_predicate.cpp
index 53c44ae5a..e68512692 100644
--- a/src/video_core/shader/decode/half_set_predicate.cpp
+++ b/src/video_core/shader/decode/half_set_predicate.cpp
@@ -13,7 +13,7 @@ using Tegra::Shader::Instruction;
13using Tegra::Shader::OpCode; 13using Tegra::Shader::OpCode;
14using Tegra::Shader::Pred; 14using Tegra::Shader::Pred;
15 15
16u32 ShaderIR::DecodeHalfSetPredicate(BasicBlock& bb, const BasicBlock& code, u32 pc) { 16u32 ShaderIR::DecodeHalfSetPredicate(NodeBlock& bb, u32 pc) {
17 const Instruction instr = {program_code[pc]}; 17 const Instruction instr = {program_code[pc]};
18 const auto opcode = OpCode::Decode(instr); 18 const auto opcode = OpCode::Decode(instr);
19 19
diff --git a/src/video_core/shader/decode/hfma2.cpp b/src/video_core/shader/decode/hfma2.cpp
index 43a0a9e10..7a07c5ec6 100644
--- a/src/video_core/shader/decode/hfma2.cpp
+++ b/src/video_core/shader/decode/hfma2.cpp
@@ -16,7 +16,7 @@ using Tegra::Shader::HalfType;
16using Tegra::Shader::Instruction; 16using Tegra::Shader::Instruction;
17using Tegra::Shader::OpCode; 17using Tegra::Shader::OpCode;
18 18
19u32 ShaderIR::DecodeHfma2(BasicBlock& bb, const BasicBlock& code, u32 pc) { 19u32 ShaderIR::DecodeHfma2(NodeBlock& bb, u32 pc) {
20 const Instruction instr = {program_code[pc]}; 20 const Instruction instr = {program_code[pc]};
21 const auto opcode = OpCode::Decode(instr); 21 const auto opcode = OpCode::Decode(instr);
22 22
diff --git a/src/video_core/shader/decode/integer_set.cpp b/src/video_core/shader/decode/integer_set.cpp
index 16eb3985f..a3bf17eba 100644
--- a/src/video_core/shader/decode/integer_set.cpp
+++ b/src/video_core/shader/decode/integer_set.cpp
@@ -12,7 +12,7 @@ namespace VideoCommon::Shader {
12using Tegra::Shader::Instruction; 12using Tegra::Shader::Instruction;
13using Tegra::Shader::OpCode; 13using Tegra::Shader::OpCode;
14 14
15u32 ShaderIR::DecodeIntegerSet(BasicBlock& bb, const BasicBlock& code, u32 pc) { 15u32 ShaderIR::DecodeIntegerSet(NodeBlock& bb, u32 pc) {
16 const Instruction instr = {program_code[pc]}; 16 const Instruction instr = {program_code[pc]};
17 const auto opcode = OpCode::Decode(instr); 17 const auto opcode = OpCode::Decode(instr);
18 18
diff --git a/src/video_core/shader/decode/integer_set_predicate.cpp b/src/video_core/shader/decode/integer_set_predicate.cpp
index daf97174b..aad836d24 100644
--- a/src/video_core/shader/decode/integer_set_predicate.cpp
+++ b/src/video_core/shader/decode/integer_set_predicate.cpp
@@ -13,7 +13,7 @@ using Tegra::Shader::Instruction;
13using Tegra::Shader::OpCode; 13using Tegra::Shader::OpCode;
14using Tegra::Shader::Pred; 14using Tegra::Shader::Pred;
15 15
16u32 ShaderIR::DecodeIntegerSetPredicate(BasicBlock& bb, const BasicBlock& code, u32 pc) { 16u32 ShaderIR::DecodeIntegerSetPredicate(NodeBlock& bb, u32 pc) {
17 const Instruction instr = {program_code[pc]}; 17 const Instruction instr = {program_code[pc]};
18 const auto opcode = OpCode::Decode(instr); 18 const auto opcode = OpCode::Decode(instr);
19 19
diff --git a/src/video_core/shader/decode/memory.cpp b/src/video_core/shader/decode/memory.cpp
index 3dd26da20..e006f8138 100644
--- a/src/video_core/shader/decode/memory.cpp
+++ b/src/video_core/shader/decode/memory.cpp
@@ -36,7 +36,7 @@ static std::size_t GetCoordCount(TextureType texture_type) {
36 } 36 }
37} 37}
38 38
39u32 ShaderIR::DecodeMemory(BasicBlock& bb, const BasicBlock& code, u32 pc) { 39u32 ShaderIR::DecodeMemory(NodeBlock& bb, u32 pc) {
40 const Instruction instr = {program_code[pc]}; 40 const Instruction instr = {program_code[pc]};
41 const auto opcode = OpCode::Decode(instr); 41 const auto opcode = OpCode::Decode(instr);
42 42
@@ -160,7 +160,8 @@ u32 ShaderIR::DecodeMemory(BasicBlock& bb, const BasicBlock& code, u32 pc) {
160 }(); 160 }();
161 161
162 const Node addr_register = GetRegister(instr.gpr8); 162 const Node addr_register = GetRegister(instr.gpr8);
163 const Node base_address = TrackCbuf(addr_register, code, static_cast<s64>(code.size())); 163 const Node base_address =
164 TrackCbuf(addr_register, global_code, static_cast<s64>(global_code.size()));
164 const auto cbuf = std::get_if<CbufNode>(base_address); 165 const auto cbuf = std::get_if<CbufNode>(base_address);
165 ASSERT(cbuf != nullptr); 166 ASSERT(cbuf != nullptr);
166 const auto cbuf_offset_imm = std::get_if<ImmediateNode>(cbuf->GetOffset()); 167 const auto cbuf_offset_imm = std::get_if<ImmediateNode>(cbuf->GetOffset());
@@ -464,8 +465,7 @@ const Sampler& ShaderIR::GetSampler(const Tegra::Shader::Sampler& sampler, Textu
464 return *used_samplers.emplace(entry).first; 465 return *used_samplers.emplace(entry).first;
465} 466}
466 467
467void ShaderIR::WriteTexInstructionFloat(BasicBlock& bb, Instruction instr, 468void ShaderIR::WriteTexInstructionFloat(NodeBlock& bb, Instruction instr, const Node4& components) {
468 const Node4& components) {
469 u32 dest_elem = 0; 469 u32 dest_elem = 0;
470 for (u32 elem = 0; elem < 4; ++elem) { 470 for (u32 elem = 0; elem < 4; ++elem) {
471 if (!instr.tex.IsComponentEnabled(elem)) { 471 if (!instr.tex.IsComponentEnabled(elem)) {
@@ -480,7 +480,7 @@ void ShaderIR::WriteTexInstructionFloat(BasicBlock& bb, Instruction instr,
480 } 480 }
481} 481}
482 482
483void ShaderIR::WriteTexsInstructionFloat(BasicBlock& bb, Instruction instr, 483void ShaderIR::WriteTexsInstructionFloat(NodeBlock& bb, Instruction instr,
484 const Node4& components) { 484 const Node4& components) {
485 // TEXS has two destination registers and a swizzle. The first two elements in the swizzle 485 // TEXS has two destination registers and a swizzle. The first two elements in the swizzle
486 // go into gpr0+0 and gpr0+1, and the rest goes into gpr28+0 and gpr28+1 486 // go into gpr0+0 and gpr0+1, and the rest goes into gpr28+0 and gpr28+1
@@ -504,7 +504,7 @@ void ShaderIR::WriteTexsInstructionFloat(BasicBlock& bb, Instruction instr,
504 } 504 }
505} 505}
506 506
507void ShaderIR::WriteTexsInstructionHalfFloat(BasicBlock& bb, Instruction instr, 507void ShaderIR::WriteTexsInstructionHalfFloat(NodeBlock& bb, Instruction instr,
508 const Node4& components) { 508 const Node4& components) {
509 // TEXS.F16 destionation registers are packed in two registers in pairs (just like any half 509 // TEXS.F16 destionation registers are packed in two registers in pairs (just like any half
510 // float instruction). 510 // float instruction).
diff --git a/src/video_core/shader/decode/other.cpp b/src/video_core/shader/decode/other.cpp
index c1e5f4efb..f9502e3d0 100644
--- a/src/video_core/shader/decode/other.cpp
+++ b/src/video_core/shader/decode/other.cpp
@@ -14,7 +14,7 @@ using Tegra::Shader::Instruction;
14using Tegra::Shader::OpCode; 14using Tegra::Shader::OpCode;
15using Tegra::Shader::Register; 15using Tegra::Shader::Register;
16 16
17u32 ShaderIR::DecodeOther(BasicBlock& bb, const BasicBlock& code, u32 pc) { 17u32 ShaderIR::DecodeOther(NodeBlock& bb, u32 pc) {
18 const Instruction instr = {program_code[pc]}; 18 const Instruction instr = {program_code[pc]};
19 const auto opcode = OpCode::Decode(instr); 19 const auto opcode = OpCode::Decode(instr);
20 20
diff --git a/src/video_core/shader/decode/predicate_set_predicate.cpp b/src/video_core/shader/decode/predicate_set_predicate.cpp
index 1717f0653..83c61680e 100644
--- a/src/video_core/shader/decode/predicate_set_predicate.cpp
+++ b/src/video_core/shader/decode/predicate_set_predicate.cpp
@@ -13,7 +13,7 @@ using Tegra::Shader::Instruction;
13using Tegra::Shader::OpCode; 13using Tegra::Shader::OpCode;
14using Tegra::Shader::Pred; 14using Tegra::Shader::Pred;
15 15
16u32 ShaderIR::DecodePredicateSetPredicate(BasicBlock& bb, const BasicBlock& code, u32 pc) { 16u32 ShaderIR::DecodePredicateSetPredicate(NodeBlock& bb, u32 pc) {
17 const Instruction instr = {program_code[pc]}; 17 const Instruction instr = {program_code[pc]};
18 const auto opcode = OpCode::Decode(instr); 18 const auto opcode = OpCode::Decode(instr);
19 19
diff --git a/src/video_core/shader/decode/predicate_set_register.cpp b/src/video_core/shader/decode/predicate_set_register.cpp
index 8bd15fb00..d0495995d 100644
--- a/src/video_core/shader/decode/predicate_set_register.cpp
+++ b/src/video_core/shader/decode/predicate_set_register.cpp
@@ -12,7 +12,7 @@ namespace VideoCommon::Shader {
12using Tegra::Shader::Instruction; 12using Tegra::Shader::Instruction;
13using Tegra::Shader::OpCode; 13using Tegra::Shader::OpCode;
14 14
15u32 ShaderIR::DecodePredicateSetRegister(BasicBlock& bb, const BasicBlock& code, u32 pc) { 15u32 ShaderIR::DecodePredicateSetRegister(NodeBlock& bb, u32 pc) {
16 const Instruction instr = {program_code[pc]}; 16 const Instruction instr = {program_code[pc]};
17 const auto opcode = OpCode::Decode(instr); 17 const auto opcode = OpCode::Decode(instr);
18 18
diff --git a/src/video_core/shader/decode/register_set_predicate.cpp b/src/video_core/shader/decode/register_set_predicate.cpp
index bdb4424a6..f070e8912 100644
--- a/src/video_core/shader/decode/register_set_predicate.cpp
+++ b/src/video_core/shader/decode/register_set_predicate.cpp
@@ -12,7 +12,7 @@ namespace VideoCommon::Shader {
12using Tegra::Shader::Instruction; 12using Tegra::Shader::Instruction;
13using Tegra::Shader::OpCode; 13using Tegra::Shader::OpCode;
14 14
15u32 ShaderIR::DecodeRegisterSetPredicate(BasicBlock& bb, const BasicBlock& code, u32 pc) { 15u32 ShaderIR::DecodeRegisterSetPredicate(NodeBlock& bb, u32 pc) {
16 const Instruction instr = {program_code[pc]}; 16 const Instruction instr = {program_code[pc]};
17 const auto opcode = OpCode::Decode(instr); 17 const auto opcode = OpCode::Decode(instr);
18 18
diff --git a/src/video_core/shader/decode/shift.cpp b/src/video_core/shader/decode/shift.cpp
index 6623f8ff9..951e85f44 100644
--- a/src/video_core/shader/decode/shift.cpp
+++ b/src/video_core/shader/decode/shift.cpp
@@ -12,7 +12,7 @@ namespace VideoCommon::Shader {
12using Tegra::Shader::Instruction; 12using Tegra::Shader::Instruction;
13using Tegra::Shader::OpCode; 13using Tegra::Shader::OpCode;
14 14
15u32 ShaderIR::DecodeShift(BasicBlock& bb, const BasicBlock& code, u32 pc) { 15u32 ShaderIR::DecodeShift(NodeBlock& bb, u32 pc) {
16 const Instruction instr = {program_code[pc]}; 16 const Instruction instr = {program_code[pc]};
17 const auto opcode = OpCode::Decode(instr); 17 const auto opcode = OpCode::Decode(instr);
18 18
diff --git a/src/video_core/shader/decode/video.cpp b/src/video_core/shader/decode/video.cpp
index c3432356d..956c01d9b 100644
--- a/src/video_core/shader/decode/video.cpp
+++ b/src/video_core/shader/decode/video.cpp
@@ -15,7 +15,7 @@ using Tegra::Shader::Pred;
15using Tegra::Shader::VideoType; 15using Tegra::Shader::VideoType;
16using Tegra::Shader::VmadShr; 16using Tegra::Shader::VmadShr;
17 17
18u32 ShaderIR::DecodeVideo(BasicBlock& bb, const BasicBlock& code, u32 pc) { 18u32 ShaderIR::DecodeVideo(NodeBlock& bb, u32 pc) {
19 const Instruction instr = {program_code[pc]}; 19 const Instruction instr = {program_code[pc]};
20 const auto opcode = OpCode::Decode(instr); 20 const auto opcode = OpCode::Decode(instr);
21 21
diff --git a/src/video_core/shader/decode/xmad.cpp b/src/video_core/shader/decode/xmad.cpp
index 9cb864500..c34843307 100644
--- a/src/video_core/shader/decode/xmad.cpp
+++ b/src/video_core/shader/decode/xmad.cpp
@@ -12,7 +12,7 @@ namespace VideoCommon::Shader {
12using Tegra::Shader::Instruction; 12using Tegra::Shader::Instruction;
13using Tegra::Shader::OpCode; 13using Tegra::Shader::OpCode;
14 14
15u32 ShaderIR::DecodeXmad(BasicBlock& bb, const BasicBlock& code, u32 pc) { 15u32 ShaderIR::DecodeXmad(NodeBlock& bb, u32 pc) {
16 const Instruction instr = {program_code[pc]}; 16 const Instruction instr = {program_code[pc]};
17 const auto opcode = OpCode::Decode(instr); 17 const auto opcode = OpCode::Decode(instr);
18 18
diff --git a/src/video_core/shader/shader_ir.cpp b/src/video_core/shader/shader_ir.cpp
index d7747103e..ac5112d78 100644
--- a/src/video_core/shader/shader_ir.cpp
+++ b/src/video_core/shader/shader_ir.cpp
@@ -337,27 +337,27 @@ Node ShaderIR::GetConditionCode(Tegra::Shader::ConditionCode cc) {
337 } 337 }
338} 338}
339 339
340void ShaderIR::SetRegister(BasicBlock& bb, Register dest, Node src) { 340void ShaderIR::SetRegister(NodeBlock& bb, Register dest, Node src) {
341 bb.push_back(Operation(OperationCode::Assign, GetRegister(dest), src)); 341 bb.push_back(Operation(OperationCode::Assign, GetRegister(dest), src));
342} 342}
343 343
344void ShaderIR::SetPredicate(BasicBlock& bb, u64 dest, Node src) { 344void ShaderIR::SetPredicate(NodeBlock& bb, u64 dest, Node src) {
345 bb.push_back(Operation(OperationCode::LogicalAssign, GetPredicate(dest), src)); 345 bb.push_back(Operation(OperationCode::LogicalAssign, GetPredicate(dest), src));
346} 346}
347 347
348void ShaderIR::SetInternalFlag(BasicBlock& bb, InternalFlag flag, Node value) { 348void ShaderIR::SetInternalFlag(NodeBlock& bb, InternalFlag flag, Node value) {
349 bb.push_back(Operation(OperationCode::LogicalAssign, GetInternalFlag(flag), value)); 349 bb.push_back(Operation(OperationCode::LogicalAssign, GetInternalFlag(flag), value));
350} 350}
351 351
352void ShaderIR::SetLocalMemory(BasicBlock& bb, Node address, Node value) { 352void ShaderIR::SetLocalMemory(NodeBlock& bb, Node address, Node value) {
353 bb.push_back(Operation(OperationCode::Assign, GetLocalMemory(address), value)); 353 bb.push_back(Operation(OperationCode::Assign, GetLocalMemory(address), value));
354} 354}
355 355
356void ShaderIR::SetTemporal(BasicBlock& bb, u32 id, Node value) { 356void ShaderIR::SetTemporal(NodeBlock& bb, u32 id, Node value) {
357 SetRegister(bb, Register::ZeroIndex + 1 + id, value); 357 SetRegister(bb, Register::ZeroIndex + 1 + id, value);
358} 358}
359 359
360void ShaderIR::SetInternalFlagsFromFloat(BasicBlock& bb, Node value, bool sets_cc) { 360void ShaderIR::SetInternalFlagsFromFloat(NodeBlock& bb, Node value, bool sets_cc) {
361 if (!sets_cc) { 361 if (!sets_cc) {
362 return; 362 return;
363 } 363 }
@@ -366,7 +366,7 @@ void ShaderIR::SetInternalFlagsFromFloat(BasicBlock& bb, Node value, bool sets_c
366 LOG_WARNING(HW_GPU, "Condition codes implementation is incomplete"); 366 LOG_WARNING(HW_GPU, "Condition codes implementation is incomplete");
367} 367}
368 368
369void ShaderIR::SetInternalFlagsFromInteger(BasicBlock& bb, Node value, bool sets_cc) { 369void ShaderIR::SetInternalFlagsFromInteger(NodeBlock& bb, Node value, bool sets_cc) {
370 if (!sets_cc) { 370 if (!sets_cc) {
371 return; 371 return;
372 } 372 }
diff --git a/src/video_core/shader/shader_ir.h b/src/video_core/shader/shader_ir.h
index ef0f3a106..1d4fbef53 100644
--- a/src/video_core/shader/shader_ir.h
+++ b/src/video_core/shader/shader_ir.h
@@ -39,7 +39,7 @@ using NodeData =
39 PredicateNode, AbufNode, CbufNode, LmemNode, GmemNode, CommentNode>; 39 PredicateNode, AbufNode, CbufNode, LmemNode, GmemNode, CommentNode>;
40using Node = const NodeData*; 40using Node = const NodeData*;
41using Node4 = std::array<Node, 4>; 41using Node4 = std::array<Node, 4>;
42using BasicBlock = std::vector<Node>; 42using NodeBlock = std::vector<Node>;
43 43
44constexpr u32 MAX_PROGRAM_LENGTH = 0x1000; 44constexpr u32 MAX_PROGRAM_LENGTH = 0x1000;
45 45
@@ -539,7 +539,7 @@ public:
539 Decode(); 539 Decode();
540 } 540 }
541 541
542 const std::map<u32, BasicBlock>& GetBasicBlocks() const { 542 const std::map<u32, NodeBlock>& GetBasicBlocks() const {
543 return basic_blocks; 543 return basic_blocks;
544 } 544 }
545 545
@@ -590,7 +590,7 @@ private:
590 590
591 ExitMethod Scan(u32 begin, u32 end, std::set<u32>& labels); 591 ExitMethod Scan(u32 begin, u32 end, std::set<u32>& labels);
592 592
593 BasicBlock DecodeRange(u32 begin, u32 end); 593 NodeBlock DecodeRange(u32 begin, u32 end);
594 594
595 /** 595 /**
596 * Decodes a single instruction from Tegra to IR. 596 * Decodes a single instruction from Tegra to IR.
@@ -598,33 +598,33 @@ private:
598 * @param pc Program counter. Offset to decode. 598 * @param pc Program counter. Offset to decode.
599 * @return Next address to decode. 599 * @return Next address to decode.
600 */ 600 */
601 u32 DecodeInstr(BasicBlock& bb, u32 pc); 601 u32 DecodeInstr(NodeBlock& bb, u32 pc);
602 602
603 u32 DecodeArithmetic(BasicBlock& bb, const BasicBlock& code, u32 pc); 603 u32 DecodeArithmetic(NodeBlock& bb, u32 pc);
604 u32 DecodeArithmeticImmediate(BasicBlock& bb, const BasicBlock& code, u32 pc); 604 u32 DecodeArithmeticImmediate(NodeBlock& bb, u32 pc);
605 u32 DecodeBfe(BasicBlock& bb, const BasicBlock& code, u32 pc); 605 u32 DecodeBfe(NodeBlock& bb, u32 pc);
606 u32 DecodeBfi(BasicBlock& bb, const BasicBlock& code, u32 pc); 606 u32 DecodeBfi(NodeBlock& bb, u32 pc);
607 u32 DecodeShift(BasicBlock& bb, const BasicBlock& code, u32 pc); 607 u32 DecodeShift(NodeBlock& bb, u32 pc);
608 u32 DecodeArithmeticInteger(BasicBlock& bb, const BasicBlock& code, u32 pc); 608 u32 DecodeArithmeticInteger(NodeBlock& bb, u32 pc);
609 u32 DecodeArithmeticIntegerImmediate(BasicBlock& bb, const BasicBlock& code, u32 pc); 609 u32 DecodeArithmeticIntegerImmediate(NodeBlock& bb, u32 pc);
610 u32 DecodeArithmeticHalf(BasicBlock& bb, const BasicBlock& code, u32 pc); 610 u32 DecodeArithmeticHalf(NodeBlock& bb, u32 pc);
611 u32 DecodeArithmeticHalfImmediate(BasicBlock& bb, const BasicBlock& code, u32 pc); 611 u32 DecodeArithmeticHalfImmediate(NodeBlock& bb, u32 pc);
612 u32 DecodeFfma(BasicBlock& bb, const BasicBlock& code, u32 pc); 612 u32 DecodeFfma(NodeBlock& bb, u32 pc);
613 u32 DecodeHfma2(BasicBlock& bb, const BasicBlock& code, u32 pc); 613 u32 DecodeHfma2(NodeBlock& bb, u32 pc);
614 u32 DecodeConversion(BasicBlock& bb, const BasicBlock& code, u32 pc); 614 u32 DecodeConversion(NodeBlock& bb, u32 pc);
615 u32 DecodeMemory(BasicBlock& bb, const BasicBlock& code, u32 pc); 615 u32 DecodeMemory(NodeBlock& bb, u32 pc);
616 u32 DecodeFloatSetPredicate(BasicBlock& bb, const BasicBlock& code, u32 pc); 616 u32 DecodeFloatSetPredicate(NodeBlock& bb, u32 pc);
617 u32 DecodeIntegerSetPredicate(BasicBlock& bb, const BasicBlock& code, u32 pc); 617 u32 DecodeIntegerSetPredicate(NodeBlock& bb, u32 pc);
618 u32 DecodeHalfSetPredicate(BasicBlock& bb, const BasicBlock& code, u32 pc); 618 u32 DecodeHalfSetPredicate(NodeBlock& bb, u32 pc);
619 u32 DecodePredicateSetRegister(BasicBlock& bb, const BasicBlock& code, u32 pc); 619 u32 DecodePredicateSetRegister(NodeBlock& bb, u32 pc);
620 u32 DecodePredicateSetPredicate(BasicBlock& bb, const BasicBlock& code, u32 pc); 620 u32 DecodePredicateSetPredicate(NodeBlock& bb, u32 pc);
621 u32 DecodeRegisterSetPredicate(BasicBlock& bb, const BasicBlock& code, u32 pc); 621 u32 DecodeRegisterSetPredicate(NodeBlock& bb, u32 pc);
622 u32 DecodeFloatSet(BasicBlock& bb, const BasicBlock& code, u32 pc); 622 u32 DecodeFloatSet(NodeBlock& bb, u32 pc);
623 u32 DecodeIntegerSet(BasicBlock& bb, const BasicBlock& code, u32 pc); 623 u32 DecodeIntegerSet(NodeBlock& bb, u32 pc);
624 u32 DecodeHalfSet(BasicBlock& bb, const BasicBlock& code, u32 pc); 624 u32 DecodeHalfSet(NodeBlock& bb, u32 pc);
625 u32 DecodeVideo(BasicBlock& bb, const BasicBlock& code, u32 pc); 625 u32 DecodeVideo(NodeBlock& bb, u32 pc);
626 u32 DecodeXmad(BasicBlock& bb, const BasicBlock& code, u32 pc); 626 u32 DecodeXmad(NodeBlock& bb, u32 pc);
627 u32 DecodeOther(BasicBlock& bb, const BasicBlock& code, u32 pc); 627 u32 DecodeOther(NodeBlock& bb, u32 pc);
628 628
629 /// Internalizes node's data and returns a managed pointer to a clone of that node 629 /// Internalizes node's data and returns a managed pointer to a clone of that node
630 Node StoreNode(NodeData&& node_data); 630 Node StoreNode(NodeData&& node_data);
@@ -673,20 +673,20 @@ private:
673 Node GetTemporal(u32 id); 673 Node GetTemporal(u32 id);
674 674
675 /// Sets a register. src value must be a number-evaluated node. 675 /// Sets a register. src value must be a number-evaluated node.
676 void SetRegister(BasicBlock& bb, Tegra::Shader::Register dest, Node src); 676 void SetRegister(NodeBlock& bb, Tegra::Shader::Register dest, Node src);
677 /// Sets a predicate. src value must be a bool-evaluated node 677 /// Sets a predicate. src value must be a bool-evaluated node
678 void SetPredicate(BasicBlock& bb, u64 dest, Node src); 678 void SetPredicate(NodeBlock& bb, u64 dest, Node src);
679 /// Sets an internal flag. src value must be a bool-evaluated node 679 /// Sets an internal flag. src value must be a bool-evaluated node
680 void SetInternalFlag(BasicBlock& bb, InternalFlag flag, Node value); 680 void SetInternalFlag(NodeBlock& bb, InternalFlag flag, Node value);
681 /// Sets a local memory address. address and value must be a number-evaluated node 681 /// Sets a local memory address. address and value must be a number-evaluated node
682 void SetLocalMemory(BasicBlock& bb, Node address, Node value); 682 void SetLocalMemory(NodeBlock& bb, Node address, Node value);
683 /// Sets a temporal. Internally it uses a post-RZ register 683 /// Sets a temporal. Internally it uses a post-RZ register
684 void SetTemporal(BasicBlock& bb, u32 id, Node value); 684 void SetTemporal(NodeBlock& bb, u32 id, Node value);
685 685
686 /// Sets internal flags from a float 686 /// Sets internal flags from a float
687 void SetInternalFlagsFromFloat(BasicBlock& bb, Node value, bool sets_cc = true); 687 void SetInternalFlagsFromFloat(NodeBlock& bb, Node value, bool sets_cc = true);
688 /// Sets internal flags from an integer 688 /// Sets internal flags from an integer
689 void SetInternalFlagsFromInteger(BasicBlock& bb, Node value, bool sets_cc = true); 689 void SetInternalFlagsFromInteger(NodeBlock& bb, Node value, bool sets_cc = true);
690 690
691 /// Conditionally absolute/negated float. Absolute is applied first 691 /// Conditionally absolute/negated float. Absolute is applied first
692 Node GetOperandAbsNegFloat(Node value, bool absolute, bool negate); 692 Node GetOperandAbsNegFloat(Node value, bool absolute, bool negate);
@@ -727,12 +727,12 @@ private:
727 /// Extracts a sequence of bits from a node 727 /// Extracts a sequence of bits from a node
728 Node BitfieldExtract(Node value, u32 offset, u32 bits); 728 Node BitfieldExtract(Node value, u32 offset, u32 bits);
729 729
730 void WriteTexInstructionFloat(BasicBlock& bb, Tegra::Shader::Instruction instr, 730 void WriteTexInstructionFloat(NodeBlock& bb, Tegra::Shader::Instruction instr,
731 const Node4& components); 731 const Node4& components);
732 732
733 void WriteTexsInstructionFloat(BasicBlock& bb, Tegra::Shader::Instruction instr, 733 void WriteTexsInstructionFloat(NodeBlock& bb, Tegra::Shader::Instruction instr,
734 const Node4& components); 734 const Node4& components);
735 void WriteTexsInstructionHalfFloat(BasicBlock& bb, Tegra::Shader::Instruction instr, 735 void WriteTexsInstructionHalfFloat(NodeBlock& bb, Tegra::Shader::Instruction instr,
736 const Node4& components); 736 const Node4& components);
737 737
738 Node4 GetTexCode(Tegra::Shader::Instruction instr, Tegra::Shader::TextureType texture_type, 738 Node4 GetTexCode(Tegra::Shader::Instruction instr, Tegra::Shader::TextureType texture_type,
@@ -761,16 +761,16 @@ private:
761 Node GetVideoOperand(Node op, bool is_chunk, bool is_signed, Tegra::Shader::VideoType type, 761 Node GetVideoOperand(Node op, bool is_chunk, bool is_signed, Tegra::Shader::VideoType type,
762 u64 byte_height); 762 u64 byte_height);
763 763
764 void WriteLogicOperation(BasicBlock& bb, Tegra::Shader::Register dest, 764 void WriteLogicOperation(NodeBlock& bb, Tegra::Shader::Register dest,
765 Tegra::Shader::LogicOperation logic_op, Node op_a, Node op_b, 765 Tegra::Shader::LogicOperation logic_op, Node op_a, Node op_b,
766 Tegra::Shader::PredicateResultMode predicate_mode, 766 Tegra::Shader::PredicateResultMode predicate_mode,
767 Tegra::Shader::Pred predicate, bool sets_cc); 767 Tegra::Shader::Pred predicate, bool sets_cc);
768 void WriteLop3Instruction(BasicBlock& bb, Tegra::Shader::Register dest, Node op_a, Node op_b, 768 void WriteLop3Instruction(NodeBlock& bb, Tegra::Shader::Register dest, Node op_a, Node op_b,
769 Node op_c, Node imm_lut, bool sets_cc); 769 Node op_c, Node imm_lut, bool sets_cc);
770 770
771 Node TrackCbuf(Node tracked, const BasicBlock& code, s64 cursor); 771 Node TrackCbuf(Node tracked, const NodeBlock& code, s64 cursor);
772 772
773 std::pair<Node, s64> TrackRegister(const GprNode* tracked, const BasicBlock& code, s64 cursor); 773 std::pair<Node, s64> TrackRegister(const GprNode* tracked, const NodeBlock& code, s64 cursor);
774 774
775 template <typename... T> 775 template <typename... T>
776 Node Operation(OperationCode code, const T*... operands) { 776 Node Operation(OperationCode code, const T*... operands) {
@@ -812,7 +812,8 @@ private:
812 u32 coverage_end{}; 812 u32 coverage_end{};
813 std::map<std::pair<u32, u32>, ExitMethod> exit_method_map; 813 std::map<std::pair<u32, u32>, ExitMethod> exit_method_map;
814 814
815 std::map<u32, BasicBlock> basic_blocks; 815 std::map<u32, NodeBlock> basic_blocks;
816 NodeBlock global_code;
816 817
817 std::vector<std::unique_ptr<NodeData>> stored_nodes; 818 std::vector<std::unique_ptr<NodeData>> stored_nodes;
818 819
diff --git a/src/video_core/shader/track.cpp b/src/video_core/shader/track.cpp
index d6d29ee9f..be4635342 100644
--- a/src/video_core/shader/track.cpp
+++ b/src/video_core/shader/track.cpp
@@ -11,7 +11,7 @@
11namespace VideoCommon::Shader { 11namespace VideoCommon::Shader {
12 12
13namespace { 13namespace {
14std::pair<Node, s64> FindOperation(const BasicBlock& code, s64 cursor, 14std::pair<Node, s64> FindOperation(const NodeBlock& code, s64 cursor,
15 OperationCode operation_code) { 15 OperationCode operation_code) {
16 for (; cursor >= 0; --cursor) { 16 for (; cursor >= 0; --cursor) {
17 const Node node = code[cursor]; 17 const Node node = code[cursor];
@@ -19,12 +19,19 @@ std::pair<Node, s64> FindOperation(const BasicBlock& code, s64 cursor,
19 if (operation->GetCode() == operation_code) 19 if (operation->GetCode() == operation_code)
20 return {node, cursor}; 20 return {node, cursor};
21 } 21 }
22 if (const auto conditional = std::get_if<ConditionalNode>(node)) {
23 const auto& code = conditional->GetCode();
24 const auto [found, internal_cursor] =
25 FindOperation(code, static_cast<s64>(code.size() - 1), operation_code);
26 if (found)
27 return {found, cursor};
28 }
22 } 29 }
23 return {}; 30 return {};
24} 31}
25} // namespace 32} // namespace
26 33
27Node ShaderIR::TrackCbuf(Node tracked, const BasicBlock& code, s64 cursor) { 34Node ShaderIR::TrackCbuf(Node tracked, const NodeBlock& code, s64 cursor) {
28 if (const auto cbuf = std::get_if<CbufNode>(tracked)) { 35 if (const auto cbuf = std::get_if<CbufNode>(tracked)) {
29 // Cbuf found, but it has to be immediate 36 // Cbuf found, but it has to be immediate
30 return std::holds_alternative<ImmediateNode>(*cbuf->GetOffset()) ? tracked : nullptr; 37 return std::holds_alternative<ImmediateNode>(*cbuf->GetOffset()) ? tracked : nullptr;
@@ -50,10 +57,14 @@ Node ShaderIR::TrackCbuf(Node tracked, const BasicBlock& code, s64 cursor) {
50 } 57 }
51 return nullptr; 58 return nullptr;
52 } 59 }
60 if (const auto conditional = std::get_if<ConditionalNode>(tracked)) {
61 const auto& code = conditional->GetCode();
62 return TrackCbuf(tracked, code, static_cast<s64>(code.size()));
63 }
53 return nullptr; 64 return nullptr;
54} 65}
55 66
56std::pair<Node, s64> ShaderIR::TrackRegister(const GprNode* tracked, const BasicBlock& code, 67std::pair<Node, s64> ShaderIR::TrackRegister(const GprNode* tracked, const NodeBlock& code,
57 s64 cursor) { 68 s64 cursor) {
58 for (; cursor >= 0; --cursor) { 69 for (; cursor >= 0; --cursor) {
59 const auto [found_node, new_cursor] = FindOperation(code, cursor, OperationCode::Assign); 70 const auto [found_node, new_cursor] = FindOperation(code, cursor, OperationCode::Assign);