17b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/****************************************************************************** 27b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 37b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @File KEGL/PVRShellAPI.cpp 47b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 57b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Title KEGL/PVRShellAPI 67b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 77b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Version 87b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 97b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Copyright Copyright (c) Imagination Technologies Limited. 107b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 117b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Platform Independent 127b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 137b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Description Makes programming for 3D APIs easier by wrapping surface 147b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens initialization, Texture allocation and other functions for use by a demo. 157b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 167b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens******************************************************************************/ 177b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 187b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#include <stdio.h> 197b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#include <stdlib.h> 207b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#include <string.h> 217b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#include <stdarg.h> 227b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 237b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#include "PVRShell.h" 247b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#include "PVRShellAPI.h" 257b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#include "PVRShellOS.h" 267b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#include "PVRShellImpl.h" 277b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 287b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens// No Doxygen for CPP files, due to documentation duplication 297b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/// @cond NO_DOXYGEN 307b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 317b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#ifndef EGL_CONTEXT_LOST_IMG 327b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*! Extended error code EGL_CONTEXT_LOST_IMG generated when power management event has occurred. */ 337b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#define EGL_CONTEXT_LOST_IMG 0x300E 347b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#endif 357b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 367b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#ifndef EGL_CONTEXT_PRIORITY_LEVEL_IMG 377b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*! An extensions added to the list of attributes for the context to give it a priority hint */ 387b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#define EGL_CONTEXT_PRIORITY_LEVEL_IMG 0x3100 397b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*! Request the context is created with high priority */ 407b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#define EGL_CONTEXT_PRIORITY_HIGH_IMG 0x3101 417b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*! Request the context is created with medium priority */ 427b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#define EGL_CONTEXT_PRIORITY_MEDIUM_IMG 0x3102 437b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*! Request the context is created with low priority */ 447b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#define EGL_CONTEXT_PRIORITY_LOW_IMG 0x3103 457b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#endif 467b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 477b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/***************************************************************************** 487b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens Declarations 497b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/ 507b21f276fa91ad62fd2055844688b07829f12205Nicolas Capensstatic bool PVRShellIsExtensionSupported(EGLDisplay dpy, const char *extension); 517b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 527b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#if defined GL_ES_VERSION_2_0 && !defined EGL_VERSION_1_3 537b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#error OpenGL ES 2 requires egl.h version 1.3 or higher 547b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#endif 557b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 567b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/**************************************************************************** 577b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens** Class: PVRShellInitAPI 587b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens****************************************************************************/ 597b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 607b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/***************************************************************************** 617b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens* Function Name : ActivatePreferences 627b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens* Description : Activates the user set preferences (like v-sync) 637b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/ 647b21f276fa91ad62fd2055844688b07829f12205Nicolas Capensvoid PVRShellInit::ApiActivatePreferences() 657b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{ 667b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 677b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#ifdef EGL_VERSION_1_1 687b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens eglSwapInterval(m_EGLDisplay, m_pShell->m_pShellData->nSwapInterval); 697b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#endif 707b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens} 717b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 727b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/***************************************************************************** 737b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens* Function Name : ApiInitAPI 747b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens* Returns : true for success 757b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens* Description : Initialise the 3D API 767b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/ 777b21f276fa91ad62fd2055844688b07829f12205Nicolas Capensbool PVRShellInit::ApiInitAPI() 787b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{ 797b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens int bDone; 807b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 817b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens m_NDT = (EGLNativeDisplayType)OsGetNativeDisplayType(); 827b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens m_NPT = (EGLNativePixmapType) OsGetNativePixmapType(); 837b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens m_NWT = (EGLNativeWindowType) OsGetNativeWindowType(); 847b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 857b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens m_EGLContext = 0; 867b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 877b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens do 887b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens { 897b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens bDone = true; 907b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 917b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens m_EGLDisplay = eglGetDisplay(m_NDT); 927b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 937b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens if(m_EGLDisplay == EGL_NO_DISPLAY) 947b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens { 957b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#if defined(BUILD_OGLES2) || defined(BUILD_OGLES3) 967b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens m_EGLDisplay = eglGetDisplay((EGLNativeDisplayType)EGL_DEFAULT_DISPLAY); 977b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#else 987b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens m_EGLDisplay = eglGetDisplay((NativeDisplayType)EGL_DEFAULT_DISPLAY); 997b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#endif 1007b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens } 1017b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 1027b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens if(!eglInitialize(m_EGLDisplay, &m_MajorVersion, &m_MinorVersion)) 1037b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens { 1047b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens m_pShell->PVRShellSet(prefExitMessage, "PVRShell: Unable to initialise EGL\n"); 1057b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens m_pShell->PVRShellOutputDebug("PVRShell: EGL Error (%s)\n", StringFrom_eglGetError()); 1067b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens return false; 1077b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens } 1087b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 1097b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens m_pShell->PVRShellOutputDebug("PVRShell: EGL %d.%d initialized\n", m_MajorVersion, m_MinorVersion); 1107b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 1117b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens // Check Extension availability after EGL initialization 1127b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens if (m_MajorVersion > 1 || (m_MajorVersion == 1 && m_MinorVersion >= 1)) 1137b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens { 1147b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens m_bPowerManagementSupported = true; 1157b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens } 1167b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens else 1177b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens { 1187b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens m_bPowerManagementSupported = PVRShellIsExtensionSupported(m_EGLDisplay,"EGL_IMG_power_management"); 1197b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens } 1207b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 1217b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens do 1227b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens { 1237b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#if defined(BUILD_OGL) 1247b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens if(!eglBindAPI(EGL_OPENGL_API)) 1257b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens { 1267b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens m_pShell->PVRShellSet(prefExitMessage, "PVRShell: Failed to bind OpenGL API\n"); 1277b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens return false; 1287b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens } 1297b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#else 1307b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#if defined EGL_VERSION_1_3 && defined GL_ES_VERSION_2_0 1317b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens if(!eglBindAPI(EGL_OPENGL_ES_API)) 1327b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens { 1337b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens m_pShell->PVRShellSet(prefExitMessage, "PVRShell: Failed to bind OpenGL ES API\n"); 1347b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens return false; 1357b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens } 1367b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#endif 1377b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#endif 1387b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens // Find an EGL config 1397b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens m_EGLConfig = SelectEGLConfiguration(m_pShell->m_pShellData); 1407b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens eglGetConfigAttrib(m_EGLDisplay, m_EGLConfig, EGL_CONFIG_ID, &m_iConfig); 1417b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 1427b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens // Destroy the context if we already created one 1437b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens if (m_EGLContext) 1447b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens { 1457b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens eglDestroyContext(m_EGLDisplay, m_EGLContext); 1467b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens } 1477b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 1487b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens // Attempt to create a context 1497b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens EGLint ai32ContextAttribs[48]; 1507b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens int i = 0; 1517b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 1527b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#if defined(BUILD_OGLES3) 1537b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens ai32ContextAttribs[i++] = EGL_CONTEXT_CLIENT_VERSION; 1547b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens ai32ContextAttribs[i++] = 3; 1557b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#else 1567b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#if defined(EGL_VERSION_1_3) && defined(GL_ES_VERSION_2_0) 1577b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens ai32ContextAttribs[i++] = EGL_CONTEXT_CLIENT_VERSION; 1587b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens ai32ContextAttribs[i++] = 2; 1597b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#endif 1607b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#endif 1617b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 1627b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#if defined(BUILD_OGL) 1637b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens //Attempt to create an OpenGL 3.2 context. 1647b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens if (PVRShellIsExtensionSupported(m_EGLDisplay, "EGL_KHR_create_context")) 1657b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens { 1667b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens ai32ContextAttribs[i++] = EGL_CONTEXT_MAJOR_VERSION_KHR; 1677b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens ai32ContextAttribs[i++] = 3; 1687b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens ai32ContextAttribs[i++] = EGL_CONTEXT_MINOR_VERSION_KHR; 1697b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens ai32ContextAttribs[i++] = 2; 1707b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens ai32ContextAttribs[i++] = EGL_CONTEXT_FLAGS_KHR; 1717b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens ai32ContextAttribs[i++] = EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE_BIT_KHR; 1727b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens ai32ContextAttribs[i++] = EGL_CONTEXT_OPENGL_PROFILE_MASK_KHR; 1737b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens ai32ContextAttribs[i++] = EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT_KHR; 1747b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens } 1757b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#endif 1767b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 1777b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#if defined(BUILD_OGLES) || defined(BUILD_OGLES2) || defined(BUILD_OGLES3) 1787b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens if(PVRShellIsExtensionSupported(m_EGLDisplay,"EGL_IMG_context_priority")) 1797b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens { 1807b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens ai32ContextAttribs[i++] = EGL_CONTEXT_PRIORITY_LEVEL_IMG; 1817b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens switch(m_pShell->PVRShellGet(prefPriority)) 1827b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens { 1837b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens case 0: ai32ContextAttribs[i++] = EGL_CONTEXT_PRIORITY_LOW_IMG; break; 1847b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens case 1: ai32ContextAttribs[i++] = EGL_CONTEXT_PRIORITY_MEDIUM_IMG; break; 1857b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens default:ai32ContextAttribs[i++] = EGL_CONTEXT_PRIORITY_HIGH_IMG; break; 1867b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens } 1877b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens } 1887b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#endif 1897b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens ai32ContextAttribs[i] = EGL_NONE; 1907b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 1917b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens if (m_EGLContext == EGL_NO_CONTEXT) 1927b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens { 1937b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens m_EGLContext = eglCreateContext(m_EGLDisplay, m_EGLConfig, NULL, ai32ContextAttribs); 1947b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens } 1957b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 1967b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens if(m_EGLContext == EGL_NO_CONTEXT) 1977b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens { 1987b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens if(m_iRequestedConfig > 0) 1997b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens { 2007b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens // We failed to create a context 2017b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens m_pShell->PVRShellSet(prefExitMessage, "PVRShell: Unable to create a context\n"); 2027b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens return false; 2037b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens } 2047b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens else if(m_pShell->m_pShellData->bNeedPbuffer) 2057b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens { 2067b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens // Disable P-buffer and try again 2077b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens m_pShell->m_pShellData->bNeedPbuffer = false; 2087b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens } 2097b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens else if(m_pShell->m_pShellData->bNeedStencilBuffer) 2107b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens { 2117b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens // Disable Stencil Buffer and try again 2127b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens m_pShell->m_pShellData->bNeedStencilBuffer = false; 2137b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens } 2147b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens else if(m_pShell->m_pShellData->nAASamples > 0) 2157b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens { 2167b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens // Still failing, reduce the AA samples and try again 2177b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens --m_pShell->m_pShellData->nAASamples; 2187b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens } 2197b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens else 2207b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens { 2217b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens m_pShell->PVRShellSet(prefExitMessage, "PVRShell: Unable to create a context\n"); 2227b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens return false; 2237b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens } 2247b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens } 2257b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens } while(m_EGLContext == EGL_NO_CONTEXT); 2267b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 2277b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#if defined(__QNXNTO__) 2287b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens int format = SCREEN_FORMAT_RGBX8888; 2297b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens if(screen_set_window_property_iv((_screen_window*) m_NWT, SCREEN_PROPERTY_FORMAT, &format)) 2307b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens { 2317b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens m_pShell->PVRShellSet(prefExitMessage, "PVRShell: Failed to set window property SCREEN_PROPERTY_FORMAT\n"); 2327b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens return false; 2337b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens } 2347b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 2357b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#if defined(BUILD_OGLES2) 2367b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens int usage = SCREEN_USAGE_OPENGL_ES2; 2377b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#else 2387b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#if defined(BUILD_OGLES) 2397b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens int usage = SCREEN_USAGE_OPENGL_ES1; 2407b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#endif 2417b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#endif 2427b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens if(screen_set_window_property_iv((_screen_window*) m_NWT, SCREEN_PROPERTY_USAGE, &usage)) 2437b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens { 2447b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens m_pShell->PVRShellSet(prefExitMessage, "PVRShell: Failed to set window property SCREEN_PROPERTY_USAGE\n"); 2457b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens return false; 2467b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens } 2477b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 2487b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens if(screen_create_window_buffers((_screen_window*) m_NWT, 2)) 2497b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens { 2507b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens m_pShell->PVRShellSet(prefExitMessage, "PVRShell: Failed to create window buffers\n"); 2517b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens return false; 2527b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens } 2537b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#endif 2547b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens EGLint attrib_list[16]; 2557b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens int i = 0; 2567b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#if defined(EGL_VERSION_1_2) 2577b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens if(m_pShell->m_pShellData->bNeedAlphaFormatPre) // The default is EGL_ALPHA_FORMAT_NONPRE 2587b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens { 2597b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens attrib_list[i++] = EGL_ALPHA_FORMAT; 2607b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens attrib_list[i++] = EGL_ALPHA_FORMAT_PRE; 2617b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens } 2627b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#endif 2637b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens // Terminate the attribute list with EGL_NONE 2647b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens attrib_list[i] = EGL_NONE; 2657b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 2667b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens if(m_pShell->m_pShellData->bNeedPixmap) 2677b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens { 2687b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens m_pShell->PVRShellOutputDebug("InitAPI() Using pixmaps, about to create egl surface\n"); 2697b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens m_EGLWindow = eglCreatePixmapSurface(m_EGLDisplay, m_EGLConfig, m_NPT, attrib_list); 2707b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens } 2717b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens else 2727b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens { 2737b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#if defined(ANDROID) 2747b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens EGLint visualID; 2757b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens eglGetConfigAttrib(m_EGLDisplay, m_EGLConfig, EGL_NATIVE_VISUAL_ID, &visualID); 2767b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 2777b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens // Change the format of our window to match our config 2787b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens ANativeWindow_setBuffersGeometry(m_NWT, 0, 0, visualID); 2797b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#endif 2807b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens m_EGLWindow = eglCreateWindowSurface(m_EGLDisplay, m_EGLConfig, m_NWT, attrib_list); 2817b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 2827b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens // If we have failed to create a surface then try using Null 2837b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens if(m_EGLWindow == EGL_NO_SURFACE) 2847b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens { 2857b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens m_EGLWindow = eglCreateWindowSurface(m_EGLDisplay, m_EGLConfig, NULL, attrib_list); 2867b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens } 2877b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens } 2887b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 2897b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens if (m_EGLWindow == EGL_NO_SURFACE) 2907b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens { 2917b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens m_pShell->PVRShellSet(prefExitMessage, "PVRShell: Unable to create surface\n"); 2927b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens return false; 2937b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens } 2947b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 2957b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens if (!eglMakeCurrent(m_EGLDisplay, m_EGLWindow, m_EGLWindow, m_EGLContext)) 2967b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens { 2977b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#ifdef EGL_VERSION_1_3 2987b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens if((eglGetError() == EGL_CONTEXT_LOST)) 2997b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#else 3007b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens if((eglGetError() == EGL_CONTEXT_LOST_IMG) && m_bPowerManagementSupported) 3017b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#endif 3027b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens { 3037b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens bDone = false; 3047b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens } 3057b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens else 3067b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens { 3077b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens m_pShell->PVRShellSet(prefExitMessage, "PVRShell: Unable to make context current\n"); 3087b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens return false; 3097b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens } 3107b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens } 3117b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens } while(!bDone); 3127b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 3137b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens /* 3147b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens Get correct screen width and height and 3157b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens save them into 3167b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens m_pShell->m_pShellData->nShellDimX and 3177b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens m_pShell->m_pShellData->nShellDimY 3187b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens */ 3197b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens eglQuerySurface(m_EGLDisplay, m_EGLWindow, 3207b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens EGL_WIDTH, (EGLint*)&m_pShell->m_pShellData->nShellDimX 3217b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens ); 3227b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens eglQuerySurface(m_EGLDisplay, m_EGLWindow, 3237b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens EGL_HEIGHT, (EGLint*)&m_pShell->m_pShellData->nShellDimY 3247b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens ); 3257b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 3267b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#if defined(ANDROID) 3277b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens glViewport(0, 0, m_pShell->m_pShellData->nShellDimX, m_pShell->m_pShellData->nShellDimY); 3287b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#endif 3297b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens /* 3307b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens Done - activate requested features 3317b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens */ 3327b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 3337b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#if defined(BUILD_OGLES) || defined(BUILD_OGLES2) 3347b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens //Get the discardframebufferEXT function. 3357b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens { 3367b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens //Get the gl extension string 3377b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens const char* strExtensions = (const char*)glGetString(GL_EXTENSIONS); 3387b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 3397b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens //Get the length of the string we're searching for 3407b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens const size_t strLength = strlen("GL_EXT_discard_framebuffer"); 3417b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 3427b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens //Get the string position 3437b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens const char* position = strstr(strExtensions,"GL_EXT_discard_framebuffer"); 3447b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 3457b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens //Loop through until we find the actual extension, avoiding substrings. 3467b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens while (position!=NULL && position[strLength]!='\0' && position[strLength]!=' ') 3477b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens { 3487b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens position = strstr(position+strLength,"GL_EXT_discard_framebuffer"); 3497b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens } 3507b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 3517b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens //Initialise the extension if it's found. 3527b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens if (position != NULL) 3537b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens { 3547b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens glDiscardFramebufferEXT = (PFNGLDISCARDFRAMEBUFFEREXTPROC)eglGetProcAddress("glDiscardFramebufferEXT"); 3557b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens } 3567b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens else 3577b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens { 3587b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens glDiscardFramebufferEXT = NULL; 3597b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens } 3607b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens } 3617b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#endif 3627b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens ApiActivatePreferences(); 3637b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens return true; 3647b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens} 3657b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 3667b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!*********************************************************************** 3677b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function OutputAPIInfo 3687b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@description When prefOutputInfo is set to true this function outputs 3697b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens various pieces of API dependent information via 3707b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens PVRShellOutputDebug. 3717b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/ 3727b21f276fa91ad62fd2055844688b07829f12205Nicolas Capensvoid PVRShellInit::OutputAPIInfo() 3737b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{ 3747b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens // Output API dependent information 3757b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens if(m_pShell->PVRShellGet(prefOutputInfo)) 3767b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens { 3777b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens EGLint i32Values[5]; 3787b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 3797b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens m_pShell->PVRShellOutputDebug("\n"); 3807b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 3817b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens m_pShell->PVRShellOutputDebug("GL:\n"); 3827b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens m_pShell->PVRShellOutputDebug(" Vendor: %s\n", (char*) glGetString(GL_VENDOR)); 3837b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens m_pShell->PVRShellOutputDebug(" Renderer: %s\n", (char*) glGetString(GL_RENDERER)); 3847b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens m_pShell->PVRShellOutputDebug(" Version: %s\n", (char*) glGetString(GL_VERSION)); 3857b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens m_pShell->PVRShellOutputDebug(" Extensions: "); 3867b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 3877b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#if defined(BUILD_OGL) 3887b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens //Get the glGetString process. 3897b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens typedef const GLubyte* (KHRONOS_APIENTRY * PFNGLGETSTRINGIPROC)(GLenum name, GLuint index); 3907b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens PFNGLGETSTRINGIPROC glGetStringi = (PFNGLGETSTRINGIPROC)eglGetProcAddress("glGetStringi"); 3917b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 3927b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens //If we've successfully got the new way to query the string, then go ahead and use this. 3937b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens if (glGetStringi) 3947b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens { 3957b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#ifndef GL_NUM_EXTENSIONS 3967b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#define GL_NUM_EXTENSIONS 0x821D 3977b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#endif 3987b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens GLint numExtensions; 3997b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens glGetIntegerv(GL_NUM_EXTENSIONS,&numExtensions); 4007b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 4017b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens for (GLint i=0; i<numExtensions; ++i) 4027b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens { 4037b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens m_pShell->PVRShellOutputDebug((const char*)glGetStringi(GL_EXTENSIONS,i)); 4047b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens m_pShell->PVRShellOutputDebug(" "); 4057b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens } 4067b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens } 4077b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#else 4087b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens m_pShell->PVRShellOutputDebug("%s\n", (char*) glGetString(GL_EXTENSIONS)); 4097b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#endif 4107b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 4117b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens m_pShell->PVRShellOutputDebug("\n"); 4127b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 4137b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens m_pShell->PVRShellOutputDebug("\n"); 4147b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens m_pShell->PVRShellOutputDebug("EGL:\n"); 4157b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens m_pShell->PVRShellOutputDebug(" Vendor: %s\n" , (char*) eglQueryString(m_EGLDisplay, EGL_VENDOR)); 4167b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens m_pShell->PVRShellOutputDebug(" Version: %s\n" , (char*) eglQueryString(m_EGLDisplay, EGL_VERSION)); 4177b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens m_pShell->PVRShellOutputDebug(" Extensions: %s\n" , (char*) eglQueryString(m_EGLDisplay, EGL_EXTENSIONS)); 4187b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 4197b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens if(eglQueryContext(m_EGLDisplay, m_EGLContext, EGL_CONTEXT_PRIORITY_LEVEL_IMG, &i32Values[0])) 4207b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens { 4217b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens switch(i32Values[0]) 4227b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens { 4237b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens case EGL_CONTEXT_PRIORITY_HIGH_IMG: m_pShell->PVRShellOutputDebug(" Context priority: High\n"); break; 4247b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens case EGL_CONTEXT_PRIORITY_MEDIUM_IMG: m_pShell->PVRShellOutputDebug(" Context priority: Medium\n");break; 4257b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens case EGL_CONTEXT_PRIORITY_LOW_IMG: m_pShell->PVRShellOutputDebug(" Context priority: Low\n"); break; 4267b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens default: m_pShell->PVRShellOutputDebug(" Context priority: Unrecognised.\n"); break; 4277b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens } 4287b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens } 4297b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens else 4307b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens { 4317b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens eglGetError(); // Clear error 4327b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens m_pShell->PVRShellOutputDebug(" Context priority: Unsupported\n"); 4337b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens } 4347b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 4357b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#ifdef EGL_VERSION_1_2 4367b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens m_pShell->PVRShellOutputDebug(" Client APIs: %s\n" , (char*) eglQueryString(m_EGLDisplay, EGL_CLIENT_APIS)); 4377b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#endif 4387b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 4397b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens m_pShell->PVRShellOutputDebug("\n"); 4407b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens m_pShell->PVRShellOutputDebug("Window Width: %i\n" , m_pShell->PVRShellGet(prefWidth)); 4417b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens m_pShell->PVRShellOutputDebug("Window Height: %i\n" , m_pShell->PVRShellGet(prefHeight)); 4427b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens m_pShell->PVRShellOutputDebug("Is Rotated: %s\n", m_pShell->PVRShellGet(prefIsRotated) ? "Yes" : "No"); 4437b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens m_pShell->PVRShellOutputDebug("\n"); 4447b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 4457b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens // EGLSurface details 4467b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens m_pShell->PVRShellOutputDebug("EGL Surface:\n"); 4477b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens eglGetConfigAttrib(m_EGLDisplay, m_EGLConfig, EGL_CONFIG_ID , &i32Values[0]); 4487b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens m_pShell->PVRShellOutputDebug(" Config ID: %i\n", i32Values[0]); 4497b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 4507b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens // Colour buffer 4517b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens eglGetConfigAttrib(m_EGLDisplay, m_EGLConfig, EGL_BUFFER_SIZE , &i32Values[0]); 4527b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens eglGetConfigAttrib(m_EGLDisplay, m_EGLConfig, EGL_RED_SIZE , &i32Values[1]); 4537b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens eglGetConfigAttrib(m_EGLDisplay, m_EGLConfig, EGL_GREEN_SIZE , &i32Values[2]); 4547b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens eglGetConfigAttrib(m_EGLDisplay, m_EGLConfig, EGL_BLUE_SIZE , &i32Values[3]); 4557b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens eglGetConfigAttrib(m_EGLDisplay, m_EGLConfig, EGL_ALPHA_SIZE , &i32Values[4]); 4567b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens m_pShell->PVRShellOutputDebug(" Colour Buffer: %i bits (R%i G%i B%i A%i)\n", i32Values[0],i32Values[1],i32Values[2],i32Values[3],i32Values[4]); 4577b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 4587b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens // Depth buffer 4597b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens eglGetConfigAttrib(m_EGLDisplay, m_EGLConfig, EGL_DEPTH_SIZE , &i32Values[0]); 4607b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens m_pShell->PVRShellOutputDebug(" Depth Buffer: %i bits\n", i32Values[0]); 4617b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 4627b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens // Stencil Buffer 4637b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens eglGetConfigAttrib(m_EGLDisplay, m_EGLConfig, EGL_STENCIL_SIZE , &i32Values[0]); 4647b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens m_pShell->PVRShellOutputDebug(" Stencil Buffer: %i bits\n", i32Values[0]); 4657b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 4667b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens // EGL surface bits support 4677b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens eglGetConfigAttrib(m_EGLDisplay, m_EGLConfig, EGL_SURFACE_TYPE , &i32Values[0]); 4687b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens m_pShell->PVRShellOutputDebug(" Surface type: %s%s%s\n", i32Values[0] & EGL_WINDOW_BIT ? "WINDOW " : "", 4697b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens i32Values[1] & EGL_PBUFFER_BIT ? "PBUFFER " : "", 4707b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens i32Values[2] & EGL_PIXMAP_BIT ? "PIXMAP " : ""); 4717b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens // EGL renderable type 4727b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#ifdef EGL_VERSION_1_2 4737b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens eglGetConfigAttrib(m_EGLDisplay, m_EGLConfig, EGL_RENDERABLE_TYPE , &i32Values[0]); 4747b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens m_pShell->PVRShellOutputDebug(" Renderable type: %s%s%s%s\n", i32Values[0] & EGL_OPENVG_BIT ? "OPENVG " : "", 4757b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens i32Values[0] & EGL_OPENGL_ES_BIT ? "OPENGL_ES " : "", 4767b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#ifdef EGL_OPENGL_BIT 4777b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens i32Values[0] & EGL_OPENGL_BIT ? "OPENGL " : 4787b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#endif 4797b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens "", 4807b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens i32Values[0] & EGL_OPENGL_ES2_BIT ? "OPENGL_ES2 " : ""); 4817b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#endif 4827b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 4837b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens eglGetConfigAttrib(m_EGLDisplay, m_EGLConfig, EGL_SAMPLE_BUFFERS , &i32Values[0]); 4847b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens eglGetConfigAttrib(m_EGLDisplay, m_EGLConfig, EGL_SAMPLES , &i32Values[1]); 4857b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens m_pShell->PVRShellOutputDebug(" Sample buffer No.: %i\n", i32Values[0]); 4867b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens m_pShell->PVRShellOutputDebug(" Samples per pixel: %i\n", i32Values[1]); 4877b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens } 4887b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens} 4897b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 4907b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!*********************************************************************** 4917b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Function ApiReleaseAPI 4927b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @description Releases all resources allocated by the API. 4937b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/ 4947b21f276fa91ad62fd2055844688b07829f12205Nicolas Capensvoid PVRShellInit::ApiReleaseAPI() 4957b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{ 4967b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens eglSwapBuffers(m_EGLDisplay, m_EGLWindow); 4977b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens eglMakeCurrent(m_EGLDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); 4987b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens eglDestroyContext(m_EGLDisplay, m_EGLContext); 4997b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens eglDestroySurface(m_EGLDisplay, m_EGLWindow); 5007b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens eglTerminate(m_EGLDisplay); 5017b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens} 5027b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 5037b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/******************************************************************************* 5047b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens * Function Name : SelectEGLConfiguration 5057b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens * Inputs : pData 5067b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens * Returns : EGLConfig 5077b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens * Description : Find the config to use for EGL initialisation 5087b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens *******************************************************************************/ 5097b21f276fa91ad62fd2055844688b07829f12205Nicolas CapensEGLConfig PVRShellInitAPI::SelectEGLConfiguration(const PVRShellData * const pData) 5107b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{ 5117b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens EGLint num_config; 5127b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens EGLint conflist[32]; 5137b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens EGLConfig conf = (EGLConfig) 0; 5147b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens int i = 0; 5157b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 5167b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens // Specific config ID requested? 5177b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens if (m_iRequestedConfig > 0) 5187b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens { 5197b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens conflist[i++] = EGL_CONFIG_ID; 5207b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens conflist[i++] = m_iRequestedConfig; 5217b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens conflist[i++] = EGL_NONE; 5227b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens if(!eglChooseConfig(m_EGLDisplay, conflist, &conf, 1, &num_config) || num_config != 1) 5237b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens { 5247b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens return 0; 5257b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens } 5267b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens return conf; 5277b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens } 5287b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 5297b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens // Select default configuration 5307b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#if defined(ANDROID) 5317b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens if(pData->nColorBPP == 32) 5327b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens { 5337b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens conflist[i++] = EGL_RED_SIZE; 5347b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens conflist[i++] = 8; 5357b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens conflist[i++] = EGL_GREEN_SIZE; 5367b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens conflist[i++] = 8; 5377b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens conflist[i++] = EGL_BLUE_SIZE; 5387b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens conflist[i++] = 8; 5397b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens conflist[i++] = EGL_ALPHA_SIZE; 5407b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens conflist[i++] = 8; 5417b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens } 5427b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens else 5437b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens { 5447b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens conflist[i++] = EGL_RED_SIZE; 5457b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens conflist[i++] = 5; 5467b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens conflist[i++] = EGL_GREEN_SIZE; 5477b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens conflist[i++] = 6; 5487b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens conflist[i++] = EGL_BLUE_SIZE; 5497b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens conflist[i++] = 5; 5507b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens conflist[i++] = EGL_ALPHA_SIZE; 5517b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens conflist[i++] = 0; 5527b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens } 5537b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#else 5547b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens conflist[i++] = EGL_BUFFER_SIZE; 5557b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens conflist[i++] = pData->nColorBPP; 5567b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#endif 5577b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 5587b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens if(pData->bNeedZbuffer || pData->nDepthBPP > 0) 5597b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens { 5607b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens conflist[i++] = EGL_DEPTH_SIZE; 5617b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens conflist[i++] = (pData->nDepthBPP > 0) ? pData->nDepthBPP : 16; 5627b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens } 5637b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 5647b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens if(pData->bNeedStencilBuffer) 5657b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens { 5667b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens conflist[i++] = EGL_STENCIL_SIZE; 5677b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens conflist[i++] = 8; 5687b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens } 5697b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 5707b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens conflist[i++] = EGL_SURFACE_TYPE; 5717b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens conflist[i] = EGL_WINDOW_BIT; 5727b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 5737b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens if(pData->bNeedPbuffer) 5747b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens { 5757b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens conflist[i] |= EGL_PBUFFER_BIT; 5767b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens } 5777b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 5787b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens if(pData->bNeedPixmap) 5797b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens { 5807b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens conflist[i] |= EGL_PIXMAP_BIT; 5817b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens } 5827b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 5837b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens ++i; 5847b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 5857b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#if defined(BUILD_OGL) 5867b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens conflist[i++] = EGL_RENDERABLE_TYPE; 5877b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens conflist[i++] = EGL_OPENGL_BIT; 5887b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#elif defined(EGL_VERSION_1_3) && defined(GL_ES_VERSION_2_0) 5897b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens conflist[i++] = EGL_RENDERABLE_TYPE; 5907b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens conflist[i++] = EGL_OPENGL_ES2_BIT; 5917b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#endif 5927b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 5937b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens // Append number of number of samples depending on AA samples value set 5947b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens if(pData->nAASamples > 0) 5957b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens { 5967b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens conflist[i++] = EGL_SAMPLE_BUFFERS; 5977b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens conflist[i++] = 1; 5987b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens conflist[i++] = EGL_SAMPLES; 5997b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens conflist[i++] = pData->nAASamples; 6007b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens } 6017b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens else 6027b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens { 6037b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens conflist[i++] = EGL_SAMPLE_BUFFERS; 6047b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens conflist[i++] = 0; 6057b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens } 6067b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 6077b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#if defined(EWS) || defined(__QNXNTO__) 6087b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens if(m_NWT != NULL) 6097b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens { 6107b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens EGLint r,g,b,a, value; 6117b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens EGLint i32Total_num_configs, j; 6127b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens EGLConfig *pConfigs; 6137b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 6147b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens // Some platforms require an egl config to have the same pixel format as the native window because 6157b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens // pixel format conversion is prohibited. 6167b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#if defined(EWS) 6177b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens int format = EWS_PIXEL_FORMAT_RGB_565; 6187b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens r = 5; g = 6; b = 5; a = 0; 6197b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#else 6207b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens r = g = b = a = 8; 6217b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#endif 6227b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 6237b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens conflist[i++] = EGL_RED_SIZE; 6247b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens conflist[i++] = r; 6257b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 6267b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens conflist[i++] = EGL_GREEN_SIZE; 6277b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens conflist[i++] = g; 6287b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 6297b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens conflist[i++] = EGL_BLUE_SIZE; 6307b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens conflist[i++] = b; 6317b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 6327b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens conflist[i++] = EGL_ALPHA_SIZE; 6337b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens conflist[i++] = a; 6347b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 6357b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens // Terminate the list with EGL_NONE 6367b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens conflist[i++] = EGL_NONE; 6377b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 6387b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens // Find out how many configs there are in total that match our criteria 6397b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens if(!eglChooseConfig(m_EGLDisplay, conflist, NULL, 0, &i32Total_num_configs) || i32Total_num_configs == 0) 6407b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens return 0; 6417b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 6427b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens // Allocate an array large enough to store all the possible configs that may be returned 6437b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens pConfigs = new EGLConfig[i32Total_num_configs]; 6447b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 6457b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens if(!pConfigs) 6467b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens return 0; 6477b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 6487b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens // Get all the configs that match our criteria 6497b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens if(!eglChooseConfig(m_EGLDisplay, conflist, pConfigs, i32Total_num_configs, &num_config)) 6507b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens { 6517b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens delete[] pConfigs; 6527b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens return 0; 6537b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens } 6547b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 6557b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens // Go through the returned configs and try and find a suitable match 6567b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens for(j = 0; j < num_config; ++j) 6577b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens { 6587b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#if defined(__QNXNTO__) 6597b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens if((eglGetConfigAttrib(m_EGLDisplay, pConfigs[j], EGL_RED_SIZE, &value) && value == r) 6607b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens && (eglGetConfigAttrib(m_EGLDisplay, pConfigs[j], EGL_GREEN_SIZE, &value) && value == g) 6617b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens && (eglGetConfigAttrib(m_EGLDisplay, pConfigs[j], EGL_BLUE_SIZE, &value) && value == b) 6627b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens && (eglGetConfigAttrib(m_EGLDisplay, pConfigs[j], EGL_ALPHA_SIZE, &value) && value == a)) 6637b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens { 6647b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens conf = pConfigs[j]; 6657b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens break; 6667b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens } 6677b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#else 6687b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#if defined (EWS) 6697b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens eglGetConfigAttrib(m_EGLDisplay, pConfigs[j], EGL_NATIVE_VISUAL_ID, &value); 6707b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens if (value == format) 6717b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens { 6727b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens conf = pConfigs[j]; 6737b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens break; 6747b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens } 6757b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#endif 6767b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#endif 6777b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens } 6787b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 6797b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens // Tidy up 6807b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens delete[] pConfigs; 6817b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens } 6827b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens else 6837b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#endif 6847b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens { 6857b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens // Terminate the list with EGL_NONE 6867b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens conflist[i++] = EGL_NONE; 6877b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 6887b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens // Return null config if config is not found 6897b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens if(!eglChooseConfig(m_EGLDisplay, conflist, &conf, 1, &num_config) || num_config != 1) 6907b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens { 6917b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens return 0; 6927b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens } 6937b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens } 6947b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 6957b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens // Return config index 6967b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens return conf; 6977b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens} 6987b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 6997b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/******************************************************************************* 7007b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens * Function Name : StringFrom_eglGetError 7017b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens * Returns : A string 7027b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens * Description : Returns a string representation of an egl error 7037b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens *******************************************************************************/ 7047b21f276fa91ad62fd2055844688b07829f12205Nicolas Capensconst char *PVRShellInitAPI::StringFrom_eglGetError() const 7057b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{ 7067b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens EGLint nErr = eglGetError(); 7077b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 7087b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens switch(nErr) 7097b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens { 7107b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens case EGL_SUCCESS: 7117b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens return "EGL_SUCCESS"; 7127b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens case EGL_BAD_DISPLAY: 7137b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens return "EGL_BAD_DISPLAY"; 7147b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens case EGL_NOT_INITIALIZED: 7157b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens return "EGL_NOT_INITIALIZED"; 7167b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens case EGL_BAD_ACCESS: 7177b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens return "EGL_BAD_ACCESS"; 7187b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens case EGL_BAD_ALLOC: 7197b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens return "EGL_BAD_ALLOC"; 7207b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens case EGL_BAD_ATTRIBUTE: 7217b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens return "EGL_BAD_ATTRIBUTE"; 7227b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens case EGL_BAD_CONFIG: 7237b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens return "EGL_BAD_CONFIG"; 7247b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens case EGL_BAD_CONTEXT: 7257b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens return "EGL_BAD_CONTEXT"; 7267b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens case EGL_BAD_CURRENT_SURFACE: 7277b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens return "EGL_BAD_CURRENT_SURFACE"; 7287b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens case EGL_BAD_MATCH: 7297b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens return "EGL_BAD_MATCH"; 7307b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens case EGL_BAD_NATIVE_PIXMAP: 7317b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens return "EGL_BAD_NATIVE_PIXMAP"; 7327b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens case EGL_BAD_NATIVE_WINDOW: 7337b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens return "EGL_BAD_NATIVE_WINDOW"; 7347b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens case EGL_BAD_PARAMETER: 7357b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens return "EGL_BAD_PARAMETER"; 7367b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens case EGL_BAD_SURFACE: 7377b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens return "EGL_BAD_SURFACE"; 7387b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens default: 7397b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens return "unknown"; 7407b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens } 7417b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens} 7427b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 7437b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!*********************************************************************** 7447b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Function ApiScreenCaptureBuffer 7457b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input Width Width of the region to capture 7467b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input Height Height of the region to capture 7477b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@Input pBuf A buffer to put the screen capture into 7487b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens@description API-specific function to store the current content of the 7497b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens FrameBuffer into the memory allocated by the user. 7507b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/ 7517b21f276fa91ad62fd2055844688b07829f12205Nicolas Capensbool PVRShellInit::ApiScreenCaptureBuffer(int Width,int Height,unsigned char *pBuf) 7527b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{ 7537b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens unsigned char *pLines2; 7547b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens int i, j; 7557b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens bool bRet = true; 7567b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 7577b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens /* Allocate memory for line */ 7587b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens pLines2 = (unsigned char *)calloc(4 * Width * Height, sizeof(unsigned char)); 7597b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens if (!pLines2) return false; 7607b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 7617b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens while (glGetError()); 7627b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens /* Read line from frame buffer */ 7637b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens glReadPixels(0, 0, Width, Height, GL_RGBA, GL_UNSIGNED_BYTE, pLines2); 7647b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 7657b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens if(glGetError()) 7667b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens { 7677b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens bRet = false; 7687b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens } 7697b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens else 7707b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens { 7717b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens /* Convert RGB to BGR in line */ 7727b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens for (j = 0, i = 0; j < 4 * Width * Height; j += 4, i += 3) 7737b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens { 7747b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens pBuf[i] = pLines2[j+2]; 7757b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens pBuf[i+1] = pLines2[j+1]; 7767b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens pBuf[i+2] = pLines2[j]; 7777b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens } 7787b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens } 7797b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 7807b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens free(pLines2); 7817b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens return bRet; 7827b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens} 7837b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 7847b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!*********************************************************************** 7857b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Function ApiRenderComplete 7867b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @description Perform API operations required after a frame has finished (e.g., flipping). 7877b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/ 7887b21f276fa91ad62fd2055844688b07829f12205Nicolas Capensvoid PVRShellInit::ApiRenderComplete() 7897b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{ 7907b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 7917b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#if defined(BUILD_OGLES) || defined(BUILD_OGLES2) || defined(BUILD_OGLES3) 7927b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens //Discard the framebuffer if set. 7937b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#if !defined(BUILD_OGLES3) 7947b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens if (glDiscardFramebufferEXT) 7957b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#endif 7967b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens { 7977b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens const GLint numAttachments=3; 7987b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens GLenum attachments[numAttachments]; 7997b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens GLint currentAttachment=0; 8007b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens if (m_pShell->PVRShellGet(prefDiscardColor)) 8017b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens { 8027b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens attachments[currentAttachment] = GL_COLOR_EXT; 8037b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens currentAttachment++; 8047b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens } 8057b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens if (m_pShell->PVRShellGet(prefDiscardDepth)) 8067b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens { 8077b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens attachments[currentAttachment] = GL_DEPTH_EXT; 8087b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens currentAttachment++; 8097b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens } 8107b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens if (m_pShell->PVRShellGet(prefDiscardStencil)) 8117b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens { 8127b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens attachments[currentAttachment] = GL_STENCIL_EXT; 8137b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens currentAttachment++; 8147b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens } 8157b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens //Assuming some attachments have been chosen, discard/invalidate them. 8167b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens if (currentAttachment!=0) 8177b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens { 8187b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#if defined(BUILD_OGLES) 8197b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens glDiscardFramebufferEXT(GL_FRAMEBUFFER_OES, currentAttachment, attachments); 8207b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#elif defined(BUILD_OGLES2) 8217b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens glDiscardFramebufferEXT(GL_FRAMEBUFFER, currentAttachment, attachments); 8227b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#elif defined(BUILD_OGLES3) 8237b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens glInvalidateFramebuffer(GL_FRAMEBUFFER, currentAttachment, attachments); 8247b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#endif 8257b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens } 8267b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens } 8277b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#endif 8287b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 8297b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens bool bRes; 8307b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 8317b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens if(m_pShell->m_pShellData->bNeedPixmap) 8327b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens { 8337b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens /* 8347b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens "Clients rendering to single buffered surfaces (e.g. pixmap surfaces) 8357b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens should call eglWaitGL before accessing the native pixmap from the client." 8367b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens */ 8377b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens eglWaitGL(); 8387b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 8397b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens // Pixmap support: Copy the rendered pixmap to the display 8407b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens if(m_pShell->m_pShellData->bNeedPixmapDisableCopy) 8417b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens { 8427b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens bRes = true; 8437b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens } 8447b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens else 8457b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens { 8467b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens bRes = OsPixmapCopy(); 8477b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens } 8487b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens } 8497b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens else 8507b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens { 8517b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens if(m_pShell->m_pShellData->bNoShellSwapBuffer) 8527b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens return; 8537b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 8547b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens bRes = (eglSwapBuffers (m_EGLDisplay, m_EGLWindow) == EGL_TRUE); 8557b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens } 8567b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 8577b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens if(!bRes) 8587b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens { 8597b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens // check for context loss 8607b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#ifdef EGL_VERSION_1_3 8617b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens if(eglGetError() == EGL_CONTEXT_LOST) 8627b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#else 8637b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens if((eglGetError() == EGL_CONTEXT_LOST_IMG) && m_bPowerManagementSupported) 8647b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#endif 8657b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens { 8667b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens m_pShell->ReleaseView(); 8677b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 8687b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens OsDoReleaseAPI(); 8697b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens if(ApiInitAPI()) 8707b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens { 8717b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens m_pShell->InitView(); 8727b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens } 8737b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens } 8747b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens else 8757b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens { 8767b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens if(m_pShell->m_pShellData->bNeedPixmap) 8777b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens m_pShell->PVRShellOutputDebug("failed to copy pixmap\n"); 8787b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens else 8797b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens m_pShell->PVRShellOutputDebug("eglSwapBuffers failed\n"); 8807b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens } 8817b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens } 8827b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens} 8837b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 8847b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!*********************************************************************** 8857b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Function ApiSet 8867b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Input prefName Name of value to set 8877b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Modified i32Value Value to set it to 8887b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @description Set parameters which are specific to the API. 8897b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/ 8907b21f276fa91ad62fd2055844688b07829f12205Nicolas Capensbool PVRShellInit::ApiSet(const prefNameIntEnum prefName, const int i32Value) 8917b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{ 8927b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens switch(prefName) 8937b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens { 8947b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#ifdef EGL_VERSION_1_1 8957b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens case prefSwapInterval: 8967b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens m_pShell->m_pShellData->nSwapInterval = i32Value; 8977b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens return true; 8987b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#endif 8997b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#if defined(BUILD_OGLES) || defined(BUILD_OGLES2) || defined(BUILD_OGLES3) 9007b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens case prefPriority: 9017b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens m_pShell->m_pShellData->nPriority = i32Value; 9027b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens return true; 9037b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens#endif 9047b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens case prefRequestedConfig: 9057b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens m_iRequestedConfig = (EGLint) i32Value; 9067b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens return true; 9077b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 9087b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens default: 9097b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens return false; 9107b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens } 9117b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens} 9127b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 9137b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!*********************************************************************** 9147b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Function ApiGet 9157b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Input prefName Name of value to get 9167b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Modified pn A pointer set to the value asked for 9177b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @description Get parameters which are specific to the API. 9187b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/ 9197b21f276fa91ad62fd2055844688b07829f12205Nicolas Capensbool PVRShellInit::ApiGet(const prefNameIntEnum prefName, int *pn) 9207b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{ 9217b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens switch(prefName) 9227b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens { 9237b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens case prefEGLMajorVersion: 9247b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens *pn = (int) m_MajorVersion; 9257b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens return true; 9267b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 9277b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens case prefEGLMinorVersion: 9287b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens *pn = (int) m_MinorVersion; 9297b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens return true; 9307b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 9317b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens case prefRequestedConfig: 9327b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens *pn = (int) m_iRequestedConfig; 9337b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens return true; 9347b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 9357b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens case prefConfig: 9367b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens *pn = (int) m_iConfig; 9377b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens return true; 9387b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 9397b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens default: 9407b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens return false; 9417b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens } 9427b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens} 9437b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 9447b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/*!*********************************************************************** 9457b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Function ApiGet 9467b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Input prefName Name of value to get 9477b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @Modified pp A pointer set to the value asked for 9487b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens @description Get parameters which are specific to the API. 9497b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*************************************************************************/ 9507b21f276fa91ad62fd2055844688b07829f12205Nicolas Capensbool PVRShellInit::ApiGet(const prefNamePtrEnum prefName, void **pp) 9517b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{ 9527b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens switch(prefName) 9537b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens { 9547b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens case prefEGLDisplay: 9557b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens *pp = (void*)m_EGLDisplay; 9567b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens return true; 9577b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens case prefEGLSurface: 9587b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens *pp = (void*)m_EGLWindow; 9597b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens return true; 9607b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens default: 9617b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens return false; 9627b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens } 9637b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens} 9647b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 9657b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/**************************************************************************** 9667b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens** Local code 9677b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens****************************************************************************/ 9687b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 9697b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens// The recommended technique for querying OpenGL extensions; 9707b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens// adapted from http://opengl.org/resources/features/OGLextensions/ 9717b21f276fa91ad62fd2055844688b07829f12205Nicolas Capensstatic bool PVRShellIsExtensionSupported(EGLDisplay dpy, const char *extension) 9727b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens{ 9737b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens // The recommended technique for querying EGL extensions matches OpenGLES; 9747b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens // from http://opengl.org/resources/features/OGLextensions/ 9757b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens const char *extensions = NULL; 9767b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens const char *start; 9777b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens char *terminator; 9787b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 9797b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens /* Extension names should not have spaces. */ 9807b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens char* where = (char *) strchr(extension, ' '); 9817b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens if (where || *extension == '\0') 9827b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens return 0; 9837b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 9847b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens extensions = eglQueryString(dpy, EGL_EXTENSIONS); 9857b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens if(!extensions) 9867b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens return false; 9877b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 9887b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens /* It takes a bit of care to be fool-proof about parsing the 9897b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens OpenGL extensions string. Don't be fooled by sub-strings, etc. */ 9907b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens start = extensions; 9917b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens for (;;) { 9927b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens where = (char *) strstr((const char *) start, extension); 9937b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens if (!where) 9947b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens break; 9957b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens terminator = where + strlen(extension); 9967b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens if (where == start || *(where - 1) == ' ') 9977b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens if (*terminator == ' ' || *terminator == '\0') 9987b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens return true; 9997b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens start = terminator; 10007b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens } 10017b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens return false; 10027b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens} 10037b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 10047b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/// @endcond 10057b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 10067b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens/***************************************************************************** 10077b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens End of file (PVRShellAPI.cpp) 10087b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens*****************************************************************************/ 10097b21f276fa91ad62fd2055844688b07829f12205Nicolas Capens 1010