summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/video_core/engines/maxwell_3d.h11
-rw-r--r--src/video_core/renderer_opengl/gl_shader_gen.cpp10
-rw-r--r--src/video_core/renderer_opengl/gl_shader_manager.cpp8
-rw-r--r--src/video_core/renderer_opengl/gl_shader_manager.h5
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
651ASSERT_REG_POSITION(rt, 0x200); 659ASSERT_REG_POSITION(rt, 0x200);
660ASSERT_REG_POSITION(viewport_transform[0], 0x280);
652ASSERT_REG_POSITION(viewport, 0x300); 661ASSERT_REG_POSITION(viewport, 0x300);
653ASSERT_REG_POSITION(vertex_buffer, 0x35D); 662ASSERT_REG_POSITION(vertex_buffer, 0x35D);
654ASSERT_REG_POSITION(zeta, 0x3F8); 663ASSERT_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
30out vec4 position; 30out vec4 position;
31 31
32layout (std140) uniform vs_config {
33 vec4 viewport_flip;
34};
35
32void main() { 36void 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
52in vec4 position; 58in vec4 position;
53out vec4 color; 59out vec4 color;
54 60
61layout (std140) uniform fs_config {
62 vec4 viewport_flip;
63};
64
55uniform sampler2D tex[32]; 65uniform sampler2D tex[32];
56 66
57void main() { 67void 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
56void MaxwellUniformData::SetFromRegs(const Maxwell3D::State::ShaderStageInfo& shader_stage) {} 56void 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.
31struct MaxwellUniformData { 31struct 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 35static_assert(sizeof(MaxwellUniformData) == 16, "MaxwellUniformData structure size is incorrect");
36// incorrect");
37static_assert(sizeof(MaxwellUniformData) < 16384, 36static_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