diff options
| author | 2018-04-18 16:42:40 -0400 | |
|---|---|---|
| committer | 2018-04-18 16:42:40 -0400 | |
| commit | ce4f159b1cf2aa090e41dc0e2fbd65aa6a31942e (patch) | |
| tree | f8f53423389ca5787c05e249d65cd2df3f59b037 /src/video_core/renderer_opengl | |
| parent | Merge pull request #350 from Subv/tex_components (diff) | |
| download | yuzu-ce4f159b1cf2aa090e41dc0e2fbd65aa6a31942e.tar.gz yuzu-ce4f159b1cf2aa090e41dc0e2fbd65aa6a31942e.tar.xz yuzu-ce4f159b1cf2aa090e41dc0e2fbd65aa6a31942e.zip | |
gl_shader_gen: Support vertical/horizontal viewport flipping. (#347)
* gl_shader_gen: Support vertical/horizontal viewport flipping.
* fixup! gl_shader_gen: Support vertical/horizontal viewport flipping.
Diffstat (limited to 'src/video_core/renderer_opengl')
| -rw-r--r-- | src/video_core/renderer_opengl/gl_shader_gen.cpp | 10 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_shader_manager.cpp | 8 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_shader_manager.h | 5 |
3 files changed, 19 insertions, 4 deletions
diff --git a/src/video_core/renderer_opengl/gl_shader_gen.cpp b/src/video_core/renderer_opengl/gl_shader_gen.cpp index 8b7f17601..254f6e2c3 100644 --- a/src/video_core/renderer_opengl/gl_shader_gen.cpp +++ b/src/video_core/renderer_opengl/gl_shader_gen.cpp | |||
| @@ -29,9 +29,15 @@ out gl_PerVertex { | |||
| 29 | 29 | ||
| 30 | out vec4 position; | 30 | out vec4 position; |
| 31 | 31 | ||
| 32 | layout (std140) uniform vs_config { | ||
| 33 | vec4 viewport_flip; | ||
| 34 | }; | ||
| 35 | |||
| 32 | void main() { | 36 | void main() { |
| 33 | exec_shader(); | 37 | exec_shader(); |
| 34 | 38 | ||
| 39 | // Viewport can be flipped, which is unsupported by glViewport | ||
| 40 | position.xy *= viewport_flip.xy; | ||
| 35 | gl_Position = position; | 41 | gl_Position = position; |
| 36 | } | 42 | } |
| 37 | )"; | 43 | )"; |
| @@ -52,6 +58,10 @@ ProgramResult GenerateFragmentShader(const ShaderSetup& setup, const MaxwellFSCo | |||
| 52 | in vec4 position; | 58 | in vec4 position; |
| 53 | out vec4 color; | 59 | out vec4 color; |
| 54 | 60 | ||
| 61 | layout (std140) uniform fs_config { | ||
| 62 | vec4 viewport_flip; | ||
| 63 | }; | ||
| 64 | |||
| 55 | uniform sampler2D tex[32]; | 65 | uniform sampler2D tex[32]; |
| 56 | 66 | ||
| 57 | void main() { | 67 | void main() { |
diff --git a/src/video_core/renderer_opengl/gl_shader_manager.cpp b/src/video_core/renderer_opengl/gl_shader_manager.cpp index 85b838faa..17b3925a0 100644 --- a/src/video_core/renderer_opengl/gl_shader_manager.cpp +++ b/src/video_core/renderer_opengl/gl_shader_manager.cpp | |||
| @@ -53,6 +53,12 @@ void SetShaderSamplerBindings(GLuint shader) { | |||
| 53 | 53 | ||
| 54 | } // namespace Impl | 54 | } // namespace Impl |
| 55 | 55 | ||
| 56 | void MaxwellUniformData::SetFromRegs(const Maxwell3D::State::ShaderStageInfo& shader_stage) {} | 56 | void MaxwellUniformData::SetFromRegs(const Maxwell3D::State::ShaderStageInfo& shader_stage) { |
| 57 | const auto& regs = Core::System().GetInstance().GPU().Maxwell3D().regs; | ||
| 58 | |||
| 59 | // TODO(bunnei): Support more than one viewport | ||
| 60 | viewport_flip[0] = regs.viewport_transform[0].scale_x < 0.0 ? -1.0 : 1.0; | ||
| 61 | viewport_flip[1] = regs.viewport_transform[0].scale_y < 0.0 ? -1.0 : 1.0; | ||
| 62 | } | ||
| 57 | 63 | ||
| 58 | } // namespace GLShader | 64 | } // namespace GLShader |
diff --git a/src/video_core/renderer_opengl/gl_shader_manager.h b/src/video_core/renderer_opengl/gl_shader_manager.h index be63320e0..e963b4b7e 100644 --- a/src/video_core/renderer_opengl/gl_shader_manager.h +++ b/src/video_core/renderer_opengl/gl_shader_manager.h | |||
| @@ -30,10 +30,9 @@ void SetShaderSamplerBindings(GLuint shader); | |||
| 30 | // Not following that rule will cause problems on some AMD drivers. | 30 | // Not following that rule will cause problems on some AMD drivers. |
| 31 | struct MaxwellUniformData { | 31 | struct MaxwellUniformData { |
| 32 | void SetFromRegs(const Maxwell3D::State::ShaderStageInfo& shader_stage); | 32 | void SetFromRegs(const Maxwell3D::State::ShaderStageInfo& shader_stage); |
| 33 | // TODO(Subv): Use this for something. | 33 | alignas(16) GLvec4 viewport_flip; |
| 34 | }; | 34 | }; |
| 35 | // static_assert(sizeof(MaxwellUniformData) == 1024, "MaxwellUniformData structure size is | 35 | static_assert(sizeof(MaxwellUniformData) == 16, "MaxwellUniformData structure size is incorrect"); |
| 36 | // incorrect"); | ||
| 37 | static_assert(sizeof(MaxwellUniformData) < 16384, | 36 | static_assert(sizeof(MaxwellUniformData) < 16384, |
| 38 | "MaxwellUniformData structure must be less than 16kb as per the OpenGL spec"); | 37 | "MaxwellUniformData structure must be less than 16kb as per the OpenGL spec"); |
| 39 | 38 | ||