diff options
| author | bunnei <bunneidev@gmail.com> | 2019-04-03 21:47:48 -0400 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2019-04-03 21:47:48 -0400 | 
| commit | d7438d067f8c4f15e689f85dc92c244bdb134bf0 (patch) | |
| tree | 24495ef29ae433bb4116cf186dece3d29fcbccf7 /src/video_core | |
| parent | a655b59cef71e4af7d5ba7a7859fcf08c0dc4618 (diff) | |
| parent | c1ba3e3d4a36d1572ddf3ff35a3fddf861e2e07d (diff) | |
Merge pull request #2299 from lioncash/maxwell
 gl_shader_manager: Remove reliance on a global accessor within MaxwellUniformData::SetFromRegs()
Diffstat (limited to 'src/video_core')
4 files changed, 15 insertions, 17 deletions
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp index 046fc935b..8f012db62 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer.cpp +++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp @@ -318,7 +318,7 @@ void RasterizerOpenGL::SetupShaders(GLenum primitive_mode) {          const std::size_t stage{index == 0 ? 0 : index - 1}; // Stage indices are 0 - 5          GLShader::MaxwellUniformData ubo{}; -        ubo.SetFromRegs(gpu.state.shader_stages[stage]); +        ubo.SetFromRegs(gpu, stage);          const GLintptr offset = buffer_cache.UploadHostMemory(              &ubo, sizeof(ubo), static_cast<std::size_t>(uniform_buffer_alignment)); diff --git a/src/video_core/renderer_opengl/gl_shader_cache.cpp b/src/video_core/renderer_opengl/gl_shader_cache.cpp index 290e654bc..7030db365 100644 --- a/src/video_core/renderer_opengl/gl_shader_cache.cpp +++ b/src/video_core/renderer_opengl/gl_shader_cache.cpp @@ -6,13 +6,11 @@  #include "common/assert.h"  #include "common/hash.h"  #include "core/core.h" -#include "core/memory.h"  #include "video_core/engines/maxwell_3d.h"  #include "video_core/renderer_opengl/gl_rasterizer.h"  #include "video_core/renderer_opengl/gl_shader_cache.h"  #include "video_core/renderer_opengl/gl_shader_decompiler.h"  #include "video_core/renderer_opengl/gl_shader_disk_cache.h" -#include "video_core/renderer_opengl/gl_shader_manager.h"  #include "video_core/renderer_opengl/utils.h"  #include "video_core/shader/shader_ir.h" diff --git a/src/video_core/renderer_opengl/gl_shader_manager.cpp b/src/video_core/renderer_opengl/gl_shader_manager.cpp index 6a30c28d2..eaf3e03a0 100644 --- a/src/video_core/renderer_opengl/gl_shader_manager.cpp +++ b/src/video_core/renderer_opengl/gl_shader_manager.cpp @@ -2,15 +2,15 @@  // Licensed under GPLv2 or any later version  // Refer to the license.txt file included. -#include "core/core.h"  #include "video_core/renderer_opengl/gl_shader_manager.h"  namespace OpenGL::GLShader { -void MaxwellUniformData::SetFromRegs(const Maxwell3D::State::ShaderStageInfo& shader_stage) { -    const auto& gpu = Core::System::GetInstance().GPU().Maxwell3D(); -    const auto& regs = gpu.regs; -    const auto& state = gpu.state; +using Tegra::Engines::Maxwell3D; + +void MaxwellUniformData::SetFromRegs(const Maxwell3D& maxwell, std::size_t shader_stage) { +    const auto& regs = maxwell.regs; +    const auto& state = maxwell.state;      // TODO(bunnei): Support more than one viewport      viewport_flip[0] = regs.viewport_transform[0].scale_x < 0.0 ? -1.0f : 1.0f; @@ -18,7 +18,7 @@ void MaxwellUniformData::SetFromRegs(const Maxwell3D::State::ShaderStageInfo& sh      u32 func = static_cast<u32>(regs.alpha_test_func);      // Normalize the gl variants of opCompare to be the same as the normal variants -    u32 op_gl_variant_base = static_cast<u32>(Tegra::Engines::Maxwell3D::Regs::ComparisonOp::Never); +    const u32 op_gl_variant_base = static_cast<u32>(Maxwell3D::Regs::ComparisonOp::Never);      if (func >= op_gl_variant_base) {          func = func - op_gl_variant_base + 1U;      } @@ -31,8 +31,9 @@ void MaxwellUniformData::SetFromRegs(const Maxwell3D::State::ShaderStageInfo& sh      // Assign in which stage the position has to be flipped      // (the last stage before the fragment shader). -    if (gpu.regs.shader_config[static_cast<u32>(Maxwell3D::Regs::ShaderProgram::Geometry)].enable) { -        flip_stage = static_cast<u32>(Maxwell3D::Regs::ShaderProgram::Geometry); +    constexpr u32 geometry_index = static_cast<u32>(Maxwell3D::Regs::ShaderProgram::Geometry); +    if (maxwell.regs.shader_config[geometry_index].enable) { +        flip_stage = geometry_index;      } else {          flip_stage = static_cast<u32>(Maxwell3D::Regs::ShaderProgram::VertexB);      } diff --git a/src/video_core/renderer_opengl/gl_shader_manager.h b/src/video_core/renderer_opengl/gl_shader_manager.h index 4970aafed..8eef2a920 100644 --- a/src/video_core/renderer_opengl/gl_shader_manager.h +++ b/src/video_core/renderer_opengl/gl_shader_manager.h @@ -12,14 +12,13 @@  namespace OpenGL::GLShader { -using Tegra::Engines::Maxwell3D; -  /// Uniform structure for the Uniform Buffer Object, all vectors must be 16-byte aligned -// NOTE: Always keep a vec4 at the end. The GL spec is not clear whether the alignment at -//       the end of a uniform block is included in UNIFORM_BLOCK_DATA_SIZE or not. -//       Not following that rule will cause problems on some AMD drivers. +/// @note Always keep a vec4 at the end. The GL spec is not clear whether the alignment at +///       the end of a uniform block is included in UNIFORM_BLOCK_DATA_SIZE or not. +///       Not following that rule will cause problems on some AMD drivers.  struct MaxwellUniformData { -    void SetFromRegs(const Maxwell3D::State::ShaderStageInfo& shader_stage); +    void SetFromRegs(const Tegra::Engines::Maxwell3D& maxwell, std::size_t shader_stage); +      alignas(16) GLvec4 viewport_flip;      struct alignas(16) {          GLuint instance_id;  | 
