weston_buffer: Add mode to weston_buffer_reference
Add a mode argument to weston_buffer_reference which indicates whether a buffer's storage may/will be accessed, or whether the underlying storage will no longer be accessed, e.g. because it has been copied. This will be used to retain a pointer to the weston_buffer whilst being able to send a release event to the client. Signed-off-by: Daniel Stone <daniels@collabora.com>
This commit is contained in:
@@ -93,7 +93,8 @@ drm_plane_state_free(struct drm_plane_state *state, bool force)
|
||||
|
||||
if (force || state != state->plane->state_cur) {
|
||||
drm_fb_unref(state->fb);
|
||||
weston_buffer_reference(&state->fb_ref.buffer, NULL);
|
||||
weston_buffer_reference(&state->fb_ref.buffer, NULL,
|
||||
BUFFER_WILL_NOT_BE_ACCESSED);
|
||||
weston_buffer_release_reference(&state->fb_ref.release, NULL);
|
||||
free(state);
|
||||
}
|
||||
@@ -135,10 +136,20 @@ drm_plane_state_duplicate(struct drm_output_state *state_output,
|
||||
* buffer, then we must also transfer the reference on the client
|
||||
* buffer. */
|
||||
if (src->fb) {
|
||||
struct weston_buffer *buffer;
|
||||
|
||||
dst->fb = drm_fb_ref(src->fb);
|
||||
memset(&dst->fb_ref, 0, sizeof(dst->fb_ref));
|
||||
weston_buffer_reference(&dst->fb_ref.buffer,
|
||||
src->fb_ref.buffer.buffer);
|
||||
|
||||
if (src->fb->type == BUFFER_CLIENT ||
|
||||
src->fb->type == BUFFER_DMABUF) {
|
||||
buffer = src->fb_ref.buffer.buffer;
|
||||
} else {
|
||||
buffer = NULL;
|
||||
}
|
||||
weston_buffer_reference(&dst->fb_ref.buffer, buffer,
|
||||
buffer ? BUFFER_MAY_BE_ACCESSED :
|
||||
BUFFER_WILL_NOT_BE_ACCESSED);
|
||||
weston_buffer_release_reference(&dst->fb_ref.release,
|
||||
src->fb_ref.release.buffer_release);
|
||||
} else {
|
||||
|
||||
@@ -139,7 +139,8 @@ drm_output_try_view_on_plane(struct drm_plane *plane,
|
||||
assert(state->fb_ref.buffer.buffer == NULL);
|
||||
assert(state->fb_ref.release.buffer_release == NULL);
|
||||
weston_buffer_reference(&state->fb_ref.buffer,
|
||||
surface->buffer_ref.buffer);
|
||||
surface->buffer_ref.buffer,
|
||||
BUFFER_MAY_BE_ACCESSED);
|
||||
weston_buffer_release_reference(&state->fb_ref.release,
|
||||
surface->buffer_release_ref.buffer_release);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user