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