mirror of
https://github.com/hyprwm/wlroots-hyprland.git
synced 2024-11-26 22:55:58 +01:00
buffer: stop using source resource in wlr_client_buffer_apply_damage
This is the first step towards dropping wlr_client_buffer.resource.
This commit is contained in:
parent
7b25b0ff88
commit
0abb67c478
2 changed files with 28 additions and 6 deletions
|
@ -137,7 +137,12 @@ struct wlr_client_buffer {
|
||||||
*/
|
*/
|
||||||
struct wlr_texture *texture;
|
struct wlr_texture *texture;
|
||||||
|
|
||||||
|
// private state
|
||||||
|
|
||||||
struct wl_listener resource_destroy;
|
struct wl_listener resource_destroy;
|
||||||
|
|
||||||
|
// If the client buffer has been created from a wl_shm buffer
|
||||||
|
uint32_t shm_source_format;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
#include <drm_fourcc.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <wlr/render/wlr_renderer.h>
|
#include <wlr/render/wlr_renderer.h>
|
||||||
#include <wlr/types/wlr_buffer.h>
|
#include <wlr/types/wlr_buffer.h>
|
||||||
|
@ -168,6 +169,10 @@ static void client_buffer_resource_handle_destroy(struct wl_listener *listener,
|
||||||
// which case we'll read garbage. We decide to accept this risk.
|
// which case we'll read garbage. We decide to accept this risk.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool buffer_is_shm_client_buffer(struct wlr_buffer *buffer);
|
||||||
|
static struct wlr_shm_client_buffer *shm_client_buffer_from_buffer(
|
||||||
|
struct wlr_buffer *buffer);
|
||||||
|
|
||||||
struct wlr_buffer *wlr_buffer_from_resource(struct wlr_renderer *renderer,
|
struct wlr_buffer *wlr_buffer_from_resource(struct wlr_renderer *renderer,
|
||||||
struct wl_resource *resource) {
|
struct wl_resource *resource) {
|
||||||
assert(resource && wlr_resource_is_buffer(resource));
|
assert(resource && wlr_resource_is_buffer(resource));
|
||||||
|
@ -224,6 +229,14 @@ struct wlr_client_buffer *wlr_client_buffer_create(struct wlr_buffer *buffer,
|
||||||
wl_resource_add_destroy_listener(resource, &client_buffer->resource_destroy);
|
wl_resource_add_destroy_listener(resource, &client_buffer->resource_destroy);
|
||||||
client_buffer->resource_destroy.notify = client_buffer_resource_handle_destroy;
|
client_buffer->resource_destroy.notify = client_buffer_resource_handle_destroy;
|
||||||
|
|
||||||
|
if (buffer_is_shm_client_buffer(buffer)) {
|
||||||
|
struct wlr_shm_client_buffer *shm_client_buffer =
|
||||||
|
shm_client_buffer_from_buffer(buffer);
|
||||||
|
client_buffer->shm_source_format = shm_client_buffer->format;
|
||||||
|
} else {
|
||||||
|
client_buffer->shm_source_format = DRM_FORMAT_INVALID;
|
||||||
|
}
|
||||||
|
|
||||||
// Ensure the buffer will be released before being destroyed
|
// Ensure the buffer will be released before being destroyed
|
||||||
wlr_buffer_lock(&client_buffer->base);
|
wlr_buffer_lock(&client_buffer->base);
|
||||||
wlr_buffer_drop(&client_buffer->base);
|
wlr_buffer_drop(&client_buffer->base);
|
||||||
|
@ -242,16 +255,16 @@ struct wlr_client_buffer *wlr_client_buffer_apply_damage(
|
||||||
}
|
}
|
||||||
|
|
||||||
struct wl_shm_buffer *shm_buf = wl_shm_buffer_get(resource);
|
struct wl_shm_buffer *shm_buf = wl_shm_buffer_get(resource);
|
||||||
struct wl_shm_buffer *old_shm_buf = wl_shm_buffer_get(client_buffer->resource);
|
if (shm_buf == NULL ||
|
||||||
if (shm_buf == NULL || old_shm_buf == NULL) {
|
client_buffer->shm_source_format == DRM_FORMAT_INVALID) {
|
||||||
// Uploading only damaged regions only works for wl_shm buffers and
|
// Uploading only damaged regions only works for wl_shm buffers and
|
||||||
// mutable textures (created from wl_shm buffer)
|
// mutable textures (created from wl_shm buffer)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
enum wl_shm_format new_fmt = wl_shm_buffer_get_format(shm_buf);
|
enum wl_shm_format new_shm_fmt = wl_shm_buffer_get_format(shm_buf);
|
||||||
enum wl_shm_format old_fmt = wl_shm_buffer_get_format(old_shm_buf);
|
if (convert_wl_shm_format_to_drm(new_shm_fmt) !=
|
||||||
if (new_fmt != old_fmt) {
|
client_buffer->shm_source_format) {
|
||||||
// Uploading to textures can't change the format
|
// Uploading to textures can't change the format
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -292,9 +305,13 @@ struct wlr_client_buffer *wlr_client_buffer_apply_damage(
|
||||||
|
|
||||||
static const struct wlr_buffer_impl shm_client_buffer_impl;
|
static const struct wlr_buffer_impl shm_client_buffer_impl;
|
||||||
|
|
||||||
|
static bool buffer_is_shm_client_buffer(struct wlr_buffer *buffer) {
|
||||||
|
return buffer->impl == &shm_client_buffer_impl;
|
||||||
|
}
|
||||||
|
|
||||||
static struct wlr_shm_client_buffer *shm_client_buffer_from_buffer(
|
static struct wlr_shm_client_buffer *shm_client_buffer_from_buffer(
|
||||||
struct wlr_buffer *buffer) {
|
struct wlr_buffer *buffer) {
|
||||||
assert(buffer->impl == &shm_client_buffer_impl);
|
assert(buffer_is_shm_client_buffer(buffer));
|
||||||
return (struct wlr_shm_client_buffer *)buffer;
|
return (struct wlr_shm_client_buffer *)buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue