wayland-drm: Pass struct wl_drm_buffer to the driver
We're going to extend this to support multi-plane buffers, so pass this to the driver so it can access the details.
This commit is contained in:
@@ -1220,43 +1220,40 @@ dri2_export_drm_image_mesa(_EGLDriver *drv, _EGLDisplay *disp, _EGLImage *img,
|
||||
|
||||
#ifdef HAVE_WAYLAND_PLATFORM
|
||||
|
||||
static void *
|
||||
static void
|
||||
dri2_wl_reference_buffer(void *user_data, uint32_t name,
|
||||
int32_t width, int32_t height,
|
||||
uint32_t stride, uint32_t format)
|
||||
struct wl_drm_buffer *buffer)
|
||||
{
|
||||
_EGLDisplay *disp = user_data;
|
||||
struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
|
||||
__DRIimage *image;
|
||||
int dri_format;
|
||||
|
||||
switch (format) {
|
||||
switch (buffer->format) {
|
||||
case WL_DRM_FORMAT_ARGB8888:
|
||||
dri_format =__DRI_IMAGE_FORMAT_ARGB8888;
|
||||
buffer->driver_format =__DRI_IMAGE_FORMAT_ARGB8888;
|
||||
break;
|
||||
case WL_DRM_FORMAT_XRGB8888:
|
||||
dri_format = __DRI_IMAGE_FORMAT_XRGB8888;
|
||||
buffer->driver_format = __DRI_IMAGE_FORMAT_XRGB8888;
|
||||
break;
|
||||
default:
|
||||
return NULL;
|
||||
return;
|
||||
}
|
||||
|
||||
image = dri2_dpy->image->createImageFromName(dri2_dpy->dri_screen,
|
||||
width, height,
|
||||
dri_format, name, stride / 4,
|
||||
NULL);
|
||||
|
||||
return image;
|
||||
buffer->driver_buffer =
|
||||
dri2_dpy->image->createImageFromName(dri2_dpy->dri_screen,
|
||||
buffer->buffer.width,
|
||||
buffer->buffer.height,
|
||||
buffer->driver_format, name,
|
||||
buffer->stride0 / 4,
|
||||
NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
dri2_wl_release_buffer(void *user_data, void *buffer)
|
||||
dri2_wl_release_buffer(void *user_data, struct wl_drm_buffer *buffer)
|
||||
{
|
||||
_EGLDisplay *disp = user_data;
|
||||
__DRIimage *image = buffer;
|
||||
struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
|
||||
|
||||
dri2_dpy->image->destroyImage(image);
|
||||
dri2_dpy->image->destroyImage(buffer->driver_buffer);
|
||||
}
|
||||
|
||||
static struct wayland_drm_callbacks wl_drm_callbacks = {
|
||||
|
||||
@@ -56,22 +56,13 @@ struct wl_drm {
|
||||
struct wayland_drm_callbacks *callbacks;
|
||||
};
|
||||
|
||||
struct wl_drm_buffer {
|
||||
struct wl_buffer buffer;
|
||||
struct wl_drm *drm;
|
||||
uint32_t format;
|
||||
|
||||
void *driver_buffer;
|
||||
};
|
||||
|
||||
static void
|
||||
destroy_buffer(struct wl_resource *resource)
|
||||
{
|
||||
struct wl_drm_buffer *buffer = resource->data;
|
||||
struct wl_drm *drm = buffer->drm;
|
||||
|
||||
drm->callbacks->release_buffer(drm->user_data,
|
||||
buffer->driver_buffer);
|
||||
drm->callbacks->release_buffer(drm->user_data, buffer);
|
||||
free(buffer);
|
||||
}
|
||||
|
||||
@@ -129,12 +120,10 @@ drm_create_buffer(struct wl_client *client, struct wl_resource *resource,
|
||||
buffer->buffer.width = width;
|
||||
buffer->buffer.height = height;
|
||||
buffer->format = format;
|
||||
buffer->offset0 = 0;
|
||||
buffer->stride0 = stride;
|
||||
|
||||
buffer->driver_buffer =
|
||||
drm->callbacks->reference_buffer(drm->user_data, name,
|
||||
width, height,
|
||||
stride, format);
|
||||
|
||||
drm->callbacks->reference_buffer(drm->user_data, name, buffer);
|
||||
if (buffer->driver_buffer == NULL) {
|
||||
wl_resource_post_error(resource,
|
||||
WL_DRM_ERROR_INVALID_NAME,
|
||||
|
||||
@@ -9,14 +9,24 @@
|
||||
|
||||
struct wl_drm;
|
||||
|
||||
struct wl_drm_buffer {
|
||||
struct wl_buffer buffer;
|
||||
struct wl_drm *drm;
|
||||
uint32_t format;
|
||||
uint32_t driver_format;
|
||||
int32_t offset0;
|
||||
int32_t stride0;
|
||||
|
||||
void *driver_buffer;
|
||||
};
|
||||
|
||||
struct wayland_drm_callbacks {
|
||||
int (*authenticate)(void *user_data, uint32_t id);
|
||||
|
||||
void *(*reference_buffer)(void *user_data, uint32_t name,
|
||||
int32_t width, int32_t height,
|
||||
uint32_t stride, uint32_t format);
|
||||
void (*reference_buffer)(void *user_data, uint32_t name,
|
||||
struct wl_drm_buffer *buffer);
|
||||
|
||||
void (*release_buffer)(void *user_data, void *buffer);
|
||||
void (*release_buffer)(void *user_data, struct wl_drm_buffer *buffer);
|
||||
};
|
||||
|
||||
struct wl_drm *
|
||||
|
||||
@@ -12,17 +12,16 @@
|
||||
|
||||
#include "native_wayland_drm_bufmgr_helper.h"
|
||||
|
||||
void *
|
||||
void
|
||||
egl_g3d_wl_drm_helper_reference_buffer(void *user_data, uint32_t name,
|
||||
int32_t width, int32_t height,
|
||||
uint32_t stride, uint32_t format)
|
||||
struct wl_drm_buffer *buffer)
|
||||
{
|
||||
struct native_display *ndpy = user_data;
|
||||
struct pipe_resource templ;
|
||||
struct winsys_handle wsh;
|
||||
enum pipe_format pf;
|
||||
|
||||
switch (format) {
|
||||
switch (buffer->format) {
|
||||
case WL_DRM_FORMAT_ARGB8888:
|
||||
pf = PIPE_FORMAT_B8G8R8A8_UNORM;
|
||||
break;
|
||||
@@ -35,28 +34,30 @@ egl_g3d_wl_drm_helper_reference_buffer(void *user_data, uint32_t name,
|
||||
}
|
||||
|
||||
if (pf == PIPE_FORMAT_NONE)
|
||||
return NULL;
|
||||
return;
|
||||
|
||||
memset(&templ, 0, sizeof(templ));
|
||||
templ.target = PIPE_TEXTURE_2D;
|
||||
templ.format = pf;
|
||||
templ.bind = PIPE_BIND_RENDER_TARGET | PIPE_BIND_SAMPLER_VIEW;
|
||||
templ.width0 = width;
|
||||
templ.height0 = height;
|
||||
templ.width0 = buffer->buffer.width;
|
||||
templ.height0 = buffer->buffer.height;
|
||||
templ.depth0 = 1;
|
||||
templ.array_size = 1;
|
||||
|
||||
memset(&wsh, 0, sizeof(wsh));
|
||||
wsh.handle = name;
|
||||
wsh.stride = stride;
|
||||
wsh.stride = buffer->stride0;
|
||||
|
||||
return ndpy->screen->resource_from_handle(ndpy->screen, &templ, &wsh);
|
||||
buffer->driver_buffer =
|
||||
ndpy->screen->resource_from_handle(ndpy->screen, &templ, &wsh);
|
||||
}
|
||||
|
||||
void
|
||||
egl_g3d_wl_drm_helper_unreference_buffer(void *user_data, void *buffer)
|
||||
egl_g3d_wl_drm_helper_unreference_buffer(void *user_data,
|
||||
struct wl_drm_buffer *buffer)
|
||||
{
|
||||
struct pipe_resource *resource = buffer;
|
||||
struct pipe_resource *resource = buffer->driver_buffer;
|
||||
|
||||
pipe_resource_reference(&resource, NULL);
|
||||
}
|
||||
|
||||
@@ -28,13 +28,13 @@
|
||||
|
||||
#include "wayland-drm.h"
|
||||
|
||||
void *
|
||||
void
|
||||
egl_g3d_wl_drm_helper_reference_buffer(void *user_data, uint32_t name,
|
||||
int32_t width, int32_t height,
|
||||
uint32_t stride, uint32_t format);
|
||||
struct wl_drm_buffer *buffer);
|
||||
|
||||
void
|
||||
egl_g3d_wl_drm_helper_unreference_buffer(void *user_data, void *buffer);
|
||||
egl_g3d_wl_drm_helper_unreference_buffer(void *user_data,
|
||||
struct wl_drm_buffer *buffer);
|
||||
|
||||
struct pipe_resource *
|
||||
egl_g3d_wl_drm_common_wl_buffer_get_resource(struct native_display *ndpy,
|
||||
|
||||
Reference in New Issue
Block a user