Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

  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, int fd,
  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.