render/gles2: transpose matrices before binding them

Setting glUniformMatrix3fv's transpose parameter to GL_TRUE is
not allowed for OpenGL ES 2.

This adds a wlr_matrix_transpose function.
This commit is contained in:
emersion 2018-03-19 20:21:02 +01:00
parent 6227da96b1
commit 6ecb0eefcb
No known key found for this signature in database
GPG key ID: 0FDE7BE0E88F5E48
3 changed files with 30 additions and 5 deletions

View file

@ -5,11 +5,12 @@
#include <wlr/types/wlr_box.h> #include <wlr/types/wlr_box.h>
void wlr_matrix_identity(float mat[static 9]); void wlr_matrix_identity(float mat[static 9]);
void wlr_matrix_multiply(float mat[static 9], const float a[static 9],
const float b[static 9]);
void wlr_matrix_transpose(float mat[static 9], const float a[static 9]);
void wlr_matrix_translate(float mat[static 9], float x, float y); void wlr_matrix_translate(float mat[static 9], float x, float y);
void wlr_matrix_scale(float mat[static 9], float x, float y); void wlr_matrix_scale(float mat[static 9], float x, float y);
void wlr_matrix_rotate(float mat[static 9], float rad); void wlr_matrix_rotate(float mat[static 9], float rad);
void wlr_matrix_multiply(float mat[static 9], const float a[static 9],
const float b[static 9]);
void wlr_matrix_transform(float mat[static 9], void wlr_matrix_transform(float mat[static 9],
enum wl_output_transform transform); enum wl_output_transform transform);
void wlr_matrix_projection(float mat[static 9], int width, int height, void wlr_matrix_projection(float mat[static 9], int width, int height,

View file

@ -180,8 +180,13 @@ static bool wlr_gles2_render_texture_with_matrix(
return false; return false;
} }
// OpenGL ES 2 requires the glUniformMatrix3fv transpose parameter to be set
// to GL_FALSE
float transposition[9];
wlr_matrix_transpose(transposition, matrix);
wlr_texture_bind(texture); wlr_texture_bind(texture);
GL_CALL(glUniformMatrix3fv(0, 1, GL_TRUE, matrix)); GL_CALL(glUniformMatrix3fv(0, 1, GL_FALSE, transposition));
GL_CALL(glUniform1i(1, texture->inverted_y)); GL_CALL(glUniform1i(1, texture->inverted_y));
GL_CALL(glUniform1f(3, alpha)); GL_CALL(glUniform1f(3, alpha));
draw_quad(); draw_quad();
@ -191,16 +196,26 @@ static bool wlr_gles2_render_texture_with_matrix(
static void wlr_gles2_render_quad(struct wlr_renderer *wlr_renderer, static void wlr_gles2_render_quad(struct wlr_renderer *wlr_renderer,
const float color[static 4], const float matrix[static 9]) { const float color[static 4], const float matrix[static 9]) {
// OpenGL ES 2 requires the glUniformMatrix3fv transpose parameter to be set
// to GL_FALSE
float transposition[9];
wlr_matrix_transpose(transposition, matrix);
GL_CALL(glUseProgram(shaders.quad)); GL_CALL(glUseProgram(shaders.quad));
GL_CALL(glUniformMatrix3fv(0, 1, GL_TRUE, matrix)); GL_CALL(glUniformMatrix3fv(0, 1, GL_FALSE, transposition));
GL_CALL(glUniform4f(1, color[0], color[1], color[2], color[3])); GL_CALL(glUniform4f(1, color[0], color[1], color[2], color[3]));
draw_quad(); draw_quad();
} }
static void wlr_gles2_render_ellipse(struct wlr_renderer *wlr_renderer, static void wlr_gles2_render_ellipse(struct wlr_renderer *wlr_renderer,
const float color[static 4], const float matrix[static 9]) { const float color[static 4], const float matrix[static 9]) {
// OpenGL ES 2 requires the glUniformMatrix3fv transpose parameter to be set
// to GL_FALSE
float transposition[9];
wlr_matrix_transpose(transposition, matrix);
GL_CALL(glUseProgram(shaders.ellipse)); GL_CALL(glUseProgram(shaders.ellipse));
GL_CALL(glUniformMatrix3fv(0, 1, GL_TRUE, matrix)); GL_CALL(glUniformMatrix3fv(0, 1, GL_FALSE, transposition));
GL_CALL(glUniform4f(1, color[0], color[1], color[2], color[3])); GL_CALL(glUniform4f(1, color[0], color[1], color[2], color[3]));
draw_quad(); draw_quad();
} }

View file

@ -33,6 +33,15 @@ void wlr_matrix_multiply(float mat[static 9], const float a[static 9],
memcpy(mat, product, sizeof(product)); memcpy(mat, product, sizeof(product));
} }
void wlr_matrix_transpose(float mat[static 9], const float a[static 9]) {
float transposition[9] = {
a[0], a[3], a[6],
a[1], a[4], a[7],
a[2], a[5], a[8],
};
memcpy(mat, transposition, sizeof(transposition));
}
void wlr_matrix_translate(float mat[static 9], float x, float y) { void wlr_matrix_translate(float mat[static 9], float x, float y) {
float translate[9] = { float translate[9] = {
1.0f, 0.0f, x, 1.0f, 0.0f, x,