Rev 4358 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
4358 | Serge | 1 | #include |
2 | #include |
||
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 |
||
11 | #include |
||
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 | |||
4401 | Serge | 80 | if (!wayland_buffer_is_drm(ndpy->wl_server_drm, &buffer->buffer)) |
4358 | Serge | 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 |