diff options
Diffstat (limited to 'src/gallium/state_trackers/egl/common')
-rw-r--r-- | src/gallium/state_trackers/egl/common/native.h | 2 | ||||
-rw-r--r-- | src/gallium/state_trackers/egl/common/native_wayland_drm_bufmgr.c | 214 | ||||
-rw-r--r-- | src/gallium/state_trackers/egl/common/native_wayland_drm_bufmgr.h (renamed from src/gallium/state_trackers/egl/common/native_wayland_drm_bufmgr_helper.h) | 26 | ||||
-rw-r--r-- | src/gallium/state_trackers/egl/common/native_wayland_drm_bufmgr_helper.c | 106 |
4 files changed, 223 insertions, 125 deletions
diff --git a/src/gallium/state_trackers/egl/common/native.h b/src/gallium/state_trackers/egl/common/native.h index 431bd3f2dc0..797933d8d75 100644 --- a/src/gallium/state_trackers/egl/common/native.h +++ b/src/gallium/state_trackers/egl/common/native.h @@ -245,7 +245,7 @@ struct native_display { const struct native_display_buffer *buffer; const struct native_display_modeset *modeset; - const struct native_display_wayland_bufmgr *wayland_bufmgr; + struct native_display_wayland_bufmgr *wayland_bufmgr; }; /** diff --git a/src/gallium/state_trackers/egl/common/native_wayland_drm_bufmgr.c b/src/gallium/state_trackers/egl/common/native_wayland_drm_bufmgr.c new file mode 100644 index 00000000000..1603a3a71e2 --- /dev/null +++ b/src/gallium/state_trackers/egl/common/native_wayland_drm_bufmgr.c @@ -0,0 +1,214 @@ +#include <stdint.h> +#include <string.h> + +#include "native.h" +#include "util/u_inlines.h" +#include "state_tracker/drm_driver.h" + +#ifdef HAVE_WAYLAND_BACKEND + +#include <wayland-server.h> +#include <wayland-drm-server-protocol.h> + +#include "native_wayland_drm_bufmgr.h" + +#include "wayland-drm.h" + +struct wayland_drm_bufmgr { + struct native_display_wayland_bufmgr base; + + struct wl_drm *wl_server_drm; + char *device_name; + + void *user_data; + + wayland_drm_bufmgr_authenticate_func authenticate; +}; + +static INLINE struct wayland_drm_bufmgr * +wayland_drm_bufmgr(const struct native_display_wayland_bufmgr *base) +{ + return (struct wayland_drm_bufmgr *) base; +} + +static int +wayland_drm_bufmgr_authenticate(void *user_data, uint32_t magic) +{ + struct native_display *ndpy = user_data; + struct wayland_drm_bufmgr *bufmgr; + + bufmgr = wayland_drm_bufmgr(ndpy->wayland_bufmgr); + + return bufmgr->authenticate(user_data, magic); +} + +static void +wayland_drm_bufmgr_reference_buffer(void *user_data, uint32_t name, int fd, + struct wl_drm_buffer *buffer) +{ + 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_XRGB8888: + pf = PIPE_FORMAT_B8G8R8X8_UNORM; + break; + default: + pf = PIPE_FORMAT_NONE; + break; + } + + if (pf == PIPE_FORMAT_NONE) + 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 = 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 = buffer->stride[0]; + + buffer->driver_buffer = + ndpy->screen->resource_from_handle(ndpy->screen, &templ, &wsh); +} + +static void +wayland_drm_bufmgr_unreference_buffer(void *user_data, + struct wl_drm_buffer *buffer) +{ + struct pipe_resource *resource = buffer->driver_buffer; + + pipe_resource_reference(&resource, NULL); +} + +static struct wayland_drm_callbacks wl_drm_callbacks = { + wayland_drm_bufmgr_authenticate, + wayland_drm_bufmgr_reference_buffer, + wayland_drm_bufmgr_unreference_buffer +}; + +static boolean +wayland_drm_bufmgr_bind_display(struct native_display *ndpy, + struct wl_display *wl_dpy) +{ + struct wayland_drm_bufmgr *bufmgr; + + bufmgr = wayland_drm_bufmgr(ndpy->wayland_bufmgr); + + if (bufmgr->wl_server_drm) + return FALSE; + + bufmgr->wl_server_drm = wayland_drm_init(wl_dpy, bufmgr->device_name, + &wl_drm_callbacks, ndpy, 0); + + if (!bufmgr->wl_server_drm) + return FALSE; + + return TRUE; +} + +static boolean +wayland_drm_bufmgr_unbind_display(struct native_display *ndpy, + struct wl_display *wl_dpy) +{ + struct wayland_drm_bufmgr *bufmgr; + + bufmgr = wayland_drm_bufmgr(ndpy->wayland_bufmgr); + + if (!bufmgr->wl_server_drm) + return FALSE; + + wayland_drm_uninit(bufmgr->wl_server_drm); + bufmgr->wl_server_drm = NULL; + + return TRUE; +} + +static struct pipe_resource * +wayland_drm_bufmgr_wl_buffer_get_resource(struct native_display *ndpy, + struct wl_buffer *buffer) +{ + return wayland_drm_buffer_get_buffer(buffer); +} + +static EGLBoolean +wayland_drm_bufmgr_query_buffer(struct native_display *ndpy, + struct wl_buffer *_buffer, + EGLint attribute, EGLint *value) +{ + struct wl_drm_buffer *buffer = (struct wl_drm_buffer *) _buffer; + struct pipe_resource *resource = buffer->driver_buffer; + + if (!wayland_buffer_is_drm(&buffer->buffer)) + return EGL_FALSE; + + switch (attribute) { + case EGL_TEXTURE_FORMAT: + switch (resource->format) { + case PIPE_FORMAT_B8G8R8A8_UNORM: + *value = EGL_TEXTURE_RGBA; + return EGL_TRUE; + case PIPE_FORMAT_B8G8R8X8_UNORM: + *value = EGL_TEXTURE_RGB; + return EGL_TRUE; + default: + return EGL_FALSE; + } + case EGL_WIDTH: + *value = buffer->buffer.width; + return EGL_TRUE; + case EGL_HEIGHT: + *value = buffer->buffer.height; + return EGL_TRUE; + default: + return EGL_FALSE; + } +} + + +struct native_display_wayland_bufmgr * +wayland_drm_bufmgr_create(wayland_drm_bufmgr_authenticate_func authenticate, + void *user_data, char *device_name) +{ + struct wayland_drm_bufmgr *bufmgr; + + bufmgr = calloc(1, sizeof *bufmgr); + if (!bufmgr) + return NULL; + + bufmgr->user_data = user_data; + bufmgr->authenticate = authenticate; + bufmgr->device_name = strdup(device_name); + + bufmgr->base.bind_display = wayland_drm_bufmgr_bind_display; + bufmgr->base.unbind_display = wayland_drm_bufmgr_unbind_display; + bufmgr->base.buffer_get_resource = wayland_drm_bufmgr_wl_buffer_get_resource; + bufmgr->base.query_buffer = wayland_drm_bufmgr_query_buffer; + + return &bufmgr->base; +} + +void +wayland_drm_bufmgr_destroy(struct native_display_wayland_bufmgr *_bufmgr) +{ + struct wayland_drm_bufmgr *bufmgr = wayland_drm_bufmgr(_bufmgr); + + if (!bufmgr) + return; + + free(bufmgr->device_name); + free(bufmgr); +} + +#endif diff --git a/src/gallium/state_trackers/egl/common/native_wayland_drm_bufmgr_helper.h b/src/gallium/state_trackers/egl/common/native_wayland_drm_bufmgr.h index 543dc6faf47..7bf6513f300 100644 --- a/src/gallium/state_trackers/egl/common/native_wayland_drm_bufmgr_helper.h +++ b/src/gallium/state_trackers/egl/common/native_wayland_drm_bufmgr.h @@ -22,26 +22,16 @@ * DEALINGS IN THE SOFTWARE. */ -#ifndef _NATIVE_WAYLAND_DRM_BUFMGR_HELPER_H_ -#define _NATIVE_WAYLAND_DRM_BUFMGR_HELPER_H_ +#ifndef _NATIVE_WAYLAND_DRM_BUFMGR_H_ +#define _NATIVE_WAYLAND_DRM_BUFMGR_H_ -#include "wayland-drm.h" +typedef int (*wayland_drm_bufmgr_authenticate_func)(void *, uint32_t); -void -egl_g3d_wl_drm_helper_reference_buffer(void *user_data, uint32_t name, int fd, - struct wl_drm_buffer *buffer); +struct native_display_wayland_bufmgr * +wayland_drm_bufmgr_create(wayland_drm_bufmgr_authenticate_func authenticate, + void *user_data, char *device_name); void -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 wl_buffer *buffer); - -EGLBoolean -egl_g3d_wl_drm_common_query_buffer(struct native_display *ndpy, - struct wl_buffer *buffer, - EGLint attribute, EGLint *value); +wayland_drm_bufmgr_destroy(struct native_display_wayland_bufmgr *bufmgr); -#endif /* _NATIVE_WAYLAND_DRM_BUFMGR_HELPER_H_ */ +#endif /* _NATIVE_WAYLAND_DRM_BUFMGR_H_ */ diff --git a/src/gallium/state_trackers/egl/common/native_wayland_drm_bufmgr_helper.c b/src/gallium/state_trackers/egl/common/native_wayland_drm_bufmgr_helper.c deleted file mode 100644 index a9e7342b68b..00000000000 --- a/src/gallium/state_trackers/egl/common/native_wayland_drm_bufmgr_helper.c +++ /dev/null @@ -1,106 +0,0 @@ -#include <stdint.h> -#include <string.h> - -#include "native.h" -#include "util/u_inlines.h" -#include "state_tracker/drm_driver.h" - -#ifdef HAVE_WAYLAND_BACKEND - -#include <wayland-server.h> -#include <wayland-drm-server-protocol.h> - -#include "native_wayland_drm_bufmgr_helper.h" - -void -egl_g3d_wl_drm_helper_reference_buffer(void *user_data, uint32_t name, int fd, - struct wl_drm_buffer *buffer) -{ - 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_XRGB8888: - pf = PIPE_FORMAT_B8G8R8X8_UNORM; - break; - default: - pf = PIPE_FORMAT_NONE; - break; - } - - if (pf == PIPE_FORMAT_NONE) - 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 = 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 = buffer->stride[0]; - - buffer->driver_buffer = - ndpy->screen->resource_from_handle(ndpy->screen, &templ, &wsh); -} - -void -egl_g3d_wl_drm_helper_unreference_buffer(void *user_data, - struct wl_drm_buffer *buffer) -{ - struct pipe_resource *resource = buffer->driver_buffer; - - pipe_resource_reference(&resource, NULL); -} - -struct pipe_resource * -egl_g3d_wl_drm_common_wl_buffer_get_resource(struct native_display *ndpy, - struct wl_buffer *buffer) -{ - return wayland_drm_buffer_get_buffer(buffer); -} - -EGLBoolean -egl_g3d_wl_drm_common_query_buffer(struct native_display *ndpy, - struct wl_buffer *_buffer, - EGLint attribute, EGLint *value) -{ - struct wl_drm_buffer *buffer = (struct wl_drm_buffer *) _buffer; - struct pipe_resource *resource = buffer->driver_buffer; - - if (!wayland_buffer_is_drm(&buffer->buffer)) - return EGL_FALSE; - - switch (attribute) { - case EGL_TEXTURE_FORMAT: - switch (resource->format) { - case PIPE_FORMAT_B8G8R8A8_UNORM: - *value = EGL_TEXTURE_RGBA; - return EGL_TRUE; - case PIPE_FORMAT_B8G8R8X8_UNORM: - *value = EGL_TEXTURE_RGB; - return EGL_TRUE; - default: - return EGL_FALSE; - } - case EGL_WIDTH: - *value = buffer->buffer.width; - return EGL_TRUE; - case EGL_HEIGHT: - *value = buffer->buffer.height; - return EGL_TRUE; - default: - return EGL_FALSE; - } -} - -#endif |