19373447a614e7b401919328b589b5f2607e456fdChia-I Wu/*
29373447a614e7b401919328b589b5f2607e456fdChia-I Wu * Mesa 3-D graphics library
39373447a614e7b401919328b589b5f2607e456fdChia-I Wu * Version:  7.8
49373447a614e7b401919328b589b5f2607e456fdChia-I Wu *
59373447a614e7b401919328b589b5f2607e456fdChia-I Wu * Copyright (C) 2010 LunarG Inc.
69373447a614e7b401919328b589b5f2607e456fdChia-I Wu *
79373447a614e7b401919328b589b5f2607e456fdChia-I Wu * Permission is hereby granted, free of charge, to any person obtaining a
89373447a614e7b401919328b589b5f2607e456fdChia-I Wu * copy of this software and associated documentation files (the "Software"),
99373447a614e7b401919328b589b5f2607e456fdChia-I Wu * to deal in the Software without restriction, including without limitation
109373447a614e7b401919328b589b5f2607e456fdChia-I Wu * the rights to use, copy, modify, merge, publish, distribute, sublicense,
119373447a614e7b401919328b589b5f2607e456fdChia-I Wu * and/or sell copies of the Software, and to permit persons to whom the
129373447a614e7b401919328b589b5f2607e456fdChia-I Wu * Software is furnished to do so, subject to the following conditions:
139373447a614e7b401919328b589b5f2607e456fdChia-I Wu *
149373447a614e7b401919328b589b5f2607e456fdChia-I Wu * The above copyright notice and this permission notice shall be included
159373447a614e7b401919328b589b5f2607e456fdChia-I Wu * in all copies or substantial portions of the Software.
169373447a614e7b401919328b589b5f2607e456fdChia-I Wu *
17870a9d643b1f256e6a379d96a325284dd2f7eeeaChia-I Wu * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18870a9d643b1f256e6a379d96a325284dd2f7eeeaChia-I Wu * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
199373447a614e7b401919328b589b5f2607e456fdChia-I Wu * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
20870a9d643b1f256e6a379d96a325284dd2f7eeeaChia-I Wu * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21870a9d643b1f256e6a379d96a325284dd2f7eeeaChia-I Wu * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
22870a9d643b1f256e6a379d96a325284dd2f7eeeaChia-I Wu * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
23870a9d643b1f256e6a379d96a325284dd2f7eeeaChia-I Wu * DEALINGS IN THE SOFTWARE.
249373447a614e7b401919328b589b5f2607e456fdChia-I Wu *
259373447a614e7b401919328b589b5f2607e456fdChia-I Wu * Authors:
269373447a614e7b401919328b589b5f2607e456fdChia-I Wu *    Chia-I Wu <olv@lunarg.com>
279373447a614e7b401919328b589b5f2607e456fdChia-I Wu */
289373447a614e7b401919328b589b5f2607e456fdChia-I Wu
299373447a614e7b401919328b589b5f2607e456fdChia-I Wu#include "pipe/p_screen.h"
309373447a614e7b401919328b589b5f2607e456fdChia-I Wu#include "util/u_memory.h"
319373447a614e7b401919328b589b5f2607e456fdChia-I Wu#include "util/u_rect.h"
329373447a614e7b401919328b589b5f2607e456fdChia-I Wu#include "util/u_inlines.h"
339373447a614e7b401919328b589b5f2607e456fdChia-I Wu#include "eglcurrent.h"
344f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu#include "egllog.h"
359373447a614e7b401919328b589b5f2607e456fdChia-I Wu
369373447a614e7b401919328b589b5f2607e456fdChia-I Wu#include "native.h"
379373447a614e7b401919328b589b5f2607e456fdChia-I Wu#include "egl_g3d.h"
389373447a614e7b401919328b589b5f2607e456fdChia-I Wu#include "egl_g3d_image.h"
399373447a614e7b401919328b589b5f2607e456fdChia-I Wu
409373447a614e7b401919328b589b5f2607e456fdChia-I Wu/**
419373447a614e7b401919328b589b5f2607e456fdChia-I Wu * Reference and return the front left buffer of the native pixmap.
429373447a614e7b401919328b589b5f2607e456fdChia-I Wu */
43287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellstatic struct pipe_resource *
449373447a614e7b401919328b589b5f2607e456fdChia-I Wuegl_g3d_reference_native_pixmap(_EGLDisplay *dpy, EGLNativePixmapType pix)
459373447a614e7b401919328b589b5f2607e456fdChia-I Wu{
469373447a614e7b401919328b589b5f2607e456fdChia-I Wu   struct egl_g3d_display *gdpy = egl_g3d_display(dpy);
479373447a614e7b401919328b589b5f2607e456fdChia-I Wu   struct native_surface *nsurf;
48287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell   struct pipe_resource *textures[NUM_NATIVE_ATTACHMENTS];
499373447a614e7b401919328b589b5f2607e456fdChia-I Wu   enum native_attachment natt;
509373447a614e7b401919328b589b5f2607e456fdChia-I Wu
510364c08d7f219ef3a250a4fd8396aacfdddf0368Chia-I Wu   nsurf = gdpy->native->create_pixmap_surface(gdpy->native, pix, NULL);
529373447a614e7b401919328b589b5f2607e456fdChia-I Wu   if (!nsurf)
539373447a614e7b401919328b589b5f2607e456fdChia-I Wu      return NULL;
549373447a614e7b401919328b589b5f2607e456fdChia-I Wu
559373447a614e7b401919328b589b5f2607e456fdChia-I Wu   natt = NATIVE_ATTACHMENT_FRONT_LEFT;
569373447a614e7b401919328b589b5f2607e456fdChia-I Wu   if (!nsurf->validate(nsurf, 1 << natt, NULL, textures, NULL, NULL))
579373447a614e7b401919328b589b5f2607e456fdChia-I Wu      textures[natt] = NULL;
589373447a614e7b401919328b589b5f2607e456fdChia-I Wu
599373447a614e7b401919328b589b5f2607e456fdChia-I Wu   nsurf->destroy(nsurf);
609373447a614e7b401919328b589b5f2607e456fdChia-I Wu
619373447a614e7b401919328b589b5f2607e456fdChia-I Wu   return textures[natt];
629373447a614e7b401919328b589b5f2607e456fdChia-I Wu}
639373447a614e7b401919328b589b5f2607e456fdChia-I Wu
644f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu#ifdef EGL_MESA_drm_image
654f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu
664f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wustatic struct pipe_resource *
675664a983867038de48e71b65df89e0e254085af2Chia-I Wuegl_g3d_create_drm_buffer(_EGLDisplay *dpy, _EGLImage *img,
685664a983867038de48e71b65df89e0e254085af2Chia-I Wu                          const EGLint *attribs)
694f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu{
704f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu   struct egl_g3d_display *gdpy = egl_g3d_display(dpy);
714f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu   struct pipe_screen *screen = gdpy->native->screen;
724f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu   struct pipe_resource templ;
735664a983867038de48e71b65df89e0e254085af2Chia-I Wu   _EGLImageAttribs attrs;
745664a983867038de48e71b65df89e0e254085af2Chia-I Wu   EGLint format, valid_use;
755664a983867038de48e71b65df89e0e254085af2Chia-I Wu
765664a983867038de48e71b65df89e0e254085af2Chia-I Wu   if (_eglParseImageAttribList(&attrs, dpy, attribs) != EGL_SUCCESS)
775664a983867038de48e71b65df89e0e254085af2Chia-I Wu      return NULL;
784f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu
795664a983867038de48e71b65df89e0e254085af2Chia-I Wu   if (attrs.Width <= 0 || attrs.Height <= 0) {
805664a983867038de48e71b65df89e0e254085af2Chia-I Wu      _eglLog(_EGL_DEBUG, "bad width or height (%dx%d)",
815664a983867038de48e71b65df89e0e254085af2Chia-I Wu            attrs.Width, attrs.Height);
824f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu      return NULL;
834f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu   }
844f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu
855664a983867038de48e71b65df89e0e254085af2Chia-I Wu   switch (attrs.DRMBufferFormatMESA) {
864f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu   case EGL_DRM_BUFFER_FORMAT_ARGB32_MESA:
874f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu      format = PIPE_FORMAT_B8G8R8A8_UNORM;
884f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu      break;
894f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu   default:
905664a983867038de48e71b65df89e0e254085af2Chia-I Wu      _eglLog(_EGL_DEBUG, "bad image format value 0x%04x",
915664a983867038de48e71b65df89e0e254085af2Chia-I Wu            attrs.DRMBufferFormatMESA);
924f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu      return NULL;
934f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu      break;
944f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu   }
954f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu
964f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu   valid_use = EGL_DRM_BUFFER_USE_SCANOUT_MESA |
97733fa000ce6792cb4f4d50537040441bdd8c6341Benjamin Franzke               EGL_DRM_BUFFER_USE_SHARE_MESA |
98733fa000ce6792cb4f4d50537040441bdd8c6341Benjamin Franzke               EGL_DRM_BUFFER_USE_CURSOR_MESA;
995664a983867038de48e71b65df89e0e254085af2Chia-I Wu   if (attrs.DRMBufferUseMESA & ~valid_use) {
1005664a983867038de48e71b65df89e0e254085af2Chia-I Wu      _eglLog(_EGL_DEBUG, "bad image use bit 0x%04x",
1015664a983867038de48e71b65df89e0e254085af2Chia-I Wu            attrs.DRMBufferUseMESA);
1024f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu      return NULL;
1034f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu   }
1044f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu
1054f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu   memset(&templ, 0, sizeof(templ));
1064f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu   templ.target = PIPE_TEXTURE_2D;
1074f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu   templ.format = format;
1084f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu   templ.bind = PIPE_BIND_RENDER_TARGET | PIPE_BIND_SAMPLER_VIEW;
1095664a983867038de48e71b65df89e0e254085af2Chia-I Wu   templ.width0 = attrs.Width;
1105664a983867038de48e71b65df89e0e254085af2Chia-I Wu   templ.height0 = attrs.Height;
1114f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu   templ.depth0 = 1;
1122d62e39c622124566779e504e7ed26eee96785fbDave Airlie   templ.array_size = 1;
1134f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu
1144f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu   /*
1154f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu    * XXX fix apps (e.g. wayland) and pipe drivers (e.g. i915) and remove the
1164f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu    * size check
1174f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu    */
1185664a983867038de48e71b65df89e0e254085af2Chia-I Wu   if ((attrs.DRMBufferUseMESA & EGL_DRM_BUFFER_USE_SCANOUT_MESA) &&
1195664a983867038de48e71b65df89e0e254085af2Chia-I Wu       attrs.Width >= 640 && attrs.Height >= 480)
1204f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu      templ.bind |= PIPE_BIND_SCANOUT;
1215664a983867038de48e71b65df89e0e254085af2Chia-I Wu   if (attrs.DRMBufferUseMESA & EGL_DRM_BUFFER_USE_SHARE_MESA)
1224f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu      templ.bind |= PIPE_BIND_SHARED;
123733fa000ce6792cb4f4d50537040441bdd8c6341Benjamin Franzke   if (attrs.DRMBufferUseMESA & EGL_DRM_BUFFER_USE_CURSOR_MESA) {
124733fa000ce6792cb4f4d50537040441bdd8c6341Benjamin Franzke      if (attrs.Width != 64 || attrs.Height != 64)
125733fa000ce6792cb4f4d50537040441bdd8c6341Benjamin Franzke         return NULL;
126733fa000ce6792cb4f4d50537040441bdd8c6341Benjamin Franzke      templ.bind |= PIPE_BIND_CURSOR;
127733fa000ce6792cb4f4d50537040441bdd8c6341Benjamin Franzke   }
1284f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu
1294f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu   return screen->resource_create(screen, &templ);
1304f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu}
1314f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu
1324f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wustatic struct pipe_resource *
1334f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wuegl_g3d_reference_drm_buffer(_EGLDisplay *dpy, EGLint name,
1345664a983867038de48e71b65df89e0e254085af2Chia-I Wu                             _EGLImage *img, const EGLint *attribs)
1354f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu{
1364f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu   struct egl_g3d_display *gdpy = egl_g3d_display(dpy);
1375664a983867038de48e71b65df89e0e254085af2Chia-I Wu   _EGLImageAttribs attrs;
1385664a983867038de48e71b65df89e0e254085af2Chia-I Wu   EGLint format;
139febf5e4147612641fc23f202d5813958bee3af13Chia-I Wu   struct native_buffer nbuf;
1404f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu
1419b6dc9b7a46df41d7eb7b1f94e50d96300b557bcBenjamin Franzke   if (!dpy->Extensions.MESA_drm_image)
1424f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu      return NULL;
1434f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu
1445664a983867038de48e71b65df89e0e254085af2Chia-I Wu   if (_eglParseImageAttribList(&attrs, dpy, attribs) != EGL_SUCCESS)
1455664a983867038de48e71b65df89e0e254085af2Chia-I Wu      return NULL;
1464f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu
1475664a983867038de48e71b65df89e0e254085af2Chia-I Wu   if (attrs.Width <= 0 || attrs.Height <= 0 ||
1485664a983867038de48e71b65df89e0e254085af2Chia-I Wu       attrs.DRMBufferStrideMESA <= 0) {
1494f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu      _eglLog(_EGL_DEBUG, "bad width, height, or stride (%dx%dx%d)",
1505664a983867038de48e71b65df89e0e254085af2Chia-I Wu            attrs.Width, attrs.Height, attrs.DRMBufferStrideMESA);
1514f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu      return NULL;
1524f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu   }
1534f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu
1545664a983867038de48e71b65df89e0e254085af2Chia-I Wu   switch (attrs.DRMBufferFormatMESA) {
1554f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu   case EGL_DRM_BUFFER_FORMAT_ARGB32_MESA:
1564f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu      format = PIPE_FORMAT_B8G8R8A8_UNORM;
1574f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu      break;
1584f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu   default:
1595664a983867038de48e71b65df89e0e254085af2Chia-I Wu      _eglLog(_EGL_DEBUG, "bad image format value 0x%04x",
1605664a983867038de48e71b65df89e0e254085af2Chia-I Wu            attrs.DRMBufferFormatMESA);
1614f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu      return NULL;
1624f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu      break;
1634f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu   }
1644f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu
165febf5e4147612641fc23f202d5813958bee3af13Chia-I Wu   memset(&nbuf, 0, sizeof(nbuf));
166febf5e4147612641fc23f202d5813958bee3af13Chia-I Wu   nbuf.type = NATIVE_BUFFER_DRM;
167febf5e4147612641fc23f202d5813958bee3af13Chia-I Wu   nbuf.u.drm.templ.target = PIPE_TEXTURE_2D;
168febf5e4147612641fc23f202d5813958bee3af13Chia-I Wu   nbuf.u.drm.templ.format = format;
169febf5e4147612641fc23f202d5813958bee3af13Chia-I Wu   nbuf.u.drm.templ.bind = PIPE_BIND_RENDER_TARGET | PIPE_BIND_SAMPLER_VIEW;
170febf5e4147612641fc23f202d5813958bee3af13Chia-I Wu   nbuf.u.drm.templ.width0 = attrs.Width;
171febf5e4147612641fc23f202d5813958bee3af13Chia-I Wu   nbuf.u.drm.templ.height0 = attrs.Height;
172febf5e4147612641fc23f202d5813958bee3af13Chia-I Wu   nbuf.u.drm.templ.depth0 = 1;
173febf5e4147612641fc23f202d5813958bee3af13Chia-I Wu   nbuf.u.drm.templ.array_size = 1;
174febf5e4147612641fc23f202d5813958bee3af13Chia-I Wu
175febf5e4147612641fc23f202d5813958bee3af13Chia-I Wu   nbuf.u.drm.name = name;
176febf5e4147612641fc23f202d5813958bee3af13Chia-I Wu   nbuf.u.drm.stride =
177febf5e4147612641fc23f202d5813958bee3af13Chia-I Wu      attrs.DRMBufferStrideMESA * util_format_get_blocksize(format);
178febf5e4147612641fc23f202d5813958bee3af13Chia-I Wu
179febf5e4147612641fc23f202d5813958bee3af13Chia-I Wu   return gdpy->native->buffer->import_buffer(gdpy->native, &nbuf);
1804f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu}
1814f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu
1824f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu#endif /* EGL_MESA_drm_image */
1834f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu
184184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke#ifdef EGL_WL_bind_wayland_display
185184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke
186184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzkestatic struct pipe_resource *
187184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzkeegl_g3d_reference_wl_buffer(_EGLDisplay *dpy, struct wl_buffer *buffer,
188184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke                            _EGLImage *img, const EGLint *attribs)
189184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke{
190184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke   struct egl_g3d_display *gdpy = egl_g3d_display(dpy);
191184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke   struct pipe_resource *resource = NULL, *tmp = NULL;
192184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke
193184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke   if (!gdpy->native->wayland_bufmgr)
194184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke      return NULL;
195184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke
196184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke   tmp = gdpy->native->wayland_bufmgr->buffer_get_resource(gdpy->native, buffer);
197184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke
198184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke   pipe_resource_reference(&resource, tmp);
199184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke
200184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke   return resource;
201184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke}
202184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke
203184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke#endif /* EGL_WL_bind_wayland_display */
204184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke
20515418a850575b2a33132165605293ed835b4be53Chia-I Wu#ifdef EGL_ANDROID_image_native_buffer
20615418a850575b2a33132165605293ed835b4be53Chia-I Wu
20715418a850575b2a33132165605293ed835b4be53Chia-I Wustatic struct pipe_resource *
20815418a850575b2a33132165605293ed835b4be53Chia-I Wuegl_g3d_reference_android_native_buffer(_EGLDisplay *dpy,
20975cc24c876059d6eb183e07ed802f997fb416864Chia-I Wu                                        struct ANativeWindowBuffer *buf)
21015418a850575b2a33132165605293ed835b4be53Chia-I Wu{
21115418a850575b2a33132165605293ed835b4be53Chia-I Wu   struct egl_g3d_display *gdpy = egl_g3d_display(dpy);
21215418a850575b2a33132165605293ed835b4be53Chia-I Wu   struct native_buffer nbuf;
21315418a850575b2a33132165605293ed835b4be53Chia-I Wu
21415418a850575b2a33132165605293ed835b4be53Chia-I Wu   memset(&nbuf, 0, sizeof(nbuf));
21515418a850575b2a33132165605293ed835b4be53Chia-I Wu   nbuf.type = NATIVE_BUFFER_ANDROID;
21615418a850575b2a33132165605293ed835b4be53Chia-I Wu   nbuf.u.android = buf;
21715418a850575b2a33132165605293ed835b4be53Chia-I Wu
21815418a850575b2a33132165605293ed835b4be53Chia-I Wu   return gdpy->native->buffer->import_buffer(gdpy->native, &nbuf);
21915418a850575b2a33132165605293ed835b4be53Chia-I Wu}
22015418a850575b2a33132165605293ed835b4be53Chia-I Wu
22115418a850575b2a33132165605293ed835b4be53Chia-I Wu#endif /* EGL_ANDROID_image_native_buffer */
22215418a850575b2a33132165605293ed835b4be53Chia-I Wu
2239373447a614e7b401919328b589b5f2607e456fdChia-I Wu_EGLImage *
2249373447a614e7b401919328b589b5f2607e456fdChia-I Wuegl_g3d_create_image(_EGLDriver *drv, _EGLDisplay *dpy, _EGLContext *ctx,
2259373447a614e7b401919328b589b5f2607e456fdChia-I Wu                     EGLenum target, EGLClientBuffer buffer,
2269373447a614e7b401919328b589b5f2607e456fdChia-I Wu                     const EGLint *attribs)
2279373447a614e7b401919328b589b5f2607e456fdChia-I Wu{
228287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell   struct pipe_resource *ptex;
2299373447a614e7b401919328b589b5f2607e456fdChia-I Wu   struct egl_g3d_image *gimg;
2304c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   unsigned level = 0, layer = 0;
2319373447a614e7b401919328b589b5f2607e456fdChia-I Wu
2329373447a614e7b401919328b589b5f2607e456fdChia-I Wu   gimg = CALLOC_STRUCT(egl_g3d_image);
2339373447a614e7b401919328b589b5f2607e456fdChia-I Wu   if (!gimg) {
234c88fc26ac9774e992501fe219caf71b290993fbfnobled      _eglError(EGL_BAD_ALLOC, "eglCreateEGLImageKHR");
2359373447a614e7b401919328b589b5f2607e456fdChia-I Wu      return NULL;
2369373447a614e7b401919328b589b5f2607e456fdChia-I Wu   }
2379373447a614e7b401919328b589b5f2607e456fdChia-I Wu
238713c8734f45b51b3758ecc95b96cf7b5aecacec8Chia-I Wu   if (!_eglInitImage(&gimg->base, dpy)) {
239870a9d643b1f256e6a379d96a325284dd2f7eeeaChia-I Wu      FREE(gimg);
2409373447a614e7b401919328b589b5f2607e456fdChia-I Wu      return NULL;
2419373447a614e7b401919328b589b5f2607e456fdChia-I Wu   }
2429373447a614e7b401919328b589b5f2607e456fdChia-I Wu
2439373447a614e7b401919328b589b5f2607e456fdChia-I Wu   switch (target) {
2449373447a614e7b401919328b589b5f2607e456fdChia-I Wu   case EGL_NATIVE_PIXMAP_KHR:
2459373447a614e7b401919328b589b5f2607e456fdChia-I Wu      ptex = egl_g3d_reference_native_pixmap(dpy,
2469373447a614e7b401919328b589b5f2607e456fdChia-I Wu            (EGLNativePixmapType) buffer);
2479373447a614e7b401919328b589b5f2607e456fdChia-I Wu      break;
2484f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu#ifdef EGL_MESA_drm_image
2494f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu   case EGL_DRM_BUFFER_MESA:
2505664a983867038de48e71b65df89e0e254085af2Chia-I Wu      ptex = egl_g3d_reference_drm_buffer(dpy,
2517aadb53ef020b13658c9a99ecffe554af8755420Chia-I Wu            (EGLint) pointer_to_intptr(buffer), &gimg->base, attribs);
2524f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu      break;
2534f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu#endif
254184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke#ifdef EGL_WL_bind_wayland_display
255184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke   case EGL_WAYLAND_BUFFER_WL:
256184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke      ptex = egl_g3d_reference_wl_buffer(dpy,
257184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke            (struct wl_buffer *) buffer, &gimg->base, attribs);
258184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke      break;
259184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke#endif
26015418a850575b2a33132165605293ed835b4be53Chia-I Wu#ifdef EGL_ANDROID_image_native_buffer
26115418a850575b2a33132165605293ed835b4be53Chia-I Wu   case EGL_NATIVE_BUFFER_ANDROID:
26215418a850575b2a33132165605293ed835b4be53Chia-I Wu      ptex = egl_g3d_reference_android_native_buffer(dpy,
26375cc24c876059d6eb183e07ed802f997fb416864Chia-I Wu            (struct ANativeWindowBuffer *) buffer);
26415418a850575b2a33132165605293ed835b4be53Chia-I Wu      break;
26515418a850575b2a33132165605293ed835b4be53Chia-I Wu#endif
2669373447a614e7b401919328b589b5f2607e456fdChia-I Wu   default:
2679373447a614e7b401919328b589b5f2607e456fdChia-I Wu      ptex = NULL;
2689373447a614e7b401919328b589b5f2607e456fdChia-I Wu      break;
2699373447a614e7b401919328b589b5f2607e456fdChia-I Wu   }
2709373447a614e7b401919328b589b5f2607e456fdChia-I Wu
2719373447a614e7b401919328b589b5f2607e456fdChia-I Wu   if (!ptex) {
272870a9d643b1f256e6a379d96a325284dd2f7eeeaChia-I Wu      FREE(gimg);
2739373447a614e7b401919328b589b5f2607e456fdChia-I Wu      return NULL;
2749373447a614e7b401919328b589b5f2607e456fdChia-I Wu   }
2759373447a614e7b401919328b589b5f2607e456fdChia-I Wu
2769373447a614e7b401919328b589b5f2607e456fdChia-I Wu   if (level > ptex->last_level) {
2779373447a614e7b401919328b589b5f2607e456fdChia-I Wu      _eglError(EGL_BAD_MATCH, "eglCreateEGLImageKHR");
278287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell      pipe_resource_reference(&gimg->texture, NULL);
279870a9d643b1f256e6a379d96a325284dd2f7eeeaChia-I Wu      FREE(gimg);
2809373447a614e7b401919328b589b5f2607e456fdChia-I Wu      return NULL;
2819373447a614e7b401919328b589b5f2607e456fdChia-I Wu   }
2824c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   if (layer >= (u_minify(ptex->depth0, level) + ptex->array_size - 1)) {
2839373447a614e7b401919328b589b5f2607e456fdChia-I Wu      _eglError(EGL_BAD_PARAMETER, "eglCreateEGLImageKHR");
284287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell      pipe_resource_reference(&gimg->texture, NULL);
285870a9d643b1f256e6a379d96a325284dd2f7eeeaChia-I Wu      FREE(gimg);
2869373447a614e7b401919328b589b5f2607e456fdChia-I Wu      return NULL;
2879373447a614e7b401919328b589b5f2607e456fdChia-I Wu   }
2889373447a614e7b401919328b589b5f2607e456fdChia-I Wu
2899373447a614e7b401919328b589b5f2607e456fdChia-I Wu   /* transfer the ownership to the image */
2909373447a614e7b401919328b589b5f2607e456fdChia-I Wu   gimg->texture = ptex;
2919373447a614e7b401919328b589b5f2607e456fdChia-I Wu   gimg->level = level;
2924c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   gimg->layer = layer;
2939373447a614e7b401919328b589b5f2607e456fdChia-I Wu
2949373447a614e7b401919328b589b5f2607e456fdChia-I Wu   return &gimg->base;
2959373447a614e7b401919328b589b5f2607e456fdChia-I Wu}
2969373447a614e7b401919328b589b5f2607e456fdChia-I Wu
2979373447a614e7b401919328b589b5f2607e456fdChia-I WuEGLBoolean
2989373447a614e7b401919328b589b5f2607e456fdChia-I Wuegl_g3d_destroy_image(_EGLDriver *drv, _EGLDisplay *dpy, _EGLImage *img)
2999373447a614e7b401919328b589b5f2607e456fdChia-I Wu{
3009373447a614e7b401919328b589b5f2607e456fdChia-I Wu   struct egl_g3d_image *gimg = egl_g3d_image(img);
3019373447a614e7b401919328b589b5f2607e456fdChia-I Wu
302287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell   pipe_resource_reference(&gimg->texture, NULL);
303870a9d643b1f256e6a379d96a325284dd2f7eeeaChia-I Wu   FREE(gimg);
3049373447a614e7b401919328b589b5f2607e456fdChia-I Wu
3059373447a614e7b401919328b589b5f2607e456fdChia-I Wu   return EGL_TRUE;
3069373447a614e7b401919328b589b5f2607e456fdChia-I Wu}
3074f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu
3084f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu_EGLImage *
3094f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wuegl_g3d_create_drm_image(_EGLDriver *drv, _EGLDisplay *dpy,
3104f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu                         const EGLint *attribs)
3114f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu{
3124f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu   struct egl_g3d_image *gimg;
3134f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu   struct pipe_resource *ptex;
3144f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu
3154f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu   gimg = CALLOC_STRUCT(egl_g3d_image);
3164f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu   if (!gimg) {
3174f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu      _eglError(EGL_BAD_ALLOC, "eglCreateDRMImageKHR");
3184f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu      return NULL;
3194f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu   }
3204f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu
321713c8734f45b51b3758ecc95b96cf7b5aecacec8Chia-I Wu   if (!_eglInitImage(&gimg->base, dpy)) {
3224f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu      FREE(gimg);
3234f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu      return NULL;
3244f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu   }
3254f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu
3264f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu#ifdef EGL_MESA_drm_image
3275664a983867038de48e71b65df89e0e254085af2Chia-I Wu   ptex = egl_g3d_create_drm_buffer(dpy, &gimg->base, attribs);
3284f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu#else
3294f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu   ptex = NULL;
3304f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu#endif
3314f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu   if (!ptex) {
3324f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu      FREE(gimg);
3334f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu      return NULL;
3344f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu   }
3354f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu
3364f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu   /* transfer the ownership to the image */
3374f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu   gimg->texture = ptex;
3384f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu   gimg->level = 0;
3394c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   gimg->layer = 0;
3404f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu
3414f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu   return &gimg->base;
3424f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu}
3434f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu
3444f6faf65d124bd690c4526f4c8e95de4d041601fChia-I WuEGLBoolean
3454f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wuegl_g3d_export_drm_image(_EGLDriver *drv, _EGLDisplay *dpy, _EGLImage *img,
3464f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu			 EGLint *name, EGLint *handle, EGLint *stride)
3474f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu{
3484f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu   struct egl_g3d_display *gdpy = egl_g3d_display(dpy);
3494f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu   struct egl_g3d_image *gimg = egl_g3d_image(img);
350febf5e4147612641fc23f202d5813958bee3af13Chia-I Wu   struct native_buffer nbuf;
3514f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu
3529b6dc9b7a46df41d7eb7b1f94e50d96300b557bcBenjamin Franzke   if (!dpy->Extensions.MESA_drm_image)
3534f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu      return EGL_FALSE;
3544f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu
355febf5e4147612641fc23f202d5813958bee3af13Chia-I Wu   memset(&nbuf, 0, sizeof(nbuf));
356febf5e4147612641fc23f202d5813958bee3af13Chia-I Wu   nbuf.type = NATIVE_BUFFER_DRM;
357febf5e4147612641fc23f202d5813958bee3af13Chia-I Wu   if (name)
358febf5e4147612641fc23f202d5813958bee3af13Chia-I Wu      nbuf.u.drm.templ.bind |= PIPE_BIND_SHARED;
3594f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu
360febf5e4147612641fc23f202d5813958bee3af13Chia-I Wu   if (!gdpy->native->buffer->export_buffer(gdpy->native,
361febf5e4147612641fc23f202d5813958bee3af13Chia-I Wu                                            gimg->texture, &nbuf))
362febf5e4147612641fc23f202d5813958bee3af13Chia-I Wu      return EGL_FALSE;
3634f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu
364febf5e4147612641fc23f202d5813958bee3af13Chia-I Wu   if (name)
365febf5e4147612641fc23f202d5813958bee3af13Chia-I Wu      *name = nbuf.u.drm.name;
366febf5e4147612641fc23f202d5813958bee3af13Chia-I Wu   if (handle)
367febf5e4147612641fc23f202d5813958bee3af13Chia-I Wu      *handle = nbuf.u.drm.handle;
368febf5e4147612641fc23f202d5813958bee3af13Chia-I Wu   if (stride)
369febf5e4147612641fc23f202d5813958bee3af13Chia-I Wu      *stride = nbuf.u.drm.stride;
3704f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu
3714f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu   return EGL_TRUE;
3724f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu}
373