mirror of
https://gitlab.freedesktop.org/wlroots/wlroots.git
synced 2024-11-25 00:22:25 +00:00
scene: add wlr_scene_buffer_set_buffer_with_options()
This is an extensible version of wlr_scene_buffer_set_buffer().
This commit is contained in:
parent
edb867bc05
commit
48f0902a36
@ -404,6 +404,24 @@ void wlr_scene_buffer_set_buffer(struct wlr_scene_buffer *scene_buffer,
|
||||
void wlr_scene_buffer_set_buffer_with_damage(struct wlr_scene_buffer *scene_buffer,
|
||||
struct wlr_buffer *buffer, const pixman_region32_t *region);
|
||||
|
||||
/**
|
||||
* Options for wlr_scene_buffer_set_buffer_with_options().
|
||||
*/
|
||||
struct wlr_scene_buffer_set_buffer_options {
|
||||
// The damage region is in buffer-local coordinates. If the region is NULL,
|
||||
// the whole buffer node will be damaged.
|
||||
const pixman_region32_t *damage;
|
||||
};
|
||||
|
||||
/**
|
||||
* Sets the buffer's backing buffer.
|
||||
*
|
||||
* If the buffer is NULL, the buffer node will not be displayed. If options is
|
||||
* NULL, empty options are used.
|
||||
*/
|
||||
void wlr_scene_buffer_set_buffer_with_options(struct wlr_scene_buffer *scene_buffer,
|
||||
struct wlr_buffer *buffer, const struct wlr_scene_buffer_set_buffer_options *options);
|
||||
|
||||
/**
|
||||
* Sets the buffer's opaque region. This is an optimization hint used to
|
||||
* determine if buffers which reside under this one need to be rendered or not.
|
||||
|
@ -686,12 +686,17 @@ struct wlr_scene_buffer *wlr_scene_buffer_create(struct wlr_scene_tree *parent,
|
||||
return scene_buffer;
|
||||
}
|
||||
|
||||
void wlr_scene_buffer_set_buffer_with_damage(struct wlr_scene_buffer *scene_buffer,
|
||||
struct wlr_buffer *buffer, const pixman_region32_t *damage) {
|
||||
void wlr_scene_buffer_set_buffer_with_options(struct wlr_scene_buffer *scene_buffer,
|
||||
struct wlr_buffer *buffer, const struct wlr_scene_buffer_set_buffer_options *options) {
|
||||
const struct wlr_scene_buffer_set_buffer_options default_options = {0};
|
||||
if (options == NULL) {
|
||||
options = &default_options;
|
||||
}
|
||||
|
||||
// specifying a region for a NULL buffer doesn't make sense. We need to know
|
||||
// about the buffer to scale the buffer local coordinates down to scene
|
||||
// coordinates.
|
||||
assert(buffer || !damage);
|
||||
assert(buffer || !options->damage);
|
||||
|
||||
bool mapped = buffer != NULL;
|
||||
bool prev_mapped = scene_buffer->buffer != NULL || scene_buffer->texture != NULL;
|
||||
@ -727,6 +732,7 @@ void wlr_scene_buffer_set_buffer_with_damage(struct wlr_scene_buffer *scene_buff
|
||||
|
||||
pixman_region32_t fallback_damage;
|
||||
pixman_region32_init_rect(&fallback_damage, 0, 0, buffer->width, buffer->height);
|
||||
const pixman_region32_t *damage = options->damage;
|
||||
if (!damage) {
|
||||
damage = &fallback_damage;
|
||||
}
|
||||
@ -810,9 +816,17 @@ void wlr_scene_buffer_set_buffer_with_damage(struct wlr_scene_buffer *scene_buff
|
||||
pixman_region32_fini(&fallback_damage);
|
||||
}
|
||||
|
||||
void wlr_scene_buffer_set_buffer_with_damage(struct wlr_scene_buffer *scene_buffer,
|
||||
struct wlr_buffer *buffer, const pixman_region32_t *damage) {
|
||||
const struct wlr_scene_buffer_set_buffer_options options = {
|
||||
.damage = damage,
|
||||
};
|
||||
wlr_scene_buffer_set_buffer_with_options(scene_buffer, buffer, &options);
|
||||
}
|
||||
|
||||
void wlr_scene_buffer_set_buffer(struct wlr_scene_buffer *scene_buffer,
|
||||
struct wlr_buffer *buffer) {
|
||||
wlr_scene_buffer_set_buffer_with_damage(scene_buffer, buffer, NULL);
|
||||
wlr_scene_buffer_set_buffer_with_options(scene_buffer, buffer, NULL);
|
||||
}
|
||||
|
||||
void wlr_scene_buffer_set_opaque_region(struct wlr_scene_buffer *scene_buffer,
|
||||
|
Loading…
Reference in New Issue
Block a user