From 7775f55e3abe2b20369f1c77abc4df832ceea906 Mon Sep 17 00:00:00 2001 From: Alexander Orzechowski Date: Mon, 27 Jan 2025 14:30:13 -0500 Subject: [PATCH] util/matrix: Rework matrix_projection to compute transform on-demand --- include/render/gles2.h | 1 - include/render/vulkan.h | 1 - render/gles2/pass.c | 10 ++++------ render/vulkan/pass.c | 10 ++++++---- util/matrix.c | 19 +++++++++---------- 5 files changed, 19 insertions(+), 22 deletions(-) diff --git a/include/render/gles2.h b/include/render/gles2.h index 0f24ae38e..f36b173e2 100644 --- a/include/render/gles2.h +++ b/include/render/gles2.h @@ -135,7 +135,6 @@ struct wlr_gles2_texture { struct wlr_gles2_render_pass { struct wlr_render_pass base; struct wlr_gles2_buffer *buffer; - float projection_matrix[9]; struct wlr_egl_context prev_ctx; struct wlr_gles2_render_timer *timer; struct wlr_drm_syncobj_timeline *signal_timeline; diff --git a/include/render/vulkan.h b/include/render/vulkan.h index abeb11cc5..83a99a8dd 100644 --- a/include/render/vulkan.h +++ b/include/render/vulkan.h @@ -384,7 +384,6 @@ struct wlr_vk_render_pass { struct wlr_vk_command_buffer *command_buffer; struct rect_union updated_region; VkPipeline bound_pipeline; - float projection[9]; bool failed; bool srgb_pathway; // if false, rendering via intermediate blending buffer struct wlr_color_transform *color_transform; diff --git a/render/gles2/pass.c b/render/gles2/pass.c index 0b5c1ab0d..7be09b1a6 100644 --- a/render/gles2/pass.c +++ b/render/gles2/pass.c @@ -124,10 +124,10 @@ static void render(const struct wlr_box *box, const pixman_region32_t *clip, GLi pixman_region32_fini(®ion); } -static void set_proj_matrix(GLint loc, float proj[9], const struct wlr_box *box) { +static void set_proj_matrix(GLint loc, struct wlr_gles2_buffer *buffer, const struct wlr_box *box) { float gl_matrix[9]; wlr_matrix_project_box(gl_matrix, box); - wlr_matrix_multiply(gl_matrix, proj, gl_matrix); + matrix_projection(gl_matrix, buffer->buffer->width, buffer->buffer->height); glUniformMatrix3fv(loc, 1, GL_FALSE, gl_matrix); } @@ -238,7 +238,7 @@ static void render_pass_add_texture(struct wlr_render_pass *wlr_pass, glUniform1i(shader->tex, 0); glUniform1f(shader->alpha, alpha); - set_proj_matrix(shader->proj, pass->projection_matrix, &dst_box); + set_proj_matrix(shader->proj, pass->buffer, &dst_box); set_tex_matrix(shader->tex_proj, options->transform, &src_fbox); render(&dst_box, options->clip, shader->pos_attrib); @@ -261,7 +261,7 @@ static void render_pass_add_rect(struct wlr_render_pass *wlr_pass, glUseProgram(renderer->shaders.quad.program); - set_proj_matrix(renderer->shaders.quad.proj, pass->projection_matrix, &box); + set_proj_matrix(renderer->shaders.quad.proj, pass->buffer, &box); glUniform4f(renderer->shaders.quad.color, color->r, color->g, color->b, color->a); render(&box, options->clip, renderer->shaders.quad.pos_attrib); @@ -323,8 +323,6 @@ struct wlr_gles2_render_pass *begin_gles2_buffer_pass(struct wlr_gles2_buffer *b pass->signal_point = signal_point; } - matrix_projection(pass->projection_matrix, wlr_buffer->width, wlr_buffer->height); - push_gles2_debug(renderer); glBindFramebuffer(GL_FRAMEBUFFER, fbo); diff --git a/render/vulkan/pass.c b/render/vulkan/pass.c index 104fbda3c..0e50e25cd 100644 --- a/render/vulkan/pass.c +++ b/render/vulkan/pass.c @@ -620,7 +620,9 @@ static void render_pass_add_rect(struct wlr_render_pass *wlr_pass, case WLR_RENDER_BLEND_MODE_PREMULTIPLIED:; float matrix[9]; wlr_matrix_project_box(matrix, &box); - wlr_matrix_multiply(matrix, pass->projection, matrix); + matrix_projection(matrix, + pass->render_buffer->wlr_buffer->width, + pass->render_buffer->wlr_buffer->height); struct wlr_vk_render_format_setup *setup = pass->srgb_pathway ? pass->render_buffer->srgb.render_setup : @@ -711,7 +713,9 @@ static void render_pass_add_texture(struct wlr_render_pass *wlr_pass, float matrix[9]; wlr_matrix_project_box(matrix, &dst_box); wlr_matrix_transform(matrix, options->transform); - wlr_matrix_multiply(matrix, pass->projection, matrix); + matrix_projection(matrix, + pass->render_buffer->wlr_buffer->width, + pass->render_buffer->wlr_buffer->height); struct wlr_vk_vert_pcr_data vert_pcr_data = { .uv_off = { @@ -1131,8 +1135,6 @@ struct wlr_vk_render_pass *vulkan_begin_render_pass(struct wlr_vk_renderer *rend .maxDepth = 1, }); - matrix_projection(pass->projection, width, height); - wlr_buffer_lock(buffer->wlr_buffer); pass->render_buffer = buffer; pass->command_buffer = cb; diff --git a/util/matrix.c b/util/matrix.c index 20612182a..ce4f29fa1 100644 --- a/util/matrix.c +++ b/util/matrix.c @@ -71,17 +71,16 @@ void wlr_matrix_transform(float mat[static 9], } void matrix_projection(float mat[static 9], int width, int height) { - memset(mat, 0, sizeof(*mat) * 9); + struct wlr_fbox fbox = { + .x = -1.0f, + .y = -1.0f, + .width = 2.0f / width, + .height = 2.0f / height, + }; - mat[0] = 2.0f / width; - mat[4] = 2.0f / height; - - // Translation - mat[2] = -copysign(1.0f, mat[0] + mat[1]); - mat[5] = -copysign(1.0f, mat[3] + mat[4]); - - // Identity - mat[8] = 1.0f; + float trans[9]; + wlr_matrix_project_fbox(trans, &fbox); + wlr_matrix_multiply(mat, trans, mat); } void wlr_matrix_project_fbox(float mat[static 9], const struct wlr_fbox *box) {