summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar wwylele2017-08-17 10:46:59 +0300
committerGravatar wwylele2017-08-21 08:03:07 +0300
commit1eca380886b5028e027f1380c04f221ac94ed47d (patch)
tree2e6b15be4c3fa915f59c80f04395cad09859394c
parentMerge pull request #2872 from wwylele/sw-geo-factor (diff)
downloadyuzu-1eca380886b5028e027f1380c04f221ac94ed47d.tar.gz
yuzu-1eca380886b5028e027f1380c04f221ac94ed47d.tar.xz
yuzu-1eca380886b5028e027f1380c04f221ac94ed47d.zip
gl_rasterizer: add clipping plane z<=0 defined in PICA
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer.cpp3
-rw-r--r--src/video_core/renderer_opengl/gl_shader_gen.cpp2
-rw-r--r--src/video_core/renderer_opengl/gl_state.cpp13
-rw-r--r--src/video_core/renderer_opengl/gl_state.h3
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));
28MICROPROFILE_DEFINE(OpenGL_CacheManagement, "OpenGL", "Cache Mgmt", MP_RGB(100, 255, 100)); 28MICROPROFILE_DEFINE(OpenGL_CacheManagement, "OpenGL", "Cache Mgmt", MP_RGB(100, 255, 100));
29 29
30RasterizerOpenGL::RasterizerOpenGL() : shader_dirty(true) { 30RasterizerOpenGL::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
73void OpenGLState::Apply() const { 75void 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
9namespace TextureUnits { 10namespace 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