148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/*-------------------------------------------------------------------------
248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * OpenGL Conformance Test Suite
348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * -----------------------------
448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * Copyright (c) 2016 Google Inc.
648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * Copyright (c) 2016 The Khronos Group Inc.
748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * Licensed under the Apache License, Version 2.0 (the "License");
948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * you may not use this file except in compliance with the License.
1048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * You may obtain a copy of the License at
1148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
1248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *      http://www.apache.org/licenses/LICENSE-2.0
1348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
1448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * Unless required by applicable law or agreed to in writing, software
1548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * distributed under the License is distributed on an "AS IS" BASIS,
1648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * See the License for the specific language governing permissions and
1848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * limitations under the License.
1948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
2084322c9402f810da3cd80b52e9f9ef72150a9004Alexander Galazin */ /*!
2148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * \file
2248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * \brief CTS rendering configuration list utility.
2384322c9402f810da3cd80b52e9f9ef72150a9004Alexander Galazin */ /*-------------------------------------------------------------------*/
2448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
2584322c9402f810da3cd80b52e9f9ef72150a9004Alexander Galazin#include "glcConfigListEGL.hpp"
2648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
2748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "deUniquePtr.hpp"
2848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "glcConfigList.hpp"
2948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
3048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include <typeinfo>
3148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
3248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "deUniquePtr.hpp"
3348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "egluNativeDisplay.hpp"
3448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "egluPlatform.hpp"
3548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "egluUtil.hpp"
3648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "eglwDefs.hpp"
3748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "eglwEnums.hpp"
3848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "tcuPlatform.hpp"
3948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
4048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#if !defined(EGL_OPENGL_ES3_BIT_KHR)
4148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#define EGL_OPENGL_ES3_BIT_KHR 0x0040
4248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#endif
4348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
444777cb3a175dc29f1302ec3b98710d423abfcc0eWeiwan Liu#if !defined(EGL_COLOR_COMPONENT_TYPE_EXT)
454777cb3a175dc29f1302ec3b98710d423abfcc0eWeiwan Liu#define EGL_COLOR_COMPONENT_TYPE_EXT 0x3339
464777cb3a175dc29f1302ec3b98710d423abfcc0eWeiwan Liu#endif
474777cb3a175dc29f1302ec3b98710d423abfcc0eWeiwan Liu
484777cb3a175dc29f1302ec3b98710d423abfcc0eWeiwan Liu#if !defined(EGL_COLOR_COMPONENT_TYPE_FLOAT_EXT)
494777cb3a175dc29f1302ec3b98710d423abfcc0eWeiwan Liu#define EGL_COLOR_COMPONENT_TYPE_FLOAT_EXT 0x333B
504777cb3a175dc29f1302ec3b98710d423abfcc0eWeiwan Liu#endif
514777cb3a175dc29f1302ec3b98710d423abfcc0eWeiwan Liu
52c9f5bf7c2a7a31811c9718e207abb5c878577fcejames.glanville#if !defined(EGL_YUV_BUFFER_EXT)
53c9f5bf7c2a7a31811c9718e207abb5c878577fcejames.glanville#define EGL_YUV_BUFFER_EXT 0x3300
54c9f5bf7c2a7a31811c9718e207abb5c878577fcejames.glanville#endif
55c9f5bf7c2a7a31811c9718e207abb5c878577fcejames.glanville
5648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosnamespace glcts
5748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
5848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
5948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosstatic void getDefaultEglConfigList(tcu::Platform& eglPlatform, glu::ApiType type, ConfigList& configList)
6048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
6148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	deUint32 renderableMask = 0;
6248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	deUint32 conformantMask = 0;
6348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
6448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (type == glu::ApiType::es(2, 0))
6548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
6648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		renderableMask = EGL_OPENGL_ES2_BIT;
6748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		conformantMask = EGL_OPENGL_ES2_BIT;
6848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
6948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	else if (type == glu::ApiType::es(3, 0))
7048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
7148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		renderableMask = EGL_OPENGL_ES3_BIT_KHR;
7248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		conformantMask = EGL_OPENGL_ES3_BIT_KHR;
7348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
7448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	else if (type == glu::ApiType::es(3, 1))
7548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
7648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		renderableMask = EGL_OPENGL_ES3_BIT_KHR;
7748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		conformantMask = EGL_OPENGL_ES3_BIT_KHR;
7848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
7948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	else if (type == glu::ApiType::es(3, 2))
8048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
8148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		renderableMask = EGL_OPENGL_ES3_BIT_KHR;
8248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		conformantMask = EGL_OPENGL_ES3_BIT_KHR;
8348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
8448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	else if (type.getProfile() == glu::PROFILE_CORE)
8548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
8648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		renderableMask = EGL_OPENGL_BIT;
8748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		conformantMask = EGL_OPENGL_BIT;
8848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
8948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	else
9048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
9148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		throw tcu::Exception("Unsupported context type");
9248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
9348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
9448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	de::UniquePtr<eglu::NativeDisplay> nativeDisplay(
9548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		eglPlatform.getEGLPlatform().getNativeDisplayFactoryRegistry().getDefaultFactory()->createDisplay());
9648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const eglw::Library&		 library = nativeDisplay->getLibrary();
9748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	eglw::EGLDisplay			 display = eglu::getAndInitDisplay(*nativeDisplay);
9848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	std::vector<eglw::EGLConfig> configs = eglu::getConfigs(library, display);
994777cb3a175dc29f1302ec3b98710d423abfcc0eWeiwan Liu	bool supportFloatConfigs			 = eglu::hasExtension(library, display, "EGL_EXT_pixel_format_float");
100c9f5bf7c2a7a31811c9718e207abb5c878577fcejames.glanville	bool supportYUVConfigs				 = eglu::hasExtension(library, display, "EGL_EXT_yuv_surface");
10148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
10248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	for (std::vector<eglw::EGLConfig>::iterator cfgIter = configs.begin(); cfgIter != configs.end(); cfgIter++)
10348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
10448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		int		 id				= eglu::getConfigAttribInt(library, display, *cfgIter, EGL_CONFIG_ID);
10548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		deUint32 renderableBits = eglu::getConfigAttribInt(library, display, *cfgIter, EGL_RENDERABLE_TYPE);
10648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		deUint32 conformantBits = eglu::getConfigAttribInt(library, display, *cfgIter, EGL_CONFORMANT);
10748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		deInt32  redSize		= eglu::getConfigAttribInt(library, display, *cfgIter, EGL_RED_SIZE);
10848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		deInt32  greenSize		= eglu::getConfigAttribInt(library, display, *cfgIter, EGL_GREEN_SIZE);
10948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		deInt32  blueSize		= eglu::getConfigAttribInt(library, display, *cfgIter, EGL_BLUE_SIZE);
11048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		deInt32  alphaSize		= eglu::getConfigAttribInt(library, display, *cfgIter, EGL_ALPHA_SIZE);
11148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		deInt32  depthSize		= eglu::getConfigAttribInt(library, display, *cfgIter, EGL_DEPTH_SIZE);
11248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		deInt32  stencilSize	= eglu::getConfigAttribInt(library, display, *cfgIter, EGL_STENCIL_SIZE);
11348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		deInt32  numSamples		= eglu::getConfigAttribInt(library, display, *cfgIter, EGL_SAMPLES);
11448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
11548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		bool isRenderable = (renderableBits & renderableMask) == renderableMask;
11648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		bool isConformant = (conformantBits & conformantMask) == conformantMask;
11748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		bool isAOSPOk	 = isRenderable && isConformant;
1184777cb3a175dc29f1302ec3b98710d423abfcc0eWeiwan Liu		bool isFloatType  = supportFloatConfigs ?
1194777cb3a175dc29f1302ec3b98710d423abfcc0eWeiwan Liu							   (eglu::getConfigAttribInt(library, display, *cfgIter, EGL_COLOR_COMPONENT_TYPE_EXT) ==
1204777cb3a175dc29f1302ec3b98710d423abfcc0eWeiwan Liu								EGL_COLOR_COMPONENT_TYPE_FLOAT_EXT) :
1214777cb3a175dc29f1302ec3b98710d423abfcc0eWeiwan Liu							   false;
122c9f5bf7c2a7a31811c9718e207abb5c878577fcejames.glanville		bool isYUV =
123c9f5bf7c2a7a31811c9718e207abb5c878577fcejames.glanville			supportYUVConfigs ?
124c9f5bf7c2a7a31811c9718e207abb5c878577fcejames.glanville				(eglu::getConfigAttribInt(library, display, *cfgIter, EGL_COLOR_BUFFER_TYPE) == EGL_YUV_BUFFER_EXT) :
125c9f5bf7c2a7a31811c9718e207abb5c878577fcejames.glanville				false;
126c9f5bf7c2a7a31811c9718e207abb5c878577fcejames.glanville		bool isOk = isRenderable && isConformant && (numSamples == 0) && !isFloatType && !isYUV;
12748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
12848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		deUint32 surfaceBits  = eglu::getConfigAttribInt(library, display, *cfgIter, EGL_SURFACE_TYPE);
12948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		deUint32 surfaceTypes = ((surfaceBits & EGL_WINDOW_BIT) ? SURFACETYPE_WINDOW : 0) |
13048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								((surfaceBits & EGL_PIXMAP_BIT) ? SURFACETYPE_PIXMAP : 0) |
13148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								((surfaceBits & EGL_PBUFFER_BIT) ? SURFACETYPE_PBUFFER : 0);
13248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
13348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (isAOSPOk)
13448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
13548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			configList.aospConfigs.push_back(AOSPConfig(CONFIGTYPE_EGL, id, surfaceTypes, redSize, greenSize, blueSize,
13648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos														alphaSize, depthSize, stencilSize, numSamples));
13748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
13848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
13948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (isOk)
14048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
14148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			configList.configs.push_back(Config(CONFIGTYPE_EGL, id, surfaceTypes));
14248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
14348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		else
14448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
145c9f5bf7c2a7a31811c9718e207abb5c878577fcejames.glanville			DE_ASSERT(!isRenderable || !isConformant || (numSamples != 0) || isFloatType || isYUV);
146c9f5bf7c2a7a31811c9718e207abb5c878577fcejames.glanville			configList.excludedConfigs.push_back(
147c9f5bf7c2a7a31811c9718e207abb5c878577fcejames.glanville				ExcludedConfig(CONFIGTYPE_EGL, id,
148c9f5bf7c2a7a31811c9718e207abb5c878577fcejames.glanville							   !isRenderable ? EXCLUDEREASON_NOT_COMPATIBLE :
149c9f5bf7c2a7a31811c9718e207abb5c878577fcejames.glanville											   !isConformant ? EXCLUDEREASON_NOT_CONFORMANT :
150c9f5bf7c2a7a31811c9718e207abb5c878577fcejames.glanville															   (numSamples != 0) ?
151c9f5bf7c2a7a31811c9718e207abb5c878577fcejames.glanville															   EXCLUDEREASON_MSAA :
152c9f5bf7c2a7a31811c9718e207abb5c878577fcejames.glanville															   isFloatType ? EXCLUDEREASON_FLOAT : EXCLUDEREASON_YUV));
15348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
15448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
15548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
15648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
15748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid getConfigListEGL(tcu::Platform& platform, glu::ApiType type, ConfigList& configList)
15848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
15948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	try
16048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
16148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		getDefaultEglConfigList(platform, type, configList);
16248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
16348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	catch (const std::bad_cast&)
16448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
16548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		throw tcu::Exception("Platform is not tcu::EglPlatform");
16648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
16748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
16848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
16948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} // glcts
170