diff options
| -rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer.cpp | 3 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_shader_gen.cpp | 2 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_state.cpp | 13 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_state.h | 3 |
4 files changed, 21 insertions, 0 deletions
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp index 1c6c15a58..aa95ef21d 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer.cpp +++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp | |||
| @@ -28,6 +28,9 @@ MICROPROFILE_DEFINE(OpenGL_Blits, "OpenGL", "Blits", MP_RGB(100, 100, 255)); | |||
| 28 | MICROPROFILE_DEFINE(OpenGL_CacheManagement, "OpenGL", "Cache Mgmt", MP_RGB(100, 255, 100)); | 28 | MICROPROFILE_DEFINE(OpenGL_CacheManagement, "OpenGL", "Cache Mgmt", MP_RGB(100, 255, 100)); |
| 29 | 29 | ||
| 30 | RasterizerOpenGL::RasterizerOpenGL() : shader_dirty(true) { | 30 | RasterizerOpenGL::RasterizerOpenGL() : shader_dirty(true) { |
| 31 | // Clipping plane 0 is always enabled for PICA fixed clip plane z <= 0 | ||
| 32 | state.clip_distance[0] = true; | ||
| 33 | |||
| 31 | // Create sampler objects | 34 | // Create sampler objects |
| 32 | for (size_t i = 0; i < texture_samplers.size(); ++i) { | 35 | for (size_t i = 0; i < texture_samplers.size(); ++i) { |
| 33 | texture_samplers[i].Create(); | 36 | texture_samplers[i].Create(); |
diff --git a/src/video_core/renderer_opengl/gl_shader_gen.cpp b/src/video_core/renderer_opengl/gl_shader_gen.cpp index ae67aab05..0dae4b91e 100644 --- a/src/video_core/renderer_opengl/gl_shader_gen.cpp +++ b/src/video_core/renderer_opengl/gl_shader_gen.cpp | |||
| @@ -1196,6 +1196,8 @@ void main() { | |||
| 1196 | normquat = vert_normquat; | 1196 | normquat = vert_normquat; |
| 1197 | view = vert_view; | 1197 | view = vert_view; |
| 1198 | gl_Position = vec4(vert_position.x, vert_position.y, -vert_position.z, vert_position.w); | 1198 | gl_Position = vec4(vert_position.x, vert_position.y, -vert_position.z, vert_position.w); |
| 1199 | gl_ClipDistance[0] = -vert_position.z; // fixed PICA clipping plane z <= 0 | ||
| 1200 | // TODO (wwylele): calculate gl_ClipDistance[1] from user-defined clipping plane | ||
| 1199 | } | 1201 | } |
| 1200 | )"; | 1202 | )"; |
| 1201 | 1203 | ||
diff --git a/src/video_core/renderer_opengl/gl_state.cpp b/src/video_core/renderer_opengl/gl_state.cpp index bc9d34b84..06a905766 100644 --- a/src/video_core/renderer_opengl/gl_state.cpp +++ b/src/video_core/renderer_opengl/gl_state.cpp | |||
| @@ -68,6 +68,8 @@ OpenGLState::OpenGLState() { | |||
| 68 | draw.vertex_buffer = 0; | 68 | draw.vertex_buffer = 0; |
| 69 | draw.uniform_buffer = 0; | 69 | draw.uniform_buffer = 0; |
| 70 | draw.shader_program = 0; | 70 | draw.shader_program = 0; |
| 71 | |||
| 72 | clip_distance = {}; | ||
| 71 | } | 73 | } |
| 72 | 74 | ||
| 73 | void OpenGLState::Apply() const { | 75 | void OpenGLState::Apply() const { |
| @@ -261,6 +263,17 @@ void OpenGLState::Apply() const { | |||
| 261 | glUseProgram(draw.shader_program); | 263 | glUseProgram(draw.shader_program); |
| 262 | } | 264 | } |
| 263 | 265 | ||
| 266 | // Clip distance | ||
| 267 | for (size_t i = 0; i < clip_distance.size(); ++i) { | ||
| 268 | if (clip_distance[i] != cur_state.clip_distance[i]) { | ||
| 269 | if (clip_distance[i]) { | ||
| 270 | glEnable(GL_CLIP_DISTANCE0 + i); | ||
| 271 | } else { | ||
| 272 | glDisable(GL_CLIP_DISTANCE0 + i); | ||
| 273 | } | ||
| 274 | } | ||
| 275 | } | ||
| 276 | |||
| 264 | cur_state = *this; | 277 | cur_state = *this; |
| 265 | } | 278 | } |
| 266 | 279 | ||
diff --git a/src/video_core/renderer_opengl/gl_state.h b/src/video_core/renderer_opengl/gl_state.h index 745a74479..437fe34c4 100644 --- a/src/video_core/renderer_opengl/gl_state.h +++ b/src/video_core/renderer_opengl/gl_state.h | |||
| @@ -4,6 +4,7 @@ | |||
| 4 | 4 | ||
| 5 | #pragma once | 5 | #pragma once |
| 6 | 6 | ||
| 7 | #include <array> | ||
| 7 | #include <glad/glad.h> | 8 | #include <glad/glad.h> |
| 8 | 9 | ||
| 9 | namespace TextureUnits { | 10 | namespace TextureUnits { |
| @@ -123,6 +124,8 @@ public: | |||
| 123 | GLuint shader_program; // GL_CURRENT_PROGRAM | 124 | GLuint shader_program; // GL_CURRENT_PROGRAM |
| 124 | } draw; | 125 | } draw; |
| 125 | 126 | ||
| 127 | std::array<bool, 2> clip_distance; // GL_CLIP_DISTANCE | ||
| 128 | |||
| 126 | OpenGLState(); | 129 | OpenGLState(); |
| 127 | 130 | ||
| 128 | /// Get the currently active OpenGL state | 131 | /// Get the currently active OpenGL state |