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