diff --git a/include/sway/desktop/fx_renderer.h b/include/sway/desktop/fx_renderer.h index bf8cd3d1..f2ed0cbc 100644 --- a/include/sway/desktop/fx_renderer.h +++ b/include/sway/desktop/fx_renderer.h @@ -48,4 +48,6 @@ bool fx_render_subtexture_with_matrix(struct fx_renderer *renderer, bool fx_render_texture_with_matrix(struct fx_renderer *renderer, struct wlr_texture *wlr_texture, const float matrix[static 9], float alpha); +void fx_render_rect(struct fx_renderer *renderer, const struct wlr_box *box, const float color[static 4], const float projection[static 9]); + #endif diff --git a/sway/desktop/fx_renderer.c b/sway/desktop/fx_renderer.c index 299eca9d..5403f763 100644 --- a/sway/desktop/fx_renderer.c +++ b/sway/desktop/fx_renderer.c @@ -92,13 +92,6 @@ const GLchar tex_fragment_src_external[] = /************************ Matrix Consts *************************/ -/* -static const GLfloat flip_180[] = { - 1.0f, 0.0f, 0.0f, - 0.0f, -1.0f, 0.0f, - 0.0f, 0.0f, 1.0f, -}; -*/ static const GLfloat verts[] = { 1, 0, // top right @@ -162,7 +155,6 @@ error: } // TODO: Hyprland way? -// TODO: instead of server, have param be server->backend like wlr_renderer_autocreate struct fx_renderer *fx_renderer_create(struct wlr_egl *egl) { struct fx_renderer *renderer = calloc(1, sizeof(struct fx_renderer)); if (renderer == NULL) { @@ -260,8 +252,6 @@ error: } void fx_renderer_begin(struct fx_renderer *renderer, uint32_t width, uint32_t height) { - //push_gles2_debug(renderer); - glViewport(0, 0, width, height); // refresh projection matrix @@ -269,9 +259,6 @@ void fx_renderer_begin(struct fx_renderer *renderer, uint32_t width, uint32_t he WL_OUTPUT_TRANSFORM_FLIPPED_180); glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); - - //pop_gles2_debug(renderer); - } void fx_renderer_end() { @@ -338,8 +325,6 @@ bool fx_render_subtexture_with_matrix(struct fx_renderer *renderer, // to GL_FALSE wlr_matrix_transpose(gl_matrix, gl_matrix); - // push_gles2_debug(renderer); - if (!texture_attrs.has_alpha && alpha == 1.0) { glDisable(GL_BLEND); } else { @@ -381,7 +366,6 @@ bool fx_render_subtexture_with_matrix(struct fx_renderer *renderer, glBindTexture(texture_attrs.target, 0); - // pop_gles2_debug(renderer); return true; } @@ -395,3 +379,41 @@ bool fx_render_texture_with_matrix(struct fx_renderer *renderer, }; return fx_render_subtexture_with_matrix(renderer, wlr_texture, &box, matrix, alpha); } + +void fx_render_rect(struct fx_renderer *renderer, const struct wlr_box *box, const float color[static 4], const float projection[static 9]) { + if (box->width == 0 || box->height == 0) { + return; + } + assert(box->width > 0 && box->height > 0); + float matrix[9]; + wlr_matrix_project_box(matrix, box, WL_OUTPUT_TRANSFORM_NORMAL, 0, projection); + + float gl_matrix[9]; + wlr_matrix_multiply(gl_matrix, renderer->projection, matrix); + + // TODO: investigate why matrix is flipped prior to this cmd + // wlr_matrix_multiply(gl_matrix, flip_180, gl_matrix); + + wlr_matrix_transpose(gl_matrix, gl_matrix); + + if (color[3] == 1.0) { + glDisable(GL_BLEND); + } else { + glEnable(GL_BLEND); + } + + glUseProgram(renderer->shaders.quad.program); + + glUniformMatrix3fv(renderer->shaders.quad.proj, 1, GL_FALSE, gl_matrix); + glUniform4f(renderer->shaders.quad.color, color[0], color[1], color[2], color[3]); + + glVertexAttribPointer(renderer->shaders.quad.pos_attrib, 2, GL_FLOAT, GL_FALSE, + 0, verts); + + glEnableVertexAttribArray(renderer->shaders.quad.pos_attrib); + + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + + glDisableVertexAttribArray(renderer->shaders.quad.pos_attrib); +} + diff --git a/sway/desktop/render.c b/sway/desktop/render.c index 94ccff42..b7ad1cfa 100644 --- a/sway/desktop/render.c +++ b/sway/desktop/render.c @@ -218,7 +218,7 @@ void render_rect(struct sway_output *output, pixman_region32_t *output_damage, const struct wlr_box *_box, float color[static 4]) { struct wlr_output *wlr_output = output->wlr_output; - struct wlr_renderer *renderer = wlr_output->renderer; + struct fx_renderer *renderer = output->server->renderer; struct wlr_box box; memcpy(&box, _box, sizeof(struct wlr_box)); @@ -239,7 +239,7 @@ void render_rect(struct sway_output *output, pixman_box32_t *rects = pixman_region32_rectangles(&damage, &nrects); for (int i = 0; i < nrects; ++i) { scissor_output(wlr_output, &rects[i]); - wlr_render_rect(renderer, &box, color, + fx_render_rect(renderer, &box, color, wlr_output->transform_matrix); } @@ -1028,7 +1028,6 @@ static void render_seatops(struct sway_output *output, void output_render(struct sway_output *output, struct timespec *when, pixman_region32_t *damage) { struct wlr_output *wlr_output = output->wlr_output; - struct wlr_renderer *wlr_renderer = output->server->wlr_renderer; struct fx_renderer *renderer = output->server->renderer; struct sway_workspace *workspace = output->current.active_workspace; @@ -1141,6 +1140,7 @@ render_overlay: render_drag_icons(output, damage, &root->drag_icons); renderer_end: + struct wlr_renderer *wlr_renderer = output->server->wlr_renderer; fx_renderer_scissor(NULL); wlr_renderer_begin(wlr_renderer, wlr_output->width, wlr_output->height); wlr_output_render_software_cursors(wlr_output, damage);