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" 334c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger#include "util/u_box.h" 345ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 355ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu#include "egl_g3d.h" 365ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu#include "egl_g3d_api.h" 375ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu#include "egl_g3d_image.h" 384b2495661f3a5ac8ed07b68c5d5bf90adee2c37dChia-I Wu#include "egl_g3d_sync.h" 395ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu#include "egl_g3d_st.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 * 464531356817ec8383ac35932903773de67af92e37Chia-I Wuegl_g3d_choose_st(_EGLDriver *drv, _EGLContext *ctx, 474531356817ec8383ac35932903773de67af92e37Chia-I Wu enum st_profile_type *profile) 485ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu{ 49948e3fa27ca9112b903a180d1a18c61cfb2928dcChia-I Wu struct st_api *stapi; 50948e3fa27ca9112b903a180d1a18c61cfb2928dcChia-I Wu EGLint api = -1; 51948e3fa27ca9112b903a180d1a18c61cfb2928dcChia-I Wu 52948e3fa27ca9112b903a180d1a18c61cfb2928dcChia-I Wu *profile = ST_PROFILE_DEFAULT; 535ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 545ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu switch (ctx->ClientAPI) { 555ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu case EGL_OPENGL_ES_API: 56538085c5d423df4fed3c3b2c473c3684f7b08db6Michel Dänzer switch (ctx->ClientMajorVersion) { 575ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu case 1: 58948e3fa27ca9112b903a180d1a18c61cfb2928dcChia-I Wu api = ST_API_OPENGL; 59948e3fa27ca9112b903a180d1a18c61cfb2928dcChia-I Wu *profile = ST_PROFILE_OPENGL_ES1; 605ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu break; 615ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu case 2: 62948e3fa27ca9112b903a180d1a18c61cfb2928dcChia-I Wu api = ST_API_OPENGL; 63948e3fa27ca9112b903a180d1a18c61cfb2928dcChia-I Wu *profile = ST_PROFILE_OPENGL_ES2; 645ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu break; 655ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu default: 66538085c5d423df4fed3c3b2c473c3684f7b08db6Michel Dänzer _eglLog(_EGL_WARNING, "unknown client major version %d", 67538085c5d423df4fed3c3b2c473c3684f7b08db6Michel Dänzer ctx->ClientMajorVersion); 685ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu break; 695ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu } 705ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu break; 715ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu case EGL_OPENVG_API: 72948e3fa27ca9112b903a180d1a18c61cfb2928dcChia-I Wu api = ST_API_OPENVG; 735ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu break; 745ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu case EGL_OPENGL_API: 75948e3fa27ca9112b903a180d1a18c61cfb2928dcChia-I Wu api = ST_API_OPENGL; 765ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu break; 775ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu default: 785ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu _eglLog(_EGL_WARNING, "unknown client API 0x%04x", ctx->ClientAPI); 795ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu break; 805ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu } 815ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 82cb29ee91a27054714e589cf29ecf5025b7140813Chia-I Wu stapi = egl_g3d_get_st_api(drv, api); 83948e3fa27ca9112b903a180d1a18c61cfb2928dcChia-I Wu if (stapi && !(stapi->profile_mask & (1 << *profile))) 84948e3fa27ca9112b903a180d1a18c61cfb2928dcChia-I Wu stapi = NULL; 854531356817ec8383ac35932903773de67af92e37Chia-I Wu 86948e3fa27ca9112b903a180d1a18c61cfb2928dcChia-I Wu return stapi; 875ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu} 885ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 89a0ad339915d8b5fdbebe82678fc81cbf1ec6682bChia-I Wustruct egl_g3d_choose_config_data { 90a0ad339915d8b5fdbebe82678fc81cbf1ec6682bChia-I Wu _EGLConfig criteria; 91a0ad339915d8b5fdbebe82678fc81cbf1ec6682bChia-I Wu enum pipe_format format; 92a0ad339915d8b5fdbebe82678fc81cbf1ec6682bChia-I Wu}; 93a0ad339915d8b5fdbebe82678fc81cbf1ec6682bChia-I Wu 9404ae53ca8a844fbb2764b6ecb942b68a6db850e7Chia-I Wustatic int 9504ae53ca8a844fbb2764b6ecb942b68a6db850e7Chia-I Wuegl_g3d_compare_config(const _EGLConfig *conf1, const _EGLConfig *conf2, 9604ae53ca8a844fbb2764b6ecb942b68a6db850e7Chia-I Wu void *priv_data) 9704ae53ca8a844fbb2764b6ecb942b68a6db850e7Chia-I Wu{ 98a0ad339915d8b5fdbebe82678fc81cbf1ec6682bChia-I Wu struct egl_g3d_choose_config_data *data = 99a0ad339915d8b5fdbebe82678fc81cbf1ec6682bChia-I Wu (struct egl_g3d_choose_config_data *) priv_data; 100a0ad339915d8b5fdbebe82678fc81cbf1ec6682bChia-I Wu const _EGLConfig *criteria = &data->criteria;; 10104ae53ca8a844fbb2764b6ecb942b68a6db850e7Chia-I Wu 10204ae53ca8a844fbb2764b6ecb942b68a6db850e7Chia-I Wu /* EGL_NATIVE_VISUAL_TYPE ignored? */ 10304ae53ca8a844fbb2764b6ecb942b68a6db850e7Chia-I Wu return _eglCompareConfigs(conf1, conf2, criteria, EGL_TRUE); 10404ae53ca8a844fbb2764b6ecb942b68a6db850e7Chia-I Wu} 10504ae53ca8a844fbb2764b6ecb942b68a6db850e7Chia-I Wu 10604ae53ca8a844fbb2764b6ecb942b68a6db850e7Chia-I Wustatic EGLBoolean 10731520548b763947da6b70b6debe38820835c5bccChia-I Wuegl_g3d_match_config(const _EGLConfig *conf, void *priv_data) 10804ae53ca8a844fbb2764b6ecb942b68a6db850e7Chia-I Wu{ 109a0ad339915d8b5fdbebe82678fc81cbf1ec6682bChia-I Wu struct egl_g3d_choose_config_data *data = 110a0ad339915d8b5fdbebe82678fc81cbf1ec6682bChia-I Wu (struct egl_g3d_choose_config_data *) priv_data; 111a0ad339915d8b5fdbebe82678fc81cbf1ec6682bChia-I Wu struct egl_g3d_config *gconf = egl_g3d_config(conf); 11231520548b763947da6b70b6debe38820835c5bccChia-I Wu 113a0ad339915d8b5fdbebe82678fc81cbf1ec6682bChia-I Wu if (data->format != PIPE_FORMAT_NONE && 114a0ad339915d8b5fdbebe82678fc81cbf1ec6682bChia-I Wu data->format != gconf->native->color_format) 11504ae53ca8a844fbb2764b6ecb942b68a6db850e7Chia-I Wu return EGL_FALSE; 11604ae53ca8a844fbb2764b6ecb942b68a6db850e7Chia-I Wu 117a0ad339915d8b5fdbebe82678fc81cbf1ec6682bChia-I Wu return _eglMatchConfig(conf, &data->criteria); 11804ae53ca8a844fbb2764b6ecb942b68a6db850e7Chia-I Wu} 11904ae53ca8a844fbb2764b6ecb942b68a6db850e7Chia-I Wu 12004ae53ca8a844fbb2764b6ecb942b68a6db850e7Chia-I Wustatic EGLBoolean 12104ae53ca8a844fbb2764b6ecb942b68a6db850e7Chia-I Wuegl_g3d_choose_config(_EGLDriver *drv, _EGLDisplay *dpy, const EGLint *attribs, 12204ae53ca8a844fbb2764b6ecb942b68a6db850e7Chia-I Wu EGLConfig *configs, EGLint size, EGLint *num_configs) 12304ae53ca8a844fbb2764b6ecb942b68a6db850e7Chia-I Wu{ 124a0ad339915d8b5fdbebe82678fc81cbf1ec6682bChia-I Wu struct egl_g3d_choose_config_data data; 12504ae53ca8a844fbb2764b6ecb942b68a6db850e7Chia-I Wu 126a0ad339915d8b5fdbebe82678fc81cbf1ec6682bChia-I Wu if (!_eglParseConfigAttribList(&data.criteria, dpy, attribs)) 12704ae53ca8a844fbb2764b6ecb942b68a6db850e7Chia-I Wu return _eglError(EGL_BAD_ATTRIBUTE, "eglChooseConfig"); 12804ae53ca8a844fbb2764b6ecb942b68a6db850e7Chia-I Wu 129a0ad339915d8b5fdbebe82678fc81cbf1ec6682bChia-I Wu data.format = PIPE_FORMAT_NONE; 130a0ad339915d8b5fdbebe82678fc81cbf1ec6682bChia-I Wu if (data.criteria.MatchNativePixmap != EGL_NONE && 131a0ad339915d8b5fdbebe82678fc81cbf1ec6682bChia-I Wu data.criteria.MatchNativePixmap != EGL_DONT_CARE) { 132a0ad339915d8b5fdbebe82678fc81cbf1ec6682bChia-I Wu struct egl_g3d_display *gdpy = egl_g3d_display(dpy); 133a0ad339915d8b5fdbebe82678fc81cbf1ec6682bChia-I Wu 134a0ad339915d8b5fdbebe82678fc81cbf1ec6682bChia-I Wu if (!gdpy->native->get_pixmap_format(gdpy->native, 135a0ad339915d8b5fdbebe82678fc81cbf1ec6682bChia-I Wu (EGLNativePixmapType) data.criteria.MatchNativePixmap, 136a0ad339915d8b5fdbebe82678fc81cbf1ec6682bChia-I Wu &data.format)) 137a0ad339915d8b5fdbebe82678fc81cbf1ec6682bChia-I Wu return _eglError(EGL_BAD_NATIVE_PIXMAP, "eglChooseConfig"); 138a0ad339915d8b5fdbebe82678fc81cbf1ec6682bChia-I Wu } 139a0ad339915d8b5fdbebe82678fc81cbf1ec6682bChia-I Wu 14031520548b763947da6b70b6debe38820835c5bccChia-I Wu return _eglFilterConfigArray(dpy->Configs, configs, size, num_configs, 141a0ad339915d8b5fdbebe82678fc81cbf1ec6682bChia-I Wu egl_g3d_match_config, egl_g3d_compare_config, &data); 14204ae53ca8a844fbb2764b6ecb942b68a6db850e7Chia-I Wu} 14304ae53ca8a844fbb2764b6ecb942b68a6db850e7Chia-I Wu 1445ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wustatic _EGLContext * 1455ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wuegl_g3d_create_context(_EGLDriver *drv, _EGLDisplay *dpy, _EGLConfig *conf, 1465ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu _EGLContext *share, const EGLint *attribs) 1475ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu{ 1485ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu struct egl_g3d_display *gdpy = egl_g3d_display(dpy); 1495ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu struct egl_g3d_context *gshare = egl_g3d_context(share); 1505ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu struct egl_g3d_config *gconf = egl_g3d_config(conf); 1515ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu struct egl_g3d_context *gctx; 1524531356817ec8383ac35932903773de67af92e37Chia-I Wu struct st_context_attribs stattribs; 1533258cd9e611bb188e4b21d23cd5dd6cb0c0ff1efAlexandre Demers enum st_context_error ctx_err = 0; 1545ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 1555ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu gctx = CALLOC_STRUCT(egl_g3d_context); 1565ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (!gctx) { 1575ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu _eglError(EGL_BAD_ALLOC, "eglCreateContext"); 1585ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return NULL; 1595ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu } 1605ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 1615ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (!_eglInitContext(&gctx->base, dpy, conf, attribs)) { 162870a9d643b1f256e6a379d96a325284dd2f7eeeaChia-I Wu FREE(gctx); 1635ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return NULL; 1645ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu } 1655ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 1664531356817ec8383ac35932903773de67af92e37Chia-I Wu memset(&stattribs, 0, sizeof(stattribs)); 1674531356817ec8383ac35932903773de67af92e37Chia-I Wu if (gconf) 1684531356817ec8383ac35932903773de67af92e37Chia-I Wu stattribs.visual = gconf->stvis; 1694531356817ec8383ac35932903773de67af92e37Chia-I Wu 1704531356817ec8383ac35932903773de67af92e37Chia-I Wu gctx->stapi = egl_g3d_choose_st(drv, &gctx->base, &stattribs.profile); 1715ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (!gctx->stapi) { 172870a9d643b1f256e6a379d96a325284dd2f7eeeaChia-I Wu FREE(gctx); 1735ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return NULL; 1745ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu } 1755ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 1763258cd9e611bb188e4b21d23cd5dd6cb0c0ff1efAlexandre Demers gctx->stctxi = gctx->stapi->create_context(gctx->stapi, gdpy->smapi, 1773258cd9e611bb188e4b21d23cd5dd6cb0c0ff1efAlexandre Demers &stattribs, &ctx_err, (gshare) ? gshare->stctxi : NULL); 1785ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (!gctx->stctxi) { 179870a9d643b1f256e6a379d96a325284dd2f7eeeaChia-I Wu FREE(gctx); 1805ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return NULL; 1815ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu } 1825ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 1835ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu gctx->stctxi->st_manager_private = (void *) &gctx->base; 1845ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 1855ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return &gctx->base; 1865ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu} 1875ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 1885ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu/** 1895ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu * Destroy a context. 1905ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu */ 1915ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wustatic void 1925ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wudestroy_context(_EGLDisplay *dpy, _EGLContext *ctx) 1935ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu{ 1945ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu struct egl_g3d_context *gctx = egl_g3d_context(ctx); 1955ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 1965ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu /* FIXME a context might live longer than its display */ 1975ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (!dpy->Initialized) 1985ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu _eglLog(_EGL_FATAL, "destroy a context with an unitialized display"); 1995ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 2005ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu gctx->stctxi->destroy(gctx->stctxi); 2015ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 202870a9d643b1f256e6a379d96a325284dd2f7eeeaChia-I Wu FREE(gctx); 2035ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu} 2045ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 2055ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wustatic EGLBoolean 2065ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wuegl_g3d_destroy_context(_EGLDriver *drv, _EGLDisplay *dpy, _EGLContext *ctx) 2075ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu{ 208d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu if (_eglPutContext(ctx)) 2095ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu destroy_context(dpy, ctx); 2105ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return EGL_TRUE; 2115ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu} 2125ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 2135ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wustruct egl_g3d_create_surface_arg { 2145ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu EGLint type; 2155ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu union { 2165ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu EGLNativeWindowType win; 2175ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu EGLNativePixmapType pix; 2185ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu } u; 2195ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu}; 2205ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 2215ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wustatic _EGLSurface * 2225ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wuegl_g3d_create_surface(_EGLDriver *drv, _EGLDisplay *dpy, _EGLConfig *conf, 2235ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu struct egl_g3d_create_surface_arg *arg, 2245ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu const EGLint *attribs) 2255ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu{ 2265ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu struct egl_g3d_display *gdpy = egl_g3d_display(dpy); 2275ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu struct egl_g3d_config *gconf = egl_g3d_config(conf); 2285ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu struct egl_g3d_surface *gsurf; 2295ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu struct native_surface *nsurf; 2305ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu const char *err; 2315ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 2325ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu switch (arg->type) { 2335ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu case EGL_WINDOW_BIT: 2345ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu err = "eglCreateWindowSurface"; 2355ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu break; 2365ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu case EGL_PIXMAP_BIT: 2375ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu err = "eglCreatePixmapSurface"; 2385ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu break; 2395ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu#ifdef EGL_MESA_screen_surface 2405ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu case EGL_SCREEN_BIT_MESA: 2415ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu err = "eglCreateScreenSurface"; 2425ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu break; 2435ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu#endif 2445ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu default: 2455ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu err = "eglCreateUnknownSurface"; 2465ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu break; 2475ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu } 2485ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 2495ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu gsurf = CALLOC_STRUCT(egl_g3d_surface); 2505ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (!gsurf) { 2515ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu _eglError(EGL_BAD_ALLOC, err); 2525ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return NULL; 2535ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu } 2545ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 2555ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (!_eglInitSurface(&gsurf->base, dpy, arg->type, conf, attribs)) { 256870a9d643b1f256e6a379d96a325284dd2f7eeeaChia-I Wu FREE(gsurf); 2575ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return NULL; 2585ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu } 2595ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 2605ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu /* create the native surface */ 2615ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu switch (arg->type) { 2625ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu case EGL_WINDOW_BIT: 2635ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu nsurf = gdpy->native->create_window_surface(gdpy->native, 2645ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu arg->u.win, gconf->native); 2655ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu break; 2665ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu case EGL_PIXMAP_BIT: 2675ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu nsurf = gdpy->native->create_pixmap_surface(gdpy->native, 2685ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu arg->u.pix, gconf->native); 2695ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu break; 2705ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu#ifdef EGL_MESA_screen_surface 2715ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu case EGL_SCREEN_BIT_MESA: 2725ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu /* prefer back buffer (move to _eglInitSurface?) */ 2735ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu gsurf->base.RenderBuffer = EGL_BACK_BUFFER; 2745ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu nsurf = gdpy->native->modeset->create_scanout_surface(gdpy->native, 2755ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu gconf->native, gsurf->base.Width, gsurf->base.Height); 2765ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu break; 2775ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu#endif 2785ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu default: 2795ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu nsurf = NULL; 2805ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu break; 2815ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu } 2825ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 2835ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (!nsurf) { 284870a9d643b1f256e6a379d96a325284dd2f7eeeaChia-I Wu FREE(gsurf); 2855ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return NULL; 2865ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu } 2875ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu /* initialize the geometry */ 2885ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (!nsurf->validate(nsurf, 0x0, &gsurf->sequence_number, NULL, 2895ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu &gsurf->base.Width, &gsurf->base.Height)) { 2905ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu nsurf->destroy(nsurf); 291870a9d643b1f256e6a379d96a325284dd2f7eeeaChia-I Wu FREE(gsurf); 2925ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return NULL; 2935ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu } 2945ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 2955ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu gsurf->stvis = gconf->stvis; 2960fb2dcc98ff46299094c308b7b4e0cde9e38d5c0Chia-I Wu if (gsurf->base.RenderBuffer == EGL_SINGLE_BUFFER && 2970fb2dcc98ff46299094c308b7b4e0cde9e38d5c0Chia-I Wu gconf->stvis.buffer_mask & ST_ATTACHMENT_FRONT_LEFT_MASK) 2985ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu gsurf->stvis.render_buffer = ST_ATTACHMENT_FRONT_LEFT; 2995ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 300249c6f1934d1d0a6215d02ef6b8a7e9585dfe955Chia-I Wu /* surfaces can always be posted when the display supports it */ 301249c6f1934d1d0a6215d02ef6b8a7e9585dfe955Chia-I Wu if (dpy->Extensions.NV_post_sub_buffer) 302249c6f1934d1d0a6215d02ef6b8a7e9585dfe955Chia-I Wu gsurf->base.PostSubBufferSupportedNV = EGL_TRUE; 30375772842133d101223ca31400e100b83476f327bFredrik Höglund 3045ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu gsurf->stfbi = egl_g3d_create_st_framebuffer(&gsurf->base); 3055ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (!gsurf->stfbi) { 3065ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu nsurf->destroy(nsurf); 307870a9d643b1f256e6a379d96a325284dd2f7eeeaChia-I Wu FREE(gsurf); 3085ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return NULL; 3095ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu } 3105ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 3115ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu nsurf->user_data = &gsurf->base; 3125ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu gsurf->native = nsurf; 3135ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 3145ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return &gsurf->base; 3155ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu} 3165ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 3175ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wustatic _EGLSurface * 3185ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wuegl_g3d_create_window_surface(_EGLDriver *drv, _EGLDisplay *dpy, 3195ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu _EGLConfig *conf, EGLNativeWindowType win, 3205ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu const EGLint *attribs) 3215ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu{ 3225ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu struct egl_g3d_create_surface_arg arg; 3235ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 3245ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu memset(&arg, 0, sizeof(arg)); 3255ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu arg.type = EGL_WINDOW_BIT; 3265ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu arg.u.win = win; 3275ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 3285ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return egl_g3d_create_surface(drv, dpy, conf, &arg, attribs); 3295ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu} 3305ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 3315ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wustatic _EGLSurface * 3325ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wuegl_g3d_create_pixmap_surface(_EGLDriver *drv, _EGLDisplay *dpy, 3335ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu _EGLConfig *conf, EGLNativePixmapType pix, 3345ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu const EGLint *attribs) 3355ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu{ 3365ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu struct egl_g3d_create_surface_arg arg; 3375ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 3385ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu memset(&arg, 0, sizeof(arg)); 3395ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu arg.type = EGL_PIXMAP_BIT; 3405ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu arg.u.pix = pix; 3415ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 3425ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return egl_g3d_create_surface(drv, dpy, conf, &arg, attribs); 3435ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu} 3445ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 345a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wustatic struct egl_g3d_surface * 346a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wucreate_pbuffer_surface(_EGLDisplay *dpy, _EGLConfig *conf, 347a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu const EGLint *attribs, const char *func) 3485ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu{ 3495ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu struct egl_g3d_config *gconf = egl_g3d_config(conf); 3505ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu struct egl_g3d_surface *gsurf; 3515ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 3525ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu gsurf = CALLOC_STRUCT(egl_g3d_surface); 3535ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (!gsurf) { 354a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu _eglError(EGL_BAD_ALLOC, func); 3555ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return NULL; 3565ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu } 3575ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 3585ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (!_eglInitSurface(&gsurf->base, dpy, EGL_PBUFFER_BIT, conf, attribs)) { 359870a9d643b1f256e6a379d96a325284dd2f7eeeaChia-I Wu FREE(gsurf); 3605ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return NULL; 3615ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu } 3625ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 3635ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu gsurf->stvis = gconf->stvis; 3645ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 3655ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu gsurf->stfbi = egl_g3d_create_st_framebuffer(&gsurf->base); 3665ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (!gsurf->stfbi) { 367870a9d643b1f256e6a379d96a325284dd2f7eeeaChia-I Wu FREE(gsurf); 3685ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return NULL; 3695ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu } 3705ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 371a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu return gsurf; 372a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu} 373a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu 374a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wustatic _EGLSurface * 375a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wuegl_g3d_create_pbuffer_surface(_EGLDriver *drv, _EGLDisplay *dpy, 376a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu _EGLConfig *conf, const EGLint *attribs) 377a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu{ 378a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu struct egl_g3d_surface *gsurf; 379a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu 380a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu gsurf = create_pbuffer_surface(dpy, conf, attribs, 381a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu "eglCreatePbufferSurface"); 382a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu if (!gsurf) 383a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu return NULL; 384a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu 385a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu gsurf->client_buffer_type = EGL_NONE; 386a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu 387a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu return &gsurf->base; 388a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu} 389a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu 390a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wustatic _EGLSurface * 391a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wuegl_g3d_create_pbuffer_from_client_buffer(_EGLDriver *drv, _EGLDisplay *dpy, 392a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu EGLenum buftype, 393a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu EGLClientBuffer buffer, 394a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu _EGLConfig *conf, 395a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu const EGLint *attribs) 396a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu{ 397a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu struct egl_g3d_surface *gsurf; 398a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu struct pipe_resource *ptex = NULL; 399a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu EGLint pbuffer_attribs[32]; 400a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu EGLint count, i; 401a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu 402a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu switch (buftype) { 403a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu case EGL_OPENVG_IMAGE: 404a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu break; 405a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu default: 406a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu _eglError(EGL_BAD_PARAMETER, "eglCreatePbufferFromClientBuffer"); 407a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu return NULL; 408a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu break; 409a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu } 410a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu 411a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu /* parse the attributes first */ 412a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu count = 0; 413a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu for (i = 0; attribs && attribs[i] != EGL_NONE; i++) { 414a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu EGLint attr = attribs[i++]; 415a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu EGLint val = attribs[i]; 416a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu EGLint err = EGL_SUCCESS; 417a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu 418a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu switch (attr) { 419a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu case EGL_TEXTURE_FORMAT: 420a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu case EGL_TEXTURE_TARGET: 421a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu case EGL_MIPMAP_TEXTURE: 422a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu pbuffer_attribs[count++] = attr; 423a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu pbuffer_attribs[count++] = val; 424a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu break; 425a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu default: 426a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu err = EGL_BAD_ATTRIBUTE; 427a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu break; 428a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu } 429a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu /* bail out */ 430a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu if (err != EGL_SUCCESS) { 431a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu _eglError(err, "eglCreatePbufferFromClientBuffer"); 432a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu return NULL; 433a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu } 434a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu } 435a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu 436a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu pbuffer_attribs[count++] = EGL_NONE; 437a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu 438a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu gsurf = create_pbuffer_surface(dpy, conf, pbuffer_attribs, 439a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu "eglCreatePbufferFromClientBuffer"); 440a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu if (!gsurf) 441a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu return NULL; 442a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu 443a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu gsurf->client_buffer_type = buftype; 444a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu gsurf->client_buffer = buffer; 445a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu 44618bc427adecd7ecd728adc03ed73bb07878c0e8fChia-I Wu /* validate now so that it fails if the client buffer is invalid */ 447a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu if (!gsurf->stfbi->validate(gsurf->stfbi, 448a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu &gsurf->stvis.render_buffer, 1, &ptex)) { 449a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu egl_g3d_destroy_st_framebuffer(gsurf->stfbi); 450a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu FREE(gsurf); 451a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu return NULL; 452a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu } 45318bc427adecd7ecd728adc03ed73bb07878c0e8fChia-I Wu pipe_resource_reference(&ptex, NULL); 454a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu 4555ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return &gsurf->base; 4565ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu} 4575ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 4585ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu/** 4595ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu * Destroy a surface. 4605ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu */ 4615ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wustatic void 4625ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wudestroy_surface(_EGLDisplay *dpy, _EGLSurface *surf) 4635ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu{ 4645ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu struct egl_g3d_surface *gsurf = egl_g3d_surface(surf); 4655ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 4665ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu /* FIXME a surface might live longer than its display */ 4675ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (!dpy->Initialized) 4685ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu _eglLog(_EGL_FATAL, "destroy a surface with an unitialized display"); 4695ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 4705ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu pipe_resource_reference(&gsurf->render_texture, NULL); 4715ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu egl_g3d_destroy_st_framebuffer(gsurf->stfbi); 4725ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (gsurf->native) 4735ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu gsurf->native->destroy(gsurf->native); 474870a9d643b1f256e6a379d96a325284dd2f7eeeaChia-I Wu FREE(gsurf); 4755ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu} 4765ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 4775ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wustatic EGLBoolean 4785ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wuegl_g3d_destroy_surface(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf) 4795ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu{ 480d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu if (_eglPutSurface(surf)) 4815ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu destroy_surface(dpy, surf); 4825ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return EGL_TRUE; 4835ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu} 4845ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 4855ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wustatic EGLBoolean 4865ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wuegl_g3d_make_current(_EGLDriver *drv, _EGLDisplay *dpy, 4875ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu _EGLSurface *draw, _EGLSurface *read, _EGLContext *ctx) 4885ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu{ 4895ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu struct egl_g3d_context *gctx = egl_g3d_context(ctx); 4905ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu struct egl_g3d_surface *gdraw = egl_g3d_surface(draw); 4915ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu struct egl_g3d_surface *gread = egl_g3d_surface(read); 4925ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu struct egl_g3d_context *old_gctx; 493d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu _EGLContext *old_ctx; 494d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu _EGLSurface *old_draw, *old_read; 4955ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu EGLBoolean ok = EGL_TRUE; 4965ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 497d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu /* make new bindings */ 498d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu if (!_eglBindContext(ctx, draw, read, &old_ctx, &old_draw, &old_read)) 4995ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return EGL_FALSE; 5005ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 501d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu old_gctx = egl_g3d_context(old_ctx); 5025ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (old_gctx) { 5035ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu /* flush old context */ 5047e02303497237cde958c28608477d0c355a8038bMarek Olšák old_gctx->stctxi->flush(old_gctx->stctxi, ST_FLUSH_FRONT, NULL); 5055ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu } 5065ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 5075ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (gctx) { 5085ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu ok = gctx->stapi->make_current(gctx->stapi, gctx->stctxi, 5095ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu (gdraw) ? gdraw->stfbi : NULL, (gread) ? gread->stfbi : NULL); 5105ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (ok) { 5119b6a63a0e2271b0b28c89b22c8981ef8f73205c8Chia-I Wu if (gdraw) { 5129b6a63a0e2271b0b28c89b22c8981ef8f73205c8Chia-I Wu if (gdraw->base.Type == EGL_WINDOW_BIT) { 5139b6a63a0e2271b0b28c89b22c8981ef8f73205c8Chia-I Wu gctx->base.WindowRenderBuffer = 5149b6a63a0e2271b0b28c89b22c8981ef8f73205c8Chia-I Wu (gdraw->stvis.render_buffer == ST_ATTACHMENT_FRONT_LEFT) ? 5159b6a63a0e2271b0b28c89b22c8981ef8f73205c8Chia-I Wu EGL_SINGLE_BUFFER : EGL_BACK_BUFFER; 5169b6a63a0e2271b0b28c89b22c8981ef8f73205c8Chia-I Wu } 5179b6a63a0e2271b0b28c89b22c8981ef8f73205c8Chia-I Wu } 5185ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu } 5195ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu } 5205ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu else if (old_gctx) { 5215ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu ok = old_gctx->stapi->make_current(old_gctx->stapi, NULL, NULL, NULL); 522d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu if (ok) 523d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu old_gctx->base.WindowRenderBuffer = EGL_NONE; 5245ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu } 5255ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 526d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu if (ok) { 527d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu if (_eglPutContext(old_ctx)) 528d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu destroy_context(dpy, old_ctx); 529d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu if (_eglPutSurface(old_draw)) 530d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu destroy_surface(dpy, old_draw); 531d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu if (_eglPutSurface(old_read)) 532d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu destroy_surface(dpy, old_read); 533d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu } 534d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu else { 535d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu /* undo the previous _eglBindContext */ 536d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu _eglBindContext(old_ctx, old_draw, old_read, &ctx, &draw, &read); 537d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu assert(&gctx->base == ctx && 538d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu &gdraw->base == draw && 539d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu &gread->base == read); 540d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu 541d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu _eglPutSurface(draw); 542d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu _eglPutSurface(read); 543d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu _eglPutContext(ctx); 544d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu 545d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu _eglPutSurface(old_draw); 546d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu _eglPutSurface(old_read); 547d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu _eglPutContext(old_ctx); 548d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu } 5495ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 5505ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return ok; 5515ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu} 5525ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 5535ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wustatic EGLBoolean 554fa0f70e45ed1b69c0e72588a061bc30fd9ad371eFredrik Höglundswap_buffers(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf, 555fa0f70e45ed1b69c0e72588a061bc30fd9ad371eFredrik Höglund EGLint num_rects, const EGLint *rects, EGLBoolean preserve) 5565ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu{ 5575ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu struct egl_g3d_surface *gsurf = egl_g3d_surface(surf); 5585ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu _EGLContext *ctx = _eglGetCurrentContext(); 5595ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu struct egl_g3d_context *gctx = NULL; 56008e1076fd2d3f6fb879dd2529e7d035d6a399da2Chia-I Wu struct native_present_control ctrl; 5615ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 5625ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu /* no-op for pixmap or pbuffer surface */ 5635ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (gsurf->base.Type == EGL_PIXMAP_BIT || 5645ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu gsurf->base.Type == EGL_PBUFFER_BIT) 5655ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return EGL_TRUE; 5665ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 5675ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu /* or when the surface is single-buffered */ 5685ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (gsurf->stvis.render_buffer == ST_ATTACHMENT_FRONT_LEFT) 5695ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return EGL_TRUE; 5705ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 5715ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (ctx && ctx->DrawSurface == surf) 5725ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu gctx = egl_g3d_context(ctx); 5735ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 5745ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu /* flush if the surface is current */ 5755ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (gctx) { 5767e02303497237cde958c28608477d0c355a8038bMarek Olšák gctx->stctxi->flush(gctx->stctxi, ST_FLUSH_FRONT, NULL); 5775ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu } 5785ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 57908e1076fd2d3f6fb879dd2529e7d035d6a399da2Chia-I Wu memset(&ctrl, 0, sizeof(ctrl)); 58008e1076fd2d3f6fb879dd2529e7d035d6a399da2Chia-I Wu ctrl.natt = NATIVE_ATTACHMENT_BACK_LEFT; 581fa0f70e45ed1b69c0e72588a061bc30fd9ad371eFredrik Höglund ctrl.preserve = preserve; 58208e1076fd2d3f6fb879dd2529e7d035d6a399da2Chia-I Wu ctrl.swap_interval = gsurf->base.SwapInterval; 58341f5d2e8acbe3d6393f8012813609215534b5678Chia-I Wu ctrl.premultiplied_alpha = (gsurf->base.VGAlphaFormat == EGL_VG_ALPHA_FORMAT_PRE); 584fa0f70e45ed1b69c0e72588a061bc30fd9ad371eFredrik Höglund ctrl.num_rects = num_rects; 585fa0f70e45ed1b69c0e72588a061bc30fd9ad371eFredrik Höglund ctrl.rects = rects; 58608e1076fd2d3f6fb879dd2529e7d035d6a399da2Chia-I Wu 58708e1076fd2d3f6fb879dd2529e7d035d6a399da2Chia-I Wu return gsurf->native->present(gsurf->native, &ctrl); 5885ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu} 5895ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 5905ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wustatic EGLBoolean 591fa0f70e45ed1b69c0e72588a061bc30fd9ad371eFredrik Höglundegl_g3d_swap_buffers(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf) 592fa0f70e45ed1b69c0e72588a061bc30fd9ad371eFredrik Höglund{ 593fa0f70e45ed1b69c0e72588a061bc30fd9ad371eFredrik Höglund struct egl_g3d_surface *gsurf = egl_g3d_surface(surf); 594fa0f70e45ed1b69c0e72588a061bc30fd9ad371eFredrik Höglund 595fa0f70e45ed1b69c0e72588a061bc30fd9ad371eFredrik Höglund return swap_buffers(drv, dpy, surf, 0, NULL, 596fa0f70e45ed1b69c0e72588a061bc30fd9ad371eFredrik Höglund (gsurf->base.SwapBehavior == EGL_BUFFER_PRESERVED)); 597fa0f70e45ed1b69c0e72588a061bc30fd9ad371eFredrik Höglund} 598fa0f70e45ed1b69c0e72588a061bc30fd9ad371eFredrik Höglund 599fa0f70e45ed1b69c0e72588a061bc30fd9ad371eFredrik Höglund#ifdef EGL_NOK_swap_region 600fa0f70e45ed1b69c0e72588a061bc30fd9ad371eFredrik Höglundstatic EGLBoolean 601fa0f70e45ed1b69c0e72588a061bc30fd9ad371eFredrik Höglundegl_g3d_swap_buffers_region(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf, 602fa0f70e45ed1b69c0e72588a061bc30fd9ad371eFredrik Höglund EGLint num_rects, const EGLint *rects) 603fa0f70e45ed1b69c0e72588a061bc30fd9ad371eFredrik Höglund{ 604fa0f70e45ed1b69c0e72588a061bc30fd9ad371eFredrik Höglund /* Note: y=0=top */ 605fa0f70e45ed1b69c0e72588a061bc30fd9ad371eFredrik Höglund return swap_buffers(drv, dpy, surf, num_rects, rects, EGL_TRUE); 606fa0f70e45ed1b69c0e72588a061bc30fd9ad371eFredrik Höglund} 607fa0f70e45ed1b69c0e72588a061bc30fd9ad371eFredrik Höglund#endif /* EGL_NOK_swap_region */ 608fa0f70e45ed1b69c0e72588a061bc30fd9ad371eFredrik Höglund 609fa0f70e45ed1b69c0e72588a061bc30fd9ad371eFredrik Höglundstatic EGLBoolean 61075772842133d101223ca31400e100b83476f327bFredrik Höglundegl_g3d_post_sub_buffer(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf, 61175772842133d101223ca31400e100b83476f327bFredrik Höglund EGLint x, EGLint y, EGLint width, EGLint height) 61275772842133d101223ca31400e100b83476f327bFredrik Höglund{ 613249c6f1934d1d0a6215d02ef6b8a7e9585dfe955Chia-I Wu EGLint rect[4]; 614249c6f1934d1d0a6215d02ef6b8a7e9585dfe955Chia-I Wu 615249c6f1934d1d0a6215d02ef6b8a7e9585dfe955Chia-I Wu if (x < 0 || y < 0 || width < 0 || height < 0) 616249c6f1934d1d0a6215d02ef6b8a7e9585dfe955Chia-I Wu return _eglError(EGL_BAD_PARAMETER, "eglPostSubBufferNV"); 617249c6f1934d1d0a6215d02ef6b8a7e9585dfe955Chia-I Wu 618249c6f1934d1d0a6215d02ef6b8a7e9585dfe955Chia-I Wu /* clamp */ 619249c6f1934d1d0a6215d02ef6b8a7e9585dfe955Chia-I Wu if (x + width > surf->Width) 620249c6f1934d1d0a6215d02ef6b8a7e9585dfe955Chia-I Wu width = surf->Width - x; 621249c6f1934d1d0a6215d02ef6b8a7e9585dfe955Chia-I Wu if (y + height > surf->Height) 622249c6f1934d1d0a6215d02ef6b8a7e9585dfe955Chia-I Wu height = surf->Height - y; 623249c6f1934d1d0a6215d02ef6b8a7e9585dfe955Chia-I Wu 624249c6f1934d1d0a6215d02ef6b8a7e9585dfe955Chia-I Wu if (width <= 0 || height <= 0) 625249c6f1934d1d0a6215d02ef6b8a7e9585dfe955Chia-I Wu return EGL_TRUE; 626249c6f1934d1d0a6215d02ef6b8a7e9585dfe955Chia-I Wu 627249c6f1934d1d0a6215d02ef6b8a7e9585dfe955Chia-I Wu rect[0] = x; 62875772842133d101223ca31400e100b83476f327bFredrik Höglund /* Note: y=0=bottom */ 629249c6f1934d1d0a6215d02ef6b8a7e9585dfe955Chia-I Wu rect[1] = surf->Height - y - height; 630249c6f1934d1d0a6215d02ef6b8a7e9585dfe955Chia-I Wu rect[2] = width; 631249c6f1934d1d0a6215d02ef6b8a7e9585dfe955Chia-I Wu rect[3] = height; 63275772842133d101223ca31400e100b83476f327bFredrik Höglund 63375772842133d101223ca31400e100b83476f327bFredrik Höglund return swap_buffers(drv, dpy, surf, 1, rect, EGL_TRUE); 63475772842133d101223ca31400e100b83476f327bFredrik Höglund} 63575772842133d101223ca31400e100b83476f327bFredrik Höglund 63675772842133d101223ca31400e100b83476f327bFredrik Höglundstatic EGLBoolean 6375ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wuegl_g3d_copy_buffers(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf, 6385ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu EGLNativePixmapType target) 6395ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu{ 6405ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu struct egl_g3d_display *gdpy = egl_g3d_display(dpy); 6415ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu struct egl_g3d_surface *gsurf = egl_g3d_surface(surf); 6425ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu _EGLContext *ctx = _eglGetCurrentContext(); 6435ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 6445ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (!gsurf->render_texture) 6455ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return EGL_TRUE; 6465ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 6475ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu /* flush if the surface is current */ 6485ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (ctx && ctx->DrawSurface == &gsurf->base) { 6495ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu struct egl_g3d_context *gctx = egl_g3d_context(ctx); 6507e02303497237cde958c28608477d0c355a8038bMarek Olšák gctx->stctxi->flush(gctx->stctxi, ST_FLUSH_FRONT, NULL); 6515ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu } 6525ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 6537c4e9dcdceec1112c91206619fe8b0885be99a79Chia-I Wu return gdpy->native->copy_to_pixmap(gdpy->native, 6547c4e9dcdceec1112c91206619fe8b0885be99a79Chia-I Wu target, gsurf->render_texture); 6555ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu} 6565ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 6575ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wustatic EGLBoolean 6585ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wuegl_g3d_wait_client(_EGLDriver *drv, _EGLDisplay *dpy, _EGLContext *ctx) 6595ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu{ 6605ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu struct egl_g3d_display *gdpy = egl_g3d_display(dpy); 6615ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu struct egl_g3d_context *gctx = egl_g3d_context(ctx); 6625ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu struct pipe_screen *screen = gdpy->native->screen; 6635ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu struct pipe_fence_handle *fence = NULL; 6645ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 6657e02303497237cde958c28608477d0c355a8038bMarek Olšák gctx->stctxi->flush(gctx->stctxi, ST_FLUSH_FRONT, &fence); 666d6de1f44a0cdcc739d3b319b5f102e1733e5b4e3Chia-I Wu if (fence) { 667bfe88e69988b3d3bdff0b9f6051d0428e1315653Marek Olšák screen->fence_finish(screen, fence, PIPE_TIMEOUT_INFINITE); 668d6de1f44a0cdcc739d3b319b5f102e1733e5b4e3Chia-I Wu screen->fence_reference(screen, &fence, NULL); 669d6de1f44a0cdcc739d3b319b5f102e1733e5b4e3Chia-I Wu } 6705ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 6715ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return EGL_TRUE; 6725ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu} 6735ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 6745ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wustatic EGLBoolean 6755ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wuegl_g3d_wait_native(_EGLDriver *drv, _EGLDisplay *dpy, EGLint engine) 6765ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu{ 6775ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu _EGLContext *ctx = _eglGetCurrentContext(); 6785ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 6795ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (engine != EGL_CORE_NATIVE_ENGINE) 6805ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return _eglError(EGL_BAD_PARAMETER, "eglWaitNative"); 6815ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 6825ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (ctx && ctx->DrawSurface) { 6835ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu struct egl_g3d_surface *gsurf = egl_g3d_surface(ctx->DrawSurface); 6845ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 6855ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (gsurf->native) 6865ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu gsurf->native->wait(gsurf->native); 6875ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu } 6885ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 6895ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return EGL_TRUE; 6905ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu} 6915ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 6925ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wustatic EGLBoolean 6935ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wuegl_g3d_bind_tex_image(_EGLDriver *drv, _EGLDisplay *dpy, 6945ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu _EGLSurface *surf, EGLint buffer) 6955ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu{ 6965ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu struct egl_g3d_surface *gsurf = egl_g3d_surface(surf); 6975ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu _EGLContext *es1 = _eglGetAPIContext(EGL_OPENGL_ES_API); 6985ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu struct egl_g3d_context *gctx; 6995ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu enum pipe_format internal_format; 7005ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu enum st_texture_type target; 7015ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 7025ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (!gsurf || gsurf->base.Type != EGL_PBUFFER_BIT) 7035ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return _eglError(EGL_BAD_SURFACE, "eglBindTexImage"); 7045ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (buffer != EGL_BACK_BUFFER) 7055ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return _eglError(EGL_BAD_PARAMETER, "eglBindTexImage"); 7065ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (gsurf->base.BoundToTexture) 7075ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return _eglError(EGL_BAD_ACCESS, "eglBindTexImage"); 7085ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 7095ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu switch (gsurf->base.TextureFormat) { 7105ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu case EGL_TEXTURE_RGB: 7115ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu internal_format = PIPE_FORMAT_R8G8B8_UNORM; 7125ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu break; 7135ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu case EGL_TEXTURE_RGBA: 7145ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu internal_format = PIPE_FORMAT_B8G8R8A8_UNORM; 7155ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu break; 7165ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu default: 7175ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return _eglError(EGL_BAD_MATCH, "eglBindTexImage"); 7185ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu } 7195ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 7205ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu switch (gsurf->base.TextureTarget) { 7215ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu case EGL_TEXTURE_2D: 7225ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu target = ST_TEXTURE_2D; 7235ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu break; 7245ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu default: 7255ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return _eglError(EGL_BAD_MATCH, "eglBindTexImage"); 7265ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu } 7275ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 7285ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (!es1) 7295ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return EGL_TRUE; 7305ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (!gsurf->render_texture) 7315ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return EGL_FALSE; 7325ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 7335ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu /* flush properly if the surface is bound */ 7345ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (gsurf->base.CurrentContext) { 7355ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu gctx = egl_g3d_context(gsurf->base.CurrentContext); 7367e02303497237cde958c28608477d0c355a8038bMarek Olšák gctx->stctxi->flush(gctx->stctxi, ST_FLUSH_FRONT, NULL); 7375ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu } 7385ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 7395ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu gctx = egl_g3d_context(es1); 7405ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (gctx->stctxi->teximage) { 7415ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (!gctx->stctxi->teximage(gctx->stctxi, target, 7425ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu gsurf->base.MipmapLevel, internal_format, 7435ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu gsurf->render_texture, gsurf->base.MipmapTexture)) 7445ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return EGL_FALSE; 7455ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu gsurf->base.BoundToTexture = EGL_TRUE; 7465ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu } 7475ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 7485ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return EGL_TRUE; 7495ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu} 7505ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 7515ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wustatic EGLBoolean 7525ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wuegl_g3d_release_tex_image(_EGLDriver *drv, _EGLDisplay *dpy, 7535ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu _EGLSurface *surf, EGLint buffer) 7545ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu{ 7555ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu struct egl_g3d_surface *gsurf = egl_g3d_surface(surf); 7565ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 7575ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (!gsurf || gsurf->base.Type != EGL_PBUFFER_BIT || 7585ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu !gsurf->base.BoundToTexture) 7595ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return _eglError(EGL_BAD_SURFACE, "eglReleaseTexImage"); 7605ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (buffer != EGL_BACK_BUFFER) 7615ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return _eglError(EGL_BAD_PARAMETER, "eglReleaseTexImage"); 7625ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 7635ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (gsurf->render_texture) { 7645ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu _EGLContext *ctx = _eglGetAPIContext(EGL_OPENGL_ES_API); 7655ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu struct egl_g3d_context *gctx = egl_g3d_context(ctx); 7665ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 7675ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu /* what if the context the surface binds to is no longer current? */ 7685ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (gctx) { 7695ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu gctx->stctxi->teximage(gctx->stctxi, ST_TEXTURE_2D, 7705ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu gsurf->base.MipmapLevel, PIPE_FORMAT_NONE, NULL, FALSE); 7715ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu } 7725ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu } 7735ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 7745ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu gsurf->base.BoundToTexture = EGL_FALSE; 7755ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 7765ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return EGL_TRUE; 7775ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu} 7785ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 7795ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu#ifdef EGL_MESA_screen_surface 7805ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 7815ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wustatic _EGLSurface * 7825ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wuegl_g3d_create_screen_surface(_EGLDriver *drv, _EGLDisplay *dpy, 7835ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu _EGLConfig *conf, const EGLint *attribs) 7845ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu{ 7855ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu struct egl_g3d_create_surface_arg arg; 7865ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 7875ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu memset(&arg, 0, sizeof(arg)); 7885ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu arg.type = EGL_SCREEN_BIT_MESA; 7895ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 7905ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return egl_g3d_create_surface(drv, dpy, conf, &arg, attribs); 7915ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu} 7925ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 7935ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wustatic EGLBoolean 7945ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wuegl_g3d_show_screen_surface(_EGLDriver *drv, _EGLDisplay *dpy, 7955ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu _EGLScreen *scr, _EGLSurface *surf, 7965ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu _EGLMode *mode) 7975ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu{ 7985ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu struct egl_g3d_display *gdpy = egl_g3d_display(dpy); 7995ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu struct egl_g3d_screen *gscr = egl_g3d_screen(scr); 8005ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu struct egl_g3d_surface *gsurf = egl_g3d_surface(surf); 8015ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu struct native_surface *nsurf; 8025ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu const struct native_mode *nmode; 8035ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu EGLBoolean changed; 8045ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 8055ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (gsurf) { 8065ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu EGLint idx; 8075ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 8085ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (!mode) 8095ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return _eglError(EGL_BAD_MATCH, "eglShowSurfaceMESA"); 8105ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (gsurf->base.Type != EGL_SCREEN_BIT_MESA) 8115ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return _eglError(EGL_BAD_SURFACE, "eglShowScreenSurfaceMESA"); 8125ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (gsurf->base.Width < mode->Width || gsurf->base.Height < mode->Height) 8135ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return _eglError(EGL_BAD_MATCH, 8145ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu "eglShowSurfaceMESA(surface smaller than mode size)"); 8155ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 8165ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu /* find the index of the mode */ 8175ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu for (idx = 0; idx < gscr->base.NumModes; idx++) 8185ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (mode == &gscr->base.Modes[idx]) 8195ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu break; 8205ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (idx >= gscr->base.NumModes) { 8215ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return _eglError(EGL_BAD_MODE_MESA, 8225ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu "eglShowSurfaceMESA(unknown mode)"); 8235ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu } 8245ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 8255ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu nsurf = gsurf->native; 8265ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu nmode = gscr->native_modes[idx]; 8275ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu } 8285ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu else { 8295ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (mode) 8305ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return _eglError(EGL_BAD_MATCH, "eglShowSurfaceMESA"); 8315ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 8325ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu /* disable the screen */ 8335ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu nsurf = NULL; 8345ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu nmode = NULL; 8355ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu } 8365ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 8375ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu /* TODO surface panning by CRTC choosing */ 8385ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu changed = gdpy->native->modeset->program(gdpy->native, 0, nsurf, 8395ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu gscr->base.OriginX, gscr->base.OriginY, &gscr->native, 1, nmode); 8405ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu if (changed) { 8415ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu gscr->base.CurrentSurface = &gsurf->base; 8425ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu gscr->base.CurrentMode = mode; 8435ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu } 8445ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 8455ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu return changed; 8465ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu} 8475ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 8485ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu#endif /* EGL_MESA_screen_surface */ 8495ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 850184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke#ifdef EGL_WL_bind_wayland_display 851184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke 852184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzkestatic EGLBoolean 853184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzkeegl_g3d_bind_wayland_display_wl(_EGLDriver *drv, _EGLDisplay *dpy, 854184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke struct wl_display *wl_dpy) 855184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke{ 856184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke struct egl_g3d_display *gdpy = egl_g3d_display(dpy); 857184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke 858184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke if (!gdpy->native->wayland_bufmgr) 859184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke return EGL_FALSE; 860184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke 861184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke return gdpy->native->wayland_bufmgr->bind_display(gdpy->native, wl_dpy); 862184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke} 863184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke 864184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzkestatic EGLBoolean 865184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzkeegl_g3d_unbind_wayland_display_wl(_EGLDriver *drv, _EGLDisplay *dpy, 866184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke struct wl_display *wl_dpy) 867184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke{ 868184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke struct egl_g3d_display *gdpy = egl_g3d_display(dpy); 869184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke 870184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke if (!gdpy->native->wayland_bufmgr) 871184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke return EGL_FALSE; 872184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke 873184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke return gdpy->native->wayland_bufmgr->unbind_display(gdpy->native, wl_dpy); 874184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke} 875184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke 876e1b45a3c06ec19a2b9f1e0d3f8732aaad2d932daKristian Høgsbergstatic EGLBoolean 877e1b45a3c06ec19a2b9f1e0d3f8732aaad2d932daKristian Høgsbergegl_g3d_query_wayland_buffer_wl(_EGLDriver *drv, _EGLDisplay *dpy, 878a8c092266e9885f3370bbeae15bd80ebf035d05dKristian Høgsberg struct wl_buffer *buffer, 879e1b45a3c06ec19a2b9f1e0d3f8732aaad2d932daKristian Høgsberg EGLint attribute, EGLint *value) 880e1b45a3c06ec19a2b9f1e0d3f8732aaad2d932daKristian Høgsberg{ 881a8c092266e9885f3370bbeae15bd80ebf035d05dKristian Høgsberg struct egl_g3d_display *gdpy = egl_g3d_display(dpy); 882e1b45a3c06ec19a2b9f1e0d3f8732aaad2d932daKristian Høgsberg 883a8c092266e9885f3370bbeae15bd80ebf035d05dKristian Høgsberg if (!gdpy->native->wayland_bufmgr) 884e1b45a3c06ec19a2b9f1e0d3f8732aaad2d932daKristian Høgsberg return EGL_FALSE; 885e1b45a3c06ec19a2b9f1e0d3f8732aaad2d932daKristian Høgsberg 886a8c092266e9885f3370bbeae15bd80ebf035d05dKristian Høgsberg return gdpy->native->wayland_bufmgr->query_buffer(gdpy->native, 887a8c092266e9885f3370bbeae15bd80ebf035d05dKristian Høgsberg buffer, attribute, value); 888e1b45a3c06ec19a2b9f1e0d3f8732aaad2d932daKristian Høgsberg} 889184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke#endif /* EGL_WL_bind_wayland_display */ 890184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke 8915ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wuvoid 8925ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wuegl_g3d_init_driver_api(_EGLDriver *drv) 8935ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu{ 8945ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu _eglInitDriverFallbacks(drv); 8955ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 89604ae53ca8a844fbb2764b6ecb942b68a6db850e7Chia-I Wu drv->API.ChooseConfig = egl_g3d_choose_config; 89704ae53ca8a844fbb2764b6ecb942b68a6db850e7Chia-I Wu 8985ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu drv->API.CreateContext = egl_g3d_create_context; 8995ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu drv->API.DestroyContext = egl_g3d_destroy_context; 9005ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu drv->API.CreateWindowSurface = egl_g3d_create_window_surface; 9015ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu drv->API.CreatePixmapSurface = egl_g3d_create_pixmap_surface; 9025ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu drv->API.CreatePbufferSurface = egl_g3d_create_pbuffer_surface; 903a5183a38c293249dad36a7230ff872ea7485eee0Chia-I Wu drv->API.CreatePbufferFromClientBuffer = egl_g3d_create_pbuffer_from_client_buffer; 9045ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu drv->API.DestroySurface = egl_g3d_destroy_surface; 9055ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu drv->API.MakeCurrent = egl_g3d_make_current; 9065ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu drv->API.SwapBuffers = egl_g3d_swap_buffers; 9075ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu drv->API.CopyBuffers = egl_g3d_copy_buffers; 9085ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu drv->API.WaitClient = egl_g3d_wait_client; 9095ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu drv->API.WaitNative = egl_g3d_wait_native; 9105ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 9115ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu drv->API.BindTexImage = egl_g3d_bind_tex_image; 9125ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu drv->API.ReleaseTexImage = egl_g3d_release_tex_image; 9135ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 9145ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu drv->API.CreateImageKHR = egl_g3d_create_image; 9155ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu drv->API.DestroyImageKHR = egl_g3d_destroy_image; 9164f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu#ifdef EGL_MESA_drm_image 9174f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu drv->API.CreateDRMImageMESA = egl_g3d_create_drm_image; 9184f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu drv->API.ExportDRMImageMESA = egl_g3d_export_drm_image; 9194f6faf65d124bd690c4526f4c8e95de4d041601fChia-I Wu#endif 920184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke#ifdef EGL_WL_bind_wayland_display 921184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke drv->API.BindWaylandDisplayWL = egl_g3d_bind_wayland_display_wl; 922184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke drv->API.UnbindWaylandDisplayWL = egl_g3d_unbind_wayland_display_wl; 923e1b45a3c06ec19a2b9f1e0d3f8732aaad2d932daKristian Høgsberg drv->API.QueryWaylandBufferWL = egl_g3d_query_wayland_buffer_wl; 924184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke#endif 9255ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu 9264b2495661f3a5ac8ed07b68c5d5bf90adee2c37dChia-I Wu drv->API.CreateSyncKHR = egl_g3d_create_sync; 9274b2495661f3a5ac8ed07b68c5d5bf90adee2c37dChia-I Wu drv->API.DestroySyncKHR = egl_g3d_destroy_sync; 9284b2495661f3a5ac8ed07b68c5d5bf90adee2c37dChia-I Wu drv->API.ClientWaitSyncKHR = egl_g3d_client_wait_sync; 9294b2495661f3a5ac8ed07b68c5d5bf90adee2c37dChia-I Wu drv->API.SignalSyncKHR = egl_g3d_signal_sync; 9304b2495661f3a5ac8ed07b68c5d5bf90adee2c37dChia-I Wu 9315ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu#ifdef EGL_MESA_screen_surface 9325ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu drv->API.CreateScreenSurfaceMESA = egl_g3d_create_screen_surface; 9335ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu drv->API.ShowScreenSurfaceMESA = egl_g3d_show_screen_surface; 9345ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu#endif 935fa0f70e45ed1b69c0e72588a061bc30fd9ad371eFredrik Höglund 936fa0f70e45ed1b69c0e72588a061bc30fd9ad371eFredrik Höglund#ifdef EGL_NOK_swap_region 937fa0f70e45ed1b69c0e72588a061bc30fd9ad371eFredrik Höglund drv->API.SwapBuffersRegionNOK = egl_g3d_swap_buffers_region; 938fa0f70e45ed1b69c0e72588a061bc30fd9ad371eFredrik Höglund#endif 93975772842133d101223ca31400e100b83476f327bFredrik Höglund 94075772842133d101223ca31400e100b83476f327bFredrik Höglund drv->API.PostSubBufferNV = egl_g3d_post_sub_buffer; 9415ec4b636c4042fecac6aa0b592e35ed32c4ce5c4Chia-I Wu} 942