diff --git a/src/xenia/gpu/gl4/command_processor.cc b/src/xenia/gpu/gl4/command_processor.cc index b66fcf846..cc4b96d95 100644 --- a/src/xenia/gpu/gl4/command_processor.cc +++ b/src/xenia/gpu/gl4/command_processor.cc @@ -1596,7 +1596,8 @@ CommandProcessor::UpdateStatus CommandProcessor::UpdateShaders( xe_gpu_program_cntl_t program_cntl; program_cntl.dword_0 = regs.sq_program_cntl; if (!active_vertex_shader_->has_prepared()) { - if (!active_vertex_shader_->PrepareVertexShader(program_cntl)) { + if (!active_vertex_shader_->PrepareVertexShader(&shader_translator_, + program_cntl)) { XELOGE("Unable to prepare vertex shader"); return UpdateStatus::kError; } @@ -1606,7 +1607,8 @@ CommandProcessor::UpdateStatus CommandProcessor::UpdateShaders( } if (!active_pixel_shader_->has_prepared()) { - if (!active_pixel_shader_->PreparePixelShader(program_cntl)) { + if (!active_pixel_shader_->PreparePixelShader(&shader_translator_, + program_cntl)) { XELOGE("Unable to prepare pixel shader"); return UpdateStatus::kError; } diff --git a/src/xenia/gpu/gl4/command_processor.h b/src/xenia/gpu/gl4/command_processor.h index 780244cb6..ca8c80032 100644 --- a/src/xenia/gpu/gl4/command_processor.h +++ b/src/xenia/gpu/gl4/command_processor.h @@ -21,6 +21,7 @@ #include "xenia/gpu/gl4/draw_batcher.h" #include "xenia/gpu/gl4/gl_context.h" #include "xenia/gpu/gl4/gl4_shader.h" +#include "xenia/gpu/gl4/gl4_shader_translator.h" #include "xenia/gpu/gl4/texture_cache.h" #include "xenia/gpu/register_file.h" #include "xenia/gpu/tracing.h" @@ -259,6 +260,7 @@ class CommandProcessor { bool has_bindless_vbos_; + GL4ShaderTranslator shader_translator_; std::vector> all_shaders_; std::unordered_map shader_cache_; GL4Shader* active_vertex_shader_; diff --git a/src/xenia/gpu/gl4/gl4_shader.cc b/src/xenia/gpu/gl4/gl4_shader.cc index 798bd06c5..2e4dd8ef6 100644 --- a/src/xenia/gpu/gl4/gl4_shader.cc +++ b/src/xenia/gpu/gl4/gl4_shader.cc @@ -23,9 +23,6 @@ using namespace xe::gpu::xenos; extern "C" GLEWContext* glewGetContext(); -// Stateful, but minimally. -thread_local GL4ShaderTranslator shader_translator_; - GL4Shader::GL4Shader(ShaderType shader_type, uint64_t data_hash, const uint32_t* dword_ptr, uint32_t dword_count) : Shader(shader_type, data_hash, dword_ptr, dword_count), @@ -224,6 +221,7 @@ bool GL4Shader::PrepareVertexArrayObject() { } bool GL4Shader::PrepareVertexShader( + GL4ShaderTranslator* shader_translator, const xenos::xe_gpu_program_cntl_t& program_cntl) { if (has_prepared_) { return is_valid_; @@ -277,7 +275,7 @@ bool GL4Shader::PrepareVertexShader( GetFooter(); std::string translated_source = - shader_translator_.TranslateVertexShader(this, program_cntl); + shader_translator->TranslateVertexShader(this, program_cntl); if (translated_source.empty()) { XELOGE("Vertex shader failed translation"); return false; @@ -293,6 +291,7 @@ bool GL4Shader::PrepareVertexShader( } bool GL4Shader::PreparePixelShader( + GL4ShaderTranslator* shader_translator, const xenos::xe_gpu_program_cntl_t& program_cntl) { if (has_prepared_) { return is_valid_; @@ -330,7 +329,7 @@ bool GL4Shader::PreparePixelShader( GetFooter(); std::string translated_source = - shader_translator_.TranslatePixelShader(this, program_cntl); + shader_translator->TranslatePixelShader(this, program_cntl); if (translated_source.empty()) { XELOGE("Pixel shader failed translation"); return false; diff --git a/src/xenia/gpu/gl4/gl4_shader.h b/src/xenia/gpu/gl4/gl4_shader.h index 9b6ba3c4a..7c68bd83a 100644 --- a/src/xenia/gpu/gl4/gl4_shader.h +++ b/src/xenia/gpu/gl4/gl4_shader.h @@ -19,6 +19,8 @@ namespace xe { namespace gpu { namespace gl4 { +class GL4ShaderTranslator; + class GL4Shader : public Shader { public: GL4Shader(ShaderType shader_type, uint64_t data_hash, @@ -28,8 +30,10 @@ class GL4Shader : public Shader { GLuint program() const { return program_; } GLuint vao() const { return vao_; } - bool PrepareVertexShader(const xenos::xe_gpu_program_cntl_t& program_cntl); - bool PreparePixelShader(const xenos::xe_gpu_program_cntl_t& program_cntl); + bool PrepareVertexShader(GL4ShaderTranslator* shader_translator, + const xenos::xe_gpu_program_cntl_t& program_cntl); + bool PreparePixelShader(GL4ShaderTranslator* shader_translator, + const xenos::xe_gpu_program_cntl_t& program_cntl); protected: std::string GetHeader();