1294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek/*-------------------------------------------------------------------------
2294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek * drawElements Quality Program EGL Module
3294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek * ---------------------------------------
4294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek *
5294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek * Copyright 2014 The Android Open Source Project
6294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek *
7294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek * Licensed under the Apache License, Version 2.0 (the "License");
8294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek * you may not use this file except in compliance with the License.
9294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek * You may obtain a copy of the License at
10294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek *
11294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek *      http://www.apache.org/licenses/LICENSE-2.0
12294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek *
13294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek * Unless required by applicable law or agreed to in writing, software
14294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek * distributed under the License is distributed on an "AS IS" BASIS,
15294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose * See the License for the specific language governing permissions and
17294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek * limitations under the License.
184a5f724538cbc275370c9504e8169ce92503256cBenjamin Kramer *
194a5f724538cbc275370c9504e8169ce92503256cBenjamin Kramer *//*!
20294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek * \file
21294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek * \brief Surface query tests.
22294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek *//*--------------------------------------------------------------------*/
23294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek
243070e13dca5bbefa32acb80ce4a7b217a6220983Ted Kremenek#include "teglQuerySurfaceTests.hpp"
253070e13dca5bbefa32acb80ce4a7b217a6220983Ted Kremenek
260849ade4bb3e90c2fc0ce01ccd330f76f91da732Ted Kremenek#include "teglSimpleConfigCase.hpp"
270849ade4bb3e90c2fc0ce01ccd330f76f91da732Ted Kremenek
283070e13dca5bbefa32acb80ce4a7b217a6220983Ted Kremenek#include "egluNativeDisplay.hpp"
293070e13dca5bbefa32acb80ce4a7b217a6220983Ted Kremenek#include "egluNativeWindow.hpp"
303070e13dca5bbefa32acb80ce4a7b217a6220983Ted Kremenek#include "egluNativePixmap.hpp"
313070e13dca5bbefa32acb80ce4a7b217a6220983Ted Kremenek#include "egluStrUtil.hpp"
323070e13dca5bbefa32acb80ce4a7b217a6220983Ted Kremenek#include "egluUtil.hpp"
333070e13dca5bbefa32acb80ce4a7b217a6220983Ted Kremenek
343070e13dca5bbefa32acb80ce4a7b217a6220983Ted Kremenek#include "tcuTestLog.hpp"
353070e13dca5bbefa32acb80ce4a7b217a6220983Ted Kremenek#include "tcuTestContext.hpp"
363070e13dca5bbefa32acb80ce4a7b217a6220983Ted Kremenek#include "tcuCommandLine.hpp"
373070e13dca5bbefa32acb80ce4a7b217a6220983Ted Kremenek
380849ade4bb3e90c2fc0ce01ccd330f76f91da732Ted Kremenek#include "deUniquePtr.hpp"
393070e13dca5bbefa32acb80ce4a7b217a6220983Ted Kremenek#include "deRandom.hpp"
403070e13dca5bbefa32acb80ce4a7b217a6220983Ted Kremenek
413070e13dca5bbefa32acb80ce4a7b217a6220983Ted Kremenek#include <string>
420849ade4bb3e90c2fc0ce01ccd330f76f91da732Ted Kremenek#include <vector>
438bef8238181a30e52dea380789a7e2d760eac532Ted Kremenek
440849ade4bb3e90c2fc0ce01ccd330f76f91da732Ted Kremeneknamespace deqp
453070e13dca5bbefa32acb80ce4a7b217a6220983Ted Kremenek{
463070e13dca5bbefa32acb80ce4a7b217a6220983Ted Kremeneknamespace egl
473070e13dca5bbefa32acb80ce4a7b217a6220983Ted Kremenek{
483070e13dca5bbefa32acb80ce4a7b217a6220983Ted Kremenek
493070e13dca5bbefa32acb80ce4a7b217a6220983Ted Kremenekusing eglu::ConfigInfo;
503070e13dca5bbefa32acb80ce4a7b217a6220983Ted Kremenekusing tcu::TestLog;
513070e13dca5bbefa32acb80ce4a7b217a6220983Ted Kremenek
52294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenekstatic void logSurfaceAttribute (tcu::TestLog& log, EGLint attribute, EGLint value)
53294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek{
540b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks	const char*								name		= eglu::getSurfaceAttribName(attribute);
550b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks	const eglu::SurfaceAttribValueFmt		valueFmt	(attribute, value);
560b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks
570b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks	log << TestLog::Message << "  " << name << ": " << valueFmt << TestLog::EndMessage;
580b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks}
590b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks
600b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaksstatic void logSurfaceAttributes (tcu::TestLog& log, const tcu::egl::Surface& surface, const EGLint* attributes, int num)
610b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks{
62256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek	for (int ndx = 0; ndx < num; ndx++)
63256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek	{
640b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks		const EGLint	attrib	= attributes[ndx];
650b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks
66256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek		logSurfaceAttribute(log, attrib, surface.getAttribute(attrib));
67256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek	}
68256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek}
690b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks
700b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaksstatic void logCommonSurfaceAttributes (tcu::TestLog& log, const tcu::egl::Surface& surface)
710b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks{
720b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks	static const EGLint	attributes[] =
73256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek	{
740b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks		EGL_CONFIG_ID,
750b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks		EGL_WIDTH,
760b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks		EGL_HEIGHT,
770b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks		EGL_HORIZONTAL_RESOLUTION,
780b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks		EGL_VERTICAL_RESOLUTION,
790b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks		EGL_MULTISAMPLE_RESOLVE,
800b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks		EGL_PIXEL_ASPECT_RATIO,
810b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks		EGL_RENDER_BUFFER,
820b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks		EGL_SWAP_BEHAVIOR,
830b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks		EGL_VG_ALPHA_FORMAT,
840b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks		EGL_VG_COLORSPACE
850b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks	};
860b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks
87256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek	logSurfaceAttributes(log, surface, attributes, DE_LENGTH_OF_ARRAY(attributes));
88256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek}
89256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek
900b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaksstatic void logPbufferSurfaceAttributes (tcu::TestLog& log, const tcu::egl::Surface& surface)
91256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek{
92256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek	static const EGLint	attributes[] = {
930b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks		EGL_LARGEST_PBUFFER,
940b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks		EGL_TEXTURE_FORMAT,
950b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks		EGL_TEXTURE_TARGET,
960b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks		EGL_MIPMAP_TEXTURE,
970b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks		EGL_MIPMAP_LEVEL,
980b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks	};
990b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks
1000b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks	logSurfaceAttributes(log, surface, attributes, DE_LENGTH_OF_ARRAY(attributes));
1010b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks}
1020b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks
1030b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaksclass QuerySurfaceCase : public SimpleConfigCase
1040b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks{
1050b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zakspublic:
106256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek	QuerySurfaceCase (EglTestContext& eglTestCtx, const char* name, const char* description, const std::vector<EGLint>& configIds);
107294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek
1080b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks	void checkCommonAttributes (const tcu::egl::Surface& surface, const ConfigInfo& info);
1090b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks	void checkNonPbufferAttributes (EGLDisplay display, const tcu::egl::Surface& surface);
1100b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks};
1110b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks
1120b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna ZaksQuerySurfaceCase::QuerySurfaceCase (EglTestContext& eglTestCtx, const char* name, const char* description, const std::vector<EGLint>& configIds)
1130b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks	: SimpleConfigCase(eglTestCtx, name, description, configIds)
1140b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks{
1150b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks}
116294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek
1170b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaksvoid QuerySurfaceCase::checkCommonAttributes (const tcu::egl::Surface& surface, const ConfigInfo& info)
1180b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks{
119256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek	tcu::TestLog&	log		= m_testCtx.getLog();
120256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek
121294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek	// Attributes which are common to all surface types
1220b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks
123294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek	// Config ID
124294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek	{
125294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek		const EGLint	id	= surface.getAttribute(EGL_CONFIG_ID);
1260b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks
1270b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks		if (id != info.configId)
128294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek		{
129294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek			log << TestLog::Message << "    Fail, config ID " << id << " does not match the one used to create the surface" << TestLog::EndMessage;
1300b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks			m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Config ID mismatch");
131294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek		}
1320b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks	}
1330b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks
1340b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks	// Width and height
135894212e9510299abb203801e014fec76b7926a05Ted Kremenek	{
1360b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks		const EGLint	width	= surface.getWidth();
1370b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks		const EGLint	height	= surface.getHeight();
138894212e9510299abb203801e014fec76b7926a05Ted Kremenek
139894212e9510299abb203801e014fec76b7926a05Ted Kremenek		if (width <= 0 || height <= 0)
1400b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks		{
1410b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks			log << TestLog::Message << "    Fail, invalid surface size " << width << "x" << height << TestLog::EndMessage;
1420b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks			m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Invalid surface size");
1430b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks		}
1440b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks	}
1450b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks
1460b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks	// Horizontal and vertical resolution
1470b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks	{
1480b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks		const EGLint	hRes	= surface.getAttribute(EGL_HORIZONTAL_RESOLUTION);
1490b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks		const EGLint	vRes	= surface.getAttribute(EGL_VERTICAL_RESOLUTION);
1500b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks
1510b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks		if ((hRes <= 0 || vRes <= 0) && (hRes != EGL_UNKNOWN && vRes != EGL_UNKNOWN))
1520b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks		{
1530b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks			log << TestLog::Message << "    Fail, invalid surface resolution " << hRes << "x" << vRes << TestLog::EndMessage;
1540b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks			m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Invalid surface resolution");
1550b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks		}
1560b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks	}
1570b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks
1580b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks	// Pixel aspect ratio
1590b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks	{
1600b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks		const EGLint	pixelRatio	= surface.getAttribute(EGL_PIXEL_ASPECT_RATIO);
1610b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks
1620b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks		if (pixelRatio <= 0 && pixelRatio != EGL_UNKNOWN)
1630b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks		{
1640b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks			log << TestLog::Message << "    Fail, invalid pixel aspect ratio " << surface.getAttribute(EGL_PIXEL_ASPECT_RATIO) << TestLog::EndMessage;
1650b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks			m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Invalid pixel aspect ratio");
1660b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks		}
1670b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks	}
1680b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks
1690b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks	// Render buffer
1700b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks	{
1710b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks		const EGLint	renderBuffer	= surface.getAttribute(EGL_RENDER_BUFFER);
1720b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks
1730b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks		if (renderBuffer != EGL_BACK_BUFFER && renderBuffer != EGL_SINGLE_BUFFER)
1740b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks		{
1750b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks			log << TestLog::Message << "    Fail, invalid render buffer value " << renderBuffer << TestLog::EndMessage;
1760b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks			m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Invalid render buffer");
1770b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks		}
1780b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks	}
1790b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks
1800b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks	// Multisample resolve
1810b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks	{
1820b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks		const EGLint	multisampleResolve	= surface.getAttribute(EGL_MULTISAMPLE_RESOLVE);
1830b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks
1840b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks		if (multisampleResolve != EGL_MULTISAMPLE_RESOLVE_DEFAULT && multisampleResolve != EGL_MULTISAMPLE_RESOLVE_BOX)
1850b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks		{
1860b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks			log << TestLog::Message << "    Fail, invalid multisample resolve value " << multisampleResolve << TestLog::EndMessage;
1870b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks			m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Invalid multisample resolve");
188242384ddb0e0b65dd7e9e0ac0cf3c31cf98b06a6Ted Kremenek		}
189294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek
190294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek		if (multisampleResolve == EGL_MULTISAMPLE_RESOLVE_BOX && !(info.surfaceType & EGL_MULTISAMPLE_RESOLVE_BOX_BIT))
1910849ade4bb3e90c2fc0ce01ccd330f76f91da732Ted Kremenek		{
1920849ade4bb3e90c2fc0ce01ccd330f76f91da732Ted Kremenek			log << TestLog::Message << "    Fail, multisample resolve is reported as box filter but configuration does not support it." << TestLog::EndMessage;
1930849ade4bb3e90c2fc0ce01ccd330f76f91da732Ted Kremenek			m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Invalid multisample resolve");
1940849ade4bb3e90c2fc0ce01ccd330f76f91da732Ted Kremenek		}
1950849ade4bb3e90c2fc0ce01ccd330f76f91da732Ted Kremenek	}
1960849ade4bb3e90c2fc0ce01ccd330f76f91da732Ted Kremenek
1970849ade4bb3e90c2fc0ce01ccd330f76f91da732Ted Kremenek	// Swap behavior
1980849ade4bb3e90c2fc0ce01ccd330f76f91da732Ted Kremenek	{
1990849ade4bb3e90c2fc0ce01ccd330f76f91da732Ted Kremenek		const EGLint	swapBehavior	= surface.getAttribute(EGL_SWAP_BEHAVIOR);
2000849ade4bb3e90c2fc0ce01ccd330f76f91da732Ted Kremenek
2016cc0969ab37c614d6cf496f2ed6d2fca397a0133Anna Zaks		if (swapBehavior != EGL_BUFFER_DESTROYED && swapBehavior != EGL_BUFFER_PRESERVED)
2025903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks		{
2036cc0969ab37c614d6cf496f2ed6d2fca397a0133Anna Zaks			log << TestLog::Message << "    Fail, invalid swap behavior value " << swapBehavior << TestLog::EndMessage;
2046cc0969ab37c614d6cf496f2ed6d2fca397a0133Anna Zaks			m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Invalid swap behavior");
2056cc0969ab37c614d6cf496f2ed6d2fca397a0133Anna Zaks		}
20601561d1039bfdda61edd20eed939011a8632c7c7Ted Kremenek
20701561d1039bfdda61edd20eed939011a8632c7c7Ted Kremenek		if (swapBehavior == EGL_BUFFER_PRESERVED && !(info.surfaceType & EGL_SWAP_BEHAVIOR_PRESERVED_BIT))
20801561d1039bfdda61edd20eed939011a8632c7c7Ted Kremenek		{
20901561d1039bfdda61edd20eed939011a8632c7c7Ted Kremenek			log << TestLog::Message << "    Fail, swap behavior is reported as preserve but configuration does not support it." << TestLog::EndMessage;
21001561d1039bfdda61edd20eed939011a8632c7c7Ted Kremenek			m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Invalid swap behavior");
2116cc0969ab37c614d6cf496f2ed6d2fca397a0133Anna Zaks		}
2126cc0969ab37c614d6cf496f2ed6d2fca397a0133Anna Zaks	}
2136cc0969ab37c614d6cf496f2ed6d2fca397a0133Anna Zaks
2146cc0969ab37c614d6cf496f2ed6d2fca397a0133Anna Zaks	// OpenVG alpha format
215e62f048960645b79363408fdead53fec2a063c52Anna Zaks	{
2163bbd8cd831788c506f2980293eb3c7e1b3ca2501Anna Zaks		const EGLint	vgAlphaFormat	= surface.getAttribute(EGL_VG_ALPHA_FORMAT);
2173bbd8cd831788c506f2980293eb3c7e1b3ca2501Anna Zaks
2186cc0969ab37c614d6cf496f2ed6d2fca397a0133Anna Zaks		if (vgAlphaFormat != EGL_VG_ALPHA_FORMAT_NONPRE && vgAlphaFormat != EGL_VG_ALPHA_FORMAT_PRE)
2196cc0969ab37c614d6cf496f2ed6d2fca397a0133Anna Zaks		{
2206cc0969ab37c614d6cf496f2ed6d2fca397a0133Anna Zaks			log << TestLog::Message << "    Fail, invalid OpenVG alpha format value " << vgAlphaFormat << TestLog::EndMessage;
2216cc0969ab37c614d6cf496f2ed6d2fca397a0133Anna Zaks			m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Invalid OpenVG alpha format");
2226cc0969ab37c614d6cf496f2ed6d2fca397a0133Anna Zaks		}
2236cc0969ab37c614d6cf496f2ed6d2fca397a0133Anna Zaks
2245903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks		if (vgAlphaFormat == EGL_VG_ALPHA_FORMAT_PRE && !(info.surfaceType & EGL_VG_ALPHA_FORMAT_PRE_BIT))
2255903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks		{
2265903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks			log << TestLog::Message << "    Fail, OpenVG is set to use premultiplied alpha but configuration does not support it." << TestLog::EndMessage;
2275903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks			m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Invalid OpenVG alpha format");
2285903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks		}
2295903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks	}
2305903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks
2315903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks	// OpenVG color space
2325903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks	{
2335903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks		const EGLint	vgColorspace	= surface.getAttribute(EGL_VG_COLORSPACE);
2345903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks
2355903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks		if (vgColorspace != EGL_VG_COLORSPACE_sRGB && vgColorspace != EGL_VG_COLORSPACE_LINEAR)
2365903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks		{
2375903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks			log << TestLog::Message << "    Fail, invalid OpenVG color space value " << vgColorspace << TestLog::EndMessage;
2385903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks			m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Invalid OpenVG color space");
2395903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks		}
2405903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks
2415903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks		if (vgColorspace == EGL_VG_COLORSPACE_LINEAR && !(info.surfaceType & EGL_VG_COLORSPACE_LINEAR_BIT))
2425903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks		{
2435903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks			log << TestLog::Message << "    Fail, OpenVG is set to use a linear color space but configuration does not support it." << TestLog::EndMessage;
2445903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks			m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Invalid OpenVG color space");
2455903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks		}
2465903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks	}
247256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek}
248256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek
249256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenekvoid QuerySurfaceCase::checkNonPbufferAttributes (EGLDisplay display, const tcu::egl::Surface& surface)
2505903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks{
2515903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks	const EGLint	uninitializedMagicValue	= -42;
2525903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks	tcu::TestLog&	log						= m_testCtx.getLog();
2538bef8238181a30e52dea380789a7e2d760eac532Ted Kremenek	EGLint			value					= uninitializedMagicValue;
254256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek
255256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek	static const EGLint pbufferAttribs[] = {
2566cc0969ab37c614d6cf496f2ed6d2fca397a0133Anna Zaks		EGL_LARGEST_PBUFFER,
257256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek		EGL_TEXTURE_FORMAT,
258256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek		EGL_TEXTURE_TARGET,
259256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek		EGL_MIPMAP_TEXTURE,
260256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek		EGL_MIPMAP_LEVEL,
261256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek	};
262256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek
263256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek	for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(pbufferAttribs); ndx++)
264256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek	{
2655903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks		const EGLint		attribute	= pbufferAttribs[ndx];
2668235f9c9c8b3d1737d1c6bd57f7ba3f616b92392Anna Zaks		const std::string	name		= eglu::getSurfaceAttribName(pbufferAttribs[ndx]);
2678235f9c9c8b3d1737d1c6bd57f7ba3f616b92392Anna Zaks
2688235f9c9c8b3d1737d1c6bd57f7ba3f616b92392Anna Zaks		eglQuerySurface(display, surface.getEGLSurface(), attribute, &value);
2696cc0969ab37c614d6cf496f2ed6d2fca397a0133Anna Zaks
270256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek		{
271256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek			const EGLint	error	= eglGetError();
272256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek
273256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek			if (error != EGL_SUCCESS)
274256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek			{
275256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek				log << TestLog::Message << "    Fail, querying " << name << " from a non-pbuffer surface should not result in an error, received "
276256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek					<< eglu::getErrorStr(error) << TestLog::EndMessage;
277256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek				m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Illegal error condition");
278256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek			}
279d9b795524eb3dc035523f82f135d0a8adf15cd72Ted Kremenek
280d9b795524eb3dc035523f82f135d0a8adf15cd72Ted Kremenek			break;
281d9b795524eb3dc035523f82f135d0a8adf15cd72Ted Kremenek		}
282d9b795524eb3dc035523f82f135d0a8adf15cd72Ted Kremenek
283d9b795524eb3dc035523f82f135d0a8adf15cd72Ted Kremenek		// "For a window or pixmap surface, the contents of value are not modified."
284256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek		if (value != uninitializedMagicValue)
285256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek		{
286256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek			log << TestLog::Message << "    Fail, return value contents were modified when querying " << name << " from a non-pbuffer surface." << TestLog::EndMessage;
287256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek			m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Illegal modification of return value");
288256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek		}
289256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek	}
2902cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks}
2912cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks
2922cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaksclass QuerySurfaceSimpleWindowCase : public QuerySurfaceCase
2932cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks{
2942cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zakspublic:
2952cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks	QuerySurfaceSimpleWindowCase (EglTestContext& eglTestCtx, const char* name, const char* description, const std::vector<EGLint>& configIds)
2962cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks		: QuerySurfaceCase(eglTestCtx, name, description, configIds)
2972cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks	{
2982cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks	}
2992cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks
3002cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks	void executeForConfig (tcu::egl::Display& display, EGLConfig config)
3012cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks	{
3022cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks		tcu::TestLog&	log		= m_testCtx.getLog();
3032cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks		const int		width	= 64;
3042cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks		const int		height	= 64;
3052cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks
3062cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks		ConfigInfo		info;
3072cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks		display.describeConfig(config, info);
3082cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks
3090d389b819c33bdf0375694a8f141c8f02e002b18Anna Zaks		log << TestLog::Message << "Creating window surface with config ID " << info.configId << TestLog::EndMessage;
3100d389b819c33bdf0375694a8f141c8f02e002b18Anna Zaks		TCU_CHECK_EGL();
3110d389b819c33bdf0375694a8f141c8f02e002b18Anna Zaks
3120d389b819c33bdf0375694a8f141c8f02e002b18Anna Zaks		de::UniquePtr<eglu::NativeWindow>	window(m_eglTestCtx.createNativeWindow(display.getEGLDisplay(), config, DE_NULL, width, height, eglu::parseWindowVisibility(m_testCtx.getCommandLine())));
3130d389b819c33bdf0375694a8f141c8f02e002b18Anna Zaks		tcu::egl::WindowSurface				surface(display, eglu::createWindowSurface(m_eglTestCtx.getNativeDisplay(), *window, display.getEGLDisplay(), config, DE_NULL));
3140d389b819c33bdf0375694a8f141c8f02e002b18Anna Zaks
31507d39a479cf8f20294407e749f9933da34ebecb7Anna Zaks		logCommonSurfaceAttributes(log, surface);
31607d39a479cf8f20294407e749f9933da34ebecb7Anna Zaks
3170d389b819c33bdf0375694a8f141c8f02e002b18Anna Zaks		checkCommonAttributes(surface, info);
3180d389b819c33bdf0375694a8f141c8f02e002b18Anna Zaks		checkNonPbufferAttributes(display.getEGLDisplay(), surface);
319ca23eb212c78ac5bc62d0881635579dbe7095639Anna Zaks	}
32007d39a479cf8f20294407e749f9933da34ebecb7Anna Zaks};
32107d39a479cf8f20294407e749f9933da34ebecb7Anna Zaks
322ca23eb212c78ac5bc62d0881635579dbe7095639Anna Zaksclass QuerySurfaceSimplePixmapCase : public QuerySurfaceCase
323ca23eb212c78ac5bc62d0881635579dbe7095639Anna Zaks{
32462a5c34ddc54696725683f6c5af1c8e1592c5c38Anna Zakspublic:
32562a5c34ddc54696725683f6c5af1c8e1592c5c38Anna Zaks	QuerySurfaceSimplePixmapCase (EglTestContext& eglTestCtx, const char* name, const char* description, const std::vector<EGLint>& configIds)
32607d39a479cf8f20294407e749f9933da34ebecb7Anna Zaks		: QuerySurfaceCase(eglTestCtx, name, description, configIds)
327ca23eb212c78ac5bc62d0881635579dbe7095639Anna Zaks	{
328ca23eb212c78ac5bc62d0881635579dbe7095639Anna Zaks	}
32962a5c34ddc54696725683f6c5af1c8e1592c5c38Anna Zaks
33062a5c34ddc54696725683f6c5af1c8e1592c5c38Anna Zaks	void executeForConfig (tcu::egl::Display& display, EGLConfig config)
331ca23eb212c78ac5bc62d0881635579dbe7095639Anna Zaks	{
3320d389b819c33bdf0375694a8f141c8f02e002b18Anna Zaks		tcu::TestLog&	log		= m_testCtx.getLog();
3330d389b819c33bdf0375694a8f141c8f02e002b18Anna Zaks		const int		width	= 64;
3340d389b819c33bdf0375694a8f141c8f02e002b18Anna Zaks		const int		height	= 64;
3352cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks
3362cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks		ConfigInfo		info;
3372cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks		display.describeConfig(config, info);
3382cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks
3392cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks		log << TestLog::Message << "Creating pixmap surface with config ID " << info.configId << TestLog::EndMessage;
3402cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks		TCU_CHECK_EGL();
3412cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks
3422cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks		de::UniquePtr<eglu::NativePixmap>	pixmap	(m_eglTestCtx.createNativePixmap(display.getEGLDisplay(), config, DE_NULL, width, height));
3432cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks		tcu::egl::PixmapSurface				surface	(display, eglu::createPixmapSurface(m_eglTestCtx.getNativeDisplay(), *pixmap, display.getEGLDisplay(), config, DE_NULL));
3442cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks
3452cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks		logCommonSurfaceAttributes(log, surface);
3462cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks
3472cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks		checkCommonAttributes(surface, info);
3482cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks		checkNonPbufferAttributes(display.getEGLDisplay(), surface);
3492cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks	}
3502cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks};
3512cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks
3522cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaksclass QuerySurfaceSimplePbufferCase : public QuerySurfaceCase
3532cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks{
3542cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zakspublic:
3552cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks	QuerySurfaceSimplePbufferCase (EglTestContext& eglTestCtx, const char* name, const char* description, const std::vector<EGLint>& configIds)
3568bef8238181a30e52dea380789a7e2d760eac532Ted Kremenek		: QuerySurfaceCase(eglTestCtx, name, description, configIds)
3578bef8238181a30e52dea380789a7e2d760eac532Ted Kremenek	{
358e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose	}
359e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose
360e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose	void executeForConfig (tcu::egl::Display& display, EGLConfig config)
361e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose	{
362e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose		tcu::TestLog&	log		= m_testCtx.getLog();
363e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose		int				width	= 64;
364e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose		int				height	= 64;
365e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose
366e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose		ConfigInfo		info;
367e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose		display.describeConfig(config, info);
368e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose
369e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose		log << TestLog::Message << "Creating pbuffer surface with config ID " << info.configId << TestLog::EndMessage;
370e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose		TCU_CHECK_EGL();
371e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose
372e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose		// Clamp to maximums reported by implementation
373e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose		width	= deMin32(width, display.getConfigAttrib(config, EGL_MAX_PBUFFER_WIDTH));
374e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose		height	= deMin32(height, display.getConfigAttrib(config, EGL_MAX_PBUFFER_HEIGHT));
375e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose
376e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose		if (width == 0 || height == 0)
3772cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks		{
3782cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks			log << TestLog::Message << "    Fail, maximum pbuffer size of " << width << "x" << height << " reported" << TestLog::EndMessage;
379e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose			m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Invalid maximum pbuffer size");
380e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose			return;
381e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose		}
382e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose
383e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose		const EGLint attribs[] =
3842cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks		{
3852cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks			EGL_WIDTH,			width,
3862cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks			EGL_HEIGHT,			height,
3872cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks			EGL_TEXTURE_FORMAT,	EGL_NO_TEXTURE,
388e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose			EGL_NONE
3892cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks		};
3902cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks
3912cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks		{
392e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose			tcu::egl::PbufferSurface surface(display, config, attribs);
393e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose
394e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose			logCommonSurfaceAttributes(log, surface);
395e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose			logPbufferSurfaceAttributes(log, surface);
396e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose
397e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose			checkCommonAttributes(surface, info);
398e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose
399e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose			// Pbuffer-specific attributes
400e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose
401e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose			// Largest pbuffer
402e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose			{
403e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose				const EGLint	largestPbuffer	= surface.getAttribute(EGL_LARGEST_PBUFFER);
404e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose
4052cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks				if (largestPbuffer != EGL_FALSE && largestPbuffer != EGL_TRUE)
406e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose				{
407e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose					log << TestLog::Message << "    Fail, invalid largest pbuffer value " << largestPbuffer << TestLog::EndMessage;
408e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose					m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Invalid largest pbuffer");
409e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose				}
410e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose			}
411e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose
412e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose			// Texture format
413e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose			{
414e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose				const EGLint	textureFormat	= surface.getAttribute(EGL_TEXTURE_FORMAT);
415e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose
4162cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks				if (textureFormat != EGL_NO_TEXTURE && textureFormat != EGL_TEXTURE_RGB && textureFormat != EGL_TEXTURE_RGBA)
417e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose				{
418e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose					log << TestLog::Message << "    Fail, invalid texture format value " << textureFormat << TestLog::EndMessage;
419e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose					m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Invalid texture format");
420e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose				}
421e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose			}
422e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose
423e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose			// Texture target
424e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose			{
425e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose				const EGLint	textureTarget	= surface.getAttribute(EGL_TEXTURE_TARGET);
426e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose
427e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose				if (textureTarget != EGL_NO_TEXTURE && textureTarget != EGL_TEXTURE_2D)
428e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose				{
429e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose					log << TestLog::Message << "    Fail, invalid texture target value " << textureTarget << TestLog::EndMessage;
430e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose					m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Invalid texture target");
431e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose				}
432e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose			}
433e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose
434e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose			// Mipmap texture
435e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose			{
436e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose				const EGLint	mipmapTexture	= surface.getAttribute(EGL_MIPMAP_TEXTURE);
437e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose
438e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose				if (mipmapTexture != EGL_FALSE && mipmapTexture != EGL_TRUE)
439e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose				{
440e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose					log << TestLog::Message << "    Fail, invalid mipmap texture value " << mipmapTexture << TestLog::EndMessage;
441e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose					m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Invalid mipmap texture");
442e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose				}
443e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose			}
444e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose		}
445e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose	}
446ebae6d0209e1ec3d5ea14f9e63bd0d740218ed14Anna Zaks};
447e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose
448e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Roseclass SurfaceAttribCase : public SimpleConfigCase
449e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose{
450e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rosepublic:
451e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose			SurfaceAttribCase	(EglTestContext& eglTestCtx, const char* name, const char* description, const std::vector<EGLint>& configIds);
4523133f79cf451e6302dd05262b4bb53a3e4fd6300Ted Kremenek	virtual	~SurfaceAttribCase	(void) {}
453eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks
454e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose	void	testAttributes		(tcu::egl::Surface& surface, const ConfigInfo& info);
455e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose};
456e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose
4575903a373db3d27794c90b25687e0dd6adb0e497dAnna ZaksSurfaceAttribCase::SurfaceAttribCase (EglTestContext& eglTestCtx, const char* name, const char* description, const std::vector<EGLint>& configIds)
4585903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks		: SimpleConfigCase(eglTestCtx, name, description, configIds)
4595903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks{
4605903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks}
4615903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks
4625903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaksvoid SurfaceAttribCase::testAttributes (tcu::egl::Surface& surface, const ConfigInfo& info)
4635903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks{
4645903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks	const tcu::egl::Display&	display			= surface.getDisplay();
46510520d76044e8fff71d414f30c21b449fd104960Ted Kremenek	tcu::TestLog&				log				= m_testCtx.getLog();
4665903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks	const int					majorVersion	= display.getEGLMajorVersion();
46710520d76044e8fff71d414f30c21b449fd104960Ted Kremenek	const int					minorVersion	= display.getEGLMinorVersion();
46810520d76044e8fff71d414f30c21b449fd104960Ted Kremenek	de::Random					rnd				(deStringHash(m_name.c_str()) ^ 0xf215918f);
469294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek
470294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek	if (majorVersion == 1 && minorVersion == 0)
471294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek	{
472294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek		log << TestLog::Message << "No attributes can be set in EGL 1.0" << TestLog::EndMessage;
473294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek		return;
474294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek	}
475294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek
476294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek	// Mipmap level
477294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek	if (info.renderableType & EGL_OPENGL_ES_BIT || info.renderableType & EGL_OPENGL_ES2_BIT)
478294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek	{
479294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek		const EGLint initialValue = 0xDEADBAAD;
480294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek		EGLint value = initialValue;
481294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek
482294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek		TCU_CHECK_EGL_CALL(eglQuerySurface(surface.getDisplay().getEGLDisplay(), surface.getEGLSurface(), EGL_MIPMAP_LEVEL, &value));
483294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek
4845903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks		logSurfaceAttribute(log, EGL_MIPMAP_LEVEL, value);
4855903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks
4865903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks		if (dynamic_cast<tcu::egl::PbufferSurface*>(&surface))
4875903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks		{
4885903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks			if (value != 0)
489294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek			{
490500abad7edfcc2409b18dd616cdbc28a094926f5Jordy Rose				log << TestLog::Message << "    Fail, initial mipmap level value should be 0, is " << value << TestLog::EndMessage;
491500abad7edfcc2409b18dd616cdbc28a094926f5Jordy Rose				m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Invalid default mipmap level");
492aa0aeb1cbe117db68d35700cb3a34aace0f99b99Anna Zaks			}
493500abad7edfcc2409b18dd616cdbc28a094926f5Jordy Rose		}
494500abad7edfcc2409b18dd616cdbc28a094926f5Jordy Rose		else if (value != initialValue)
495294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek		{
4965903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks			log << TestLog::Message << "    Fail, eglQuerySurface changed value when querying EGL_MIPMAP_LEVEL for non-pbuffer surface. Result: " << value << ". Expected: " << initialValue << TestLog::EndMessage;
4975903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks			m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "EGL_MIPMAP_LEVEL query modified result for non-pbuffer surface.");
4985eca482fe895ea57bc82410222e6426c09e63284Ted Kremenek		}
499500abad7edfcc2409b18dd616cdbc28a094926f5Jordy Rose
500500abad7edfcc2409b18dd616cdbc28a094926f5Jordy Rose		eglSurfaceAttrib(display.getEGLDisplay(), surface.getEGLSurface(), EGL_MIPMAP_LEVEL, 1);
501500abad7edfcc2409b18dd616cdbc28a094926f5Jordy Rose
502500abad7edfcc2409b18dd616cdbc28a094926f5Jordy Rose		{
503500abad7edfcc2409b18dd616cdbc28a094926f5Jordy Rose			const EGLint	error	= eglGetError();
504500abad7edfcc2409b18dd616cdbc28a094926f5Jordy Rose
505500abad7edfcc2409b18dd616cdbc28a094926f5Jordy Rose			if (error != EGL_SUCCESS)
506500abad7edfcc2409b18dd616cdbc28a094926f5Jordy Rose			{
507500abad7edfcc2409b18dd616cdbc28a094926f5Jordy Rose				log << TestLog::Message << "    Fail, setting EGL_MIPMAP_LEVEL should not result in an error, received " << eglu::getErrorStr(error) << TestLog::EndMessage;
508500abad7edfcc2409b18dd616cdbc28a094926f5Jordy Rose
509500abad7edfcc2409b18dd616cdbc28a094926f5Jordy Rose				m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Illegal error condition");
510500abad7edfcc2409b18dd616cdbc28a094926f5Jordy Rose			}
511500abad7edfcc2409b18dd616cdbc28a094926f5Jordy Rose		}
512ebae6d0209e1ec3d5ea14f9e63bd0d740218ed14Anna Zaks	}
5133133f79cf451e6302dd05262b4bb53a3e4fd6300Ted Kremenek
5143133f79cf451e6302dd05262b4bb53a3e4fd6300Ted Kremenek	// Only mipmap level can be set in EGL 1.3 and lower
515500abad7edfcc2409b18dd616cdbc28a094926f5Jordy Rose	if (majorVersion == 1 && minorVersion <= 3) return;
516e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose
5175eca482fe895ea57bc82410222e6426c09e63284Ted Kremenek	// Multisample resolve
518e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose	{
519e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose		const EGLint	value	= surface.getAttribute(EGL_MULTISAMPLE_RESOLVE);
5205eca482fe895ea57bc82410222e6426c09e63284Ted Kremenek
5215eca482fe895ea57bc82410222e6426c09e63284Ted Kremenek		logSurfaceAttribute(log, EGL_MULTISAMPLE_RESOLVE, value);
522500abad7edfcc2409b18dd616cdbc28a094926f5Jordy Rose
523fe27971d54d26997149d6b84057f04ff398d1d5dJordy Rose		if (value != EGL_MULTISAMPLE_RESOLVE_DEFAULT)
524ebae6d0209e1ec3d5ea14f9e63bd0d740218ed14Anna Zaks		{
525294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek			log << TestLog::Message << "    Fail, initial multisample resolve value should be EGL_MULTISAMPLE_RESOLVE_DEFAULT, is "
526294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek				<< eglu::getSurfaceAttribValueStr(EGL_MULTISAMPLE_RESOLVE, value) << TestLog::EndMessage;
527294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek			m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Invalid default multisample resolve");
528294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek		}
529294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek
530294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek		if (info.renderableType & EGL_MULTISAMPLE_RESOLVE_BOX_BIT)
531294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek		{
532294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek			log << TestLog::Message << "    Box filter is supported by surface, trying to set." << TestLog::EndMessage;
533294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek
534294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek			surface.setAttribute(EGL_MULTISAMPLE_RESOLVE, EGL_MULTISAMPLE_RESOLVE_BOX);
535294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek
536294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek			if (surface.getAttribute(EGL_MULTISAMPLE_RESOLVE) != EGL_MULTISAMPLE_RESOLVE_BOX)
537294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek			{
538294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek				log << TestLog::Message << "    Fail, tried to enable box filter but value did not change.";
539294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek				m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Failed to set multisample resolve");
540294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek			}
541294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek		}
542294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek	}
543294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek
544256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek	// Swap behavior
545256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek	{
546256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek		const EGLint	value	= surface.getAttribute(EGL_SWAP_BEHAVIOR);
547256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek
548256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek		logSurfaceAttribute(log, EGL_SWAP_BEHAVIOR, value);
549256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek
550256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek		if (info.renderableType & EGL_SWAP_BEHAVIOR_PRESERVED_BIT)
551256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek		{
552256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek			const EGLint	nextValue	= (value == EGL_BUFFER_DESTROYED) ? EGL_BUFFER_PRESERVED : EGL_BUFFER_DESTROYED;
553256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek
554294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek			surface.setAttribute(EGL_SWAP_BEHAVIOR, nextValue);
555294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek
556294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek			if (surface.getAttribute(EGL_SWAP_BEHAVIOR) != nextValue)
557			{
558				log << TestLog::Message << "  Fail, tried to set swap behavior to " << eglu::getSurfaceAttribStr(nextValue) << TestLog::EndMessage;
559				m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Failed to set swap behavior");
560			}
561		}
562	}
563}
564
565class SurfaceAttribWindowCase : public SurfaceAttribCase
566{
567public:
568	SurfaceAttribWindowCase (EglTestContext& eglTestCtx, const char* name, const char* description, const std::vector<EGLint>& configIds)
569		: SurfaceAttribCase(eglTestCtx, name, description, configIds)
570	{
571	}
572
573	void executeForConfig (tcu::egl::Display& display, EGLConfig config)
574	{
575		tcu::TestLog&	log		= m_testCtx.getLog();
576		const int		width	= 64;
577		const int		height	= 64;
578
579		ConfigInfo		info;
580		display.describeConfig(config, info);
581
582		log << TestLog::Message << "Creating window surface with config ID " << info.configId << TestLog::EndMessage;
583		TCU_CHECK_EGL();
584
585		de::UniquePtr<eglu::NativeWindow>	window(m_eglTestCtx.createNativeWindow(display.getEGLDisplay(), config, DE_NULL, width, height, eglu::parseWindowVisibility(m_testCtx.getCommandLine())));
586		tcu::egl::WindowSurface				surface(display, eglu::createWindowSurface(m_eglTestCtx.getNativeDisplay(), *window, display.getEGLDisplay(), config, DE_NULL));
587
588		testAttributes(surface, info);
589	}
590};
591
592class SurfaceAttribPixmapCase : public SurfaceAttribCase
593{
594public:
595	SurfaceAttribPixmapCase (EglTestContext& eglTestCtx, const char* name, const char* description, const std::vector<EGLint>& configIds)
596		: SurfaceAttribCase(eglTestCtx, name, description, configIds)
597	{
598	}
599
600	void executeForConfig (tcu::egl::Display& display, EGLConfig config)
601	{
602		tcu::TestLog&	log		= m_testCtx.getLog();
603		const int		width	= 64;
604		const int		height	= 64;
605
606		ConfigInfo		info;
607		display.describeConfig(config, info);
608
609		log << TestLog::Message << "Creating pixmap surface with config ID " << info.configId << TestLog::EndMessage;
610		TCU_CHECK_EGL();
611
612		de::UniquePtr<eglu::NativePixmap>	pixmap	(m_eglTestCtx.createNativePixmap(display.getEGLDisplay(), config, DE_NULL, width, height));
613		tcu::egl::PixmapSurface				surface	(display, eglu::createPixmapSurface(m_eglTestCtx.getNativeDisplay(), *pixmap, display.getEGLDisplay(), config, DE_NULL));
614
615		testAttributes(surface, info);
616	}
617};
618
619class SurfaceAttribPbufferCase : public SurfaceAttribCase
620{
621public:
622	SurfaceAttribPbufferCase (EglTestContext& eglTestCtx, const char* name, const char* description, const std::vector<EGLint>& configIds)
623		: SurfaceAttribCase(eglTestCtx, name, description, configIds)
624	{
625	}
626
627	void executeForConfig (tcu::egl::Display& display, EGLConfig config)
628	{
629		tcu::TestLog&	log		= m_testCtx.getLog();
630		int				width	= 64;
631		int				height	= 64;
632
633		ConfigInfo		info;
634		display.describeConfig(config, info);
635
636		log << TestLog::Message << "Creating pbuffer surface with config ID " << info.configId << TestLog::EndMessage;
637		TCU_CHECK_EGL();
638
639		// Clamp to maximums reported by implementation
640		width	= deMin32(width, display.getConfigAttrib(config, EGL_MAX_PBUFFER_WIDTH));
641		height	= deMin32(height, display.getConfigAttrib(config, EGL_MAX_PBUFFER_HEIGHT));
642
643		if (width == 0 || height == 0)
644		{
645			log << TestLog::Message << "    Fail, maximum pbuffer size of " << width << "x" << height << " reported" << TestLog::EndMessage;
646			m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Invalid maximum pbuffer size");
647			return;
648		}
649
650		const EGLint attribs[] =
651		{
652			EGL_WIDTH,			width,
653			EGL_HEIGHT,			height,
654			EGL_TEXTURE_FORMAT,	EGL_NO_TEXTURE,
655			EGL_NONE
656		};
657
658		tcu::egl::PbufferSurface surface(display, config, attribs);
659
660		testAttributes(surface, info);
661	}
662};
663
664QuerySurfaceTests::QuerySurfaceTests (EglTestContext& eglTestCtx)
665	: TestCaseGroup(eglTestCtx, "query_surface", "Surface Query Tests")
666{
667}
668
669QuerySurfaceTests::~QuerySurfaceTests (void)
670{
671}
672
673std::vector<EGLint> getConfigs (const tcu::egl::Display& display, EGLint surfaceType)
674{
675	std::vector<EGLint>			out;
676
677	std::vector<EGLConfig> eglConfigs;
678	display.getConfigs(eglConfigs);
679
680	for (size_t ndx = 0; ndx < eglConfigs.size(); ndx++)
681	{
682		ConfigInfo info;
683		display.describeConfig(eglConfigs[ndx], info);
684
685		if (info.surfaceType & surfaceType)
686			out.push_back(info.configId);
687	}
688
689	return out;
690}
691
692void QuerySurfaceTests::init (void)
693{
694	// Simple queries
695	{
696		tcu::TestCaseGroup* simpleGroup = new tcu::TestCaseGroup(m_testCtx, "simple", "Simple queries");
697		addChild(simpleGroup);
698
699		// Window
700		{
701			tcu::TestCaseGroup* windowGroup = new tcu::TestCaseGroup(m_testCtx, "window", "Window surfaces");
702			simpleGroup->addChild(windowGroup);
703
704			eglu::FilterList filters;
705			filters << (eglu::ConfigSurfaceType() & EGL_WINDOW_BIT);
706
707			std::vector<NamedConfigIdSet> configIdSets;
708			NamedConfigIdSet::getDefaultSets(configIdSets, m_eglTestCtx.getConfigs(), filters);
709
710			for (std::vector<NamedConfigIdSet>::iterator i = configIdSets.begin(); i != configIdSets.end(); i++)
711				windowGroup->addChild(new QuerySurfaceSimpleWindowCase(m_eglTestCtx, i->getName(), i->getDescription(), i->getConfigIds()));
712		}
713
714		// Pixmap
715		{
716			tcu::TestCaseGroup* pixmapGroup = new tcu::TestCaseGroup(m_testCtx, "pixmap", "Pixmap surfaces");
717			simpleGroup->addChild(pixmapGroup);
718
719			eglu::FilterList filters;
720			filters << (eglu::ConfigSurfaceType() & EGL_PIXMAP_BIT);
721
722			std::vector<NamedConfigIdSet> configIdSets;
723			NamedConfigIdSet::getDefaultSets(configIdSets, m_eglTestCtx.getConfigs(), filters);
724
725			for (std::vector<NamedConfigIdSet>::iterator i = configIdSets.begin(); i != configIdSets.end(); i++)
726				pixmapGroup->addChild(new QuerySurfaceSimplePixmapCase(m_eglTestCtx, i->getName(), i->getDescription(), i->getConfigIds()));
727		}
728
729		// Pbuffer
730		{
731			tcu::TestCaseGroup* pbufferGroup = new tcu::TestCaseGroup(m_testCtx, "pbuffer", "Pbuffer surfaces");
732			simpleGroup->addChild(pbufferGroup);
733
734			eglu::FilterList filters;
735			filters << (eglu::ConfigSurfaceType() & EGL_PBUFFER_BIT);
736
737			std::vector<NamedConfigIdSet> configIdSets;
738			NamedConfigIdSet::getDefaultSets(configIdSets, m_eglTestCtx.getConfigs(), filters);
739
740			for (std::vector<NamedConfigIdSet>::iterator i = configIdSets.begin(); i != configIdSets.end(); i++)
741				pbufferGroup->addChild(new QuerySurfaceSimplePbufferCase(m_eglTestCtx, i->getName(), i->getDescription(), i->getConfigIds()));
742		}
743	}
744
745	// Set surface attributes
746	{
747		tcu::TestCaseGroup* setAttributeGroup = new tcu::TestCaseGroup(m_testCtx, "set_attribute", "Setting attributes");
748		addChild(setAttributeGroup);
749
750		// Window
751		{
752			tcu::TestCaseGroup* windowGroup = new tcu::TestCaseGroup(m_testCtx, "window", "Window surfaces");
753			setAttributeGroup->addChild(windowGroup);
754
755			eglu::FilterList filters;
756			filters << (eglu::ConfigSurfaceType() & EGL_WINDOW_BIT);
757
758			std::vector<NamedConfigIdSet> configIdSets;
759			NamedConfigIdSet::getDefaultSets(configIdSets, m_eglTestCtx.getConfigs(), filters);
760
761			for (std::vector<NamedConfigIdSet>::iterator i = configIdSets.begin(); i != configIdSets.end(); i++)
762				windowGroup->addChild(new SurfaceAttribWindowCase(m_eglTestCtx, i->getName(), i->getDescription(), i->getConfigIds()));
763		}
764
765		// Pixmap
766		{
767			tcu::TestCaseGroup* pixmapGroup = new tcu::TestCaseGroup(m_testCtx, "pixmap", "Pixmap surfaces");
768			setAttributeGroup->addChild(pixmapGroup);
769
770			eglu::FilterList filters;
771			filters << (eglu::ConfigSurfaceType() & EGL_PIXMAP_BIT);
772
773			std::vector<NamedConfigIdSet> configIdSets;
774			NamedConfigIdSet::getDefaultSets(configIdSets, m_eglTestCtx.getConfigs(), filters);
775
776			for (std::vector<NamedConfigIdSet>::iterator i = configIdSets.begin(); i != configIdSets.end(); i++)
777				pixmapGroup->addChild(new SurfaceAttribPixmapCase(m_eglTestCtx, i->getName(), i->getDescription(), i->getConfigIds()));
778		}
779
780		// Pbuffer
781		{
782			tcu::TestCaseGroup* pbufferGroup = new tcu::TestCaseGroup(m_testCtx, "pbuffer", "Pbuffer surfaces");
783			setAttributeGroup->addChild(pbufferGroup);
784
785			eglu::FilterList filters;
786			filters << (eglu::ConfigSurfaceType() & EGL_PBUFFER_BIT);
787
788			std::vector<NamedConfigIdSet> configIdSets;
789			NamedConfigIdSet::getDefaultSets(configIdSets, m_eglTestCtx.getConfigs(), filters);
790
791			for (std::vector<NamedConfigIdSet>::iterator i = configIdSets.begin(); i != configIdSets.end(); i++)
792				pbufferGroup->addChild(new SurfaceAttribPbufferCase(m_eglTestCtx, i->getName(), i->getDescription(), i->getConfigIds()));
793		}
794	}
795}
796
797} // egl
798} // deqp
799