mirror of
https://gitlab.freedesktop.org/wayland/wayland.git
synced 2026-04-06 07:15:47 -04:00
Make sure there is a current context.
The context of a display is shared with the cairo device. cairo_acquire_device should be called whenever OpenGL calls are made.
This commit is contained in:
parent
1f411902de
commit
4d8ba216c5
1 changed files with 17 additions and 3 deletions
|
|
@ -167,16 +167,20 @@ struct drm_surface_data {
|
||||||
struct surface_data data;
|
struct surface_data data;
|
||||||
EGLImageKHR image;
|
EGLImageKHR image;
|
||||||
GLuint texture;
|
GLuint texture;
|
||||||
EGLDisplay dpy;
|
struct display *display;
|
||||||
};
|
};
|
||||||
|
|
||||||
static void
|
static void
|
||||||
drm_surface_data_destroy(void *p)
|
drm_surface_data_destroy(void *p)
|
||||||
{
|
{
|
||||||
struct drm_surface_data *data = p;
|
struct drm_surface_data *data = p;
|
||||||
|
struct display *d = data->display;
|
||||||
|
|
||||||
|
cairo_device_acquire(d->device);
|
||||||
glDeleteTextures(1, &data->texture);
|
glDeleteTextures(1, &data->texture);
|
||||||
eglDestroyImageKHR(data->dpy, data->image);
|
cairo_device_release(d->device);
|
||||||
|
|
||||||
|
eglDestroyImageKHR(d->dpy, data->image);
|
||||||
wl_buffer_destroy(data->data.buffer);
|
wl_buffer_destroy(data->data.buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -203,13 +207,17 @@ display_create_drm_surface(struct display *display,
|
||||||
if (data == NULL)
|
if (data == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
data->display = display;
|
||||||
|
|
||||||
image_attribs[1] = rectangle->width;
|
image_attribs[1] = rectangle->width;
|
||||||
image_attribs[3] = rectangle->height;
|
image_attribs[3] = rectangle->height;
|
||||||
data->image = eglCreateDRMImageMESA(dpy, image_attribs);
|
data->image = eglCreateDRMImageMESA(dpy, image_attribs);
|
||||||
|
|
||||||
|
cairo_device_acquire(display->device);
|
||||||
glGenTextures(1, &data->texture);
|
glGenTextures(1, &data->texture);
|
||||||
data->dpy = dpy;
|
|
||||||
glBindTexture(GL_TEXTURE_2D, data->texture);
|
glBindTexture(GL_TEXTURE_2D, data->texture);
|
||||||
glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, data->image);
|
glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, data->image);
|
||||||
|
cairo_device_release(display->device);
|
||||||
|
|
||||||
eglExportDRMImageMESA(display->dpy, data->image, &name, NULL, &stride);
|
eglExportDRMImageMESA(display->dpy, data->image, &name, NULL, &stride);
|
||||||
|
|
||||||
|
|
@ -240,6 +248,7 @@ display_create_drm_surface_from_file(struct display *display,
|
||||||
GError *error = NULL;
|
GError *error = NULL;
|
||||||
int stride, i;
|
int stride, i;
|
||||||
unsigned char *pixels, *p, *end;
|
unsigned char *pixels, *p, *end;
|
||||||
|
struct drm_surface_data *data;
|
||||||
|
|
||||||
pixbuf = gdk_pixbuf_new_from_file_at_scale(filename,
|
pixbuf = gdk_pixbuf_new_from_file_at_scale(filename,
|
||||||
rect->width, rect->height,
|
rect->width, rect->height,
|
||||||
|
|
@ -275,8 +284,13 @@ display_create_drm_surface_from_file(struct display *display,
|
||||||
}
|
}
|
||||||
|
|
||||||
surface = display_create_drm_surface(display, rect);
|
surface = display_create_drm_surface(display, rect);
|
||||||
|
data = cairo_surface_get_user_data(surface, &surface_data_key);
|
||||||
|
|
||||||
|
cairo_device_acquire(display->device);
|
||||||
|
glBindTexture(GL_TEXTURE_2D, data->texture);
|
||||||
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, rect->width, rect->height,
|
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, rect->width, rect->height,
|
||||||
GL_RGBA, GL_UNSIGNED_BYTE, pixels);
|
GL_RGBA, GL_UNSIGNED_BYTE, pixels);
|
||||||
|
cairo_device_release(display->device);
|
||||||
|
|
||||||
gdk_pixbuf_unref(pixbuf);
|
gdk_pixbuf_unref(pixbuf);
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue