gl-renderer: Delete egl_image wrapper
Now that EGLImages are strongly associated with a gl_buffer_state, which has a lifetime strictly bounded by a weston_buffer, we don't need to have an egl_image wrapper having its own separate refcounting anymore. Signed-off-by: Daniel Stone <daniels@collabora.com>
This commit is contained in:
@@ -108,12 +108,6 @@ struct gl_output_state {
|
|||||||
|
|
||||||
struct gl_renderer;
|
struct gl_renderer;
|
||||||
|
|
||||||
struct egl_image {
|
|
||||||
struct gl_renderer *renderer;
|
|
||||||
EGLImageKHR image;
|
|
||||||
int refcount;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct dmabuf_format {
|
struct dmabuf_format {
|
||||||
uint32_t format;
|
uint32_t format;
|
||||||
struct wl_list link;
|
struct wl_list link;
|
||||||
@@ -146,6 +140,8 @@ struct yuv_format_descriptor {
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct gl_buffer_state {
|
struct gl_buffer_state {
|
||||||
|
struct gl_renderer *gr;
|
||||||
|
|
||||||
GLfloat color[4];
|
GLfloat color[4];
|
||||||
|
|
||||||
bool needs_full_upload;
|
bool needs_full_upload;
|
||||||
@@ -156,7 +152,7 @@ struct gl_buffer_state {
|
|||||||
GLenum gl_format[3];
|
GLenum gl_format[3];
|
||||||
GLenum gl_pixel_type;
|
GLenum gl_pixel_type;
|
||||||
|
|
||||||
struct egl_image* images[3];
|
EGLImageKHR images[3];
|
||||||
int num_images;
|
int num_images;
|
||||||
enum gl_shader_texture_variant shader_variant;
|
enum gl_shader_texture_variant shader_variant;
|
||||||
|
|
||||||
@@ -338,53 +334,6 @@ timeline_submit_render_sync(struct gl_renderer *gr,
|
|||||||
wl_list_insert(&go->timeline_render_point_list, &trp->link);
|
wl_list_insert(&go->timeline_render_point_list, &trp->link);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct egl_image*
|
|
||||||
egl_image_create(struct gl_renderer *gr, EGLenum target,
|
|
||||||
EGLClientBuffer buffer, const EGLint *attribs)
|
|
||||||
{
|
|
||||||
struct egl_image *img;
|
|
||||||
|
|
||||||
img = zalloc(sizeof *img);
|
|
||||||
img->renderer = gr;
|
|
||||||
img->refcount = 1;
|
|
||||||
img->image = gr->create_image(gr->egl_display, EGL_NO_CONTEXT,
|
|
||||||
target, buffer, attribs);
|
|
||||||
|
|
||||||
if (img->image == EGL_NO_IMAGE_KHR) {
|
|
||||||
free(img);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return img;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
egl_image_unref(struct egl_image *image)
|
|
||||||
{
|
|
||||||
struct gl_renderer *gr;
|
|
||||||
|
|
||||||
/* in multi-planar cases, egl_image_create() might fail on an
|
|
||||||
* intermediary step resulting in egl_image being NULL. In order to go
|
|
||||||
* over all successful ones, and avoid leaking one of them (the last
|
|
||||||
* one), we'll have to guard against it -- until we'll have a correct
|
|
||||||
* way of disposing of any previous created images.
|
|
||||||
*/
|
|
||||||
if (!image)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
gr = image->renderer;
|
|
||||||
assert(image->refcount > 0);
|
|
||||||
|
|
||||||
image->refcount--;
|
|
||||||
if (image->refcount > 0)
|
|
||||||
return image->refcount;
|
|
||||||
|
|
||||||
gr->destroy_image(gr->egl_display, image->image);
|
|
||||||
free(image);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define max(a, b) (((a) > (b)) ? (a) : (b))
|
#define max(a, b) (((a) > (b)) ? (a) : (b))
|
||||||
#define min(a, b) (((a) > (b)) ? (b) : (a))
|
#define min(a, b) (((a) > (b)) ? (b) : (a))
|
||||||
|
|
||||||
@@ -1902,7 +1851,7 @@ destroy_buffer_state(struct gl_buffer_state *gb)
|
|||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < gb->num_images; i++)
|
for (i = 0; i < gb->num_images; i++)
|
||||||
egl_image_unref(gb->images[i]);
|
gb->gr->destroy_image(gb->gr->egl_display, gb->images[i]);
|
||||||
|
|
||||||
pixman_region32_fini(&gb->texture_damage);
|
pixman_region32_fini(&gb->texture_damage);
|
||||||
wl_list_remove(&gb->destroy_listener.link);
|
wl_list_remove(&gb->destroy_listener.link);
|
||||||
@@ -2142,6 +2091,7 @@ unsupported:
|
|||||||
gb = zalloc(sizeof(*gb));
|
gb = zalloc(sizeof(*gb));
|
||||||
if (!gb)
|
if (!gb)
|
||||||
return false;
|
return false;
|
||||||
|
gb->gr = gr;
|
||||||
|
|
||||||
wl_list_init(&gb->destroy_listener.link);
|
wl_list_init(&gb->destroy_listener.link);
|
||||||
pixman_region32_init(&gb->texture_damage);
|
pixman_region32_init(&gb->texture_damage);
|
||||||
@@ -2180,6 +2130,7 @@ gl_renderer_fill_buffer_info(struct weston_compositor *ec,
|
|||||||
if (!gb)
|
if (!gb)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
gb->gr = gr;
|
||||||
pixman_region32_init(&gb->texture_damage);
|
pixman_region32_init(&gb->texture_damage);
|
||||||
|
|
||||||
buffer->legacy_buffer = (struct wl_buffer *)buffer->resource;
|
buffer->legacy_buffer = (struct wl_buffer *)buffer->resource;
|
||||||
@@ -2254,10 +2205,12 @@ gl_renderer_fill_buffer_info(struct weston_compositor *ec,
|
|||||||
EGL_NONE
|
EGL_NONE
|
||||||
};
|
};
|
||||||
|
|
||||||
gb->images[i] = egl_image_create(gr, EGL_WAYLAND_BUFFER_WL,
|
gb->images[i] = gr->create_image(gr->egl_display,
|
||||||
|
EGL_NO_CONTEXT,
|
||||||
|
EGL_WAYLAND_BUFFER_WL,
|
||||||
buffer->legacy_buffer,
|
buffer->legacy_buffer,
|
||||||
attribs);
|
attribs);
|
||||||
if (!gb->images[i]) {
|
if (gb->images[i] == EGL_NO_IMAGE_KHR) {
|
||||||
weston_log("couldn't create EGLImage for plane %d\n", i);
|
weston_log("couldn't create EGLImage for plane %d\n", i);
|
||||||
goto err_img;
|
goto err_img;
|
||||||
}
|
}
|
||||||
@@ -2270,7 +2223,7 @@ gl_renderer_fill_buffer_info(struct weston_compositor *ec,
|
|||||||
|
|
||||||
err_img:
|
err_img:
|
||||||
while (--i >= 0)
|
while (--i >= 0)
|
||||||
egl_image_unref(gb->images[i]);
|
gr->destroy_image(gb->gr->egl_display, gb->images[i]);
|
||||||
err_free:
|
err_free:
|
||||||
free(gb);
|
free(gb);
|
||||||
return false;
|
return false;
|
||||||
@@ -2295,7 +2248,7 @@ gl_renderer_attach_egl(struct weston_surface *es, struct weston_buffer *buffer)
|
|||||||
for (i = 0; i < gb->num_images; i++) {
|
for (i = 0; i < gb->num_images; i++) {
|
||||||
glActiveTexture(GL_TEXTURE0 + i);
|
glActiveTexture(GL_TEXTURE0 + i);
|
||||||
glBindTexture(target, gs->textures[i]);
|
glBindTexture(target, gs->textures[i]);
|
||||||
gr->image_target_texture_2d(target, gb->images[i]->image);
|
gr->image_target_texture_2d(target, gb->images[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@@ -2311,11 +2264,10 @@ gl_renderer_destroy_dmabuf(struct linux_dmabuf_buffer *dmabuf)
|
|||||||
destroy_buffer_state(gb);
|
destroy_buffer_state(gb);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct egl_image *
|
static EGLImageKHR
|
||||||
import_simple_dmabuf(struct gl_renderer *gr,
|
import_simple_dmabuf(struct gl_renderer *gr,
|
||||||
struct dmabuf_attributes *attributes)
|
struct dmabuf_attributes *attributes)
|
||||||
{
|
{
|
||||||
struct egl_image *image;
|
|
||||||
EGLint attribs[52];
|
EGLint attribs[52];
|
||||||
int atti = 0;
|
int atti = 0;
|
||||||
bool has_modifier;
|
bool has_modifier;
|
||||||
@@ -2407,10 +2359,8 @@ import_simple_dmabuf(struct gl_renderer *gr,
|
|||||||
|
|
||||||
attribs[atti++] = EGL_NONE;
|
attribs[atti++] = EGL_NONE;
|
||||||
|
|
||||||
image = egl_image_create(gr, EGL_LINUX_DMA_BUF_EXT, NULL,
|
return gr->create_image(gr->egl_display, EGL_NO_CONTEXT,
|
||||||
attribs);
|
EGL_LINUX_DMA_BUF_EXT, NULL, attribs);
|
||||||
|
|
||||||
return image;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
struct yuv_format_descriptor yuv_formats[] = {
|
struct yuv_format_descriptor yuv_formats[] = {
|
||||||
@@ -2502,13 +2452,13 @@ struct yuv_format_descriptor yuv_formats[] = {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct egl_image *
|
static EGLImageKHR
|
||||||
import_dmabuf_single_plane(struct gl_renderer *gr,
|
import_dmabuf_single_plane(struct gl_renderer *gr,
|
||||||
const struct dmabuf_attributes *attributes,
|
const struct dmabuf_attributes *attributes,
|
||||||
struct yuv_plane_descriptor *descriptor)
|
struct yuv_plane_descriptor *descriptor)
|
||||||
{
|
{
|
||||||
struct dmabuf_attributes plane;
|
struct dmabuf_attributes plane;
|
||||||
struct egl_image *image;
|
EGLImageKHR image;
|
||||||
char fmt[4];
|
char fmt[4];
|
||||||
|
|
||||||
plane.width = attributes->width / descriptor->width_divisor;
|
plane.width = attributes->width / descriptor->width_divisor;
|
||||||
@@ -2521,7 +2471,7 @@ import_dmabuf_single_plane(struct gl_renderer *gr,
|
|||||||
plane.modifier[0] = attributes->modifier[descriptor->plane_index];
|
plane.modifier[0] = attributes->modifier[descriptor->plane_index];
|
||||||
|
|
||||||
image = import_simple_dmabuf(gr, &plane);
|
image = import_simple_dmabuf(gr, &plane);
|
||||||
if (!image) {
|
if (image == EGL_NO_IMAGE_KHR) {
|
||||||
weston_log("Failed to import plane %d as %.4s\n",
|
weston_log("Failed to import plane %d as %.4s\n",
|
||||||
descriptor->plane_index,
|
descriptor->plane_index,
|
||||||
dump_format(descriptor->format, fmt));
|
dump_format(descriptor->format, fmt));
|
||||||
@@ -2537,7 +2487,6 @@ import_yuv_dmabuf(struct gl_renderer *gr, struct gl_buffer_state *gb,
|
|||||||
{
|
{
|
||||||
unsigned i;
|
unsigned i;
|
||||||
int j;
|
int j;
|
||||||
int ret;
|
|
||||||
struct yuv_format_descriptor *format = NULL;
|
struct yuv_format_descriptor *format = NULL;
|
||||||
char fmt[4];
|
char fmt[4];
|
||||||
|
|
||||||
@@ -2567,10 +2516,10 @@ import_yuv_dmabuf(struct gl_renderer *gr, struct gl_buffer_state *gb,
|
|||||||
for (j = 0; j < format->output_planes; ++j) {
|
for (j = 0; j < format->output_planes; ++j) {
|
||||||
gb->images[j] = import_dmabuf_single_plane(gr, attributes,
|
gb->images[j] = import_dmabuf_single_plane(gr, attributes,
|
||||||
&format->plane[j]);
|
&format->plane[j]);
|
||||||
if (!gb->images[j]) {
|
if (gb->images[j] == EGL_NO_IMAGE_KHR) {
|
||||||
while (--j >= 0) {
|
while (--j >= 0) {
|
||||||
ret = egl_image_unref(gb->images[j]);
|
gr->destroy_image(gb->gr->egl_display,
|
||||||
assert(ret == 0);
|
gb->images[j]);
|
||||||
gb->images[j] = NULL;
|
gb->images[j] = NULL;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
@@ -2688,7 +2637,7 @@ static struct gl_buffer_state *
|
|||||||
import_dmabuf(struct gl_renderer *gr,
|
import_dmabuf(struct gl_renderer *gr,
|
||||||
struct linux_dmabuf_buffer *dmabuf)
|
struct linux_dmabuf_buffer *dmabuf)
|
||||||
{
|
{
|
||||||
struct egl_image *egl_image;
|
EGLImageKHR egl_image;
|
||||||
struct gl_buffer_state *gb = zalloc(sizeof(*gb));
|
struct gl_buffer_state *gb = zalloc(sizeof(*gb));
|
||||||
|
|
||||||
if (!pixel_format_get_info(dmabuf->attributes.format))
|
if (!pixel_format_get_info(dmabuf->attributes.format))
|
||||||
@@ -2698,11 +2647,12 @@ import_dmabuf(struct gl_renderer *gr,
|
|||||||
if (!gb)
|
if (!gb)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
gb->gr = gr;
|
||||||
pixman_region32_init(&gb->texture_damage);
|
pixman_region32_init(&gb->texture_damage);
|
||||||
wl_list_init(&gb->destroy_listener.link);
|
wl_list_init(&gb->destroy_listener.link);
|
||||||
|
|
||||||
egl_image = import_simple_dmabuf(gr, &dmabuf->attributes);
|
egl_image = import_simple_dmabuf(gr, &dmabuf->attributes);
|
||||||
if (egl_image) {
|
if (egl_image != EGL_NO_IMAGE_KHR) {
|
||||||
GLenum target = choose_texture_target(gr, &dmabuf->attributes);
|
GLenum target = choose_texture_target(gr, &dmabuf->attributes);
|
||||||
|
|
||||||
gb->num_images = 1;
|
gb->num_images = 1;
|
||||||
@@ -2902,7 +2852,7 @@ gl_renderer_attach_dmabuf(struct weston_surface *surface,
|
|||||||
for (i = 0; i < gb->num_images; ++i) {
|
for (i = 0; i < gb->num_images; ++i) {
|
||||||
glActiveTexture(GL_TEXTURE0 + i);
|
glActiveTexture(GL_TEXTURE0 + i);
|
||||||
glBindTexture(target, gs->textures[i]);
|
glBindTexture(target, gs->textures[i]);
|
||||||
gr->image_target_texture_2d(target, gb->images[i]->image);
|
gr->image_target_texture_2d(target, gb->images[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@@ -2977,6 +2927,7 @@ static bool
|
|||||||
gl_renderer_attach_solid(struct weston_surface *surface,
|
gl_renderer_attach_solid(struct weston_surface *surface,
|
||||||
struct weston_buffer *buffer)
|
struct weston_buffer *buffer)
|
||||||
{
|
{
|
||||||
|
struct gl_renderer *gr = get_renderer(surface->compositor);
|
||||||
struct gl_surface_state *gs = get_surface_state(surface);
|
struct gl_surface_state *gs = get_surface_state(surface);
|
||||||
struct gl_buffer_state *gb = buffer->renderer_private;
|
struct gl_buffer_state *gb = buffer->renderer_private;
|
||||||
|
|
||||||
@@ -2986,8 +2937,8 @@ gl_renderer_attach_solid(struct weston_surface *surface,
|
|||||||
}
|
}
|
||||||
|
|
||||||
gb = zalloc(sizeof(*gb));
|
gb = zalloc(sizeof(*gb));
|
||||||
|
gb->gr = gr;
|
||||||
pixman_region32_init(&gb->texture_damage);
|
pixman_region32_init(&gb->texture_damage);
|
||||||
|
|
||||||
buffer->renderer_private = gb;
|
buffer->renderer_private = gb;
|
||||||
gb->destroy_listener.notify = handle_buffer_destroy;
|
gb->destroy_listener.notify = handle_buffer_destroy;
|
||||||
wl_signal_add(&buffer->destroy_signal, &gb->destroy_listener);
|
wl_signal_add(&buffer->destroy_signal, &gb->destroy_listener);
|
||||||
|
|||||||
Reference in New Issue
Block a user