egl_g3d_st.c revision 5f66363f8ed26d6f3fc8fcccde804fe1fea1bbaa
1a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu/*
2a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu * Mesa 3-D graphics library
3a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu * Version:  7.9
4a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu *
5a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu * Copyright (C) 2010 LunarG Inc.
6a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu *
7a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu * Permission is hereby granted, free of charge, to any person obtaining a
8a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu * copy of this software and associated documentation files (the "Software"),
9a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu * to deal in the Software without restriction, including without limitation
10a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu * and/or sell copies of the Software, and to permit persons to whom the
12a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu * Software is furnished to do so, subject to the following conditions:
13a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu *
14a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu * The above copyright notice and this permission notice shall be included
15a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu * in all copies or substantial portions of the Software.
16a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu *
17ba81b0743efd978509b1931d7b4b93f37e8aeb5eChia-I Wu * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18ba81b0743efd978509b1931d7b4b93f37e8aeb5eChia-I Wu * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
20ba81b0743efd978509b1931d7b4b93f37e8aeb5eChia-I Wu * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21ba81b0743efd978509b1931d7b4b93f37e8aeb5eChia-I Wu * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
22ba81b0743efd978509b1931d7b4b93f37e8aeb5eChia-I Wu * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
23ba81b0743efd978509b1931d7b4b93f37e8aeb5eChia-I Wu * DEALINGS IN THE SOFTWARE.
24a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu *
25a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu * Authors:
26a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu *    Chia-I Wu <olv@lunarg.com>
27a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu */
28a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu
29a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu#include "util/u_memory.h"
302773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu#include "util/u_string.h"
31a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu#include "util/u_inlines.h"
32a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu#include "util/u_dl.h"
332773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu#include "egldriver.h"
34a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu#include "eglimage.h"
35a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu#include "eglmutex.h"
36a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu
37a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu#include "egl_g3d.h"
38a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu#include "egl_g3d_st.h"
39a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu
40a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wustruct egl_g3d_st_manager {
41a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu   struct st_manager base;
42a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu   _EGLDisplay *display;
43a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu};
44a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu
45a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wustatic INLINE struct egl_g3d_st_manager *
46a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wuegl_g3d_st_manager(struct st_manager *smapi)
47a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu{
48a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu   return (struct egl_g3d_st_manager *) smapi;
49a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu}
50a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu
512773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wustatic struct egl_g3d_st_module {
522773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu   const char *filename;
53a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu   struct util_dl_library *lib;
542773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu   struct st_api *stapi;
552773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu} egl_g3d_st_modules[ST_API_COUNT];
562773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu
572773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wustatic EGLBoolean
582773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wuegl_g3d_search_path_callback(const char *dir, size_t len, void *callback_data)
592773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu{
602773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu   struct egl_g3d_st_module *stmod =
612773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu      (struct egl_g3d_st_module *) callback_data;
622773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu   char path[1024];
632773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu   int ret;
642773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu
652773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu   ret = util_snprintf(path, sizeof(path),
662773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu         "%.*s/%s", len, dir, stmod->filename);
672773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu   if (ret > 0 && ret < sizeof(path))
682773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu      stmod->lib = util_dl_open(path);
692773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu
702773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu   return !(stmod->lib);
712773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu}
722773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu
732773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wustatic boolean
742773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wuegl_g3d_load_st_module(struct egl_g3d_st_module *stmod,
752773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu                       const char *filename, const char *procname)
762773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu{
772773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu   struct st_api *(*create_api)(void);
782773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu
792773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu   stmod->filename = filename;
802773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu   if (stmod->filename)
812773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu      _eglSearchPathForEach(egl_g3d_search_path_callback, (void *) stmod);
822773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu   else
832773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu      stmod->lib = util_dl_open(NULL);
842773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu
852773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu   if (stmod->lib) {
862773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu      create_api = (struct st_api *(*)(void))
872773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu         util_dl_get_proc_address(stmod->lib, procname);
882773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu      if (create_api)
892773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu         stmod->stapi = create_api();
902773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu
912773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu      if (!stmod->stapi) {
922773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu         util_dl_close(stmod->lib);
932773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu         stmod->lib = NULL;
942773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu      }
95a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu   }
960c572c6828b6a338b07a6860280b3a314a81662eJakob Bornecrantz
972773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu   if (stmod->stapi) {
982773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu      return TRUE;
99a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu   }
1002773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu   else {
1012773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu      stmod->filename = NULL;
1022773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu      return FALSE;
1032773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu   }
1042773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu}
1052773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu
1062773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wuvoid
1072773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wuegl_g3d_init_st_apis(struct st_api *stapis[ST_API_COUNT])
1082773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu{
1092773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu   const char *skip_checks[ST_API_COUNT], *symbols[ST_API_COUNT];
1102773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu   const char *filenames[ST_API_COUNT][4];
1112773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu   struct util_dl_library *self;
1122773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu   int num_needed = 0, api;
1130c572c6828b6a338b07a6860280b3a314a81662eJakob Bornecrantz
1142773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu   self = util_dl_open(NULL);
115a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu
1162773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu   /* collect the necessary data for loading modules */
1172773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu   for (api = 0; api < ST_API_COUNT; api++) {
1182773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu      int count = 0;
1192773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu
1202773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu      switch (api) {
1212773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu      case ST_API_OPENGL:
1222773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu         skip_checks[api] = "glColor4d";
1232773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu         symbols[api] = ST_CREATE_OPENGL_SYMBOL;
1242773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu         filenames[api][count++] = "api_GL.so";
1252773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu         break;
1262773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu      case ST_API_OPENGL_ES1:
1272773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu         skip_checks[api] = "glColor4x";
1282773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu         symbols[api] = ST_CREATE_OPENGL_ES1_SYMBOL;
1292773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu         filenames[api][count++] = "api_GLESv1_CM.so";
1302773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu         filenames[api][count++] = "api_GL.so";
1312773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu         break;
1322773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu      case ST_API_OPENGL_ES2:
1332773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu         skip_checks[api] = "glShaderBinary";
1342773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu         symbols[api] = ST_CREATE_OPENGL_ES2_SYMBOL;
1352773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu         filenames[api][count++] = "api_GLESv2.so";
1362773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu         filenames[api][count++] = "api_GL.so";
1372773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu         break;
1382773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu      case ST_API_OPENVG:
1392773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu         skip_checks[api] = "vgClear";
1402773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu         symbols[api] = ST_CREATE_OPENVG_SYMBOL;
1412773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu         filenames[api][count++]= "api_OpenVG.so";
1422773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu         break;
1432773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu      default:
1442773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu         assert(!"Unknown API Type\n");
1452773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu         skip_checks[api] = NULL;
1462773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu         symbols[api] = NULL;
1472773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu         break;
1482773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu      }
1492773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu      filenames[api][count++]= NULL;
1502773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu      assert(count < Elements(filenames[api]));
1512773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu
1522773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu      /* heuristicically decide if the module is needed */
1532773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu      if (!self || !skip_checks[api] ||
1542773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu          util_dl_get_proc_address(self, skip_checks[api])) {
1552773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu         /* unset so the module is not skipped */
1562773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu         skip_checks[api] = NULL;
1572773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu         num_needed++;
1582773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu      }
1592773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu   }
1602773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu   /* mark all moudles needed if we wrongly decided that none is needed */
1612773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu   if (!num_needed)
1622773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu      memset(skip_checks, 0, sizeof(skip_checks));
1632773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu
1642773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu   if (self)
1652773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu      util_dl_close(self);
1662773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu
1672773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu   for (api = 0; api < ST_API_COUNT; api++) {
1682773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu      struct egl_g3d_st_module *stmod = &egl_g3d_st_modules[api];
1692773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu      const char **p;
1702773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu
1712773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu      /* skip the module */
1722773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu      if (skip_checks[api])
1732773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu         continue;
1742773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu
1752773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu      /* try all filenames, including NULL */
1762773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu      for (p = filenames[api]; *p; p++) {
1772773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu         if (egl_g3d_load_st_module(stmod, *p, symbols[api]))
1782773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu            break;
1792773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu      }
1802773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu      if (!stmod->stapi)
1812773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu         egl_g3d_load_st_module(stmod, NULL, symbols[api]);
1822773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu
1832773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu      stapis[api] = stmod->stapi;
1842773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu   }
1852773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu}
1862773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu
1872773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wuvoid
1882773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wuegl_g3d_destroy_st_apis(void)
1892773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu{
1902773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu   int api;
1912773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu
1922773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu   for (api = 0; api < ST_API_COUNT; api++) {
1932773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu      struct egl_g3d_st_module *stmod = &egl_g3d_st_modules[api];
1942773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu
1952773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu      if (stmod->stapi) {
1962773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu         stmod->stapi->destroy(stmod->stapi);
1972773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu         stmod->stapi = NULL;
1982773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu      }
1992773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu      if (stmod->lib) {
2002773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu         util_dl_close(stmod->lib);
2012773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu         stmod->lib = NULL;
2022773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu      }
2032773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu      stmod->filename = NULL;
2042773f888dc9cde61dedf1b004e35efcc72ca9240Chia-I Wu   }
205a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu}
206a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu
207776dc53f62c46e235ff8ef2e1eec1a308a036987Chia-I Wustatic boolean
208776dc53f62c46e235ff8ef2e1eec1a308a036987Chia-I Wuegl_g3d_st_manager_get_egl_image(struct st_manager *smapi,
209776dc53f62c46e235ff8ef2e1eec1a308a036987Chia-I Wu                                 struct st_egl_image *stimg)
210776dc53f62c46e235ff8ef2e1eec1a308a036987Chia-I Wu{
211776dc53f62c46e235ff8ef2e1eec1a308a036987Chia-I Wu   struct egl_g3d_st_manager *gsmapi = egl_g3d_st_manager(smapi);
212776dc53f62c46e235ff8ef2e1eec1a308a036987Chia-I Wu   EGLImageKHR handle = (EGLImageKHR) stimg->egl_image;
213776dc53f62c46e235ff8ef2e1eec1a308a036987Chia-I Wu   _EGLImage *img;
214776dc53f62c46e235ff8ef2e1eec1a308a036987Chia-I Wu   struct egl_g3d_image *gimg;
215776dc53f62c46e235ff8ef2e1eec1a308a036987Chia-I Wu
216776dc53f62c46e235ff8ef2e1eec1a308a036987Chia-I Wu   /* this is called from state trackers */
217776dc53f62c46e235ff8ef2e1eec1a308a036987Chia-I Wu   _eglLockMutex(&gsmapi->display->Mutex);
218776dc53f62c46e235ff8ef2e1eec1a308a036987Chia-I Wu
219776dc53f62c46e235ff8ef2e1eec1a308a036987Chia-I Wu   img = _eglLookupImage(handle, gsmapi->display);
220776dc53f62c46e235ff8ef2e1eec1a308a036987Chia-I Wu   if (!img) {
221776dc53f62c46e235ff8ef2e1eec1a308a036987Chia-I Wu      _eglUnlockMutex(&gsmapi->display->Mutex);
222776dc53f62c46e235ff8ef2e1eec1a308a036987Chia-I Wu      return FALSE;
223776dc53f62c46e235ff8ef2e1eec1a308a036987Chia-I Wu   }
224776dc53f62c46e235ff8ef2e1eec1a308a036987Chia-I Wu
225776dc53f62c46e235ff8ef2e1eec1a308a036987Chia-I Wu   gimg = egl_g3d_image(img);
226776dc53f62c46e235ff8ef2e1eec1a308a036987Chia-I Wu
227776dc53f62c46e235ff8ef2e1eec1a308a036987Chia-I Wu   stimg->texture = NULL;
228287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell   pipe_resource_reference(&stimg->texture, gimg->texture);
229776dc53f62c46e235ff8ef2e1eec1a308a036987Chia-I Wu   stimg->face = gimg->face;
230776dc53f62c46e235ff8ef2e1eec1a308a036987Chia-I Wu   stimg->level = gimg->level;
231776dc53f62c46e235ff8ef2e1eec1a308a036987Chia-I Wu   stimg->zslice = gimg->zslice;
232776dc53f62c46e235ff8ef2e1eec1a308a036987Chia-I Wu
233776dc53f62c46e235ff8ef2e1eec1a308a036987Chia-I Wu   _eglUnlockMutex(&gsmapi->display->Mutex);
234776dc53f62c46e235ff8ef2e1eec1a308a036987Chia-I Wu
235776dc53f62c46e235ff8ef2e1eec1a308a036987Chia-I Wu   return TRUE;
236776dc53f62c46e235ff8ef2e1eec1a308a036987Chia-I Wu}
237776dc53f62c46e235ff8ef2e1eec1a308a036987Chia-I Wu
2385f66363f8ed26d6f3fc8fcccde804fe1fea1bbaaJakob Bornecrantzstatic int
2395f66363f8ed26d6f3fc8fcccde804fe1fea1bbaaJakob Bornecrantzegl_g3d_st_manager_get_param(struct st_manager *smapi,
2405f66363f8ed26d6f3fc8fcccde804fe1fea1bbaaJakob Bornecrantz                             enum st_manager_param param)
2415f66363f8ed26d6f3fc8fcccde804fe1fea1bbaaJakob Bornecrantz{
2425f66363f8ed26d6f3fc8fcccde804fe1fea1bbaaJakob Bornecrantz   return 0;
2435f66363f8ed26d6f3fc8fcccde804fe1fea1bbaaJakob Bornecrantz}
2445f66363f8ed26d6f3fc8fcccde804fe1fea1bbaaJakob Bornecrantz
245a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wustruct st_manager *
246a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wuegl_g3d_create_st_manager(_EGLDisplay *dpy)
247a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu{
248a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu   struct egl_g3d_display *gdpy = egl_g3d_display(dpy);
249a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu   struct egl_g3d_st_manager *gsmapi;
250a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu
251a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu   gsmapi = CALLOC_STRUCT(egl_g3d_st_manager);
252a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu   if (gsmapi) {
253a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu      gsmapi->display = dpy;
254a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu
255a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu      gsmapi->base.screen = gdpy->native->screen;
256776dc53f62c46e235ff8ef2e1eec1a308a036987Chia-I Wu      gsmapi->base.get_egl_image = egl_g3d_st_manager_get_egl_image;
2575f66363f8ed26d6f3fc8fcccde804fe1fea1bbaaJakob Bornecrantz      gsmapi->base.get_param = egl_g3d_st_manager_get_param;
258a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu   }
259a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu
260a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu   return &gsmapi->base;;
261a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu}
262a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu
263a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wuvoid
264a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wuegl_g3d_destroy_st_manager(struct st_manager *smapi)
265a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu{
266a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu   struct egl_g3d_st_manager *gsmapi = egl_g3d_st_manager(smapi);
267870a9d643b1f256e6a379d96a325284dd2f7eeeaChia-I Wu   FREE(gsmapi);
268a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu}
269a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu
270a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wustatic boolean
271f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wuegl_g3d_st_framebuffer_flush_front_pbuffer(struct st_framebuffer_iface *stfbi,
272f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wu                                           enum st_attachment_type statt)
273f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wu{
274f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wu   return TRUE;
275f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wu}
276f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wu
277f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wustatic boolean
278f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wuegl_g3d_st_framebuffer_validate_pbuffer(struct st_framebuffer_iface *stfbi,
279f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wu                                        const enum st_attachment_type *statts,
280f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wu                                        unsigned count,
281287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell                                        struct pipe_resource **out)
282f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wu{
283f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wu   _EGLSurface *surf = (_EGLSurface *) stfbi->st_manager_private;
284f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wu   struct egl_g3d_surface *gsurf = egl_g3d_surface(surf);
285287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell   struct pipe_resource templ;
286f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wu   unsigned i;
287f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wu
288f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wu   for (i = 0; i < count; i++) {
289f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wu      out[i] = NULL;
290f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wu
291f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wu      if (gsurf->stvis.render_buffer != statts[i])
292f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wu         continue;
293f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wu
294f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wu      if (!gsurf->render_texture) {
295f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wu         struct egl_g3d_display *gdpy =
296f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wu            egl_g3d_display(gsurf->base.Resource.Display);
297f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wu         struct pipe_screen *screen = gdpy->native->screen;
298f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wu
299f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wu         memset(&templ, 0, sizeof(templ));
300f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wu         templ.target = PIPE_TEXTURE_2D;
301f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wu         templ.last_level = 0;
302f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wu         templ.width0 = gsurf->base.Width;
303f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wu         templ.height0 = gsurf->base.Height;
304f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wu         templ.depth0 = 1;
305f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wu         templ.format = gsurf->stvis.color_format;
306287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell         templ.bind = PIPE_BIND_RENDER_TARGET;
307f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wu
308287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell         gsurf->render_texture = screen->resource_create(screen, &templ);
309f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wu      }
310f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wu
311287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell      pipe_resource_reference(&out[i], gsurf->render_texture);
312f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wu   }
313f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wu
314f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wu   return TRUE;
315f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wu}
316f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wu
317f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wustatic boolean
318a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wuegl_g3d_st_framebuffer_flush_front(struct st_framebuffer_iface *stfbi,
319a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu                                   enum st_attachment_type statt)
320a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu{
321a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu   _EGLSurface *surf = (_EGLSurface *) stfbi->st_manager_private;
322a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu   struct egl_g3d_surface *gsurf = egl_g3d_surface(surf);
323a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu
324a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu   return gsurf->native->flush_frontbuffer(gsurf->native);
325a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu}
326a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu
327a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wustatic boolean
328a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wuegl_g3d_st_framebuffer_validate(struct st_framebuffer_iface *stfbi,
329a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu                                const enum st_attachment_type *statts,
330a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu                                unsigned count,
331287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell                                struct pipe_resource **out)
332a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu{
333a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu   _EGLSurface *surf = (_EGLSurface *) stfbi->st_manager_private;
334a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu   struct egl_g3d_surface *gsurf = egl_g3d_surface(surf);
335287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell   struct pipe_resource *textures[NUM_NATIVE_ATTACHMENTS];
336a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu   uint attachment_mask = 0;
337a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu   unsigned i;
338a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu
339a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu   for (i = 0; i < count; i++) {
340a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu      int natt;
341a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu
342a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu      switch (statts[i]) {
343a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu      case ST_ATTACHMENT_FRONT_LEFT:
344a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu         natt = NATIVE_ATTACHMENT_FRONT_LEFT;
345a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu         break;
346a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu      case ST_ATTACHMENT_BACK_LEFT:
347a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu         natt = NATIVE_ATTACHMENT_BACK_LEFT;
348a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu         break;
349a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu      case ST_ATTACHMENT_FRONT_RIGHT:
350a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu         natt = NATIVE_ATTACHMENT_FRONT_RIGHT;
351a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu         break;
352a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu      case ST_ATTACHMENT_BACK_RIGHT:
353a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu         natt = NATIVE_ATTACHMENT_BACK_RIGHT;
3542ae66e9b97e9864367c26fc5f9cb86896bc83b45Chia-I Wu         break;
355a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu      default:
356a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu         natt = -1;
357a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu         break;
358a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu      }
359a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu
360a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu      if (natt >= 0)
361a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu         attachment_mask |= 1 << natt;
362a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu   }
363a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu
364a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu   if (!gsurf->native->validate(gsurf->native, attachment_mask,
365a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu         &gsurf->sequence_number, textures, &gsurf->base.Width,
366a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu         &gsurf->base.Height))
367a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu      return FALSE;
368a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu
369a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu   for (i = 0; i < count; i++) {
370287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell      struct pipe_resource *tex;
371a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu      int natt;
372a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu
373a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu      switch (statts[i]) {
374a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu      case ST_ATTACHMENT_FRONT_LEFT:
375a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu         natt = NATIVE_ATTACHMENT_FRONT_LEFT;
376a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu         break;
377a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu      case ST_ATTACHMENT_BACK_LEFT:
378a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu         natt = NATIVE_ATTACHMENT_BACK_LEFT;
379a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu         break;
380a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu      case ST_ATTACHMENT_FRONT_RIGHT:
381a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu         natt = NATIVE_ATTACHMENT_FRONT_RIGHT;
382a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu         break;
383a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu      case ST_ATTACHMENT_BACK_RIGHT:
384a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu         natt = NATIVE_ATTACHMENT_BACK_RIGHT;
385a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu         break;
386a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu      default:
387a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu         natt = -1;
388a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu         break;
389a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu      }
390a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu
391a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu      if (natt >= 0) {
392a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu         tex = textures[natt];
393a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu
394a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu         if (statts[i] == stfbi->visual->render_buffer)
395287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell            pipe_resource_reference(&gsurf->render_texture, tex);
396a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu
397a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu         if (attachment_mask & (1 << natt)) {
398a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu            /* transfer the ownership to the caller */
399a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu            out[i] = tex;
400a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu            attachment_mask &= ~(1 << natt);
401a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu         }
402a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu         else {
403a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu            /* the attachment is listed more than once */
404287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell            pipe_resource_reference(&out[i], tex);
405a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu         }
406a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu      }
407a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu   }
408a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu
409a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu   return TRUE;
410a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu}
411a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu
412a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wustruct st_framebuffer_iface *
413a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wuegl_g3d_create_st_framebuffer(_EGLSurface *surf)
414a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu{
415a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu   struct egl_g3d_surface *gsurf = egl_g3d_surface(surf);
416a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu   struct st_framebuffer_iface *stfbi;
417a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu
418a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu   stfbi = CALLOC_STRUCT(st_framebuffer_iface);
419a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu   if (!stfbi)
420a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu      return NULL;
421a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu
422a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu   stfbi->visual = &gsurf->stvis;
423f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wu   if (gsurf->base.Type != EGL_PBUFFER_BIT) {
424f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wu      stfbi->flush_front = egl_g3d_st_framebuffer_flush_front;
425f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wu      stfbi->validate = egl_g3d_st_framebuffer_validate;
426f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wu   }
427f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wu   else {
428f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wu      stfbi->flush_front = egl_g3d_st_framebuffer_flush_front_pbuffer;
429f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wu      stfbi->validate = egl_g3d_st_framebuffer_validate_pbuffer;
430f69b35fa15f43747dde29addaeec845604d7e127Chia-I Wu   }
431a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu   stfbi->st_manager_private = (void *) &gsurf->base;
432a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu
433a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu   return stfbi;
434a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu}
435a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu
436a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wuvoid
437a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wuegl_g3d_destroy_st_framebuffer(struct st_framebuffer_iface *stfbi)
438a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu{
439870a9d643b1f256e6a379d96a325284dd2f7eeeaChia-I Wu   FREE(stfbi);
440a924dd18c32bbc0056a799cf621dc2835644c16eChia-I Wu}
441