{
pepper_view_t *view = l->item;
pepper_plane_t *plane = NULL;
+ pepper_surface_t *surface = pepper_view_get_surface(view);
+ pepper_buffer_t *buffer = pepper_surface_get_buffer(surface);
+
+ if ((output->render_type == DRM_RENDER_TYPE_PIXMAN) ||
+ (buffer &&
+ (!wl_shm_buffer_get(pepper_buffer_get_resource(buffer)))))
+ pepper_surface_set_keep_buffer(surface, PEPPER_TRUE);
+ else
+ pepper_surface_set_keep_buffer(surface, PEPPER_FALSE);
if (plane == NULL)
plane = assign_cursor_plane(output, view);
int32_t x, y;
int32_t transform;
int32_t scale;
+ pepper_bool_t keep_buffer;
} buffer;
/* Surface size in surface local coordinate space.
PEPPER_API pixman_region32_t *
pepper_surface_get_input_region(pepper_surface_t *surface);
+PEPPER_API pepper_bool_t
+pepper_surface_get_keep_buffer(pepper_surface_t *surface);
+
+PEPPER_API void
+pepper_surface_set_keep_buffer(pepper_surface_t *surface, pepper_bool_t keep_buffer);
+
/* Buffer. */
PEPPER_API void
pepper_buffer_reference(pepper_buffer_t *buffer);
return &surface->input_region;
}
+PEPPER_API pepper_bool_t
+pepper_surface_get_keep_buffer(pepper_surface_t *surface)
+{
+ return surface->buffer.keep_buffer;
+}
+
+PEPPER_API void
+pepper_surface_set_keep_buffer(pepper_surface_t *surface, pepper_bool_t keep_buffer)
+{
+ surface->buffer.keep_buffer = keep_buffer;
+}
+
void
pepper_surface_flush_damage(pepper_surface_t *surface)
{
pixman_region32_clear(&surface->damage_region);
- if (surface->buffer.buffer)
+ if (surface->buffer.buffer && !surface->buffer.keep_buffer)
{
pepper_buffer_unreference(surface->buffer.buffer);
pepper_event_listener_remove(surface->buffer.destroy_listener);
gl_renderer_t *renderer;
pepper_surface_t *surface;
- pepper_buffer_t *buffer;
int buffer_width, buffer_height;
int buffer_type;
}
state->num_planes = 0;
-
- if (state->buffer)
- {
- pepper_buffer_unreference(state->buffer);
- state->buffer = NULL;
-
- pepper_event_listener_remove(state->buffer_destroy_listener);
- }
}
static void
{
gl_surface_state_t *state = data;
surface_state_release_buffer(state);
+ pepper_event_listener_remove(state->buffer_destroy_listener);
+ state->buffer_destroy_listener = NULL;
}
static gl_surface_state_t *
*h = 0;
surface_state_release_buffer(state);
- return PEPPER_FALSE;
+ goto done;
}
surface_state_destroy_images(state);
return PEPPER_FALSE;
done:
- pepper_buffer_reference(buffer);
- /* Release previous buffer. */
- if (state->buffer)
+ if (state->buffer_destroy_listener)
{
- pepper_buffer_unreference(state->buffer);
pepper_event_listener_remove(state->buffer_destroy_listener);
+ state->buffer_destroy_listener = NULL;
}
- /* Set new buffer. */
- state->buffer = buffer;
- state->buffer_destroy_listener =
- pepper_object_add_event_listener((pepper_object_t *)buffer, PEPPER_EVENT_OBJECT_DESTROY, 0,
- surface_state_handle_buffer_destroy, state);
+ if (buffer)
+ state->buffer_destroy_listener =
+ pepper_object_add_event_listener((pepper_object_t *)buffer,
+ PEPPER_EVENT_OBJECT_DESTROY, 0,
+ surface_state_handle_buffer_destroy, state);
/* Output buffer size info. */
*w = state->buffer_width;
{
gl_renderer_t *gr = (gl_renderer_t *)renderer;
gl_surface_state_t *state = get_surface_state(renderer, surface);
+ pepper_buffer_t *buffer = pepper_surface_get_buffer(surface);
- if (!state->buffer)
+ if (!buffer)
return PEPPER_FALSE;
if (state->buffer_type == BUFFER_TYPE_EGL)
int texture_format;
int i;
EGLDisplay display = gr->display;
- struct wl_resource *resource = pepper_buffer_get_resource(state->buffer);
+ struct wl_resource *resource = pepper_buffer_get_resource(buffer);
if (!gr->query_buffer(display, resource, EGL_TEXTURE_FORMAT, &texture_format))
return PEPPER_FALSE;
}
state->sampler = sampler;
- goto done;
+ return PEPPER_TRUE;
}
/* state->buffer_type == BUFFER_TYPE_SHM */
state->shm.format, state->shm.pixel_format,
wl_shm_buffer_get_data(state->shm.buffer));
wl_shm_buffer_end_access(state->shm.buffer);
- goto done;
+ return PEPPER_TRUE;
}
/* Texture upload. */
wl_shm_buffer_end_access(state->shm.buffer);
}
-done:
- pepper_buffer_unreference(state->buffer);
- pepper_event_listener_remove(state->buffer_destroy_listener);
- state->buffer = NULL;
-
return PEPPER_TRUE;
}
pixman_renderer_t *renderer;
pepper_surface_t *surface;
- pepper_buffer_t *buffer;
int buffer_width, buffer_height;
pixman_image_t *image;
pixman_image_unref(state->image);
state->image = NULL;
}
-
- if (state->buffer)
- {
- pepper_buffer_unreference(state->buffer);
- state->buffer = NULL;
-
- pepper_event_listener_remove(state->buffer_destroy_listener);
- }
}
static void
{
pixman_surface_state_t *state = data;
surface_state_release_buffer(state);
+ pepper_event_listener_remove(state->buffer_destroy_listener);
+ state->buffer_destroy_listener = NULL;
}
static pixman_surface_state_t *
*h = 0;
surface_state_release_buffer(state);
- return PEPPER_TRUE;
+ goto done;
}
if (surface_state_attach_shm(state, buffer))
return PEPPER_FALSE;
done:
- pepper_buffer_reference(buffer);
- /* Release previous buffer. */
- if (state->buffer)
+ if (state->buffer_destroy_listener)
{
- pepper_buffer_unreference(state->buffer);
pepper_event_listener_remove(state->buffer_destroy_listener);
+ state->buffer_destroy_listener = NULL;
}
- /* Set new buffer. */
- state->buffer = buffer;
- state->buffer_destroy_listener =
- pepper_object_add_event_listener((pepper_object_t *)buffer, PEPPER_EVENT_OBJECT_DESTROY, 0,
- surface_state_handle_buffer_destroy, state);
+ if (buffer)
+ state->buffer_destroy_listener =
+ pepper_object_add_event_listener((pepper_object_t *)buffer,
+ PEPPER_EVENT_OBJECT_DESTROY, 0,
+ surface_state_handle_buffer_destroy, state);
/* Output buffer size info. */
*w = state->buffer_width;