diff options
Diffstat (limited to '')
| -rw-r--r-- | src/video_core/engines/maxwell_3d.h | 11 | ||||
| -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 |
4 files changed, 29 insertions, 5 deletions
diff --git a/src/video_core/engines/maxwell_3d.h b/src/video_core/engines/maxwell_3d.h index b379d8057..d4fcedace 100644 --- a/src/video_core/engines/maxwell_3d.h +++ b/src/video_core/engines/maxwell_3d.h | |||
| @@ -319,7 +319,15 @@ public: | |||
| 319 | } | 319 | } |
| 320 | } rt[NumRenderTargets]; | 320 | } rt[NumRenderTargets]; |
| 321 | 321 | ||
| 322 | INSERT_PADDING_WORDS(0x80); | 322 | struct { |
| 323 | f32 scale_x; | ||
| 324 | f32 scale_y; | ||
| 325 | f32 scale_z; | ||
| 326 | u32 translate_x; | ||
| 327 | u32 translate_y; | ||
| 328 | u32 translate_z; | ||
| 329 | INSERT_PADDING_WORDS(2); | ||
| 330 | } viewport_transform[NumViewports]; | ||
| 323 | 331 | ||
| 324 | struct { | 332 | struct { |
| 325 | union { | 333 | union { |
| @@ -649,6 +657,7 @@ private: | |||
| 649 | "Field " #field_name " has invalid position") | 657 | "Field " #field_name " has invalid position") |
| 650 | 658 | ||
| 651 | ASSERT_REG_POSITION(rt, 0x200); | 659 | ASSERT_REG_POSITION(rt, 0x200); |
| 660 | ASSERT_REG_POSITION(viewport_transform[0], 0x280); | ||
| 652 | ASSERT_REG_POSITION(viewport, 0x300); | 661 | ASSERT_REG_POSITION(viewport, 0x300); |
| 653 | ASSERT_REG_POSITION(vertex_buffer, 0x35D); | 662 | ASSERT_REG_POSITION(vertex_buffer, 0x35D); |
| 654 | ASSERT_REG_POSITION(zeta, 0x3F8); | 663 | ASSERT_REG_POSITION(zeta, 0x3F8); |
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 | ||