[Mesa-dev] [PATCH mesa 1/3] gallium-egl: Simplify native_wayland_drm_bufmgr_helper interface
Emil Velikov
emil.l.velikov at gmail.com
Thu Jul 18 12:04:26 PDT 2013
On 18/07/13 13:11, Ander Conselvan de Oliveira wrote:
> The helper provides a series of functions to easy the implementation
> of the WL_bind_wayland_display extension on different platforms. But
> even with the helpers there was still a bit of duplicated code between
> platforms, with the drm authentication being the only part that
> differs.
>
> This patch changes the bufmgr interface to provide a self contained
> object with a create function that takes a drm authentication callback
> as an argument. That way all the helper functions are made static and
> the "_helper" suffix was removed from the sources file name.
>
> This change also removes the mix of Wayland client and server code in
> the wayland drm platform source file. All the uses of libwayland-server
> are now contained in native_wayland_drm_bufmgr.c.
>
> Changes to the drm platform are only compile tested.
>
Hi Ander Conselvan de Oliveira
Thanks for doing this, I was wondering what's happening with my mesa
build since updating wayland to 1.2 :)
I have a rather silly question
> Signed-off-by: Ander Conselvan de Oliveira <ander.conselvan.de.oliveira at intel.com>
> ---
> src/gallium/state_trackers/egl/Makefile.am | 2 +-
> src/gallium/state_trackers/egl/common/native.h | 2 +-
> .../egl/common/native_wayland_drm_bufmgr.c | 214 +++++++++++++++++++++
> .../egl/common/native_wayland_drm_bufmgr.h | 37 ++++
> .../egl/common/native_wayland_drm_bufmgr_helper.c | 106 ----------
> .../egl/common/native_wayland_drm_bufmgr_helper.h | 47 -----
> src/gallium/state_trackers/egl/drm/native_drm.c | 52 +----
> src/gallium/state_trackers/egl/drm/native_drm.h | 2 +-
> .../state_trackers/egl/wayland/native_drm.c | 93 +++------
> src/gallium/state_trackers/egl/x11/native_dri2.c | 87 +++------
> 10 files changed, 305 insertions(+), 337 deletions(-)
> create mode 100644 src/gallium/state_trackers/egl/common/native_wayland_drm_bufmgr.c
> create mode 100644 src/gallium/state_trackers/egl/common/native_wayland_drm_bufmgr.h
> delete mode 100644 src/gallium/state_trackers/egl/common/native_wayland_drm_bufmgr_helper.c
> delete mode 100644 src/gallium/state_trackers/egl/common/native_wayland_drm_bufmgr_helper.h
[...]
> 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 0000000..1603a3a
> --- /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)
According to
src/gallium/state_trackers/egl/common/native_wayland_bufmgr.h the
function should use non EGL variable types
boolean (*query_buffer)(struct native_display *ndpy,
struct wl_buffer *buffer,
int attribute, int *value);
otherwise the compiler complains a bit :\
Cheers
Emil
More information about the mesa-dev
mailing list