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