We're going to extend this to support multi-plane buffers, so pass this
to the driver so it can access the details.
#ifdef HAVE_WAYLAND_PLATFORM
#ifdef HAVE_WAYLAND_PLATFORM
dri2_wl_reference_buffer(void *user_data, uint32_t name,
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);
{
_EGLDisplay *disp = user_data;
struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
- __DRIimage *image;
- int dri_format;
+ switch (buffer->format) {
case WL_DRM_FORMAT_ARGB8888:
case WL_DRM_FORMAT_ARGB8888:
- dri_format =__DRI_IMAGE_FORMAT_ARGB8888;
+ buffer->driver_format =__DRI_IMAGE_FORMAT_ARGB8888;
break;
case WL_DRM_FORMAT_XRGB8888:
break;
case WL_DRM_FORMAT_XRGB8888:
- dri_format = __DRI_IMAGE_FORMAT_XRGB8888;
+ buffer->driver_format = __DRI_IMAGE_FORMAT_XRGB8888;
- 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);
-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;
{
_EGLDisplay *disp = user_data;
- __DRIimage *image = buffer;
struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
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 = {
}
static struct wayland_drm_callbacks wl_drm_callbacks = {
struct wayland_drm_callbacks *callbacks;
};
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;
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);
buffer->buffer.width = width;
buffer->buffer.height = height;
buffer->format = format;
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,
if (buffer->driver_buffer == NULL) {
wl_resource_post_error(resource,
WL_DRM_ERROR_INVALID_NAME,
+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);
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);
#include "native_wayland_drm_bufmgr_helper.h"
#include "native_wayland_drm_bufmgr_helper.h"
egl_g3d_wl_drm_helper_reference_buffer(void *user_data, uint32_t name,
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;
{
struct native_display *ndpy = user_data;
struct pipe_resource templ;
struct winsys_handle wsh;
enum pipe_format pf;
+ switch (buffer->format) {
case WL_DRM_FORMAT_ARGB8888:
pf = PIPE_FORMAT_B8G8R8A8_UNORM;
break;
case WL_DRM_FORMAT_ARGB8888:
pf = PIPE_FORMAT_B8G8R8A8_UNORM;
break;
}
if (pf == PIPE_FORMAT_NONE)
}
if (pf == PIPE_FORMAT_NONE)
memset(&templ, 0, sizeof(templ));
templ.target = PIPE_TEXTURE_2D;
templ.format = pf;
templ.bind = PIPE_BIND_RENDER_TARGET | PIPE_BIND_SAMPLER_VIEW;
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;
templ.depth0 = 1;
templ.array_size = 1;
memset(&wsh, 0, sizeof(wsh));
wsh.handle = name;
+ 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);
-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);
}
pipe_resource_reference(&resource, NULL);
}
egl_g3d_wl_drm_helper_reference_buffer(void *user_data, uint32_t name,
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);
-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,
struct pipe_resource *
egl_g3d_wl_drm_common_wl_buffer_get_resource(struct native_display *ndpy,