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