mirror of
https://github.com/hyprwm/wlroots-hyprland.git
synced 2024-11-02 11:55:59 +01:00
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:
parent
6227da96b1
commit
6ecb0eefcb
3 changed files with 30 additions and 5 deletions
|
@ -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,
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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,
|
||||||
|
|
Loading…
Reference in a new issue