struct wl_listener destroy;
struct wl_listener outputs_update;
const struct scaled_scene_buffer_impl *impl;
- /*
- * Pointer to the per-implementation list of scaled-scene-buffers.
- * This is used to share the backing wlr_buffers.
- */
- struct wl_list *cached_buffers;
- struct wl_list link; /* struct scaled_scene_buffer.cached_buffers */
+ struct wl_list link; /* all_scaled_buffers */
};
/*
* allocations.
*
* Besides caching buffers for each scale per scaled_scene_buffer, we also
- * store all the scaled_scene_buffers in a per-implementer list passed as
- * @cached_buffers in order to reuse backing buffers for visually duplicated
+ * store all the scaled_scene_buffers from all the implementers in a list
+ * in order to reuse backing buffers for visually duplicated
* scaled_scene_buffers found via impl->equal().
*
* All requested lab_data_buffers via impl->create_buffer() will be locked
struct scaled_scene_buffer *scaled_scene_buffer_create(
struct wlr_scene_tree *parent,
const struct scaled_scene_buffer_impl *implementation,
- struct wl_list *cached_buffers, bool drop_buffer);
+ bool drop_buffer);
/**
* scaled_scene_buffer_request_update - mark the buffer that needs to be
#include <wlr/util/log.h>
#include "buffer.h"
#include "common/font.h"
-#include "common/list.h"
#include "common/mem.h"
#include "common/scaled-scene-buffer.h"
#include "common/scaled-font-buffer.h"
-/* This holds all the scaled-font-buffers and used for sharing backing buffers */
-static struct wl_list cached_buffers = WL_LIST_INIT(&cached_buffers);
-
static struct lab_data_buffer *
_create_buffer(struct scaled_scene_buffer *scaled_buffer, double scale)
{
assert(parent);
struct scaled_font_buffer *self = znew(*self);
struct scaled_scene_buffer *scaled_buffer = scaled_scene_buffer_create(
- parent, &impl, &cached_buffers, /* drop_buffer */ true);
+ parent, &impl, /* drop_buffer */ true);
if (!scaled_buffer) {
free(self);
return NULL;
#include <wayland-server-core.h>
#include <wlr/types/wlr_scene.h>
#include "buffer.h"
-#include "common/list.h"
#include "common/mem.h"
#include "common/scaled-img-buffer.h"
#include "common/scaled-scene-buffer.h"
#include "img/img.h"
#include "node.h"
-static struct wl_list cached_buffers = WL_LIST_INIT(&cached_buffers);
-
static struct lab_data_buffer *
_create_buffer(struct scaled_scene_buffer *scaled_buffer, double scale)
{
{
assert(img);
struct scaled_scene_buffer *scaled_buffer = scaled_scene_buffer_create(
- parent, &impl, &cached_buffers, /* drop_buffer */ true);
+ parent, &impl, /* drop_buffer */ true);
struct scaled_img_buffer *self = znew(*self);
self->scaled_buffer = scaled_buffer;
self->scene_buffer = scaled_buffer->scene_buffer;
#include <wlr/util/log.h>
#include "buffer.h"
#include "common/graphic-helpers.h"
-#include "common/list.h"
#include "common/macros.h"
#include "common/mem.h"
#include "common/scaled-scene-buffer.h"
#include "common/scaled-rect-buffer.h"
-static struct wl_list cached_buffers = WL_LIST_INIT(&cached_buffers);
-
static void
draw_rectangle_path(cairo_t *cairo, int width, int height, int border_width)
{
assert(parent);
struct scaled_rect_buffer *self = znew(*self);
struct scaled_scene_buffer *scaled_buffer = scaled_scene_buffer_create(
- parent, &impl, &cached_buffers, /* drop_buffer */ true);
+ parent, &impl, /* drop_buffer */ true);
scaled_buffer->data = self;
self->scaled_buffer = scaled_buffer;
self->scene_buffer = scaled_buffer->scene_buffer;
#include <wlr/types/wlr_scene.h>
#include <wlr/util/log.h>
#include "buffer.h"
+#include "common/list.h"
#include "common/macros.h"
#include "common/mem.h"
#include "common/scaled-scene-buffer.h"
#include "node.h"
+/*
+ * This holds all the scaled_scene_buffers from all the implementers.
+ * This is used to share visually duplicated buffers found via impl->equal().
+ */
+static struct wl_list all_scaled_buffers = WL_LIST_INIT(&all_scaled_buffers);
+
/* Internal API */
static void
_cache_entry_destroy(struct scaled_scene_buffer_cache_entry *cache_entry, bool drop_buffer)
struct wlr_buffer *wlr_buffer = NULL;
- if (self->impl->equal && self->cached_buffers) {
+ if (self->impl->equal) {
/* Search from other cached scaled-scene-buffers */
struct scaled_scene_buffer *scene_buffer;
- wl_list_for_each(scene_buffer, self->cached_buffers, link) {
+ wl_list_for_each(scene_buffer, &all_scaled_buffers, link) {
if (scene_buffer == self) {
continue;
}
+ if (self->impl != scene_buffer->impl) {
+ continue;
+ }
if (!self->impl->equal(self, scene_buffer)) {
continue;
}
struct scaled_scene_buffer *
scaled_scene_buffer_create(struct wlr_scene_tree *parent,
const struct scaled_scene_buffer_impl *impl,
- struct wl_list *cached_buffers, bool drop_buffer)
+ bool drop_buffer)
{
assert(parent);
assert(impl);
self->drop_buffer = drop_buffer;
wl_list_init(&self->cache);
- self->cached_buffers = cached_buffers;
- if (self->cached_buffers) {
- wl_list_insert(self->cached_buffers, &self->link);
- } else {
- /* Ensure self->link can be removed safely in the destroy handler */
- wl_list_init(&self->link);
- }
+ wl_list_insert(&all_scaled_buffers, &self->link);
/* Listen to outputs_update so we get notified about scale changes */
self->outputs_update.notify = _handle_outputs_update;