diff options
Diffstat (limited to 'src')
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 | ||
| 124 | BasicBlock ShaderIR::DecodeRange(u32 begin, u32 end) { | 124 | NodeBlock 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 | ||
| 132 | u32 ShaderIR::DecodeInstr(BasicBlock& bb, u32 pc) { | 132 | u32 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; | |||
| 13 | using Tegra::Shader::OpCode; | 13 | using Tegra::Shader::OpCode; |
| 14 | using Tegra::Shader::SubOp; | 14 | using Tegra::Shader::SubOp; |
| 15 | 15 | ||
| 16 | u32 ShaderIR::DecodeArithmetic(BasicBlock& bb, const BasicBlock& code, u32 pc) { | 16 | u32 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 { | |||
| 12 | using Tegra::Shader::Instruction; | 12 | using Tegra::Shader::Instruction; |
| 13 | using Tegra::Shader::OpCode; | 13 | using Tegra::Shader::OpCode; |
| 14 | 14 | ||
| 15 | u32 ShaderIR::DecodeArithmeticHalf(BasicBlock& bb, const BasicBlock& code, u32 pc) { | 15 | u32 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 { | |||
| 12 | using Tegra::Shader::Instruction; | 12 | using Tegra::Shader::Instruction; |
| 13 | using Tegra::Shader::OpCode; | 13 | using Tegra::Shader::OpCode; |
| 14 | 14 | ||
| 15 | u32 ShaderIR::DecodeArithmeticHalfImmediate(BasicBlock& bb, const BasicBlock& code, u32 pc) { | 15 | u32 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 { | |||
| 12 | using Tegra::Shader::Instruction; | 12 | using Tegra::Shader::Instruction; |
| 13 | using Tegra::Shader::OpCode; | 13 | using Tegra::Shader::OpCode; |
| 14 | 14 | ||
| 15 | u32 ShaderIR::DecodeArithmeticImmediate(BasicBlock& bb, const BasicBlock& code, u32 pc) { | 15 | u32 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; | |||
| 15 | using Tegra::Shader::Pred; | 15 | using Tegra::Shader::Pred; |
| 16 | using Tegra::Shader::Register; | 16 | using Tegra::Shader::Register; |
| 17 | 17 | ||
| 18 | u32 ShaderIR::DecodeArithmeticInteger(BasicBlock& bb, const BasicBlock& code, u32 pc) { | 18 | u32 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 | ||
| 245 | void ShaderIR::WriteLop3Instruction(BasicBlock& bb, Register dest, Node op_a, Node op_b, Node op_c, | 245 | void 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; | |||
| 16 | using Tegra::Shader::PredicateResultMode; | 16 | using Tegra::Shader::PredicateResultMode; |
| 17 | using Tegra::Shader::Register; | 17 | using Tegra::Shader::Register; |
| 18 | 18 | ||
| 19 | u32 ShaderIR::DecodeArithmeticIntegerImmediate(BasicBlock& bb, const BasicBlock& code, u32 pc) { | 19 | u32 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 | ||
| 57 | void ShaderIR::WriteLogicOperation(BasicBlock& bb, Register dest, LogicOperation logic_op, | 57 | void 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 { | |||
| 12 | using Tegra::Shader::Instruction; | 12 | using Tegra::Shader::Instruction; |
| 13 | using Tegra::Shader::OpCode; | 13 | using Tegra::Shader::OpCode; |
| 14 | 14 | ||
| 15 | u32 ShaderIR::DecodeBfe(BasicBlock& bb, const BasicBlock& code, u32 pc) { | 15 | u32 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 { | |||
| 12 | using Tegra::Shader::Instruction; | 12 | using Tegra::Shader::Instruction; |
| 13 | using Tegra::Shader::OpCode; | 13 | using Tegra::Shader::OpCode; |
| 14 | 14 | ||
| 15 | u32 ShaderIR::DecodeBfi(BasicBlock& bb, const BasicBlock& code, u32 pc) { | 15 | u32 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; | |||
| 13 | using Tegra::Shader::OpCode; | 13 | using Tegra::Shader::OpCode; |
| 14 | using Tegra::Shader::Register; | 14 | using Tegra::Shader::Register; |
| 15 | 15 | ||
| 16 | u32 ShaderIR::DecodeConversion(BasicBlock& bb, const BasicBlock& code, u32 pc) { | 16 | u32 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 { | |||
| 12 | using Tegra::Shader::Instruction; | 12 | using Tegra::Shader::Instruction; |
| 13 | using Tegra::Shader::OpCode; | 13 | using Tegra::Shader::OpCode; |
| 14 | 14 | ||
| 15 | u32 ShaderIR::DecodeFfma(BasicBlock& bb, const BasicBlock& code, u32 pc) { | 15 | u32 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 { | |||
| 12 | using Tegra::Shader::Instruction; | 12 | using Tegra::Shader::Instruction; |
| 13 | using Tegra::Shader::OpCode; | 13 | using Tegra::Shader::OpCode; |
| 14 | 14 | ||
| 15 | u32 ShaderIR::DecodeFloatSet(BasicBlock& bb, const BasicBlock& code, u32 pc) { | 15 | u32 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; | |||
| 13 | using Tegra::Shader::OpCode; | 13 | using Tegra::Shader::OpCode; |
| 14 | using Tegra::Shader::Pred; | 14 | using Tegra::Shader::Pred; |
| 15 | 15 | ||
| 16 | u32 ShaderIR::DecodeFloatSetPredicate(BasicBlock& bb, const BasicBlock& code, u32 pc) { | 16 | u32 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 { | |||
| 14 | using Tegra::Shader::Instruction; | 14 | using Tegra::Shader::Instruction; |
| 15 | using Tegra::Shader::OpCode; | 15 | using Tegra::Shader::OpCode; |
| 16 | 16 | ||
| 17 | u32 ShaderIR::DecodeHalfSet(BasicBlock& bb, const BasicBlock& code, u32 pc) { | 17 | u32 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; | |||
| 13 | using Tegra::Shader::OpCode; | 13 | using Tegra::Shader::OpCode; |
| 14 | using Tegra::Shader::Pred; | 14 | using Tegra::Shader::Pred; |
| 15 | 15 | ||
| 16 | u32 ShaderIR::DecodeHalfSetPredicate(BasicBlock& bb, const BasicBlock& code, u32 pc) { | 16 | u32 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; | |||
| 16 | using Tegra::Shader::Instruction; | 16 | using Tegra::Shader::Instruction; |
| 17 | using Tegra::Shader::OpCode; | 17 | using Tegra::Shader::OpCode; |
| 18 | 18 | ||
| 19 | u32 ShaderIR::DecodeHfma2(BasicBlock& bb, const BasicBlock& code, u32 pc) { | 19 | u32 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 { | |||
| 12 | using Tegra::Shader::Instruction; | 12 | using Tegra::Shader::Instruction; |
| 13 | using Tegra::Shader::OpCode; | 13 | using Tegra::Shader::OpCode; |
| 14 | 14 | ||
| 15 | u32 ShaderIR::DecodeIntegerSet(BasicBlock& bb, const BasicBlock& code, u32 pc) { | 15 | u32 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; | |||
| 13 | using Tegra::Shader::OpCode; | 13 | using Tegra::Shader::OpCode; |
| 14 | using Tegra::Shader::Pred; | 14 | using Tegra::Shader::Pred; |
| 15 | 15 | ||
| 16 | u32 ShaderIR::DecodeIntegerSetPredicate(BasicBlock& bb, const BasicBlock& code, u32 pc) { | 16 | u32 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 | ||
| 39 | u32 ShaderIR::DecodeMemory(BasicBlock& bb, const BasicBlock& code, u32 pc) { | 39 | u32 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 | ||
| 467 | void ShaderIR::WriteTexInstructionFloat(BasicBlock& bb, Instruction instr, | 468 | void 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 | ||
| 483 | void ShaderIR::WriteTexsInstructionFloat(BasicBlock& bb, Instruction instr, | 483 | void 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 | ||
| 507 | void ShaderIR::WriteTexsInstructionHalfFloat(BasicBlock& bb, Instruction instr, | 507 | void 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; | |||
| 14 | using Tegra::Shader::OpCode; | 14 | using Tegra::Shader::OpCode; |
| 15 | using Tegra::Shader::Register; | 15 | using Tegra::Shader::Register; |
| 16 | 16 | ||
| 17 | u32 ShaderIR::DecodeOther(BasicBlock& bb, const BasicBlock& code, u32 pc) { | 17 | u32 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; | |||
| 13 | using Tegra::Shader::OpCode; | 13 | using Tegra::Shader::OpCode; |
| 14 | using Tegra::Shader::Pred; | 14 | using Tegra::Shader::Pred; |
| 15 | 15 | ||
| 16 | u32 ShaderIR::DecodePredicateSetPredicate(BasicBlock& bb, const BasicBlock& code, u32 pc) { | 16 | u32 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 { | |||
| 12 | using Tegra::Shader::Instruction; | 12 | using Tegra::Shader::Instruction; |
| 13 | using Tegra::Shader::OpCode; | 13 | using Tegra::Shader::OpCode; |
| 14 | 14 | ||
| 15 | u32 ShaderIR::DecodePredicateSetRegister(BasicBlock& bb, const BasicBlock& code, u32 pc) { | 15 | u32 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 { | |||
| 12 | using Tegra::Shader::Instruction; | 12 | using Tegra::Shader::Instruction; |
| 13 | using Tegra::Shader::OpCode; | 13 | using Tegra::Shader::OpCode; |
| 14 | 14 | ||
| 15 | u32 ShaderIR::DecodeRegisterSetPredicate(BasicBlock& bb, const BasicBlock& code, u32 pc) { | 15 | u32 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 { | |||
| 12 | using Tegra::Shader::Instruction; | 12 | using Tegra::Shader::Instruction; |
| 13 | using Tegra::Shader::OpCode; | 13 | using Tegra::Shader::OpCode; |
| 14 | 14 | ||
| 15 | u32 ShaderIR::DecodeShift(BasicBlock& bb, const BasicBlock& code, u32 pc) { | 15 | u32 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; | |||
| 15 | using Tegra::Shader::VideoType; | 15 | using Tegra::Shader::VideoType; |
| 16 | using Tegra::Shader::VmadShr; | 16 | using Tegra::Shader::VmadShr; |
| 17 | 17 | ||
| 18 | u32 ShaderIR::DecodeVideo(BasicBlock& bb, const BasicBlock& code, u32 pc) { | 18 | u32 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 { | |||
| 12 | using Tegra::Shader::Instruction; | 12 | using Tegra::Shader::Instruction; |
| 13 | using Tegra::Shader::OpCode; | 13 | using Tegra::Shader::OpCode; |
| 14 | 14 | ||
| 15 | u32 ShaderIR::DecodeXmad(BasicBlock& bb, const BasicBlock& code, u32 pc) { | 15 | u32 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 | ||
| 340 | void ShaderIR::SetRegister(BasicBlock& bb, Register dest, Node src) { | 340 | void 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 | ||
| 344 | void ShaderIR::SetPredicate(BasicBlock& bb, u64 dest, Node src) { | 344 | void 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 | ||
| 348 | void ShaderIR::SetInternalFlag(BasicBlock& bb, InternalFlag flag, Node value) { | 348 | void 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 | ||
| 352 | void ShaderIR::SetLocalMemory(BasicBlock& bb, Node address, Node value) { | 352 | void 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 | ||
| 356 | void ShaderIR::SetTemporal(BasicBlock& bb, u32 id, Node value) { | 356 | void 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 | ||
| 360 | void ShaderIR::SetInternalFlagsFromFloat(BasicBlock& bb, Node value, bool sets_cc) { | 360 | void 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 | ||
| 369 | void ShaderIR::SetInternalFlagsFromInteger(BasicBlock& bb, Node value, bool sets_cc) { | 369 | void 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>; |
| 40 | using Node = const NodeData*; | 40 | using Node = const NodeData*; |
| 41 | using Node4 = std::array<Node, 4>; | 41 | using Node4 = std::array<Node, 4>; |
| 42 | using BasicBlock = std::vector<Node>; | 42 | using NodeBlock = std::vector<Node>; |
| 43 | 43 | ||
| 44 | constexpr u32 MAX_PROGRAM_LENGTH = 0x1000; | 44 | constexpr 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 @@ | |||
| 11 | namespace VideoCommon::Shader { | 11 | namespace VideoCommon::Shader { |
| 12 | 12 | ||
| 13 | namespace { | 13 | namespace { |
| 14 | std::pair<Node, s64> FindOperation(const BasicBlock& code, s64 cursor, | 14 | std::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 | ||
| 27 | Node ShaderIR::TrackCbuf(Node tracked, const BasicBlock& code, s64 cursor) { | 34 | Node 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 | ||
| 56 | std::pair<Node, s64> ShaderIR::TrackRegister(const GprNode* tracked, const BasicBlock& code, | 67 | std::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); |