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