Merge branch 'buffer-pass-clear' into 'master'

render: optionally clear buffer before rendering

See merge request wlroots/wlroots!4518
This commit is contained in:
Julia Tatz 2024-04-22 06:05:12 +00:00
commit 229f89b416
19 changed files with 254 additions and 118 deletions

View file

@ -169,6 +169,7 @@ void push_gles2_debug_(struct wlr_gles2_renderer *renderer,
void pop_gles2_debug(struct wlr_gles2_renderer *renderer);
struct wlr_gles2_render_pass *begin_gles2_buffer_pass(struct wlr_gles2_buffer *buffer,
struct wlr_egl_context *prev_ctx, struct wlr_gles2_render_timer *timer);
struct wlr_egl_context *prev_ctx, struct wlr_gles2_render_timer *timer,
const struct wlr_render_color *clear_color);
#endif

View file

@ -175,17 +175,28 @@ struct wlr_vk_pipeline {
struct wl_list link; // struct wlr_vk_render_format_setup
};
struct wlr_vk_framebuffer {
int width, height;
VkFramebuffer vk;
struct wlr_vk_render_format_setup *setup;
struct wl_list link; // struct wlr_vk_render_format_setup
};
// For each format we want to render, we need a separate renderpass
// and therefore also separate pipelines.
struct wlr_vk_render_format_setup {
struct wl_list link; // wlr_vk_renderer.render_format_setups
const struct wlr_vk_format *render_format; // used in renderpass
bool has_blending_buffer;
bool clear_on_load;
VkRenderPass render_pass;
VkPipeline output_pipe;
struct wlr_vk_renderer *renderer;
struct wl_list pipelines; // struct wlr_vk_pipeline.link
struct wl_list framebuffers; // struct wlr_vk_framebuffer.link
};
// Renderer-internal represenation of an wlr_buffer imported for rendering.
@ -193,12 +204,12 @@ struct wlr_vk_render_buffer {
struct wlr_buffer *wlr_buffer;
struct wlr_addon addon;
struct wlr_vk_renderer *renderer;
struct wlr_vk_render_format_setup *render_setup;
struct wl_list link; // wlr_vk_renderer.buffers
const struct wlr_vk_format *fmt;
VkImage image;
VkImageView image_view;
VkFramebuffer framebuffer;
uint32_t mem_count;
VkDeviceMemory memories[WLR_DMABUF_MAX_PLANES];
bool transitioned;
@ -295,12 +306,18 @@ struct wlr_vk_texture_view {
struct wlr_vk_descriptor_pool *ds_pool;
};
struct wlr_vk_render_format_setup *find_or_create_render_setup(
struct wlr_vk_renderer *renderer, const struct wlr_vk_format *format,
bool has_blending_buffer, bool clear_on_load);
struct wlr_vk_pipeline *setup_get_or_create_pipeline(
struct wlr_vk_render_format_setup *setup,
const struct wlr_vk_pipeline_key *key);
struct wlr_vk_pipeline_layout *get_or_create_pipeline_layout(
struct wlr_vk_renderer *renderer,
const struct wlr_vk_pipeline_layout_key *key);
struct wlr_vk_framebuffer *get_or_create_framebuffer(
struct wlr_vk_render_format_setup *setup,
int width, int height);
struct wlr_vk_texture_view *vulkan_texture_get_or_create_view(
struct wlr_vk_texture *texture,
const struct wlr_vk_pipeline_layout *layout);
@ -321,6 +338,7 @@ struct wlr_vk_render_pass {
struct wlr_render_pass base;
struct wlr_vk_renderer *renderer;
struct wlr_vk_render_buffer *render_buffer;
struct wlr_vk_render_format_setup *render_setup;
struct wlr_vk_command_buffer *command_buffer;
struct rect_union updated_region;
VkPipeline bound_pipeline;
@ -329,7 +347,7 @@ struct wlr_vk_render_pass {
};
struct wlr_vk_render_pass *vulkan_begin_render_pass(struct wlr_vk_renderer *renderer,
struct wlr_vk_render_buffer *buffer);
struct wlr_vk_render_buffer *buffer, const struct wlr_render_color *clear_color);
// Suballocates a buffer span with the given size that can be mapped
// and used as staging buffer. The allocation is implicitly released when the

View file

@ -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;