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:
Kristian Høgsberg
2012-07-05 14:19:48 -04:00
parent 95bc0527e9
commit 379eb47ea6
5 changed files with 49 additions and 52 deletions
+15 -18
View File
@@ -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 = {
+4 -15
View File
@@ -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,
+14 -4
View File
@@ -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,