From f252c5a79214a3d3cd7ab3f239050b234e4ae9e2 Mon Sep 17 00:00:00 2001 From: Drew DeVault Date: Fri, 23 Jun 2017 11:46:03 -0400 Subject: [PATCH] Manually transpose matricies in shader Since GLES2 doesn't do this for us, it seems, on all platforms. --- render/gles2/renderer.c | 2 +- render/gles2/shaders.c | 32 ++++++++++++++++++++++++++++++-- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/render/gles2/renderer.c b/render/gles2/renderer.c index 07647f2f..623f378e 100644 --- a/render/gles2/renderer.c +++ b/render/gles2/renderer.c @@ -142,7 +142,7 @@ static bool wlr_gles2_render_surface(struct wlr_renderer_state *state, } gles2_flush_errors(); wlr_surface_bind(surface); - GL_CALL(glUniformMatrix4fv(0, 1, GL_TRUE, *matrix)); + GL_CALL(glUniformMatrix4fv(0, 1, GL_FALSE, *matrix)); draw_quad(); return true; } diff --git a/render/gles2/shaders.c b/render/gles2/shaders.c index 850c0618..62712230 100644 --- a/render/gles2/shaders.c +++ b/render/gles2/shaders.c @@ -9,8 +9,22 @@ const GLchar quad_vertex_src[] = "attribute vec2 texcoord;" "varying vec4 v_color;" "varying vec2 v_texcoord;" +"mat4 transpose(in mat4 inMatrix) {" +" vec4 i0 = inMatrix[0];" +" vec4 i1 = inMatrix[1];" +" vec4 i2 = inMatrix[2];" +" vec4 i3 = inMatrix[3];" +" mat4 outMatrix = mat4(" +" vec4(i0.x, i1.x, i2.x, i3.x)," +" vec4(i0.y, i1.y, i2.y, i3.y)," +" vec4(i0.z, i1.z, i2.z, i3.z)," +" vec4(i0.w, i1.w, i2.w, i3.w)" +" );" +"" +" return outMatrix;" +"}" "void main() {" -" gl_Position = proj * vec4(pos, 0.0, 1.0);" +" gl_Position = transpose(proj) * vec4(pos, 0.0, 1.0);" " v_color = color;" " v_texcoord = texcoord;" "}"; @@ -41,8 +55,22 @@ const GLchar vertex_src[] = "attribute vec2 pos;" "attribute vec2 texcoord;" "varying vec2 v_texcoord;" +"mat4 transpose(in mat4 inMatrix) {" +" vec4 i0 = inMatrix[0];" +" vec4 i1 = inMatrix[1];" +" vec4 i2 = inMatrix[2];" +" vec4 i3 = inMatrix[3];" +" mat4 outMatrix = mat4(" +" vec4(i0.x, i1.x, i2.x, i3.x)," +" vec4(i0.y, i1.y, i2.y, i3.y)," +" vec4(i0.z, i1.z, i2.z, i3.z)," +" vec4(i0.w, i1.w, i2.w, i3.w)" +" );" +"" +" return outMatrix;" +"}" "void main() {" -" gl_Position = proj * vec4(pos, 0.0, 1.0);" +" gl_Position = transpose(proj) * vec4(pos, 0.0, 1.0);" " v_texcoord = texcoord;" "}";