153365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi/*------------------------------------------------------------------------- 253365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi * drawElements Quality Program Tester Core 353365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi * ---------------------------------------- 453365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi * 553365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi * Copyright 2014 The Android Open Source Project 653365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi * 753365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi * Licensed under the Apache License, Version 2.0 (the "License"); 853365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi * you may not use this file except in compliance with the License. 953365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi * You may obtain a copy of the License at 1053365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi * 1153365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi * http://www.apache.org/licenses/LICENSE-2.0 1253365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi * 1353365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi * Unless required by applicable law or agreed to in writing, software 1453365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi * distributed under the License is distributed on an "AS IS" BASIS, 1553365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1653365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi * See the License for the specific language governing permissions and 1753365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi * limitations under the License. 1853365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi * 1953365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi *//*! 2053365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi * \file 2153365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi * \brief EGL utilities for interfacing with GL APIs. 2253365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi *//*--------------------------------------------------------------------*/ 2353365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi 2453365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi#include "egluGLUtil.hpp" 2553365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi 2653365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi#include "egluUtil.hpp" 273c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos#include "eglwLibrary.hpp" 283c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos#include "eglwEnums.hpp" 2953365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi#include "glwEnums.hpp" 3053365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi 3153365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi#include <vector> 3253365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi 3353365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärviusing std::vector; 3453365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi 3553365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvinamespace eglu 3653365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi{ 3753365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi 383c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulosusing namespace eglw; 393c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos 4053365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärviglw::GLenum getImageGLTarget (EGLenum source) 4153365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi{ 4253365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi switch (source) 4353365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi { 4453365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi case EGL_GL_TEXTURE_2D_KHR: return GL_TEXTURE_2D; 4553365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR: return GL_TEXTURE_CUBE_MAP_POSITIVE_X; 4653365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y_KHR: return GL_TEXTURE_CUBE_MAP_POSITIVE_Y; 4753365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z_KHR: return GL_TEXTURE_CUBE_MAP_POSITIVE_Z; 4853365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X_KHR: return GL_TEXTURE_CUBE_MAP_NEGATIVE_X; 4953365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_KHR: return GL_TEXTURE_CUBE_MAP_NEGATIVE_Y; 5053365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_KHR: return GL_TEXTURE_CUBE_MAP_NEGATIVE_Z; 5153365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi case EGL_GL_TEXTURE_3D_KHR: return GL_TEXTURE_3D; 5253365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi case EGL_GL_RENDERBUFFER_KHR: return GL_RENDERBUFFER; 531cc61b7d03cad727bbddd00cea8d78f4f6cc9047Jarkko Pöyry default: DE_FATAL("Impossible"); return GL_NONE; 5453365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi } 5553365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi} 5653365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi 5753365959f2740e7b9ed59c51adbb73372f908a09Mika IsojärviEGLint apiRenderableType (glu::ApiType apiType) 5853365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi{ 5953365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi switch (apiType.getProfile()) 6053365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi { 6153365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi case glu::PROFILE_CORE: 6253365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi case glu::PROFILE_COMPATIBILITY: 6353365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi return EGL_OPENGL_BIT; 6453365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi case glu::PROFILE_ES: 6553365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi switch (apiType.getMajorVersion()) 6653365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi { 6753365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi case 1: return EGL_OPENGL_ES_BIT; 6853365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi case 2: return EGL_OPENGL_ES2_BIT; 6953365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi case 3: return EGL_OPENGL_ES3_BIT_KHR; 701cc61b7d03cad727bbddd00cea8d78f4f6cc9047Jarkko Pöyry default: DE_FATAL("Unknown OpenGL ES version"); 7153365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi } 7253365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi default: 731cc61b7d03cad727bbddd00cea8d78f4f6cc9047Jarkko Pöyry DE_FATAL("Unknown GL API"); 7453365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi } 7553365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi 7653365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi return 0; 7753365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi} 7853365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi 793c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry HaulosEGLContext createGLContext (const Library& egl, EGLDisplay display, EGLContext eglConfig, const glu::ContextType& contextType) 8053365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi{ 813c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos const bool khrCreateContextSupported = hasExtension(egl, display, "EGL_KHR_create_context"); 8253365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi EGLContext context = EGL_NO_CONTEXT; 8353365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi EGLenum api = EGL_NONE; 8453365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi vector<EGLint> attribList; 8553365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi 8653365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi if (glu::isContextTypeES(contextType)) 8753365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi { 8853365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi api = EGL_OPENGL_ES_API; 8953365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi 9053365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi if (contextType.getMajorVersion() <= 2) 9153365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi { 9253365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi attribList.push_back(EGL_CONTEXT_CLIENT_VERSION); 9353365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi attribList.push_back(contextType.getMajorVersion()); 9453365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi } 9553365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi else 9653365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi { 9753365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi if (!khrCreateContextSupported) 9853365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi throw tcu::NotSupportedError("EGL_KHR_create_context is required for OpenGL ES 3.0 and newer", DE_NULL, __FILE__, __LINE__); 9953365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi 10053365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi attribList.push_back(EGL_CONTEXT_MAJOR_VERSION_KHR); 10153365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi attribList.push_back(contextType.getMajorVersion()); 10253365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi attribList.push_back(EGL_CONTEXT_MINOR_VERSION_KHR); 10353365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi attribList.push_back(contextType.getMinorVersion()); 10453365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi } 10553365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi } 10653365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi else 10753365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi { 10853365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi DE_ASSERT(glu::isContextTypeGLCore(contextType) || glu::isContextTypeGLCompatibility(contextType)); 10953365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi 11053365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi if (!khrCreateContextSupported) 11153365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi throw tcu::NotSupportedError("EGL_KHR_create_context is required for OpenGL context creation", DE_NULL, __FILE__, __LINE__); 11253365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi 11353365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi api = EGL_OPENGL_API; 11453365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi 11553365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi attribList.push_back(EGL_CONTEXT_MAJOR_VERSION_KHR); 11653365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi attribList.push_back(contextType.getMajorVersion()); 11753365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi attribList.push_back(EGL_CONTEXT_MINOR_VERSION_KHR); 11853365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi attribList.push_back(contextType.getMinorVersion()); 11953365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi attribList.push_back(EGL_CONTEXT_OPENGL_PROFILE_MASK_KHR); 12053365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi attribList.push_back(glu::isContextTypeGLCore(contextType) ? EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT_KHR 12153365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi : EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT_KHR); 12253365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi } 12353365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi 12453365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi if (contextType.getFlags() != glu::ContextFlags(0)) 12553365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi { 12653365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi EGLint flags = 0; 12753365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi 12853365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi if (!khrCreateContextSupported) 12953365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi throw tcu::NotSupportedError("EGL_KHR_create_context is required for creating robust/debug/forward-compatible contexts"); 13053365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi 13153365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi if ((contextType.getFlags() & glu::CONTEXT_DEBUG) != 0) 13253365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi flags |= EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR; 13353365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi 13453365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi if ((contextType.getFlags() & glu::CONTEXT_ROBUST) != 0) 13553365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi flags |= EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR; 13653365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi 13753365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi if ((contextType.getFlags() & glu::CONTEXT_FORWARD_COMPATIBLE) != 0) 13853365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi { 13953365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi if (!glu::isContextTypeGLCore(contextType)) 14053365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi throw tcu::NotSupportedError("Only OpenGL core contexts can be forward-compatible"); 14153365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi 14253365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi flags |= EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE_BIT_KHR; 14353365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi } 14453365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi 14553365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi attribList.push_back(EGL_CONTEXT_FLAGS_KHR); 14653365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi attribList.push_back(flags); 14753365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi } 14853365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi 14953365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi attribList.push_back(EGL_NONE); 15053365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi 1513c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos EGLU_CHECK_CALL(egl, bindAPI(api)); 1523c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos context = egl.createContext(display, eglConfig, EGL_NO_CONTEXT, &(attribList[0])); 1533c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos EGLU_CHECK_MSG(egl, "eglCreateContext()"); 15453365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi 15553365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi return context; 15653365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi} 15753365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi 158bf44c5c30440b0c7a8c7c87f2b7c3ff984e77018Jarkko Pöyrystatic bool configMatches (const eglw::Library& egl, eglw::EGLDisplay display, eglw::EGLConfig eglConfig, const glu::RenderConfig& renderConfig) 159bf44c5c30440b0c7a8c7c87f2b7c3ff984e77018Jarkko Pöyry{ 160bf44c5c30440b0c7a8c7c87f2b7c3ff984e77018Jarkko Pöyry // \todo [2014-03-12 pyry] Check other attributes like double-buffer bit. 161bf44c5c30440b0c7a8c7c87f2b7c3ff984e77018Jarkko Pöyry 162bf44c5c30440b0c7a8c7c87f2b7c3ff984e77018Jarkko Pöyry { 163bf44c5c30440b0c7a8c7c87f2b7c3ff984e77018Jarkko Pöyry EGLint renderableType = 0; 164bf44c5c30440b0c7a8c7c87f2b7c3ff984e77018Jarkko Pöyry EGLint requiredRenderable = apiRenderableType(renderConfig.type.getAPI()); 165bf44c5c30440b0c7a8c7c87f2b7c3ff984e77018Jarkko Pöyry 166bf44c5c30440b0c7a8c7c87f2b7c3ff984e77018Jarkko Pöyry EGLU_CHECK_CALL(egl, getConfigAttrib(display, eglConfig, EGL_RENDERABLE_TYPE, &renderableType)); 167bf44c5c30440b0c7a8c7c87f2b7c3ff984e77018Jarkko Pöyry 168bf44c5c30440b0c7a8c7c87f2b7c3ff984e77018Jarkko Pöyry if ((renderableType & requiredRenderable) == 0) 169bf44c5c30440b0c7a8c7c87f2b7c3ff984e77018Jarkko Pöyry return false; 170bf44c5c30440b0c7a8c7c87f2b7c3ff984e77018Jarkko Pöyry } 171bf44c5c30440b0c7a8c7c87f2b7c3ff984e77018Jarkko Pöyry 172475cc0a88e23a8847cf2724cc292da978adf76c5Jarkko Pöyry if (renderConfig.surfaceType != glu::RenderConfig::SURFACETYPE_DONT_CARE) 173bf44c5c30440b0c7a8c7c87f2b7c3ff984e77018Jarkko Pöyry { 174bf44c5c30440b0c7a8c7c87f2b7c3ff984e77018Jarkko Pöyry EGLint surfaceType = 0; 175bf44c5c30440b0c7a8c7c87f2b7c3ff984e77018Jarkko Pöyry EGLint requiredSurface = 0; 176bf44c5c30440b0c7a8c7c87f2b7c3ff984e77018Jarkko Pöyry 177bf44c5c30440b0c7a8c7c87f2b7c3ff984e77018Jarkko Pöyry switch (renderConfig.surfaceType) 178bf44c5c30440b0c7a8c7c87f2b7c3ff984e77018Jarkko Pöyry { 179bf44c5c30440b0c7a8c7c87f2b7c3ff984e77018Jarkko Pöyry case glu::RenderConfig::SURFACETYPE_WINDOW: requiredSurface = EGL_WINDOW_BIT; break; 180bf44c5c30440b0c7a8c7c87f2b7c3ff984e77018Jarkko Pöyry case glu::RenderConfig::SURFACETYPE_OFFSCREEN_NATIVE: requiredSurface = EGL_PIXMAP_BIT; break; 181bf44c5c30440b0c7a8c7c87f2b7c3ff984e77018Jarkko Pöyry case glu::RenderConfig::SURFACETYPE_OFFSCREEN_GENERIC: requiredSurface = EGL_PBUFFER_BIT; break; 182bf44c5c30440b0c7a8c7c87f2b7c3ff984e77018Jarkko Pöyry default: 183bf44c5c30440b0c7a8c7c87f2b7c3ff984e77018Jarkko Pöyry DE_ASSERT(false); 184bf44c5c30440b0c7a8c7c87f2b7c3ff984e77018Jarkko Pöyry } 185bf44c5c30440b0c7a8c7c87f2b7c3ff984e77018Jarkko Pöyry 186bf44c5c30440b0c7a8c7c87f2b7c3ff984e77018Jarkko Pöyry EGLU_CHECK_CALL(egl, getConfigAttrib(display, eglConfig, EGL_SURFACE_TYPE, &surfaceType)); 187bf44c5c30440b0c7a8c7c87f2b7c3ff984e77018Jarkko Pöyry 188bf44c5c30440b0c7a8c7c87f2b7c3ff984e77018Jarkko Pöyry if ((surfaceType & requiredSurface) == 0) 189bf44c5c30440b0c7a8c7c87f2b7c3ff984e77018Jarkko Pöyry return false; 190bf44c5c30440b0c7a8c7c87f2b7c3ff984e77018Jarkko Pöyry } 191bf44c5c30440b0c7a8c7c87f2b7c3ff984e77018Jarkko Pöyry 192bf44c5c30440b0c7a8c7c87f2b7c3ff984e77018Jarkko Pöyry { 193bf44c5c30440b0c7a8c7c87f2b7c3ff984e77018Jarkko Pöyry static const struct 194bf44c5c30440b0c7a8c7c87f2b7c3ff984e77018Jarkko Pöyry { 195bf44c5c30440b0c7a8c7c87f2b7c3ff984e77018Jarkko Pöyry int glu::RenderConfig::*field; 196bf44c5c30440b0c7a8c7c87f2b7c3ff984e77018Jarkko Pöyry EGLint attrib; 197bf44c5c30440b0c7a8c7c87f2b7c3ff984e77018Jarkko Pöyry } s_attribs[] = 198bf44c5c30440b0c7a8c7c87f2b7c3ff984e77018Jarkko Pöyry { 199bf44c5c30440b0c7a8c7c87f2b7c3ff984e77018Jarkko Pöyry { &glu::RenderConfig::id, EGL_CONFIG_ID }, 200bf44c5c30440b0c7a8c7c87f2b7c3ff984e77018Jarkko Pöyry { &glu::RenderConfig::redBits, EGL_RED_SIZE }, 201bf44c5c30440b0c7a8c7c87f2b7c3ff984e77018Jarkko Pöyry { &glu::RenderConfig::greenBits, EGL_GREEN_SIZE }, 202bf44c5c30440b0c7a8c7c87f2b7c3ff984e77018Jarkko Pöyry { &glu::RenderConfig::blueBits, EGL_BLUE_SIZE }, 203bf44c5c30440b0c7a8c7c87f2b7c3ff984e77018Jarkko Pöyry { &glu::RenderConfig::alphaBits, EGL_ALPHA_SIZE }, 204bf44c5c30440b0c7a8c7c87f2b7c3ff984e77018Jarkko Pöyry { &glu::RenderConfig::depthBits, EGL_DEPTH_SIZE }, 205bf44c5c30440b0c7a8c7c87f2b7c3ff984e77018Jarkko Pöyry { &glu::RenderConfig::stencilBits, EGL_STENCIL_SIZE }, 206bf44c5c30440b0c7a8c7c87f2b7c3ff984e77018Jarkko Pöyry { &glu::RenderConfig::numSamples, EGL_SAMPLES }, 207bf44c5c30440b0c7a8c7c87f2b7c3ff984e77018Jarkko Pöyry }; 208bf44c5c30440b0c7a8c7c87f2b7c3ff984e77018Jarkko Pöyry 209bf44c5c30440b0c7a8c7c87f2b7c3ff984e77018Jarkko Pöyry for (int attribNdx = 0; attribNdx < DE_LENGTH_OF_ARRAY(s_attribs); attribNdx++) 210bf44c5c30440b0c7a8c7c87f2b7c3ff984e77018Jarkko Pöyry { 211bf44c5c30440b0c7a8c7c87f2b7c3ff984e77018Jarkko Pöyry if (renderConfig.*s_attribs[attribNdx].field != glu::RenderConfig::DONT_CARE) 212bf44c5c30440b0c7a8c7c87f2b7c3ff984e77018Jarkko Pöyry { 213bf44c5c30440b0c7a8c7c87f2b7c3ff984e77018Jarkko Pöyry EGLint value = 0; 214bf44c5c30440b0c7a8c7c87f2b7c3ff984e77018Jarkko Pöyry EGLU_CHECK_CALL(egl, getConfigAttrib(display, eglConfig, s_attribs[attribNdx].attrib, &value)); 215bf44c5c30440b0c7a8c7c87f2b7c3ff984e77018Jarkko Pöyry if (value != renderConfig.*s_attribs[attribNdx].field) 216bf44c5c30440b0c7a8c7c87f2b7c3ff984e77018Jarkko Pöyry return false; 217bf44c5c30440b0c7a8c7c87f2b7c3ff984e77018Jarkko Pöyry } 218bf44c5c30440b0c7a8c7c87f2b7c3ff984e77018Jarkko Pöyry } 219bf44c5c30440b0c7a8c7c87f2b7c3ff984e77018Jarkko Pöyry } 220bf44c5c30440b0c7a8c7c87f2b7c3ff984e77018Jarkko Pöyry 221bf44c5c30440b0c7a8c7c87f2b7c3ff984e77018Jarkko Pöyry return true; 222bf44c5c30440b0c7a8c7c87f2b7c3ff984e77018Jarkko Pöyry} 223bf44c5c30440b0c7a8c7c87f2b7c3ff984e77018Jarkko Pöyry 224bf44c5c30440b0c7a8c7c87f2b7c3ff984e77018Jarkko PöyryEGLConfig chooseConfig (const Library& egl, EGLDisplay display, const glu::RenderConfig& config) 225bf44c5c30440b0c7a8c7c87f2b7c3ff984e77018Jarkko Pöyry{ 226bf44c5c30440b0c7a8c7c87f2b7c3ff984e77018Jarkko Pöyry const std::vector<EGLConfig> configs = eglu::getConfigs(egl, display); 227bf44c5c30440b0c7a8c7c87f2b7c3ff984e77018Jarkko Pöyry 228bf44c5c30440b0c7a8c7c87f2b7c3ff984e77018Jarkko Pöyry for (vector<EGLConfig>::const_iterator iter = configs.begin(); iter != configs.end(); ++iter) 229bf44c5c30440b0c7a8c7c87f2b7c3ff984e77018Jarkko Pöyry { 230bf44c5c30440b0c7a8c7c87f2b7c3ff984e77018Jarkko Pöyry if (configMatches(egl, display, *iter, config)) 231bf44c5c30440b0c7a8c7c87f2b7c3ff984e77018Jarkko Pöyry return *iter; 232bf44c5c30440b0c7a8c7c87f2b7c3ff984e77018Jarkko Pöyry } 233bf44c5c30440b0c7a8c7c87f2b7c3ff984e77018Jarkko Pöyry 234bf44c5c30440b0c7a8c7c87f2b7c3ff984e77018Jarkko Pöyry throw tcu::NotSupportedError("Matching EGL config not found", DE_NULL, __FILE__, __LINE__); 235bf44c5c30440b0c7a8c7c87f2b7c3ff984e77018Jarkko Pöyry} 236bf44c5c30440b0c7a8c7c87f2b7c3ff984e77018Jarkko Pöyry 23753365959f2740e7b9ed59c51adbb73372f908a09Mika Isojärvi} 238