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