From 534266b3f89906cb791fe391f55954409d9350b8 Mon Sep 17 00:00:00 2001 From: Julia Tatz Date: Tue, 12 Dec 2023 17:54:27 -0500 Subject: [PATCH] render: optionally clear buffer before rendering It's suboptimal to do it separately, and some drivers can do it for free this way Prevents UNASSIGNED-BestPractices-vkCmdClearAttachments-clear-after-load warning --- include/wlr/render/pass.h | 24 ++++++++++++++---------- render/gles2/renderer.c | 8 ++++++++ render/pixman/renderer.c | 7 +++++++ render/vulkan/renderer.c | 8 ++++++++ 4 files changed, 37 insertions(+), 10 deletions(-) diff --git a/include/wlr/render/pass.h b/include/wlr/render/pass.h index d1b3eb150..8d508344d 100644 --- a/include/wlr/render/pass.h +++ b/include/wlr/render/pass.h @@ -27,9 +27,23 @@ struct wlr_render_pass; */ struct wlr_render_timer; +/** + * A color value. + * + * Each channel has values between 0 and 1 inclusive. The R, G, B + * channels need to be pre-multiplied by A. + */ +struct wlr_render_color { + float r, g, b, a; +}; + struct wlr_buffer_pass_options { /* Timer to measure the duration of the render pass */ struct wlr_render_timer *timer; + /* Clear the buffer before rendering into it */ + bool clear_buffer; + /* If clearing the buffer, what color to clear it with */ + struct wlr_render_color clear_color; }; /** @@ -93,16 +107,6 @@ struct wlr_render_texture_options { void wlr_render_pass_add_texture(struct wlr_render_pass *render_pass, const struct wlr_render_texture_options *options); -/** - * A color value. - * - * Each channel has values between 0 and 1 inclusive. The R, G, B - * channels need to be pre-multiplied by A. - */ -struct wlr_render_color { - float r, g, b, a; -}; - struct wlr_render_rect_options { /* Rectangle coordinates */ struct wlr_box box; diff --git a/render/gles2/renderer.c b/render/gles2/renderer.c index a71423c0c..5e73bcabb 100644 --- a/render/gles2/renderer.c +++ b/render/gles2/renderer.c @@ -268,6 +268,14 @@ static struct wlr_render_pass *gles2_begin_buffer_pass(struct wlr_renderer *wlr_ if (!pass) { return NULL; } + // TODO: switch to using `glClearColor` + `glClear` + if (options->clear_buffer) { + wlr_render_pass_add_rect(&pass->base, &(struct wlr_render_rect_options){ + .box = { .width = buffer->buffer->width, .height = buffer->buffer->height }, + .color = options->clear_color, + .blend_mode = WLR_RENDER_BLEND_MODE_NONE, + }); + } return &pass->base; } diff --git a/render/pixman/renderer.c b/render/pixman/renderer.c index 27cde9394..8c98e4379 100644 --- a/render/pixman/renderer.c +++ b/render/pixman/renderer.c @@ -307,6 +307,13 @@ static struct wlr_render_pass *pixman_begin_buffer_pass(struct wlr_renderer *wlr if (pass == NULL) { return NULL; } + if (options->clear_buffer) { + wlr_render_pass_add_rect(&pass->base, &(struct wlr_render_rect_options){ + .box = { .width = buffer->buffer->width, .height = buffer->buffer->height }, + .color = options->clear_color, + .blend_mode = WLR_RENDER_BLEND_MODE_NONE, + }); + } return &pass->base; } diff --git a/render/vulkan/renderer.c b/render/vulkan/renderer.c index 05486a0f8..ea8a5d153 100644 --- a/render/vulkan/renderer.c +++ b/render/vulkan/renderer.c @@ -1321,6 +1321,14 @@ static struct wlr_render_pass *vulkan_begin_buffer_pass(struct wlr_renderer *wlr if (render_pass == NULL) { return NULL; } + // TODO: switch to using `VkRenderPassBeginInfo.pClearValues` + if (options->clear_buffer) { + wlr_render_pass_add_rect(&render_pass->base, &(struct wlr_render_rect_options){ + .box = { .width = buffer->width, .height = buffer->height }, + .color = options->clear_color, + .blend_mode = WLR_RENDER_BLEND_MODE_NONE, + }); + } return &render_pass->base; }