summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Fernando Sahmkow2019-09-23 15:40:58 -0400
committerGravatar FernandoS272019-10-25 09:01:29 -0400
commitacd64411342e70bd7e9f7156f62c3b1a609ac3c4 (patch)
treec05f05bb52fdee4fb0c693c98dec5915b69b302d /src
parentVideoCore: Unify const buffer accessing along engines and provide ConstBuffer... (diff)
downloadyuzu-acd64411342e70bd7e9f7156f62c3b1a609ac3c4.tar.gz
yuzu-acd64411342e70bd7e9f7156f62c3b1a609ac3c4.tar.xz
yuzu-acd64411342e70bd7e9f7156f62c3b1a609ac3c4.zip
Shader_Cache: setup connection of ConstBufferLocker
Diffstat (limited to 'src')
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer.cpp6
-rw-r--r--src/video_core/renderer_opengl/gl_shader_cache.cpp45
-rw-r--r--src/video_core/renderer_opengl/gl_shader_cache.h1
-rw-r--r--src/video_core/renderer_opengl/gl_shader_gen.cpp26
-rw-r--r--src/video_core/renderer_opengl/gl_shader_gen.h13
-rw-r--r--src/video_core/shader/control_flow.cpp22
-rw-r--r--src/video_core/shader/control_flow.h3
-rw-r--r--src/video_core/shader/decode.cpp2
-rw-r--r--src/video_core/shader/shader_ir.cpp4
-rw-r--r--src/video_core/shader/shader_ir.h3
10 files changed, 82 insertions, 43 deletions
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp
index 10114909b..9431d64ac 100644
--- a/src/video_core/renderer_opengl/gl_rasterizer.cpp
+++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp
@@ -1006,7 +1006,8 @@ TextureBufferUsage RasterizerOpenGL::SetupComputeTextures(const Shader& kernel)
1006 } 1006 }
1007 const auto cbuf = entry.GetBindlessCBuf(); 1007 const auto cbuf = entry.GetBindlessCBuf();
1008 Tegra::Texture::TextureHandle tex_handle; 1008 Tegra::Texture::TextureHandle tex_handle;
1009 tex_handle.raw = compute.AccessConstBuffer32(Tegra::Engines::ShaderType::Compute, cbuf.first, cbuf.second); 1009 tex_handle.raw = compute.AccessConstBuffer32(Tegra::Engines::ShaderType::Compute,
1010 cbuf.first, cbuf.second);
1010 return compute.GetTextureInfo(tex_handle, entry.GetOffset()); 1011 return compute.GetTextureInfo(tex_handle, entry.GetOffset());
1011 }(); 1012 }();
1012 1013
@@ -1051,7 +1052,8 @@ void RasterizerOpenGL::SetupComputeImages(const Shader& shader) {
1051 } 1052 }
1052 const auto cbuf = entry.GetBindlessCBuf(); 1053 const auto cbuf = entry.GetBindlessCBuf();
1053 Tegra::Texture::TextureHandle tex_handle; 1054 Tegra::Texture::TextureHandle tex_handle;
1054 tex_handle.raw = compute.AccessConstBuffer32(Tegra::Engines::ShaderType::Compute, cbuf.first, cbuf.second); 1055 tex_handle.raw = compute.AccessConstBuffer32(Tegra::Engines::ShaderType::Compute,
1056 cbuf.first, cbuf.second);
1055 return compute.GetTextureInfo(tex_handle, entry.GetOffset()).tic; 1057 return compute.GetTextureInfo(tex_handle, entry.GetOffset()).tic;
1056 }(); 1058 }();
1057 SetupImage(bindpoint, tic, entry); 1059 SetupImage(bindpoint, tic, entry);
diff --git a/src/video_core/renderer_opengl/gl_shader_cache.cpp b/src/video_core/renderer_opengl/gl_shader_cache.cpp
index 42ca3b1bd..9e2799876 100644
--- a/src/video_core/renderer_opengl/gl_shader_cache.cpp
+++ b/src/video_core/renderer_opengl/gl_shader_cache.cpp
@@ -10,6 +10,7 @@
10#include "common/scope_exit.h" 10#include "common/scope_exit.h"
11#include "core/core.h" 11#include "core/core.h"
12#include "core/frontend/emu_window.h" 12#include "core/frontend/emu_window.h"
13#include "video_core/engines/kepler_compute.h"
13#include "video_core/engines/maxwell_3d.h" 14#include "video_core/engines/maxwell_3d.h"
14#include "video_core/memory_manager.h" 15#include "video_core/memory_manager.h"
15#include "video_core/renderer_opengl/gl_rasterizer.h" 16#include "video_core/renderer_opengl/gl_rasterizer.h"
@@ -173,8 +174,9 @@ u64 GetUniqueIdentifier(ProgramType program_type, const ProgramCode& code,
173} 174}
174 175
175/// Creates an unspecialized program from code streams 176/// Creates an unspecialized program from code streams
176GLShader::ProgramResult CreateProgram(const Device& device, ProgramType program_type, 177GLShader::ProgramResult CreateProgram(Core::System& system, const Device& device,
177 ProgramCode program_code, ProgramCode program_code_b) { 178 ProgramType program_type, ProgramCode program_code,
179 ProgramCode program_code_b) {
178 GLShader::ShaderSetup setup(program_code); 180 GLShader::ShaderSetup setup(program_code);
179 setup.program.size_a = CalculateProgramSize(program_code); 181 setup.program.size_a = CalculateProgramSize(program_code);
180 setup.program.size_b = 0; 182 setup.program.size_b = 0;
@@ -190,14 +192,25 @@ GLShader::ProgramResult CreateProgram(const Device& device, ProgramType program_
190 192
191 switch (program_type) { 193 switch (program_type) {
192 case ProgramType::VertexA: 194 case ProgramType::VertexA:
193 case ProgramType::VertexB: 195 case ProgramType::VertexB: {
194 return GLShader::GenerateVertexShader(device, setup); 196 VideoCommon::Shader::ConstBufferLocker locker{Tegra::Engines::ShaderType::Vertex,
195 case ProgramType::Geometry: 197 &(system.GPU().Maxwell3D())};
196 return GLShader::GenerateGeometryShader(device, setup); 198 return GLShader::GenerateVertexShader(locker, device, setup);
197 case ProgramType::Fragment: 199 }
198 return GLShader::GenerateFragmentShader(device, setup); 200 case ProgramType::Geometry: {
199 case ProgramType::Compute: 201 VideoCommon::Shader::ConstBufferLocker locker{Tegra::Engines::ShaderType::Geometry,
200 return GLShader::GenerateComputeShader(device, setup); 202 &(system.GPU().Maxwell3D())};
203 return GLShader::GenerateGeometryShader(locker, device, setup);
204 }
205 case ProgramType::Fragment: {
206 VideoCommon::Shader::ConstBufferLocker locker{Tegra::Engines::ShaderType::Fragment,
207 &(system.GPU().Maxwell3D())};
208 return GLShader::GenerateFragmentShader(locker, device, setup);
209 }
210 case ProgramType::Compute: {
211 VideoCommon::Shader::ConstBufferLocker locker{Tegra::Engines::ShaderType::Compute, &(system.GPU().KeplerCompute())};
212 return GLShader::GenerateComputeShader(locker, device, setup);
213 }
201 default: 214 default:
202 UNIMPLEMENTED_MSG("Unimplemented program_type={}", static_cast<u32>(program_type)); 215 UNIMPLEMENTED_MSG("Unimplemented program_type={}", static_cast<u32>(program_type));
203 return {}; 216 return {};
@@ -307,8 +320,8 @@ Shader CachedShader::CreateStageFromMemory(const ShaderParameters& params,
307 ProgramCode&& program_code_b) { 320 ProgramCode&& program_code_b) {
308 const auto code_size{CalculateProgramSize(program_code)}; 321 const auto code_size{CalculateProgramSize(program_code)};
309 const auto code_size_b{CalculateProgramSize(program_code_b)}; 322 const auto code_size_b{CalculateProgramSize(program_code_b)};
310 auto result{ 323 auto result{CreateProgram(params.system, params.device, GetProgramType(program_type),
311 CreateProgram(params.device, GetProgramType(program_type), program_code, program_code_b)}; 324 program_code, program_code_b)};
312 if (result.first.empty()) { 325 if (result.first.empty()) {
313 // TODO(Rodrigo): Unimplemented shader stages hit here, avoid using these for now 326 // TODO(Rodrigo): Unimplemented shader stages hit here, avoid using these for now
314 return {}; 327 return {};
@@ -331,7 +344,7 @@ Shader CachedShader::CreateStageFromCache(const ShaderParameters& params,
331} 344}
332 345
333Shader CachedShader::CreateKernelFromMemory(const ShaderParameters& params, ProgramCode&& code) { 346Shader CachedShader::CreateKernelFromMemory(const ShaderParameters& params, ProgramCode&& code) {
334 auto result{CreateProgram(params.device, ProgramType::Compute, code, {})}; 347 auto result{CreateProgram(params.system, params.device, ProgramType::Compute, code, {})};
335 348
336 const auto code_size{CalculateProgramSize(code)}; 349 const auto code_size{CalculateProgramSize(code)};
337 params.disk_cache.SaveRaw(ShaderDiskCacheRaw(params.unique_identifier, ProgramType::Compute, 350 params.disk_cache.SaveRaw(ShaderDiskCacheRaw(params.unique_identifier, ProgramType::Compute,
@@ -566,7 +579,7 @@ std::unordered_map<u64, UnspecializedShader> ShaderCacheOpenGL::GenerateUnspecia
566 result = {stored_decompiled.code, stored_decompiled.entries}; 579 result = {stored_decompiled.code, stored_decompiled.entries};
567 } else { 580 } else {
568 // Otherwise decompile the shader at boot and save the result to the decompiled file 581 // Otherwise decompile the shader at boot and save the result to the decompiled file
569 result = CreateProgram(device, raw.GetProgramType(), raw.GetProgramCode(), 582 result = CreateProgram(system, device, raw.GetProgramType(), raw.GetProgramCode(),
570 raw.GetProgramCodeB()); 583 raw.GetProgramCodeB());
571 disk_cache.SaveDecompiled(unique_identifier, result.first, result.second); 584 disk_cache.SaveDecompiled(unique_identifier, result.first, result.second);
572 } 585 }
@@ -612,7 +625,7 @@ Shader ShaderCacheOpenGL::GetStageProgram(Maxwell::ShaderProgram program) {
612 const auto unique_identifier = 625 const auto unique_identifier =
613 GetUniqueIdentifier(GetProgramType(program), program_code, program_code_b); 626 GetUniqueIdentifier(GetProgramType(program), program_code, program_code_b);
614 const auto cpu_addr{*memory_manager.GpuToCpuAddress(program_addr)}; 627 const auto cpu_addr{*memory_manager.GpuToCpuAddress(program_addr)};
615 const ShaderParameters params{disk_cache, precompiled_programs, device, cpu_addr, 628 const ShaderParameters params{disk_cache, precompiled_programs, system, device, cpu_addr,
616 host_ptr, unique_identifier}; 629 host_ptr, unique_identifier};
617 630
618 const auto found = precompiled_shaders.find(unique_identifier); 631 const auto found = precompiled_shaders.find(unique_identifier);
@@ -639,7 +652,7 @@ Shader ShaderCacheOpenGL::GetComputeKernel(GPUVAddr code_addr) {
639 auto code{GetShaderCode(memory_manager, code_addr, host_ptr)}; 652 auto code{GetShaderCode(memory_manager, code_addr, host_ptr)};
640 const auto unique_identifier{GetUniqueIdentifier(ProgramType::Compute, code, {})}; 653 const auto unique_identifier{GetUniqueIdentifier(ProgramType::Compute, code, {})};
641 const auto cpu_addr{*memory_manager.GpuToCpuAddress(code_addr)}; 654 const auto cpu_addr{*memory_manager.GpuToCpuAddress(code_addr)};
642 const ShaderParameters params{disk_cache, precompiled_programs, device, cpu_addr, 655 const ShaderParameters params{disk_cache, precompiled_programs, system, device, cpu_addr,
643 host_ptr, unique_identifier}; 656 host_ptr, unique_identifier};
644 657
645 const auto found = precompiled_shaders.find(unique_identifier); 658 const auto found = precompiled_shaders.find(unique_identifier);
diff --git a/src/video_core/renderer_opengl/gl_shader_cache.h b/src/video_core/renderer_opengl/gl_shader_cache.h
index de195cc5d..6ff78f005 100644
--- a/src/video_core/renderer_opengl/gl_shader_cache.h
+++ b/src/video_core/renderer_opengl/gl_shader_cache.h
@@ -45,6 +45,7 @@ using PrecompiledShaders = std::unordered_map<u64, GLShader::ProgramResult>;
45struct ShaderParameters { 45struct ShaderParameters {
46 ShaderDiskCacheOpenGL& disk_cache; 46 ShaderDiskCacheOpenGL& disk_cache;
47 const PrecompiledPrograms& precompiled_programs; 47 const PrecompiledPrograms& precompiled_programs;
48 Core::System& system;
48 const Device& device; 49 const Device& device;
49 VAddr cpu_addr; 50 VAddr cpu_addr;
50 u8* host_ptr; 51 u8* host_ptr;
diff --git a/src/video_core/renderer_opengl/gl_shader_gen.cpp b/src/video_core/renderer_opengl/gl_shader_gen.cpp
index b5a43e79e..817c6e12c 100644
--- a/src/video_core/renderer_opengl/gl_shader_gen.cpp
+++ b/src/video_core/renderer_opengl/gl_shader_gen.cpp
@@ -21,7 +21,8 @@ static constexpr u32 COMPUTE_OFFSET = 0;
21 21
22static constexpr CompilerSettings settings{CompileDepth::NoFlowStack, true}; 22static constexpr CompilerSettings settings{CompileDepth::NoFlowStack, true};
23 23
24ProgramResult GenerateVertexShader(const Device& device, const ShaderSetup& setup) { 24ProgramResult GenerateVertexShader(ConstBufferLocker& locker, const Device& device,
25 const ShaderSetup& setup) {
25 const std::string id = fmt::format("{:016x}", setup.program.unique_identifier); 26 const std::string id = fmt::format("{:016x}", setup.program.unique_identifier);
26 27
27 std::string out = "// Shader Unique Id: VS" + id + "\n\n"; 28 std::string out = "// Shader Unique Id: VS" + id + "\n\n";
@@ -35,14 +36,15 @@ layout (std140, binding = EMULATION_UBO_BINDING) uniform vs_config {
35 36
36)"; 37)";
37 38
38 const ShaderIR program_ir(setup.program.code, PROGRAM_OFFSET, setup.program.size_a, settings); 39 const ShaderIR program_ir(setup.program.code, PROGRAM_OFFSET, setup.program.size_a, settings,
40 locker);
39 const auto stage = setup.IsDualProgram() ? ProgramType::VertexA : ProgramType::VertexB; 41 const auto stage = setup.IsDualProgram() ? ProgramType::VertexA : ProgramType::VertexB;
40 ProgramResult program = Decompile(device, program_ir, stage, "vertex"); 42 ProgramResult program = Decompile(device, program_ir, stage, "vertex");
41 out += program.first; 43 out += program.first;
42 44
43 if (setup.IsDualProgram()) { 45 if (setup.IsDualProgram()) {
44 const ShaderIR program_ir_b(setup.program.code_b, PROGRAM_OFFSET, setup.program.size_b, 46 const ShaderIR program_ir_b(setup.program.code_b, PROGRAM_OFFSET, setup.program.size_b,
45 settings); 47 settings, locker);
46 ProgramResult program_b = Decompile(device, program_ir_b, ProgramType::VertexB, "vertex_b"); 48 ProgramResult program_b = Decompile(device, program_ir_b, ProgramType::VertexB, "vertex_b");
47 out += program_b.first; 49 out += program_b.first;
48 } 50 }
@@ -71,7 +73,8 @@ void main() {
71 return {std::move(out), std::move(program.second)}; 73 return {std::move(out), std::move(program.second)};
72} 74}
73 75
74ProgramResult GenerateGeometryShader(const Device& device, const ShaderSetup& setup) { 76ProgramResult GenerateGeometryShader(ConstBufferLocker& locker, const Device& device,
77 const ShaderSetup& setup) {
75 const std::string id = fmt::format("{:016x}", setup.program.unique_identifier); 78 const std::string id = fmt::format("{:016x}", setup.program.unique_identifier);
76 79
77 std::string out = "// Shader Unique Id: GS" + id + "\n\n"; 80 std::string out = "// Shader Unique Id: GS" + id + "\n\n";
@@ -85,7 +88,8 @@ layout (std140, binding = EMULATION_UBO_BINDING) uniform gs_config {
85 88
86)"; 89)";
87 90
88 const ShaderIR program_ir(setup.program.code, PROGRAM_OFFSET, setup.program.size_a, settings); 91 const ShaderIR program_ir(setup.program.code, PROGRAM_OFFSET, setup.program.size_a, settings,
92 locker);
89 ProgramResult program = Decompile(device, program_ir, ProgramType::Geometry, "geometry"); 93 ProgramResult program = Decompile(device, program_ir, ProgramType::Geometry, "geometry");
90 out += program.first; 94 out += program.first;
91 95
@@ -97,7 +101,8 @@ void main() {
97 return {std::move(out), std::move(program.second)}; 101 return {std::move(out), std::move(program.second)};
98} 102}
99 103
100ProgramResult GenerateFragmentShader(const Device& device, const ShaderSetup& setup) { 104ProgramResult GenerateFragmentShader(ConstBufferLocker& locker, const Device& device,
105 const ShaderSetup& setup) {
101 const std::string id = fmt::format("{:016x}", setup.program.unique_identifier); 106 const std::string id = fmt::format("{:016x}", setup.program.unique_identifier);
102 107
103 std::string out = "// Shader Unique Id: FS" + id + "\n\n"; 108 std::string out = "// Shader Unique Id: FS" + id + "\n\n";
@@ -120,7 +125,8 @@ layout (std140, binding = EMULATION_UBO_BINDING) uniform fs_config {
120 125
121)"; 126)";
122 127
123 const ShaderIR program_ir(setup.program.code, PROGRAM_OFFSET, setup.program.size_a, settings); 128 const ShaderIR program_ir(setup.program.code, PROGRAM_OFFSET, setup.program.size_a, settings,
129 locker);
124 ProgramResult program = Decompile(device, program_ir, ProgramType::Fragment, "fragment"); 130 ProgramResult program = Decompile(device, program_ir, ProgramType::Fragment, "fragment");
125 out += program.first; 131 out += program.first;
126 132
@@ -133,13 +139,15 @@ void main() {
133 return {std::move(out), std::move(program.second)}; 139 return {std::move(out), std::move(program.second)};
134} 140}
135 141
136ProgramResult GenerateComputeShader(const Device& device, const ShaderSetup& setup) { 142ProgramResult GenerateComputeShader(ConstBufferLocker& locker, const Device& device,
143 const ShaderSetup& setup) {
137 const std::string id = fmt::format("{:016x}", setup.program.unique_identifier); 144 const std::string id = fmt::format("{:016x}", setup.program.unique_identifier);
138 145
139 std::string out = "// Shader Unique Id: CS" + id + "\n\n"; 146 std::string out = "// Shader Unique Id: CS" + id + "\n\n";
140 out += GetCommonDeclarations(); 147 out += GetCommonDeclarations();
141 148
142 const ShaderIR program_ir(setup.program.code, COMPUTE_OFFSET, setup.program.size_a, settings); 149 const ShaderIR program_ir(setup.program.code, COMPUTE_OFFSET, setup.program.size_a, settings,
150 locker);
143 ProgramResult program = Decompile(device, program_ir, ProgramType::Compute, "compute"); 151 ProgramResult program = Decompile(device, program_ir, ProgramType::Compute, "compute");
144 out += program.first; 152 out += program.first;
145 153
diff --git a/src/video_core/renderer_opengl/gl_shader_gen.h b/src/video_core/renderer_opengl/gl_shader_gen.h
index 3833e88ab..05f157298 100644
--- a/src/video_core/renderer_opengl/gl_shader_gen.h
+++ b/src/video_core/renderer_opengl/gl_shader_gen.h
@@ -16,6 +16,7 @@ class Device;
16 16
17namespace OpenGL::GLShader { 17namespace OpenGL::GLShader {
18 18
19using VideoCommon::Shader::ConstBufferLocker;
19using VideoCommon::Shader::ProgramCode; 20using VideoCommon::Shader::ProgramCode;
20 21
21struct ShaderSetup { 22struct ShaderSetup {
@@ -46,15 +47,19 @@ private:
46}; 47};
47 48
48/// Generates the GLSL vertex shader program source code for the given VS program 49/// Generates the GLSL vertex shader program source code for the given VS program
49ProgramResult GenerateVertexShader(const Device& device, const ShaderSetup& setup); 50ProgramResult GenerateVertexShader(ConstBufferLocker& locker, const Device& device,
51 const ShaderSetup& setup);
50 52
51/// Generates the GLSL geometry shader program source code for the given GS program 53/// Generates the GLSL geometry shader program source code for the given GS program
52ProgramResult GenerateGeometryShader(const Device& device, const ShaderSetup& setup); 54ProgramResult GenerateGeometryShader(ConstBufferLocker& locker, const Device& device,
55 const ShaderSetup& setup);
53 56
54/// Generates the GLSL fragment shader program source code for the given FS program 57/// Generates the GLSL fragment shader program source code for the given FS program
55ProgramResult GenerateFragmentShader(const Device& device, const ShaderSetup& setup); 58ProgramResult GenerateFragmentShader(ConstBufferLocker& locker, const Device& device,
59 const ShaderSetup& setup);
56 60
57/// Generates the GLSL compute shader program source code for the given CS program 61/// Generates the GLSL compute shader program source code for the given CS program
58ProgramResult GenerateComputeShader(const Device& device, const ShaderSetup& setup); 62ProgramResult GenerateComputeShader(ConstBufferLocker& locker, const Device& device,
63 const ShaderSetup& setup);
59 64
60} // namespace OpenGL::GLShader 65} // namespace OpenGL::GLShader
diff --git a/src/video_core/shader/control_flow.cpp b/src/video_core/shader/control_flow.cpp
index 70f758642..dac2e4272 100644
--- a/src/video_core/shader/control_flow.cpp
+++ b/src/video_core/shader/control_flow.cpp
@@ -57,8 +57,8 @@ struct BlockInfo {
57 57
58struct CFGRebuildState { 58struct CFGRebuildState {
59 explicit CFGRebuildState(const ProgramCode& program_code, const std::size_t program_size, 59 explicit CFGRebuildState(const ProgramCode& program_code, const std::size_t program_size,
60 const u32 start) 60 const u32 start, ConstBufferLocker& locker)
61 : start{start}, program_code{program_code}, program_size{program_size} {} 61 : start{start}, program_code{program_code}, program_size{program_size}, locker{locker} {}
62 62
63 u32 start{}; 63 u32 start{};
64 std::vector<BlockInfo> block_info{}; 64 std::vector<BlockInfo> block_info{};
@@ -72,6 +72,7 @@ struct CFGRebuildState {
72 const ProgramCode& program_code; 72 const ProgramCode& program_code;
73 const std::size_t program_size; 73 const std::size_t program_size;
74 ASTManager* manager; 74 ASTManager* manager;
75 ConstBufferLocker& locker;
75}; 76};
76 77
77enum class BlockCollision : u32 { None, Found, Inside }; 78enum class BlockCollision : u32 { None, Found, Inside };
@@ -214,7 +215,7 @@ std::optional<BranchIndirectInfo> TrackBranchIndirectInfo(const CFGRebuildState&
214 if (opcode->get().GetId() == OpCode::Id::IMNMX_IMM) { 215 if (opcode->get().GetId() == OpCode::Id::IMNMX_IMM) {
215 if (instr.gpr0.Value() == track_register) { 216 if (instr.gpr0.Value() == track_register) {
216 track_register = instr.gpr8.Value(); 217 track_register = instr.gpr8.Value();
217 result.entries = instr.alu.GetSignedImm20_20(); 218 result.entries = instr.alu.GetSignedImm20_20() + 1;
218 pos--; 219 pos--;
219 found_track = true; 220 found_track = true;
220 break; 221 break;
@@ -406,8 +407,14 @@ std::pair<ParseResult, ParseInfo> ParseCode(CFGRebuildState& state, u32 address)
406 auto tmp = TrackBranchIndirectInfo(state, address, offset); 407 auto tmp = TrackBranchIndirectInfo(state, address, offset);
407 if (tmp) { 408 if (tmp) {
408 auto result = *tmp; 409 auto result = *tmp;
409 LOG_CRITICAL(HW_GPU, "Track Successful, BRX: buffer:{}, offset:{}, entries:{}", 410 std::string entries{};
410 result.buffer, result.offset, result.entries); 411 for (u32 i = 0; i < result.entries; i++) {
412 auto k = locker.ObtainKey(result.buffer, result.offset + i * 4);
413 entries = entries + std::to_string(*k) + '\n';
414 }
415 LOG_CRITICAL(HW_GPU,
416 "Track Successful, BRX: buffer:{}, offset:{}, entries:{}, inner:\n{}",
417 result.buffer, result.offset, result.entries, entries);
411 } else { 418 } else {
412 LOG_CRITICAL(HW_GPU, "Track Unsuccesful"); 419 LOG_CRITICAL(HW_GPU, "Track Unsuccesful");
413 } 420 }
@@ -588,14 +595,15 @@ void DecompileShader(CFGRebuildState& state) {
588 595
589std::unique_ptr<ShaderCharacteristics> ScanFlow(const ProgramCode& program_code, 596std::unique_ptr<ShaderCharacteristics> ScanFlow(const ProgramCode& program_code,
590 std::size_t program_size, u32 start_address, 597 std::size_t program_size, u32 start_address,
591 const CompilerSettings& settings) { 598 const CompilerSettings& settings,
599 ConstBufferLocker& locker) {
592 auto result_out = std::make_unique<ShaderCharacteristics>(); 600 auto result_out = std::make_unique<ShaderCharacteristics>();
593 if (settings.depth == CompileDepth::BruteForce) { 601 if (settings.depth == CompileDepth::BruteForce) {
594 result_out->settings.depth = CompileDepth::BruteForce; 602 result_out->settings.depth = CompileDepth::BruteForce;
595 return result_out; 603 return result_out;
596 } 604 }
597 605
598 CFGRebuildState state{program_code, program_size, start_address}; 606 CFGRebuildState state{program_code, program_size, start_address, locker};
599 // Inspect Code and generate blocks 607 // Inspect Code and generate blocks
600 state.labels.clear(); 608 state.labels.clear();
601 state.labels.emplace(start_address); 609 state.labels.emplace(start_address);
diff --git a/src/video_core/shader/control_flow.h b/src/video_core/shader/control_flow.h
index 37e987d62..6d0e50d7c 100644
--- a/src/video_core/shader/control_flow.h
+++ b/src/video_core/shader/control_flow.h
@@ -78,6 +78,7 @@ struct ShaderCharacteristics {
78 78
79std::unique_ptr<ShaderCharacteristics> ScanFlow(const ProgramCode& program_code, 79std::unique_ptr<ShaderCharacteristics> ScanFlow(const ProgramCode& program_code,
80 std::size_t program_size, u32 start_address, 80 std::size_t program_size, u32 start_address,
81 const CompilerSettings& settings); 81 const CompilerSettings& settings,
82 ConstBufferLocker& locker);
82 83
83} // namespace VideoCommon::Shader 84} // namespace VideoCommon::Shader
diff --git a/src/video_core/shader/decode.cpp b/src/video_core/shader/decode.cpp
index 2626b1616..3f87b87ca 100644
--- a/src/video_core/shader/decode.cpp
+++ b/src/video_core/shader/decode.cpp
@@ -102,7 +102,7 @@ void ShaderIR::Decode() {
102 std::memcpy(&header, program_code.data(), sizeof(Tegra::Shader::Header)); 102 std::memcpy(&header, program_code.data(), sizeof(Tegra::Shader::Header));
103 103
104 decompiled = false; 104 decompiled = false;
105 auto info = ScanFlow(program_code, program_size, main_offset, settings); 105 auto info = ScanFlow(program_code, program_size, main_offset, settings, locker);
106 auto& shader_info = *info; 106 auto& shader_info = *info;
107 coverage_begin = shader_info.start; 107 coverage_begin = shader_info.start;
108 coverage_end = shader_info.end; 108 coverage_end = shader_info.end;
diff --git a/src/video_core/shader/shader_ir.cpp b/src/video_core/shader/shader_ir.cpp
index c1f2b88c8..6430575ec 100644
--- a/src/video_core/shader/shader_ir.cpp
+++ b/src/video_core/shader/shader_ir.cpp
@@ -23,9 +23,9 @@ using Tegra::Shader::PredOperation;
23using Tegra::Shader::Register; 23using Tegra::Shader::Register;
24 24
25ShaderIR::ShaderIR(const ProgramCode& program_code, u32 main_offset, const std::size_t size, 25ShaderIR::ShaderIR(const ProgramCode& program_code, u32 main_offset, const std::size_t size,
26 CompilerSettings settings) 26 CompilerSettings settings, ConstBufferLocker& locker)
27 : program_code{program_code}, main_offset{main_offset}, program_size{size}, basic_blocks{}, 27 : program_code{program_code}, main_offset{main_offset}, program_size{size}, basic_blocks{},
28 program_manager{true, true}, settings{settings} { 28 program_manager{true, true}, settings{settings}, locker{locker} {
29 Decode(); 29 Decode();
30} 30}
31 31
diff --git a/src/video_core/shader/shader_ir.h b/src/video_core/shader/shader_ir.h
index 68818643c..e3b568d3e 100644
--- a/src/video_core/shader/shader_ir.h
+++ b/src/video_core/shader/shader_ir.h
@@ -68,7 +68,7 @@ struct GlobalMemoryUsage {
68class ShaderIR final { 68class ShaderIR final {
69public: 69public:
70 explicit ShaderIR(const ProgramCode& program_code, u32 main_offset, std::size_t size, 70 explicit ShaderIR(const ProgramCode& program_code, u32 main_offset, std::size_t size,
71 CompilerSettings settings); 71 CompilerSettings settings, ConstBufferLocker& locker);
72 ~ShaderIR(); 72 ~ShaderIR();
73 73
74 const std::map<u32, NodeBlock>& GetBasicBlocks() const { 74 const std::map<u32, NodeBlock>& GetBasicBlocks() const {
@@ -389,6 +389,7 @@ private:
389 NodeBlock global_code; 389 NodeBlock global_code;
390 ASTManager program_manager; 390 ASTManager program_manager;
391 CompilerSettings settings{}; 391 CompilerSettings settings{};
392 ConstBufferLocker& locker;
392 393
393 std::set<u32> used_registers; 394 std::set<u32> used_registers;
394 std::set<Tegra::Shader::Pred> used_predicates; 395 std::set<Tegra::Shader::Pred> used_predicates;