egl_g3d_api.c revision 4f6faf65d124bd690c4526f4c8e95de4d041601f
15ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu/* 25ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu * Mesa 3-D graphics library 35ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu * Version: 7.9 45ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu * 55ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu * Copyright (C) 2009-2010 Chia-I Wu <olv@0xlab.org> 65ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu * 75ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu * Permission is hereby granted, free of charge, to any person obtaining a 85ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu * copy of this software and associated documentation files (the "Software"), 95ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu * to deal in the Software without restriction, including without limitation 105ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu * the rights to use, copy, modify, merge, publish, distribute, sublicense, 115ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu * and/or sell copies of the Software, and to permit persons to whom the 125ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu * Software is furnished to do so, subject to the following conditions: 135ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu * 145ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu * The above copyright notice and this permission notice shall be included 155ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu * in all copies or substantial portions of the Software. 165ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu * 175ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 185ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 195ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 205ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 215ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 225ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 235ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu * DEALINGS IN THE SOFTWARE. 245ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu */ 255ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 265ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu#include "egldriver.h" 275ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu#include "eglcurrent.h" 285ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu#include "egllog.h" 295ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 305ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu#include "pipe/p_screen.h" 315ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu#include "util/u_memory.h" 325ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu#include "util/u_inlines.h" 335ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 345ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu#include "egl_g3d.h" 355ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu#include "egl_g3d_api.h" 365ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu#include "egl_g3d_image.h" 374b2495661f3a5ac8ed07b68c5d5bf90adee2c37dChia-I Wu#include "egl_g3d_sync.h" 385ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu#include "egl_g3d_st.h" 39d5ab243d5a5bacbd2ba615d40f13c8ab37364745Chia-I Wu#include "egl_g3d_loader.h" 405ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu#include "native.h" 415ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 425ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu/** 435ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu * Return the state tracker for the given context. 445ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu */ 455ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wustatic struct st_api * 465ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wuegl_g3d_choose_st(_EGLDriver *drv, _EGLContext *ctx) 475ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu{ 485ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu struct egl_g3d_driver *gdrv = egl_g3d_driver(drv); 495ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu EGLint idx = -1; 505ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 515ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu switch (ctx->ClientAPI) { 525ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu case EGL_OPENGL_ES_API: 535ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu switch (ctx->ClientVersion) { 545ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu case 1: 555ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu idx = ST_API_OPENGL_ES1; 565ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu break; 575ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu case 2: 585ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu idx = ST_API_OPENGL_ES2; 595ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu break; 605ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu default: 615ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu _eglLog(_EGL_WARNING, "unknown client version %d", 625ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu ctx->ClientVersion); 635ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu break; 645ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu } 655ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu break; 665ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu case EGL_OPENVG_API: 675ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu idx = ST_API_OPENVG; 685ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu break; 695ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu case EGL_OPENGL_API: 705ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu idx = ST_API_OPENGL; 715ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu break; 725ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu default: 735ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu _eglLog(_EGL_WARNING, "unknown client API 0x%04x", ctx->ClientAPI); 745ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu break; 755ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu } 765ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 77d5ab243d5a5bacbd2ba615d40f13c8ab37364745Chia-I Wu return (idx >= 0) ? gdrv->loader->get_st_api(idx) : NULL; 785ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu} 795ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 805ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wustatic _EGLContext * 815ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wuegl_g3d_create_context(_EGLDriver *drv, _EGLDisplay *dpy, _EGLConfig *conf, 825ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu _EGLContext *share, const EGLint *attribs) 835ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu{ 845ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu struct egl_g3d_display *gdpy = egl_g3d_display(dpy); 855ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu struct egl_g3d_context *gshare = egl_g3d_context(share); 865ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu struct egl_g3d_config *gconf = egl_g3d_config(conf); 875ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu struct egl_g3d_context *gctx; 885ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 895ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu gctx = CALLOC_STRUCT(egl_g3d_context); 905ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (!gctx) { 915ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu _eglError(EGL_BAD_ALLOC, "eglCreateContext"); 925ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return NULL; 935ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu } 945ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 955ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (!_eglInitContext(&gctx->base, dpy, conf, attribs)) { 96870a9d643b1f256e6a379d96a325284dd2f7eeeaChia-I Wu FREE(gctx); 975ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return NULL; 985ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu } 995ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 1005ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu gctx->stapi = egl_g3d_choose_st(drv, &gctx->base); 1015ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (!gctx->stapi) { 102870a9d643b1f256e6a379d96a325284dd2f7eeeaChia-I Wu FREE(gctx); 1035ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return NULL; 1045ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu } 1055ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 1065ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu gctx->stctxi = gctx->stapi->create_context(gctx->stapi, gdpy->smapi, 1079b6a63a0e2271b0b28c89b22c8981ef8f73205c8Chia-I Wu (gconf) ? &gconf->stvis : NULL, (gshare) ? gshare->stctxi : NULL); 1085ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (!gctx->stctxi) { 109870a9d643b1f256e6a379d96a325284dd2f7eeeaChia-I Wu FREE(gctx); 1105ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return NULL; 1115ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu } 1125ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 1135ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu gctx->stctxi->st_manager_private = (void *) &gctx->base; 1145ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 1155ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return &gctx->base; 1165ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu} 1175ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 1185ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu/** 1195ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu * Destroy a context. 1205ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu */ 1215ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wustatic void 1225ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wudestroy_context(_EGLDisplay *dpy, _EGLContext *ctx) 1235ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu{ 1245ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu struct egl_g3d_context *gctx = egl_g3d_context(ctx); 1255ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 1265ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu /* FIXME a context might live longer than its display */ 1275ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (!dpy->Initialized) 1285ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu _eglLog(_EGL_FATAL, "destroy a context with an unitialized display"); 1295ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 1305ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu gctx->stctxi->destroy(gctx->stctxi); 1315ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 132870a9d643b1f256e6a379d96a325284dd2f7eeeaChia-I Wu FREE(gctx); 1335ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu} 1345ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 1355ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wustatic EGLBoolean 1365ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wuegl_g3d_destroy_context(_EGLDriver *drv, _EGLDisplay *dpy, _EGLContext *ctx) 1375ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu{ 1385ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (!_eglIsContextBound(ctx)) 1395ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu destroy_context(dpy, ctx); 1405ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return EGL_TRUE; 1415ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu} 1425ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 1435ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wustruct egl_g3d_create_surface_arg { 1445ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu EGLint type; 1455ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu union { 1465ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu EGLNativeWindowType win; 1475ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu EGLNativePixmapType pix; 1485ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu } u; 1495ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu}; 1505ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 1515ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wustatic _EGLSurface * 1525ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wuegl_g3d_create_surface(_EGLDriver *drv, _EGLDisplay *dpy, _EGLConfig *conf, 1535ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu struct egl_g3d_create_surface_arg *arg, 1545ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu const EGLint *attribs) 1555ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu{ 1565ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu struct egl_g3d_display *gdpy = egl_g3d_display(dpy); 1575ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu struct egl_g3d_config *gconf = egl_g3d_config(conf); 1585ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu struct egl_g3d_surface *gsurf; 1595ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu struct native_surface *nsurf; 1605ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu const char *err; 1615ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 1625ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu switch (arg->type) { 1635ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu case EGL_WINDOW_BIT: 1645ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu err = "eglCreateWindowSurface"; 1655ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu break; 1665ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu case EGL_PIXMAP_BIT: 1675ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu err = "eglCreatePixmapSurface"; 1685ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu break; 1695ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu#ifdef EGL_MESA_screen_surface 1705ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu case EGL_SCREEN_BIT_MESA: 1715ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu err = "eglCreateScreenSurface"; 1725ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu break; 1735ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu#endif 1745ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu default: 1755ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu err = "eglCreateUnknownSurface"; 1765ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu break; 1775ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu } 1785ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 1795ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu gsurf = CALLOC_STRUCT(egl_g3d_surface); 1805ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (!gsurf) { 1815ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu _eglError(EGL_BAD_ALLOC, err); 1825ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return NULL; 1835ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu } 1845ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 1855ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (!_eglInitSurface(&gsurf->base, dpy, arg->type, conf, attribs)) { 186870a9d643b1f256e6a379d96a325284dd2f7eeeaChia-I Wu FREE(gsurf); 1875ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return NULL; 1885ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu } 1895ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 1905ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu /* create the native surface */ 1915ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu switch (arg->type) { 1925ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu case EGL_WINDOW_BIT: 1935ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu nsurf = gdpy->native->create_window_surface(gdpy->native, 1945ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu arg->u.win, gconf->native); 1955ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu break; 1965ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu case EGL_PIXMAP_BIT: 1975ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu nsurf = gdpy->native->create_pixmap_surface(gdpy->native, 1985ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu arg->u.pix, gconf->native); 1995ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu break; 2005ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu#ifdef EGL_MESA_screen_surface 2015ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu case EGL_SCREEN_BIT_MESA: 2025ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu /* prefer back buffer (move to _eglInitSurface?) */ 2035ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu gsurf->base.RenderBuffer = EGL_BACK_BUFFER; 2045ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu nsurf = gdpy->native->modeset->create_scanout_surface(gdpy->native, 2055ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu gconf->native, gsurf->base.Width, gsurf->base.Height); 2065ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu break; 2075ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu#endif 2085ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu default: 2095ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu nsurf = NULL; 2105ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu break; 2115ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu } 2125ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 2135ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (!nsurf) { 214870a9d643b1f256e6a379d96a325284dd2f7eeeaChia-I Wu FREE(gsurf); 2155ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return NULL; 2165ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu } 2175ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu /* initialize the geometry */ 2185ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (!nsurf->validate(nsurf, 0x0, &gsurf->sequence_number, NULL, 2195ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu &gsurf->base.Width, &gsurf->base.Height)) { 2205ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu nsurf->destroy(nsurf); 221870a9d643b1f256e6a379d96a325284dd2f7eeeaChia-I Wu FREE(gsurf); 2225ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return NULL; 2235ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu } 2245ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 2255ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu gsurf->stvis = gconf->stvis; 2265ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (gsurf->base.RenderBuffer == EGL_SINGLE_BUFFER) 2275ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu gsurf->stvis.render_buffer = ST_ATTACHMENT_FRONT_LEFT; 2285ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 2295ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu gsurf->stfbi = egl_g3d_create_st_framebuffer(&gsurf->base); 2305ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (!gsurf->stfbi) { 2315ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu nsurf->destroy(nsurf); 232870a9d643b1f256e6a379d96a325284dd2f7eeeaChia-I Wu FREE(gsurf); 2335ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return NULL; 2345ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu } 2355ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 2365ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu nsurf->user_data = &gsurf->base; 2375ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu gsurf->native = nsurf; 2385ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 2395ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return &gsurf->base; 2405ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu} 2415ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 2425ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wustatic _EGLSurface * 2435ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wuegl_g3d_create_window_surface(_EGLDriver *drv, _EGLDisplay *dpy, 2445ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu _EGLConfig *conf, EGLNativeWindowType win, 2455ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu const EGLint *attribs) 2465ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu{ 2475ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu struct egl_g3d_create_surface_arg arg; 2485ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 2495ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu memset(&arg, 0, sizeof(arg)); 2505ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu arg.type = EGL_WINDOW_BIT; 2515ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu arg.u.win = win; 2525ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 2535ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return egl_g3d_create_surface(drv, dpy, conf, &arg, attribs); 2545ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu} 2555ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 2565ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wustatic _EGLSurface * 2575ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wuegl_g3d_create_pixmap_surface(_EGLDriver *drv, _EGLDisplay *dpy, 2585ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu _EGLConfig *conf, EGLNativePixmapType pix, 2595ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu const EGLint *attribs) 2605ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu{ 2615ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu struct egl_g3d_create_surface_arg arg; 2625ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 2635ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu memset(&arg, 0, sizeof(arg)); 2645ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu arg.type = EGL_PIXMAP_BIT; 2655ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu arg.u.pix = pix; 2665ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 2675ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return egl_g3d_create_surface(drv, dpy, conf, &arg, attribs); 2685ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu} 2695ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 270a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wustatic struct egl_g3d_surface * 271a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wucreate_pbuffer_surface(_EGLDisplay *dpy, _EGLConfig *conf, 272a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu const EGLint *attribs, const char *func) 2735ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu{ 2745ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu struct egl_g3d_config *gconf = egl_g3d_config(conf); 2755ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu struct egl_g3d_surface *gsurf; 2765ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 2775ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu gsurf = CALLOC_STRUCT(egl_g3d_surface); 2785ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (!gsurf) { 279a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu _eglError(EGL_BAD_ALLOC, func); 2805ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return NULL; 2815ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu } 2825ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 2835ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (!_eglInitSurface(&gsurf->base, dpy, EGL_PBUFFER_BIT, conf, attribs)) { 284870a9d643b1f256e6a379d96a325284dd2f7eeeaChia-I Wu FREE(gsurf); 2855ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return NULL; 2865ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu } 2875ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 2885ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu gsurf->stvis = gconf->stvis; 2895ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 2905ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu gsurf->stfbi = egl_g3d_create_st_framebuffer(&gsurf->base); 2915ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (!gsurf->stfbi) { 292870a9d643b1f256e6a379d96a325284dd2f7eeeaChia-I Wu FREE(gsurf); 2935ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return NULL; 2945ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu } 2955ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 296a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu return gsurf; 297a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu} 298a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu 299a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wustatic _EGLSurface * 300a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wuegl_g3d_create_pbuffer_surface(_EGLDriver *drv, _EGLDisplay *dpy, 301a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu _EGLConfig *conf, const EGLint *attribs) 302a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu{ 303a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu struct egl_g3d_surface *gsurf; 304a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu struct pipe_resource *ptex = NULL; 305a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu 306a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu gsurf = create_pbuffer_surface(dpy, conf, attribs, 307a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu "eglCreatePbufferSurface"); 308a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu if (!gsurf) 309a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu return NULL; 310a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu 311a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu gsurf->client_buffer_type = EGL_NONE; 312a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu 313a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu if (!gsurf->stfbi->validate(gsurf->stfbi, 314a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu &gsurf->stvis.render_buffer, 1, &ptex)) { 315a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu egl_g3d_destroy_st_framebuffer(gsurf->stfbi); 316a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu FREE(gsurf); 317a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu return NULL; 318a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu } 319a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu 320a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu return &gsurf->base; 321a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu} 322a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu 323a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wustatic _EGLSurface * 324a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wuegl_g3d_create_pbuffer_from_client_buffer(_EGLDriver *drv, _EGLDisplay *dpy, 325a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu EGLenum buftype, 326a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu EGLClientBuffer buffer, 327a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu _EGLConfig *conf, 328a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu const EGLint *attribs) 329a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu{ 330a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu struct egl_g3d_surface *gsurf; 331a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu struct pipe_resource *ptex = NULL; 332a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu EGLint pbuffer_attribs[32]; 333a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu EGLint count, i; 334a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu 335a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu switch (buftype) { 336a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu case EGL_OPENVG_IMAGE: 337a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu break; 338a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu default: 339a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu _eglError(EGL_BAD_PARAMETER, "eglCreatePbufferFromClientBuffer"); 340a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu return NULL; 341a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu break; 342a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu } 343a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu 344a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu /* parse the attributes first */ 345a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu count = 0; 346a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu for (i = 0; attribs && attribs[i] != EGL_NONE; i++) { 347a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu EGLint attr = attribs[i++]; 348a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu EGLint val = attribs[i]; 349a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu EGLint err = EGL_SUCCESS; 350a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu 351a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu switch (attr) { 352a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu case EGL_TEXTURE_FORMAT: 353a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu case EGL_TEXTURE_TARGET: 354a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu case EGL_MIPMAP_TEXTURE: 355a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu pbuffer_attribs[count++] = attr; 356a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu pbuffer_attribs[count++] = val; 357a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu break; 358a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu default: 359a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu err = EGL_BAD_ATTRIBUTE; 360a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu break; 361a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu } 362a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu /* bail out */ 363a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu if (err != EGL_SUCCESS) { 364a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu _eglError(err, "eglCreatePbufferFromClientBuffer"); 365a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu return NULL; 366a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu } 367a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu } 368a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu 369a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu pbuffer_attribs[count++] = EGL_NONE; 370a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu 371a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu gsurf = create_pbuffer_surface(dpy, conf, pbuffer_attribs, 372a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu "eglCreatePbufferFromClientBuffer"); 373a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu if (!gsurf) 374a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu return NULL; 375a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu 376a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu gsurf->client_buffer_type = buftype; 377a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu gsurf->client_buffer = buffer; 378a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu 379a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu if (!gsurf->stfbi->validate(gsurf->stfbi, 380a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu &gsurf->stvis.render_buffer, 1, &ptex)) { 381a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu egl_g3d_destroy_st_framebuffer(gsurf->stfbi); 382a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu FREE(gsurf); 383a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu return NULL; 384a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu } 385a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu 3865ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return &gsurf->base; 3875ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu} 3885ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 3895ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu/** 3905ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu * Destroy a surface. 3915ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu */ 3925ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wustatic void 3935ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wudestroy_surface(_EGLDisplay *dpy, _EGLSurface *surf) 3945ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu{ 3955ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu struct egl_g3d_surface *gsurf = egl_g3d_surface(surf); 3965ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 3975ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu /* FIXME a surface might live longer than its display */ 3985ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (!dpy->Initialized) 3995ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu _eglLog(_EGL_FATAL, "destroy a surface with an unitialized display"); 4005ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 4015ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu pipe_resource_reference(&gsurf->render_texture, NULL); 4025ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu egl_g3d_destroy_st_framebuffer(gsurf->stfbi); 4035ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (gsurf->native) 4045ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu gsurf->native->destroy(gsurf->native); 405870a9d643b1f256e6a379d96a325284dd2f7eeeaChia-I Wu FREE(gsurf); 4065ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu} 4075ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 4085ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wustatic EGLBoolean 4095ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wuegl_g3d_destroy_surface(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf) 4105ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu{ 4115ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (!_eglIsSurfaceBound(surf)) 4125ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu destroy_surface(dpy, surf); 4135ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return EGL_TRUE; 4145ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu} 4155ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 4165ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wustatic EGLBoolean 4175ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wuegl_g3d_make_current(_EGLDriver *drv, _EGLDisplay *dpy, 4185ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu _EGLSurface *draw, _EGLSurface *read, _EGLContext *ctx) 4195ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu{ 4205ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu struct egl_g3d_context *gctx = egl_g3d_context(ctx); 4215ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu struct egl_g3d_surface *gdraw = egl_g3d_surface(draw); 4225ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu struct egl_g3d_surface *gread = egl_g3d_surface(read); 4235ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu struct egl_g3d_context *old_gctx; 4245ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu EGLBoolean ok = EGL_TRUE; 4255ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 4265ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu /* bind the new context and return the "orphaned" one */ 4275ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (!_eglBindContext(&ctx, &draw, &read)) 4285ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return EGL_FALSE; 4295ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu old_gctx = egl_g3d_context(ctx); 4305ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 4315ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (old_gctx) { 4325ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu /* flush old context */ 4335ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu old_gctx->stctxi->flush(old_gctx->stctxi, 4345ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu PIPE_FLUSH_RENDER_CACHE | PIPE_FLUSH_FRAME, NULL); 4355ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu } 4365ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 4375ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (gctx) { 4385ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu ok = gctx->stapi->make_current(gctx->stapi, gctx->stctxi, 4395ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu (gdraw) ? gdraw->stfbi : NULL, (gread) ? gread->stfbi : NULL); 4405ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (ok) { 4419b6a63a0e2271b0b28c89b22c8981ef8f73205c8Chia-I Wu if (gdraw) { 4425ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu gctx->stctxi->notify_invalid_framebuffer(gctx->stctxi, 4439b6a63a0e2271b0b28c89b22c8981ef8f73205c8Chia-I Wu gdraw->stfbi); 4445ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 4459b6a63a0e2271b0b28c89b22c8981ef8f73205c8Chia-I Wu if (gdraw->base.Type == EGL_WINDOW_BIT) { 4469b6a63a0e2271b0b28c89b22c8981ef8f73205c8Chia-I Wu gctx->base.WindowRenderBuffer = 4479b6a63a0e2271b0b28c89b22c8981ef8f73205c8Chia-I Wu (gdraw->stvis.render_buffer == ST_ATTACHMENT_FRONT_LEFT) ? 4489b6a63a0e2271b0b28c89b22c8981ef8f73205c8Chia-I Wu EGL_SINGLE_BUFFER : EGL_BACK_BUFFER; 4499b6a63a0e2271b0b28c89b22c8981ef8f73205c8Chia-I Wu } 4509b6a63a0e2271b0b28c89b22c8981ef8f73205c8Chia-I Wu } 4519b6a63a0e2271b0b28c89b22c8981ef8f73205c8Chia-I Wu if (gread && gread != gdraw) { 4529b6a63a0e2271b0b28c89b22c8981ef8f73205c8Chia-I Wu gctx->stctxi->notify_invalid_framebuffer(gctx->stctxi, 4539b6a63a0e2271b0b28c89b22c8981ef8f73205c8Chia-I Wu gread->stfbi); 4545ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu } 4555ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu } 4565ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu } 4575ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu else if (old_gctx) { 4585ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu ok = old_gctx->stapi->make_current(old_gctx->stapi, NULL, NULL, NULL); 4595ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu old_gctx->base.WindowRenderBuffer = EGL_NONE; 4605ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu } 4615ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 4625ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (ctx && !_eglIsContextLinked(ctx)) 4635ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu destroy_context(dpy, ctx); 4645ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (draw && !_eglIsSurfaceLinked(draw)) 4655ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu destroy_surface(dpy, draw); 4665ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (read && read != draw && !_eglIsSurfaceLinked(read)) 4675ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu destroy_surface(dpy, read); 4685ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 4695ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return ok; 4705ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu} 4715ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 4725ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wustatic EGLBoolean 4735ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wuegl_g3d_swap_buffers(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf) 4745ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu{ 4755ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu struct egl_g3d_surface *gsurf = egl_g3d_surface(surf); 4765ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu _EGLContext *ctx = _eglGetCurrentContext(); 4775ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu struct egl_g3d_context *gctx = NULL; 4785ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 4795ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu /* no-op for pixmap or pbuffer surface */ 4805ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (gsurf->base.Type == EGL_PIXMAP_BIT || 4815ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu gsurf->base.Type == EGL_PBUFFER_BIT) 4825ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return EGL_TRUE; 4835ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 4845ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu /* or when the surface is single-buffered */ 4855ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (gsurf->stvis.render_buffer == ST_ATTACHMENT_FRONT_LEFT) 4865ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return EGL_TRUE; 4875ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 4885ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (ctx && ctx->DrawSurface == surf) 4895ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu gctx = egl_g3d_context(ctx); 4905ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 4915ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu /* flush if the surface is current */ 4925ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (gctx) { 4935ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu gctx->stctxi->flush(gctx->stctxi, 4945ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu PIPE_FLUSH_RENDER_CACHE | PIPE_FLUSH_FRAME, NULL); 4955ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu } 4965ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 4975ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return gsurf->native->swap_buffers(gsurf->native); 4985ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu} 4995ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 5005ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu/** 5015ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu * Get the pipe surface of the given attachment of the native surface. 5025ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu */ 5032a15553e431f04d13b757a3a76e4eb7d794f1219Roland Scheideggerstatic struct pipe_resource * 5042a15553e431f04d13b757a3a76e4eb7d794f1219Roland Scheideggerget_pipe_resource(struct native_display *ndpy, struct native_surface *nsurf, 5052a15553e431f04d13b757a3a76e4eb7d794f1219Roland Scheidegger enum native_attachment natt) 5065ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu{ 5075ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu struct pipe_resource *textures[NUM_NATIVE_ATTACHMENTS]; 5085ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 5095ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu textures[natt] = NULL; 5105ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu nsurf->validate(nsurf, 1 << natt, NULL, textures, NULL, NULL); 5115ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 5122a15553e431f04d13b757a3a76e4eb7d794f1219Roland Scheidegger return textures[natt]; 5135ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu} 5145ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 5155ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wustatic EGLBoolean 5165ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wuegl_g3d_copy_buffers(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf, 5175ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu EGLNativePixmapType target) 5185ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu{ 5195ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu struct egl_g3d_display *gdpy = egl_g3d_display(dpy); 5205ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu struct egl_g3d_surface *gsurf = egl_g3d_surface(surf); 5215ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu _EGLContext *ctx = _eglGetCurrentContext(); 5225ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu struct egl_g3d_config *gconf; 5235ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu struct native_surface *nsurf; 5242a15553e431f04d13b757a3a76e4eb7d794f1219Roland Scheidegger struct pipe_resource *ptex; 5255ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 5265ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (!gsurf->render_texture) 5275ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return EGL_TRUE; 5285ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 5295ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu gconf = egl_g3d_config(egl_g3d_find_pixmap_config(dpy, target)); 5305ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (!gconf) 5315ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return _eglError(EGL_BAD_NATIVE_PIXMAP, "eglCopyBuffers"); 5325ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 5335ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu nsurf = gdpy->native->create_pixmap_surface(gdpy->native, 5345ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu target, gconf->native); 5355ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (!nsurf) 5365ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return _eglError(EGL_BAD_NATIVE_PIXMAP, "eglCopyBuffers"); 5375ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 5385ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu /* flush if the surface is current */ 5395ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (ctx && ctx->DrawSurface == &gsurf->base) { 5405ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu struct egl_g3d_context *gctx = egl_g3d_context(ctx); 5415ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu gctx->stctxi->flush(gctx->stctxi, 5425ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu PIPE_FLUSH_RENDER_CACHE | PIPE_FLUSH_FRAME, NULL); 5435ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu } 5445ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 5455ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu /* create a pipe context to copy surfaces */ 5465ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (!gdpy->pipe) { 5475ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu gdpy->pipe = 5485ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu gdpy->native->screen->context_create(gdpy->native->screen, NULL); 5495ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (!gdpy->pipe) 5505ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return EGL_FALSE; 5515ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu } 5525ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 5532a15553e431f04d13b757a3a76e4eb7d794f1219Roland Scheidegger ptex = get_pipe_resource(gdpy->native, nsurf, NATIVE_ATTACHMENT_FRONT_LEFT); 5542a15553e431f04d13b757a3a76e4eb7d794f1219Roland Scheidegger if (ptex) { 5559d7219c560d468e1329d6867cff5033e979f535fChia-I Wu struct pipe_resource *psrc = gsurf->render_texture; 5562a15553e431f04d13b757a3a76e4eb7d794f1219Roland Scheidegger struct pipe_subresource subsrc, subdst; 5572a15553e431f04d13b757a3a76e4eb7d794f1219Roland Scheidegger subsrc.face = 0; 5582a15553e431f04d13b757a3a76e4eb7d794f1219Roland Scheidegger subsrc.level = 0; 5592a15553e431f04d13b757a3a76e4eb7d794f1219Roland Scheidegger subdst.face = 0; 5602a15553e431f04d13b757a3a76e4eb7d794f1219Roland Scheidegger subdst.level = 0; 5615ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 5625ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (psrc) { 5632a15553e431f04d13b757a3a76e4eb7d794f1219Roland Scheidegger gdpy->pipe->resource_copy_region(gdpy->pipe, ptex, subdst, 0, 0, 0, 5642a15553e431f04d13b757a3a76e4eb7d794f1219Roland Scheidegger gsurf->render_texture, subsrc, 0, 0, 0, ptex->width0, ptex->height0); 5655ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 5665ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu nsurf->flush_frontbuffer(nsurf); 5675ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu } 5685ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 5692a15553e431f04d13b757a3a76e4eb7d794f1219Roland Scheidegger pipe_resource_reference(&ptex, NULL); 5705ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu } 5715ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 5725ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu nsurf->destroy(nsurf); 5735ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 5745ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return EGL_TRUE; 5755ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu} 5765ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 5775ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wustatic EGLBoolean 5785ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wuegl_g3d_wait_client(_EGLDriver *drv, _EGLDisplay *dpy, _EGLContext *ctx) 5795ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu{ 5805ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu struct egl_g3d_display *gdpy = egl_g3d_display(dpy); 5815ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu struct egl_g3d_context *gctx = egl_g3d_context(ctx); 5825ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu struct pipe_screen *screen = gdpy->native->screen; 5835ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu struct pipe_fence_handle *fence = NULL; 5845ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 5855ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu gctx->stctxi->flush(gctx->stctxi, 5865ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu PIPE_FLUSH_RENDER_CACHE | PIPE_FLUSH_FRAME, &fence); 5875ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu screen->fence_finish(screen, fence, 0); 5885ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu screen->fence_reference(screen, &fence, NULL); 5895ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 5905ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return EGL_TRUE; 5915ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu} 5925ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 5935ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wustatic EGLBoolean 5945ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wuegl_g3d_wait_native(_EGLDriver *drv, _EGLDisplay *dpy, EGLint engine) 5955ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu{ 5965ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu _EGLContext *ctx = _eglGetCurrentContext(); 5975ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 5985ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (engine != EGL_CORE_NATIVE_ENGINE) 5995ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return _eglError(EGL_BAD_PARAMETER, "eglWaitNative"); 6005ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 6015ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (ctx && ctx->DrawSurface) { 6025ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu struct egl_g3d_surface *gsurf = egl_g3d_surface(ctx->DrawSurface); 6035ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 6045ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (gsurf->native) 6055ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu gsurf->native->wait(gsurf->native); 6065ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu } 6075ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 6085ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return EGL_TRUE; 6095ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu} 6105ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 6115ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wustatic EGLBoolean 6125ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wuegl_g3d_bind_tex_image(_EGLDriver *drv, _EGLDisplay *dpy, 6135ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu _EGLSurface *surf, EGLint buffer) 6145ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu{ 6155ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu struct egl_g3d_surface *gsurf = egl_g3d_surface(surf); 6165ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu _EGLContext *es1 = _eglGetAPIContext(EGL_OPENGL_ES_API); 6175ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu struct egl_g3d_context *gctx; 6185ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu enum pipe_format internal_format; 6195ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu enum st_texture_type target; 6205ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 6215ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (!gsurf || gsurf->base.Type != EGL_PBUFFER_BIT) 6225ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return _eglError(EGL_BAD_SURFACE, "eglBindTexImage"); 6235ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (buffer != EGL_BACK_BUFFER) 6245ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return _eglError(EGL_BAD_PARAMETER, "eglBindTexImage"); 6255ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (gsurf->base.BoundToTexture) 6265ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return _eglError(EGL_BAD_ACCESS, "eglBindTexImage"); 6275ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 6285ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu switch (gsurf->base.TextureFormat) { 6295ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu case EGL_TEXTURE_RGB: 6305ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu internal_format = PIPE_FORMAT_R8G8B8_UNORM; 6315ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu break; 6325ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu case EGL_TEXTURE_RGBA: 6335ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu internal_format = PIPE_FORMAT_B8G8R8A8_UNORM; 6345ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu break; 6355ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu default: 6365ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return _eglError(EGL_BAD_MATCH, "eglBindTexImage"); 6375ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu } 6385ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 6395ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu switch (gsurf->base.TextureTarget) { 6405ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu case EGL_TEXTURE_2D: 6415ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu target = ST_TEXTURE_2D; 6425ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu break; 6435ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu default: 6445ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return _eglError(EGL_BAD_MATCH, "eglBindTexImage"); 6455ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu } 6465ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 6475ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (!es1) 6485ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return EGL_TRUE; 6495ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (!gsurf->render_texture) 6505ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return EGL_FALSE; 6515ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 6525ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu /* flush properly if the surface is bound */ 6535ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (gsurf->base.CurrentContext) { 6545ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu gctx = egl_g3d_context(gsurf->base.CurrentContext); 6555ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu gctx->stctxi->flush(gctx->stctxi, 6565ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu PIPE_FLUSH_RENDER_CACHE | PIPE_FLUSH_FRAME, NULL); 6575ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu } 6585ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 6595ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu gctx = egl_g3d_context(es1); 6605ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (gctx->stctxi->teximage) { 6615ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (!gctx->stctxi->teximage(gctx->stctxi, target, 6625ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu gsurf->base.MipmapLevel, internal_format, 6635ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu gsurf->render_texture, gsurf->base.MipmapTexture)) 6645ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return EGL_FALSE; 6655ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu gsurf->base.BoundToTexture = EGL_TRUE; 6665ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu } 6675ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 6685ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return EGL_TRUE; 6695ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu} 6705ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 6715ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wustatic EGLBoolean 6725ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wuegl_g3d_release_tex_image(_EGLDriver *drv, _EGLDisplay *dpy, 6735ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu _EGLSurface *surf, EGLint buffer) 6745ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu{ 6755ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu struct egl_g3d_surface *gsurf = egl_g3d_surface(surf); 6765ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 6775ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (!gsurf || gsurf->base.Type != EGL_PBUFFER_BIT || 6785ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu !gsurf->base.BoundToTexture) 6795ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return _eglError(EGL_BAD_SURFACE, "eglReleaseTexImage"); 6805ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (buffer != EGL_BACK_BUFFER) 6815ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return _eglError(EGL_BAD_PARAMETER, "eglReleaseTexImage"); 6825ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 6835ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (gsurf->render_texture) { 6845ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu _EGLContext *ctx = _eglGetAPIContext(EGL_OPENGL_ES_API); 6855ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu struct egl_g3d_context *gctx = egl_g3d_context(ctx); 6865ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 6875ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu /* what if the context the surface binds to is no longer current? */ 6885ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (gctx) { 6895ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu gctx->stctxi->teximage(gctx->stctxi, ST_TEXTURE_2D, 6905ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu gsurf->base.MipmapLevel, PIPE_FORMAT_NONE, NULL, FALSE); 6915ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu } 6925ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu } 6935ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 6945ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu gsurf->base.BoundToTexture = EGL_FALSE; 6955ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 6965ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return EGL_TRUE; 6975ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu} 6985ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 6995ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu#ifdef EGL_MESA_screen_surface 7005ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 7015ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wustatic _EGLSurface * 7025ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wuegl_g3d_create_screen_surface(_EGLDriver *drv, _EGLDisplay *dpy, 7035ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu _EGLConfig *conf, const EGLint *attribs) 7045ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu{ 7055ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu struct egl_g3d_create_surface_arg arg; 7065ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 7075ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu memset(&arg, 0, sizeof(arg)); 7085ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu arg.type = EGL_SCREEN_BIT_MESA; 7095ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 7105ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return egl_g3d_create_surface(drv, dpy, conf, &arg, attribs); 7115ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu} 7125ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 7135ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wustatic EGLBoolean 7145ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wuegl_g3d_show_screen_surface(_EGLDriver *drv, _EGLDisplay *dpy, 7155ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu _EGLScreen *scr, _EGLSurface *surf, 7165ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu _EGLMode *mode) 7175ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu{ 7185ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu struct egl_g3d_display *gdpy = egl_g3d_display(dpy); 7195ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu struct egl_g3d_screen *gscr = egl_g3d_screen(scr); 7205ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu struct egl_g3d_surface *gsurf = egl_g3d_surface(surf); 7215ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu struct native_surface *nsurf; 7225ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu const struct native_mode *nmode; 7235ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu EGLBoolean changed; 7245ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 7255ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (gsurf) { 7265ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu EGLint idx; 7275ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 7285ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (!mode) 7295ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return _eglError(EGL_BAD_MATCH, "eglShowSurfaceMESA"); 7305ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (gsurf->base.Type != EGL_SCREEN_BIT_MESA) 7315ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return _eglError(EGL_BAD_SURFACE, "eglShowScreenSurfaceMESA"); 7325ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (gsurf->base.Width < mode->Width || gsurf->base.Height < mode->Height) 7335ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return _eglError(EGL_BAD_MATCH, 7345ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu "eglShowSurfaceMESA(surface smaller than mode size)"); 7355ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 7365ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu /* find the index of the mode */ 7375ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu for (idx = 0; idx < gscr->base.NumModes; idx++) 7385ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (mode == &gscr->base.Modes[idx]) 7395ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu break; 7405ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (idx >= gscr->base.NumModes) { 7415ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return _eglError(EGL_BAD_MODE_MESA, 7425ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu "eglShowSurfaceMESA(unknown mode)"); 7435ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu } 7445ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 7455ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu nsurf = gsurf->native; 7465ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu nmode = gscr->native_modes[idx]; 7475ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu } 7485ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu else { 7495ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (mode) 7505ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return _eglError(EGL_BAD_MATCH, "eglShowSurfaceMESA"); 7515ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 7525ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu /* disable the screen */ 7535ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu nsurf = NULL; 7545ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu nmode = NULL; 7555ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu } 7565ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 7575ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu /* TODO surface panning by CRTC choosing */ 7585ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu changed = gdpy->native->modeset->program(gdpy->native, 0, nsurf, 7595ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu gscr->base.OriginX, gscr->base.OriginY, &gscr->native, 1, nmode); 7605ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (changed) { 7615ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu gscr->base.CurrentSurface = &gsurf->base; 7625ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu gscr->base.CurrentMode = mode; 7635ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu } 7645ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 7655ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return changed; 7665ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu} 7675ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 7685ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu#endif /* EGL_MESA_screen_surface */ 7695ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 7705ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu/** 7715ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu * Find a config that supports the pixmap. 7725ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu */ 7735ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu_EGLConfig * 7745ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wuegl_g3d_find_pixmap_config(_EGLDisplay *dpy, EGLNativePixmapType pix) 7755ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu{ 7765ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu struct egl_g3d_display *gdpy = egl_g3d_display(dpy); 7775ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu struct egl_g3d_config *gconf; 7785ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu EGLint i; 7795ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 7806717a313f26e42a7864f46f499637462a7cc3d57Chia-I Wu for (i = 0; i < dpy->Configs->Size; i++) { 7816717a313f26e42a7864f46f499637462a7cc3d57Chia-I Wu gconf = egl_g3d_config((_EGLConfig *) dpy->Configs->Elements[i]); 7825ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (gdpy->native->is_pixmap_supported(gdpy->native, pix, gconf->native)) 7835ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu break; 7845ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu } 7855ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 7866717a313f26e42a7864f46f499637462a7cc3d57Chia-I Wu return (i < dpy->Configs->Size) ? &gconf->base : NULL; 7875ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu} 7885ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 7895ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wuvoid 7905ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wuegl_g3d_init_driver_api(_EGLDriver *drv) 7915ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu{ 7925ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu _eglInitDriverFallbacks(drv); 7935ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 7945ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu drv->API.CreateContext = egl_g3d_create_context; 7955ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu drv->API.DestroyContext = egl_g3d_destroy_context; 7965ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu drv->API.CreateWindowSurface = egl_g3d_create_window_surface; 7975ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu drv->API.CreatePixmapSurface = egl_g3d_create_pixmap_surface; 7985ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu drv->API.CreatePbufferSurface = egl_g3d_create_pbuffer_surface; 799a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu drv->API.CreatePbufferFromClientBuffer = egl_g3d_create_pbuffer_from_client_buffer; 8005ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu drv->API.DestroySurface = egl_g3d_destroy_surface; 8015ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu drv->API.MakeCurrent = egl_g3d_make_current; 8025ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu drv->API.SwapBuffers = egl_g3d_swap_buffers; 8035ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu drv->API.CopyBuffers = egl_g3d_copy_buffers; 8045ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu drv->API.WaitClient = egl_g3d_wait_client; 8055ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu drv->API.WaitNative = egl_g3d_wait_native; 8065ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 8075ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu drv->API.BindTexImage = egl_g3d_bind_tex_image; 8085ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu drv->API.ReleaseTexImage = egl_g3d_release_tex_image; 8095ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 8105ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu drv->API.CreateImageKHR = egl_g3d_create_image; 8115ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu drv->API.DestroyImageKHR = egl_g3d_destroy_image; 8124f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu#ifdef EGL_MESA_drm_image 8134f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu drv->API.CreateDRMImageMESA = egl_g3d_create_drm_image; 8144f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu drv->API.ExportDRMImageMESA = egl_g3d_export_drm_image; 8154f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu#endif 8165ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 8174b2495661f3a5ac8ed07b68c5d5bf90adee2c37dChia-I Wu#ifdef EGL_KHR_reusable_sync 8184b2495661f3a5ac8ed07b68c5d5bf90adee2c37dChia-I Wu drv->API.CreateSyncKHR = egl_g3d_create_sync; 8194b2495661f3a5ac8ed07b68c5d5bf90adee2c37dChia-I Wu drv->API.DestroySyncKHR = egl_g3d_destroy_sync; 8204b2495661f3a5ac8ed07b68c5d5bf90adee2c37dChia-I Wu drv->API.ClientWaitSyncKHR = egl_g3d_client_wait_sync; 8214b2495661f3a5ac8ed07b68c5d5bf90adee2c37dChia-I Wu drv->API.SignalSyncKHR = egl_g3d_signal_sync; 8224b2495661f3a5ac8ed07b68c5d5bf90adee2c37dChia-I Wu#endif 8234b2495661f3a5ac8ed07b68c5d5bf90adee2c37dChia-I Wu 8245ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu#ifdef EGL_MESA_screen_surface 8255ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu drv->API.CreateScreenSurfaceMESA = egl_g3d_create_screen_surface; 8265ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu drv->API.ShowScreenSurfaceMESA = egl_g3d_show_screen_surface; 8275ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu#endif 8285ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu} 829