Home | History | Annotate | Download | only in common
      1 #include <stdint.h>
      2 #include <string.h>
      3 
      4 #include "native.h"
      5 #include "util/u_inlines.h"
      6 #include "state_tracker/drm_driver.h"
      7 
      8 #ifdef HAVE_WAYLAND_BACKEND
      9 
     10 #include <wayland-server.h>
     11 #include <wayland-drm-server-protocol.h>
     12 
     13 #include "native_wayland_drm_bufmgr_helper.h"
     14 
     15 void
     16 egl_g3d_wl_drm_helper_reference_buffer(void *user_data, uint32_t name,
     17                                        struct wl_drm_buffer *buffer)
     18 {
     19    struct native_display *ndpy = user_data;
     20    struct pipe_resource templ;
     21    struct winsys_handle wsh;
     22    enum pipe_format pf;
     23 
     24    switch (buffer->format) {
     25    case WL_DRM_FORMAT_ARGB8888:
     26       pf = PIPE_FORMAT_B8G8R8A8_UNORM;
     27       break;
     28    case WL_DRM_FORMAT_XRGB8888:
     29       pf = PIPE_FORMAT_B8G8R8X8_UNORM;
     30       break;
     31    default:
     32       pf = PIPE_FORMAT_NONE;
     33       break;
     34    }
     35 
     36    if (pf == PIPE_FORMAT_NONE)
     37       return;
     38 
     39    memset(&templ, 0, sizeof(templ));
     40    templ.target = PIPE_TEXTURE_2D;
     41    templ.format = pf;
     42    templ.bind = PIPE_BIND_RENDER_TARGET | PIPE_BIND_SAMPLER_VIEW;
     43    templ.width0 = buffer->buffer.width;
     44    templ.height0 = buffer->buffer.height;
     45    templ.depth0 = 1;
     46    templ.array_size = 1;
     47 
     48    memset(&wsh, 0, sizeof(wsh));
     49    wsh.handle = name;
     50    wsh.stride = buffer->stride[0];
     51 
     52    buffer->driver_buffer =
     53       ndpy->screen->resource_from_handle(ndpy->screen, &templ, &wsh);
     54 }
     55 
     56 void
     57 egl_g3d_wl_drm_helper_unreference_buffer(void *user_data,
     58                                          struct wl_drm_buffer *buffer)
     59 {
     60    struct pipe_resource *resource = buffer->driver_buffer;
     61 
     62    pipe_resource_reference(&resource, NULL);
     63 }
     64 
     65 struct pipe_resource *
     66 egl_g3d_wl_drm_common_wl_buffer_get_resource(struct native_display *ndpy,
     67                                              struct wl_buffer *buffer)
     68 {
     69    return wayland_drm_buffer_get_buffer(buffer);
     70 }
     71 
     72 EGLBoolean
     73 egl_g3d_wl_drm_common_query_buffer(struct native_display *ndpy,
     74                                    struct wl_buffer *_buffer,
     75                                    EGLint attribute, EGLint *value)
     76 {
     77    struct wl_drm_buffer *buffer = (struct wl_drm_buffer *) _buffer;
     78    struct pipe_resource *resource = buffer->driver_buffer;
     79 
     80    if (!wayland_buffer_is_drm(&buffer->buffer))
     81       return EGL_FALSE;
     82 
     83    switch (attribute) {
     84    case EGL_TEXTURE_FORMAT:
     85       switch (resource->format) {
     86       case PIPE_FORMAT_B8G8R8A8_UNORM:
     87          *value = EGL_TEXTURE_RGBA;
     88          return EGL_TRUE;
     89       case PIPE_FORMAT_B8G8R8X8_UNORM:
     90          *value = EGL_TEXTURE_RGB;
     91          return EGL_TRUE;
     92       default:
     93          return EGL_FALSE;
     94       }
     95    case EGL_WIDTH:
     96       *value = buffer->buffer.width;
     97       return EGL_TRUE;
     98    case EGL_HEIGHT:
     99       *value = buffer->buffer.height;
    100       return EGL_TRUE;
    101    default:
    102       return EGL_FALSE;
    103    }
    104 }
    105 
    106 #endif
    107