|
|
@ -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); |
|
|
|
|
|
|
|
|
|
|
|