1/*-------------------------------------------------------------------------
2 * drawElements Quality Program EGL Module
3 * ---------------------------------------
4 *
5 * Copyright 2014 The Android Open Source Project
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 *      http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 *
19 *//*!
20 * \file
21 * \brief Color clear tests.
22 *//*--------------------------------------------------------------------*/
23
24#include "teglColorClearTests.hpp"
25#include "teglColorClearCase.hpp"
26#include "eglwEnums.hpp"
27
28using std::string;
29using std::vector;
30
31namespace deqp
32{
33namespace egl
34{
35
36using namespace eglw;
37
38ColorClearTests::ColorClearTests (EglTestContext& eglTestCtx)
39	: TestCaseGroup(eglTestCtx, "color_clears", "Color clears with different client APIs")
40{
41}
42
43ColorClearTests::~ColorClearTests (void)
44{
45}
46
47struct ColorClearGroupSpec
48{
49	const char*			name;
50	const char*			desc;
51	EGLint				apiBits;
52	eglu::ConfigFilter	baseFilter;
53	int					numContextsPerApi;
54};
55
56template <class ClearClass>
57static void createColorClearGroups (EglTestContext& eglTestCtx, tcu::TestCaseGroup* group, const ColorClearGroupSpec* first, const ColorClearGroupSpec* last)
58{
59	for (const ColorClearGroupSpec* groupIter = first; groupIter != last; groupIter++)
60	{
61		tcu::TestCaseGroup* configGroup = new tcu::TestCaseGroup(eglTestCtx.getTestContext(), groupIter->name, groupIter->desc);
62		group->addChild(configGroup);
63
64		vector<RenderFilterList>	filterLists;
65		eglu::FilterList			baseFilters;
66		baseFilters << groupIter->baseFilter;
67		getDefaultRenderFilterLists(filterLists, baseFilters);
68
69		for (vector<RenderFilterList>::const_iterator listIter = filterLists.begin(); listIter != filterLists.end(); listIter++)
70			configGroup->addChild(new ClearClass(eglTestCtx, listIter->getName(), "", groupIter->apiBits, listIter->getSurfaceTypeMask(), *listIter, groupIter->numContextsPerApi));
71	}
72}
73
74template <deUint32 Bits>
75static bool renderable (const eglu::CandidateConfig& c)
76{
77	return (c.renderableType() & Bits) == Bits;
78}
79
80void ColorClearTests::init (void)
81{
82#define CASE(NAME, DESC, BITS, NUMCFG) { NAME, DESC, BITS, renderable<BITS>, NUMCFG }
83
84	static const ColorClearGroupSpec singleContextCases[] =
85	{
86		CASE("gles1",			"Color clears using GLES1",											EGL_OPENGL_ES_BIT,										1),
87		CASE("gles2",			"Color clears using GLES2",											EGL_OPENGL_ES2_BIT,										1),
88		CASE("gles3",			"Color clears using GLES3",											EGL_OPENGL_ES3_BIT,										1),
89		CASE("vg",				"Color clears using OpenVG",										EGL_OPENVG_BIT,											1)
90	};
91
92	static const ColorClearGroupSpec multiContextCases[] =
93	{
94		CASE("gles1",				"Color clears using multiple GLES1 contexts to shared surface",		EGL_OPENGL_ES_BIT,											3),
95		CASE("gles2",				"Color clears using multiple GLES2 contexts to shared surface",		EGL_OPENGL_ES2_BIT,											3),
96		CASE("gles3",				"Color clears using multiple GLES3 contexts to shared surface",		EGL_OPENGL_ES3_BIT,											3),
97		CASE("vg",					"Color clears using multiple OpenVG contexts to shared surface",	EGL_OPENVG_BIT,												3),
98		CASE("gles1_gles2",			"Color clears using multiple APIs to shared surface",				EGL_OPENGL_ES_BIT|EGL_OPENGL_ES2_BIT,						1),
99		CASE("gles1_gles2_gles3",	"Color clears using multiple APIs to shared surface",				EGL_OPENGL_ES_BIT|EGL_OPENGL_ES2_BIT|EGL_OPENGL_ES3_BIT,	1),
100		CASE("gles1_vg",			"Color clears using multiple APIs to shared surface",				EGL_OPENGL_ES_BIT|EGL_OPENVG_BIT,							1),
101		CASE("gles2_vg",			"Color clears using multiple APIs to shared surface",				EGL_OPENGL_ES2_BIT|EGL_OPENVG_BIT,							1),
102		CASE("gles3_vg",			"Color clears using multiple APIs to shared surface",				EGL_OPENGL_ES3_BIT|EGL_OPENVG_BIT,							1),
103		CASE("gles1_gles2_vg",		"Color clears using multiple APIs to shared surface",				EGL_OPENGL_ES_BIT|EGL_OPENGL_ES2_BIT|EGL_OPENVG_BIT,		1)
104	};
105
106#undef CASE
107
108	tcu::TestCaseGroup* singleContextGroup = new tcu::TestCaseGroup(m_testCtx, "single_context", "Single-context color clears");
109	addChild(singleContextGroup);
110	createColorClearGroups<SingleThreadColorClearCase>(m_eglTestCtx, singleContextGroup, &singleContextCases[0], &singleContextCases[DE_LENGTH_OF_ARRAY(singleContextCases)]);
111
112	tcu::TestCaseGroup* multiContextGroup = new tcu::TestCaseGroup(m_testCtx, "multi_context", "Multi-context color clears with shared surface");
113	addChild(multiContextGroup);
114	createColorClearGroups<SingleThreadColorClearCase>(m_eglTestCtx, multiContextGroup, &multiContextCases[0], &multiContextCases[DE_LENGTH_OF_ARRAY(multiContextCases)]);
115
116	tcu::TestCaseGroup* multiThreadGroup = new tcu::TestCaseGroup(m_testCtx, "multi_thread", "Multi-thread color clears with shared surface");
117	addChild(multiThreadGroup);
118	createColorClearGroups<MultiThreadColorClearCase>(m_eglTestCtx, multiThreadGroup, &multiContextCases[0], &multiContextCases[DE_LENGTH_OF_ARRAY(multiContextCases)]);
119}
120
121} // egl
122} // deqp
123