1d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu/*-------------------------------------------------------------------------
2d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu * drawElements Quality Program EGL Module
3d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu * ---------------------------------------
4d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu *
5d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu * Copyright 2015 The Android Open Source Project
6d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu *
7d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu * Licensed under the Apache License, Version 2.0 (the "License");
8d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu * you may not use this file except in compliance with the License.
9d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu * You may obtain a copy of the License at
10d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu *
11d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu *       http://www.apache.org/licenses/LICENSE-2.0
12d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu *
13d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu * Unless required by applicable law or agreed to in writing, software
14d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu * distributed under the License is distributed on an "AS IS" BASIS,
15d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu * See the License for the specific language governing permissions and
17d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu * limitations under the License.
18d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu *
19d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu *//*!
20d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu * \file
21d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu * \brief Test KHR_swap_buffer_with_damage
22d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu *//*--------------------------------------------------------------------*/
23d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
24d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu#include "teglSwapBuffersWithDamageTests.hpp"
25d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
26d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu#include "tcuImageCompare.hpp"
27d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu#include "tcuSurface.hpp"
28d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu#include "tcuTextureUtil.hpp"
29d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
30d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu#include "egluNativeWindow.hpp"
31d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu#include "egluUtil.hpp"
32d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu#include "egluConfigFilter.hpp"
33d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
34d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu#include "eglwLibrary.hpp"
35d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu#include "eglwEnums.hpp"
36d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
37d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu#include "gluDefs.hpp"
38d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu#include "gluRenderContext.hpp"
39d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu#include "gluShaderProgram.hpp"
40d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
41d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu#include "glwDefs.hpp"
42d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu#include "glwEnums.hpp"
43d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu#include "glwFunctions.hpp"
44d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
45d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu#include "deRandom.hpp"
46d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu#include "deString.h"
47d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
48d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu#include <string>
49d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu#include <vector>
50d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu#include <sstream>
51d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
52d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Huusing std::string;
53d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Huusing std::vector;
54d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Huusing glw::GLubyte;
55d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Huusing tcu::IVec2;
56d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
57d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Huusing namespace eglw;
58d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
59d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hunamespace deqp
60d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu{
61d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hunamespace egl
62d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu{
63d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hunamespace
64d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu{
65d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
66d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hutypedef	tcu::Vector<GLubyte, 3> Color;
67d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
68d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Huenum DrawType
69d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu{
70d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu    DRAWTYPE_GLES2_CLEAR,
71d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu    DRAWTYPE_GLES2_RENDER
72d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu};
73d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
74043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvienum ResizeType
75043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi{
76043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi	RESIZETYPE_NONE = 0,
77043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi	RESIZETYPE_BEFORE_SWAP,
78043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi	RESIZETYPE_AFTER_SWAP,
79043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi
80043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi	RESIZETYPE_LAST
81043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi};
82043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi
83d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hustruct ColoredRect
84d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu{
85d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hupublic:
86d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu				ColoredRect (const IVec2& bottomLeft_, const IVec2& topRight_, const Color& color_);
87d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	IVec2		bottomLeft;
88d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	IVec2		topRight;
89653ad0e8a4209754304cbd5b5ceb4fdc7b29c01aPyry Haulos	Color		color;
90d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu};
91d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
92d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan HuColoredRect::ColoredRect (const IVec2& bottomLeft_, const IVec2& topRight_, const Color& color_)
93d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	: bottomLeft	(bottomLeft_)
94d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	, topRight		(topRight_)
95d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	, color			(color_)
96d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu{
97d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu}
98d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
99d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hustruct DrawCommand
100d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu{
101d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu				DrawCommand (DrawType drawType_, const ColoredRect& rect_);
102d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu    DrawType	drawType;
103d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	ColoredRect	rect;
104d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu};
105d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
106d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan HuDrawCommand::DrawCommand (DrawType drawType_, const ColoredRect& rect_)
107d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	: drawType	(drawType_)
108d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	, rect		(rect_)
109d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu{
110d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu}
111d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
112d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hustruct Frame
113d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu{
114d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu						Frame (int width_, int height_);
115653ad0e8a4209754304cbd5b5ceb4fdc7b29c01aPyry Haulos	int					width;
116d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	int					height;
117d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	vector<DrawCommand> draws;
118d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu};
119d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
120d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan HuFrame::Frame (int width_, int height_)
121d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	: width (width_)
122d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	, height(height_)
123d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu{
124d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu}
125d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
126d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hutypedef vector<Frame> FrameSequence;
127d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
128d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu//helper function declaration
129d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan HuEGLConfig		getEGLConfig					(const Library& egl, EGLDisplay eglDisplay, bool preserveBuffer);
130d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Huvoid			clearColorScreen				(const glw::Functions& gl, const tcu::Vec4& clearColor);
131d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hufloat			windowToDeviceCoordinates		(int x, int length);
132d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
133d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Huclass GLES2Renderer
134d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu{
135d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hupublic:
136d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu							GLES2Renderer		(const glw::Functions& gl);
137d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu							~GLES2Renderer		(void);
138d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	void					render				(int width, int height, const Frame& frame) const;
139d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
140d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Huprivate:
141d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu							GLES2Renderer		(const GLES2Renderer&);
142d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	GLES2Renderer&			operator=			(const GLES2Renderer&);
143d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
144d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	const glw::Functions&	m_gl;
145d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	glu::ShaderProgram		m_glProgram;
146d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	glw::GLuint				m_coordLoc;
147d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	glw::GLuint				m_colorLoc;
148d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu};
149d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
150d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu// generate sources for vertex and fragment buffer
151d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Huglu::ProgramSources getSources (void)
152d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu{
153d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	const char* const vertexShaderSource =
154d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu		"attribute mediump vec2 a_pos;\n"
155d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu		"attribute mediump vec4 a_color;\n"
156d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu		"varying mediump vec4 v_color;\n"
157d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu		"void main(void)\n"
158d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu		"{\n"
159d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu		"\tv_color = a_color;\n"
160d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu		"\tgl_Position = vec4(a_pos, 0.0, 1.0);\n"
161d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu		"}";
162d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
163d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	const char* const fragmentShaderSource =
164d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu		"varying mediump vec4 v_color;\n"
165d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu		"void main(void)\n"
166d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu		"{\n"
167d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu		"\tgl_FragColor = v_color;\n"
168d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu		"}";
169d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
170d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	return glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource);
171d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu}
172d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
173d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan HuGLES2Renderer::GLES2Renderer (const glw::Functions& gl)
174d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	: m_gl        (gl)
175d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	, m_glProgram (gl, getSources())
176d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	, m_coordLoc  ((glw::GLuint)-1)
177d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	, m_colorLoc  ((glw::GLuint)-1)
178d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu{
179d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	m_colorLoc = m_gl.getAttribLocation(m_glProgram.getProgram(), "a_color");
180d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	m_coordLoc = m_gl.getAttribLocation(m_glProgram.getProgram(), "a_pos");
181d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	GLU_EXPECT_NO_ERROR(m_gl.getError(), "Failed to get attribute locations");
182d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu}
183d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
184d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan HuGLES2Renderer::~GLES2Renderer (void)
185d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu{
186d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu}
187d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
188d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Huvoid GLES2Renderer::render (int width, int height, const Frame& frame) const
189d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu{
190d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	for (size_t drawNdx = 0; drawNdx < frame.draws.size(); drawNdx++)
191d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	{
192d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu		const ColoredRect& coloredRect = frame.draws[drawNdx].rect;
193d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
194d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu		if (frame.draws[drawNdx].drawType == DRAWTYPE_GLES2_RENDER)
195d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu		{
196d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu			const float x1 = windowToDeviceCoordinates(coloredRect.bottomLeft.x(), width);
197d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu			const float y1 = windowToDeviceCoordinates(coloredRect.bottomLeft.y(), height);
198d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu			const float x2 = windowToDeviceCoordinates(coloredRect.topRight.x(), width);
199d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu			const float y2 = windowToDeviceCoordinates(coloredRect.topRight.y(), height);
200d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
201d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu			const glw::GLfloat coords[] =
202d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu			{
203d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu				x1, y1,
204d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu				x1, y2,
205d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu				x2, y2,
206d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
207d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu				x2, y2,
208d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu				x2, y1,
209d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu				x1, y1,
210d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu			};
211d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
212d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu			const glw::GLubyte colors[] =
213d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu			{
214d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu				coloredRect.color.x(), coloredRect.color.y(), coloredRect.color.z(), 255,
215d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu				coloredRect.color.x(), coloredRect.color.y(), coloredRect.color.z(), 255,
216d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu				coloredRect.color.x(), coloredRect.color.y(), coloredRect.color.z(), 255,
217d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
218d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu				coloredRect.color.x(), coloredRect.color.y(), coloredRect.color.z(), 255,
219d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu				coloredRect.color.x(), coloredRect.color.y(), coloredRect.color.z(), 255,
220d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu				coloredRect.color.x(), coloredRect.color.y(), coloredRect.color.z(), 255,
221d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu			};
222d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
223d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu			m_gl.useProgram(m_glProgram.getProgram());
224d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu			GLU_EXPECT_NO_ERROR(m_gl.getError(), "glUseProgram() failed");
225d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
226d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu			m_gl.enableVertexAttribArray(m_coordLoc);
227d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu			m_gl.enableVertexAttribArray(m_colorLoc);
228d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu			GLU_EXPECT_NO_ERROR(m_gl.getError(), "Failed to enable attributes");
229d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
230d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu			m_gl.vertexAttribPointer(m_coordLoc, 2, GL_FLOAT, GL_FALSE, 0, coords);
231d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu			m_gl.vertexAttribPointer(m_colorLoc, 4, GL_UNSIGNED_BYTE, GL_TRUE, 0, colors);
232d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu			GLU_EXPECT_NO_ERROR(m_gl.getError(), "Failed to set attribute pointers");
233d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
234d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu			m_gl.drawArrays(GL_TRIANGLES, 0, DE_LENGTH_OF_ARRAY(coords)/2);
235d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu			GLU_EXPECT_NO_ERROR(m_gl.getError(), "glDrawArrays(), failed");
236d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
237d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu			m_gl.disableVertexAttribArray(m_coordLoc);
238d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu			m_gl.disableVertexAttribArray(m_colorLoc);
239d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu			GLU_EXPECT_NO_ERROR(m_gl.getError(), "Failed to disable attributes");
240d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
241d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu			m_gl.useProgram(0);
242d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu			GLU_EXPECT_NO_ERROR(m_gl.getError(), "glUseProgram() failed");
243d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu		}
244d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu		else if (frame.draws[drawNdx].drawType == DRAWTYPE_GLES2_CLEAR)
245d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu		{
246d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu			m_gl.enable(GL_SCISSOR_TEST);
247d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu			m_gl.scissor(coloredRect.bottomLeft.x(), coloredRect.bottomLeft.y(),
248d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu						 coloredRect.topRight.x()-coloredRect.bottomLeft.x(), coloredRect.topRight.y()-coloredRect.bottomLeft.y());
249d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu			m_gl.clearColor(coloredRect.color.x()/255.0f, coloredRect.color.y()/255.0f, coloredRect.color.z()/255.0f, 1.0f);
250d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu			m_gl.clear(GL_COLOR_BUFFER_BIT);
251d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu			m_gl.disable(GL_SCISSOR_TEST);
252d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu		}
253d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu		else
254d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu			DE_FATAL("Invalid drawtype");
255d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	}
256d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu}
257d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
258d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Huclass SwapBuffersWithDamageTest : public TestCase
259d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu{
260d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hupublic:
261043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi								SwapBuffersWithDamageTest		(EglTestContext&			eglTestCtx,
262043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi																 const vector<DrawType>&	frameDrawType,
263043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi																 int						iterationTimes,
264043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi																 ResizeType					resizeType,
265043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi																 const char*				name,
266043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi																 const char*				description);
267043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi
268d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu								~SwapBuffersWithDamageTest		(void);
269d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
270d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	virtual void				init							(void);
271d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	void						deinit							(void);
272d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	virtual IterateResult		iterate							(void);
273d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
274d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Huprotected:
275d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	virtual EGLConfig			getConfig						(const Library& egl, EGLDisplay eglDisplay);
276d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	virtual void				checkExtension					(const Library& egl, EGLDisplay eglDisplay);
277d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	void						initEGLSurface					(EGLConfig config);
278d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	void						initEGLContext					(EGLConfig config);
279d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
280d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	eglu::NativeWindow*			m_window;
281d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	EGLConfig					m_eglConfig;
282d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	EGLContext					m_eglContext;
283d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	const int					m_seed;
284d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	const int					m_iterationTimes;
285043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi	const vector<DrawType>		m_frameDrawType;
286043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi	const ResizeType			m_resizeType;
287d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	EGLDisplay					m_eglDisplay;
288d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	EGLSurface					m_eglSurface;
289d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	glw::Functions				m_gl;
290d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	GLES2Renderer*				m_gles2Renderer;
291d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu};
292d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
293043056f99f5caae4360e20c9dfe813edf281a13fMika IsojärviSwapBuffersWithDamageTest::SwapBuffersWithDamageTest (EglTestContext& eglTestCtx, const vector<DrawType>& frameDrawType, int iterationTimes, ResizeType resizeType, const char* name, const char* description)
294043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi	: TestCase			(eglTestCtx, name, description)
295043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi	, m_window			(DE_NULL)
296043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi	, m_eglContext		(EGL_NO_CONTEXT)
297043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi	, m_seed			(deStringHash(name))
298043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi	, m_iterationTimes	(iterationTimes)
299043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi	, m_frameDrawType	(frameDrawType)
300043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi	, m_resizeType		(resizeType)
301043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi	, m_eglDisplay		(EGL_NO_DISPLAY)
302043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi	, m_eglSurface		(EGL_NO_SURFACE)
303043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi	, m_gles2Renderer	 (DE_NULL)
304d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu{
305d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu}
306d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
307d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan HuSwapBuffersWithDamageTest::~SwapBuffersWithDamageTest (void)
308d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu{
309d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	deinit();
310d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu}
311d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
312d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan HuEGLConfig SwapBuffersWithDamageTest::getConfig (const Library& egl, EGLDisplay eglDisplay)
313d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu{
314d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	return getEGLConfig(egl, eglDisplay, false);
315d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu}
316d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
317d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Huvoid SwapBuffersWithDamageTest::checkExtension (const Library& egl, EGLDisplay eglDisplay)
318d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu{
319d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	if (!eglu::hasExtension(egl, eglDisplay, "EGL_KHR_swap_buffers_with_damage"))
320d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu		TCU_THROW(NotSupportedError, "EGL_KHR_swap_buffers_with_damage is not supported");
321d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu}
322d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
323d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Huvoid SwapBuffersWithDamageTest::init (void)
324d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu{
325d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	const Library& egl = m_eglTestCtx.getLibrary();
326d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
327d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	m_eglDisplay = eglu::getAndInitDisplay(m_eglTestCtx.getNativeDisplay());
328d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	m_eglConfig  = getConfig(egl, m_eglDisplay);
329d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
330d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	checkExtension(egl, m_eglDisplay);
331d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
332d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	initEGLSurface(m_eglConfig);
333d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	initEGLContext(m_eglConfig);
334d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
335d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	m_eglTestCtx.initGLFunctions(&m_gl, glu::ApiType::es(2,0));
336d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	m_gles2Renderer = new GLES2Renderer(m_gl);
337d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu}
338d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
339d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Huvoid SwapBuffersWithDamageTest::deinit (void)
340d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu{
341d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	const Library& egl = m_eglTestCtx.getLibrary();
342d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
343d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	delete m_gles2Renderer;
344d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	m_gles2Renderer = DE_NULL;
345d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
346d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	if (m_eglContext != EGL_NO_CONTEXT)
347d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	{
348d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu		egl.makeCurrent(m_eglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
349d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu		egl.destroyContext(m_eglDisplay, m_eglContext);
350d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu		m_eglContext = EGL_NO_CONTEXT;
351d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	}
352d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
353d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	if (m_eglSurface != EGL_NO_SURFACE)
354d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	{
355d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu		egl.destroySurface(m_eglDisplay, m_eglSurface);
356d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu		m_eglSurface = EGL_NO_SURFACE;
357d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	}
358d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
359d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	if (m_eglDisplay != EGL_NO_DISPLAY)
360d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	{
361d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu		egl.terminate(m_eglDisplay);
362d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu		m_eglDisplay = EGL_NO_DISPLAY;
363d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	}
364d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
365d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	delete m_window;
366d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	m_window = DE_NULL;
367d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu}
368d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
369d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Huvoid SwapBuffersWithDamageTest::initEGLSurface (EGLConfig config)
370d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu{
371d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	const eglu::NativeWindowFactory& factory = eglu::selectNativeWindowFactory(m_eglTestCtx.getNativeDisplayFactory(), m_testCtx.getCommandLine());
372d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	m_window = factory.createWindow(&m_eglTestCtx.getNativeDisplay(), m_eglDisplay, config, DE_NULL,
373d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu									eglu::WindowParams(480, 480, eglu::parseWindowVisibility(m_testCtx.getCommandLine())));
374d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	m_eglSurface = eglu::createWindowSurface(m_eglTestCtx.getNativeDisplay(), *m_window, m_eglDisplay, config, DE_NULL);
375d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu}
376d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
377d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Huvoid SwapBuffersWithDamageTest::initEGLContext (EGLConfig config)
378d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu{
379653ad0e8a4209754304cbd5b5ceb4fdc7b29c01aPyry Haulos	const Library&	egl			 = m_eglTestCtx.getLibrary();
380653ad0e8a4209754304cbd5b5ceb4fdc7b29c01aPyry Haulos	const EGLint	attribList[] =
381d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	{
382d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu		EGL_CONTEXT_CLIENT_VERSION, 2,
383d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu		EGL_NONE
384d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	};
385d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
386d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	egl.bindAPI(EGL_OPENGL_ES_API);
387d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	m_eglContext = egl.createContext(m_eglDisplay, config, EGL_NO_CONTEXT, attribList);
388d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	EGLU_CHECK_MSG(egl, "eglCreateContext");
389d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	TCU_CHECK(m_eglSurface != EGL_NO_SURFACE);
390d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	egl.makeCurrent(m_eglDisplay, m_eglSurface, m_eglSurface, m_eglContext);
391d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	EGLU_CHECK_MSG(egl, "eglMakeCurrent");
392d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu}
393d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
394d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan HuFrameSequence	generateFrameSequence	(const vector<DrawType>& frameDrawType, de::Random& rnd, int numFrames, int width, int height);
395d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Huvector<EGLint>	getDamageRegion			(const Frame& frame);
396d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
397d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan HuTestCase::IterateResult SwapBuffersWithDamageTest::iterate (void)
398d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu{
399d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	de::Random			rnd				(m_seed);
400d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	const Library&		egl				= m_eglTestCtx.getLibrary();
401d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	const int			width			= eglu::querySurfaceInt(egl, m_eglDisplay, m_eglSurface, EGL_WIDTH);
402d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	const int			height			= eglu::querySurfaceInt(egl, m_eglDisplay, m_eglSurface, EGL_HEIGHT);
403d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	const float			clearRed		= rnd.getFloat();
404d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	const float			clearGreen		= rnd.getFloat();
405d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	const float			clearBlue		= rnd.getFloat();
406d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	const tcu::Vec4		clearColor		(clearRed, clearGreen, clearBlue, 1.0f);
407d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	const int			numFrames		= 24; // (width, height) = (480, 480) --> numFrame = 24, divisible
408d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	const FrameSequence frameSequence	= generateFrameSequence(m_frameDrawType, rnd, numFrames, width, height);
409d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
410d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
411d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	EGLU_CHECK_CALL(egl, surfaceAttrib(m_eglDisplay, m_eglSurface, EGL_SWAP_BEHAVIOR, EGL_BUFFER_DESTROYED));
412d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
413d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	for (int iterationNdx = 0; iterationNdx < m_iterationTimes; iterationNdx++)
414d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	{
415d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu		for (int currentFrameNdx = 0; currentFrameNdx < numFrames; currentFrameNdx++)
416d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu		{
417d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu			vector<EGLint>	damageRegion = getDamageRegion(frameSequence[currentFrameNdx]);
418d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
419d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu			clearColorScreen(m_gl, clearColor);
420d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu			for (int ndx = 0; ndx <= currentFrameNdx; ndx++)
421d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu				m_gles2Renderer->render(width, height, frameSequence[ndx]);
422d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
423043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi			if (m_resizeType == RESIZETYPE_BEFORE_SWAP)
424043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi			{
425043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi				if (iterationNdx % 2 == 0)
426043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi					m_window->setSurfaceSize(IVec2(width*2, height/2));
427043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi				else
428043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi					m_window->setSurfaceSize(IVec2(height/2, width*2));
429043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi			}
430043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi
431d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu			EGLU_CHECK_CALL(egl, swapBuffersWithDamageKHR(m_eglDisplay, m_eglSurface, &damageRegion[0], (EGLint)damageRegion.size()/4));
432043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi
433043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi			if (m_resizeType == RESIZETYPE_AFTER_SWAP)
434043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi			{
435043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi				if (iterationNdx % 2 == 0)
436043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi					m_window->setSurfaceSize(IVec2(width*2, height/2));
437043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi				else
438043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi					m_window->setSurfaceSize(IVec2(height/2, width*2));
439043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi			}
440d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu		}
441d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	}
442d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	return STOP;
443d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu}
444d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
445d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Huclass SwapBuffersWithDamageAndPreserveBufferTest : public SwapBuffersWithDamageTest
446d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu{
447d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hupublic:
448043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi					SwapBuffersWithDamageAndPreserveBufferTest	(EglTestContext&			eglTestCtx,
449043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi																 const vector<DrawType>&	frameDrawType,
450043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi																 int						iterationTimes,
451043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi																 ResizeType					resizeType,
452043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi																 const char*				name,
453043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi																 const char*				description);
454043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi
455d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	IterateResult	iterate										(void);
456d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
457d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Huprotected:
458d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	EGLConfig		getConfig									(const Library& egl, EGLDisplay eglDisplay);
459d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu};
460d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
461043056f99f5caae4360e20c9dfe813edf281a13fMika IsojärviSwapBuffersWithDamageAndPreserveBufferTest::SwapBuffersWithDamageAndPreserveBufferTest (EglTestContext&			eglTestCtx,
462043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi																						const vector<DrawType>&	frameDrawType,
463043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi																						int						iterationTimes,
464043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi																						ResizeType				resizeType,
465043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi																						const char*				name,
466043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi																						const char*				description)
467043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi	: SwapBuffersWithDamageTest (eglTestCtx, frameDrawType, iterationTimes, resizeType, name, description)
468d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu{
469d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu}
470d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
471d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan HuEGLConfig SwapBuffersWithDamageAndPreserveBufferTest::getConfig (const Library& egl, EGLDisplay eglDisplay)
472d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu{
473d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	return getEGLConfig(egl, eglDisplay, true);
474d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu}
475d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
476d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan HuTestCase::IterateResult SwapBuffersWithDamageAndPreserveBufferTest::iterate (void)
477d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu{
478d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
479d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	de::Random			rnd				(m_seed);
480d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	const Library&		egl				= m_eglTestCtx.getLibrary();
481d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	const int			width			= eglu::querySurfaceInt(egl, m_eglDisplay, m_eglSurface, EGL_WIDTH);
482d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	const int			height			= eglu::querySurfaceInt(egl, m_eglDisplay, m_eglSurface, EGL_HEIGHT);
483d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	const float			clearRed		= rnd.getFloat();
484d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	const float			clearGreen		= rnd.getFloat();
485d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	const float			clearBlue		= rnd.getFloat();
486d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	const tcu::Vec4		clearColor		(clearRed, clearGreen, clearBlue, 1.0f);
487d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	const int			numFrames		= 24; // (width, height) = (480, 480) --> numFrame = 24, divisible
488d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	const FrameSequence frameSequence	= generateFrameSequence(m_frameDrawType, rnd, numFrames, width, height);
489d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
490d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
491d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	EGLU_CHECK_CALL(egl, surfaceAttrib(m_eglDisplay, m_eglSurface, EGL_SWAP_BEHAVIOR, EGL_BUFFER_PRESERVED));
492d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
493d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	for (int iterationNdx = 0; iterationNdx < m_iterationTimes; iterationNdx++)
494d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	{
495d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu		clearColorScreen(m_gl, clearColor);
496d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu		EGLU_CHECK_CALL(egl, swapBuffersWithDamageKHR(m_eglDisplay, m_eglSurface, DE_NULL, 0));
497d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
498d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu		for (int frameNdx = 0; frameNdx < numFrames; frameNdx++)
499d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu		{
500d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu			const Frame&	currentFrame = frameSequence[frameNdx];
501d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu			vector<EGLint>	damageRegion = getDamageRegion(currentFrame);
502d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
503d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu			m_gles2Renderer->render(width, height, currentFrame);
504043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi
505043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi			if (m_resizeType == RESIZETYPE_BEFORE_SWAP)
506043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi			{
507043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi				if (iterationNdx % 2 == 0)
508043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi					m_window->setSurfaceSize(IVec2(width*2, height/2));
509043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi				else
510043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi					m_window->setSurfaceSize(IVec2(height/2, width*2));
511043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi			}
512043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi
513d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu			EGLU_CHECK_CALL(egl, swapBuffersWithDamageKHR(m_eglDisplay, m_eglSurface, &damageRegion[0], (EGLint)damageRegion.size()/4));
514043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi
515043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi			if (m_resizeType == RESIZETYPE_AFTER_SWAP)
516043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi			{
517043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi				if (iterationNdx % 2 == 0)
518043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi					m_window->setSurfaceSize(IVec2(width*2, height/2));
519043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi				else
520043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi					m_window->setSurfaceSize(IVec2(height/2, width*2));
521043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi			}
522d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu		}
523d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	}
524d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
525d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	return STOP;
526d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu}
527d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
528d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Huclass SwapBuffersWithDamageAndBufferAgeTest : public SwapBuffersWithDamageTest
529d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu{
530d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hupublic:
531043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi					SwapBuffersWithDamageAndBufferAgeTest	(EglTestContext&			eglTestCtx,
532043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi															 const vector<DrawType>&	frameDrawType,
533043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi															 int						iterationTimes,
534043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi															 ResizeType					resizeType,
535043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi															 const char*				name,
536043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi															 const char*				description);
537043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi
538d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	IterateResult	iterate									(void);
539d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
540d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Huprotected:
541d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	void			checkExtension							(const Library& egl, EGLDisplay eglDisplay);
542d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu};
543d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
544043056f99f5caae4360e20c9dfe813edf281a13fMika IsojärviSwapBuffersWithDamageAndBufferAgeTest::SwapBuffersWithDamageAndBufferAgeTest (EglTestContext&			eglTestCtx,
545043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi																			  const vector<DrawType>&	frameDrawType,
546043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi																			  int						iterationTimes,
547043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi																			  ResizeType				resizeType,
548043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi																			  const char*				name,
549043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi																			  const char*				description)
550043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi	: SwapBuffersWithDamageTest (eglTestCtx, frameDrawType, iterationTimes, resizeType, name, description)
551d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu{
552d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu}
553d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
554d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
555d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Huvoid SwapBuffersWithDamageAndBufferAgeTest::checkExtension (const Library& egl, EGLDisplay eglDisplay)
556d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu{
557d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	if (!eglu::hasExtension(egl, eglDisplay, "EGL_KHR_swap_buffers_with_damage"))
558d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu		TCU_THROW(NotSupportedError, "EGL_KHR_swap_buffers_with_damage is not supported");
559d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
560d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	if (!eglu::hasExtension(egl, eglDisplay, "EGL_EXT_buffer_age"))
561d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu		TCU_THROW(NotSupportedError, "EGL_EXT_buffer_age not supported");
562d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu}
563d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
564d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan HuTestCase::IterateResult SwapBuffersWithDamageAndBufferAgeTest::iterate (void)
565d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu{
566d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
567d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	de::Random			rnd				(m_seed);
568d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	const Library&		egl				= m_eglTestCtx.getLibrary();
569d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	const int			width			= eglu::querySurfaceInt(egl, m_eglDisplay, m_eglSurface, EGL_WIDTH);
570d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	const int			height			= eglu::querySurfaceInt(egl, m_eglDisplay, m_eglSurface, EGL_HEIGHT);
571d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	const float			clearRed		= rnd.getFloat();
572d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	const float			clearGreen		= rnd.getFloat();
573d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	const float			clearBlue		= rnd.getFloat();
574d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	const tcu::Vec4		clearColor		(clearRed, clearGreen, clearBlue, 1.0f);
575d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	const int			numFrames		= 24; // (width, height) = (480, 480) --> numFrame = 24, divisible
576d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	const FrameSequence frameSequence	= generateFrameSequence(m_frameDrawType, rnd, numFrames, width, height);
577d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
578d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
579d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	EGLU_CHECK_CALL(egl, surfaceAttrib(m_eglDisplay, m_eglSurface, EGL_SWAP_BEHAVIOR, EGL_BUFFER_DESTROYED));
580d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
581d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	for (int iterationNdx = 0; iterationNdx < m_iterationTimes; iterationNdx++)
582d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	{
58347e4ec00e391faa4a310b7565f0f5c4853766917Hengyuan Hu		clearColorScreen(m_gl, clearColor);
58447e4ec00e391faa4a310b7565f0f5c4853766917Hengyuan Hu		EGLU_CHECK_CALL(egl, swapBuffersWithDamageKHR(m_eglDisplay, m_eglSurface, DE_NULL, 0));
58547e4ec00e391faa4a310b7565f0f5c4853766917Hengyuan Hu
586d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu		for (int frameNdx = 0; frameNdx < numFrames; frameNdx++)
587d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu		{
588d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu			vector<EGLint>	damageRegion;
589d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu			int				bufferAge		= -1;
590d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu			int				startFrameNdx	= -1;
591d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu			int				endFrameNdx		= frameNdx;
592d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
593d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu			EGLU_CHECK_CALL(egl, querySurface(m_eglDisplay, m_eglSurface, EGL_BUFFER_AGE_EXT, &bufferAge));
594d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
595d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu			if (bufferAge < 0) // invalid buffer age
596d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu			{
597d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu				std::ostringstream stream;
598d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu				stream << "Fail, the age is invalid. Age: " << bufferAge << ", frameNdx: " << frameNdx;
599d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu				m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, stream.str().c_str());
600d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu				return STOP;
601d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu			}
602d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
603d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu			if (bufferAge == 0 || bufferAge > frameNdx)
604d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu			{
605d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu				clearColorScreen(m_gl, clearColor);
606d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu				startFrameNdx = 0;
607d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu			}
608d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu			else
609d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu				startFrameNdx = frameNdx-bufferAge+1;
610d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
611d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu			for (int ndx = startFrameNdx; ndx <= endFrameNdx; ndx++)
612d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu			{
613d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu				const vector<EGLint> partialDamageRegion = getDamageRegion(frameSequence[ndx]);
614d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
615d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu				damageRegion.insert(damageRegion.end(), partialDamageRegion.begin(), partialDamageRegion.end());
616d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu				m_gles2Renderer->render(width, height, frameSequence[ndx]);
617d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu			}
618d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
619043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi			if (m_resizeType == RESIZETYPE_BEFORE_SWAP)
620043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi			{
621043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi				if (iterationNdx % 2 == 0)
622043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi					m_window->setSurfaceSize(IVec2(width*2, height/2));
623043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi				else
624043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi					m_window->setSurfaceSize(IVec2(height/2, width*2));
625043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi			}
626043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi
627d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu			EGLU_CHECK_CALL(egl, swapBuffersWithDamageKHR(m_eglDisplay, m_eglSurface, &damageRegion[0], (EGLint)damageRegion.size()/4));
628043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi
629043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi			if (m_resizeType == RESIZETYPE_AFTER_SWAP)
630043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi			{
631043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi				if (iterationNdx % 2 == 0)
632043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi					m_window->setSurfaceSize(IVec2(width*2, height/2));
633043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi				else
634043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi					m_window->setSurfaceSize(IVec2(height/2, width*2));
635043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi			}
636d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu		}
637d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	}
638d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	return STOP;
639d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu}
640d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
641d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu// generate a frame sequence with certain frame for visual verification
642d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan HuFrameSequence generateFrameSequence (const vector<DrawType>& frameDrawType, de::Random& rnd, int numFrames, int width, int height)
643d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu{
644d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	const int			frameDiff		= height / numFrames;
645d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	const GLubyte		r				= rnd.getUint8();
646d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	const GLubyte		g				= rnd.getUint8();
647d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	const GLubyte		b				= rnd.getUint8();
648d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	const Color			color			(r, g, b);
649d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	FrameSequence		frameSequence;
650d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
651d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	for (int frameNdx = 0; frameNdx < numFrames; frameNdx++)
652d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	{
653d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu		Frame frame (width, height);
654d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
655d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu		for (int rectNdx = 0; rectNdx < (int)frameDrawType.size(); rectNdx++)
656d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu		{
657d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu			const int			rectHeight		= frameDiff / (int)frameDrawType.size();
658d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu			const ColoredRect	rect			(IVec2(0, frameNdx*frameDiff+rectNdx*rectHeight), IVec2(width, frameNdx*frameDiff+(rectNdx+1)*rectHeight), color);
659d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu			const DrawCommand	drawCommand		(frameDrawType[rectNdx], rect);
660d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
661d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu			frame.draws.push_back(drawCommand);
662d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu		}
663d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu		frameSequence.push_back(frame);
664d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	}
665d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	return frameSequence;
666d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu}
667d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
668d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Huvector<EGLint> getDamageRegion (const Frame& frame)
669d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu{
670d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	vector<EGLint> damageRegion;
671d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	for (size_t drawNdx = 0; drawNdx < frame.draws.size(); drawNdx++)
672d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	{
673d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu		const ColoredRect& rect = frame.draws[drawNdx].rect;
674d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu		damageRegion.push_back(rect.bottomLeft.x());
675d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu		damageRegion.push_back(rect.bottomLeft.y());
676d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu		damageRegion.push_back(rect.topRight.x() - rect.bottomLeft.x());
677d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu		damageRegion.push_back(rect.topRight.y() - rect.bottomLeft.y());
678d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	}
679d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
680d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	DE_ASSERT(damageRegion.size() % 4 == 0);
681d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	return damageRegion;
682d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu}
683d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
684d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hustring generateTestName (const vector<DrawType>& frameDrawType)
685d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu{
686d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	std::ostringstream stream;
687d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
688d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	for (size_t ndx = 0; ndx < frameDrawType.size(); ndx++)
689d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	{
690d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu		if (frameDrawType[ndx] == DRAWTYPE_GLES2_RENDER)
691d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu			stream << "render";
692d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu		else if (frameDrawType[ndx] == DRAWTYPE_GLES2_CLEAR)
693d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu			stream << "clear";
694d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu		else
695d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu			DE_ASSERT(false);
696d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
697d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu		if (ndx < frameDrawType.size()-1)
698d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu			stream << "_";
699d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	}
700d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
701d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	return stream.str();
702d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu}
703d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
704043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvistring generateResizeGroupName (ResizeType resizeType)
705043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi{
706043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi	switch (resizeType)
707043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi	{
708043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi		case RESIZETYPE_NONE:
709043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi			return "no_resize";
710043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi
711043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi		case RESIZETYPE_AFTER_SWAP:
712043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi			return "resize_after_swap";
713043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi
714043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi		case RESIZETYPE_BEFORE_SWAP:
715043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi			return "resize_before_swap";
716043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi
717043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi		default:
718043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi			DE_FATAL("Unknown resize type");
719043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi			return "";
720043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi	}
721043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi}
722043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi
723d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hubool isWindow (const eglu::CandidateConfig& c)
724d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu{
725d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	return (c.surfaceType() & EGL_WINDOW_BIT) == EGL_WINDOW_BIT;
726d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu}
727d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
728d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hubool isES2Renderable (const eglu::CandidateConfig& c)
729d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu{
730d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	return (c.get(EGL_RENDERABLE_TYPE) & EGL_OPENGL_ES2_BIT) == EGL_OPENGL_ES2_BIT;
731d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu}
732d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
733d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hubool hasPreserveSwap (const eglu::CandidateConfig& c)
734d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu{
735d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	return (c.surfaceType() & EGL_SWAP_BEHAVIOR_PRESERVED_BIT) == EGL_SWAP_BEHAVIOR_PRESERVED_BIT;
736d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu}
737d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
738d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan HuEGLConfig getEGLConfig (const Library& egl, EGLDisplay eglDisplay, bool preserveBuffer)
739d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu{
740d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	eglu::FilterList filters;
741d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
742d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	filters << isWindow << isES2Renderable;
743d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	if (preserveBuffer)
744d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu		filters << hasPreserveSwap;
745d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
746d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	return eglu::chooseSingleConfig(egl, eglDisplay, filters);
747d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu}
748d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
749d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Huvoid clearColorScreen (const glw::Functions& gl, const tcu::Vec4& clearColor)
750d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu{
751d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	gl.clearColor(clearColor.x(), clearColor.y(), clearColor.z(), clearColor.w());
752d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	gl.clear(GL_COLOR_BUFFER_BIT);
753d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu}
754d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
755d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hufloat windowToDeviceCoordinates (int x, int length)
756d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu{
757d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	return (2.0f * float(x) / float(length)) - 1.0f;
758d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu}
759d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
760d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu} // anonymous
761d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
762d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan HuSwapBuffersWithDamageTests::SwapBuffersWithDamageTests (EglTestContext& eglTestCtx)
763d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	: TestCaseGroup(eglTestCtx, "swap_buffers_with_damage", "Swap buffers with damages tests")
764d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu{
765d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu}
766d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
767d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Huvoid SwapBuffersWithDamageTests::init (void)
768d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu{
769d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	const DrawType clearRender[2] =
770d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	{
771d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu		DRAWTYPE_GLES2_CLEAR,
772d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu		DRAWTYPE_GLES2_RENDER
773d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	};
774d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
775d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	const DrawType renderClear[2] =
776d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	{
777d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu		DRAWTYPE_GLES2_RENDER,
778d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu		DRAWTYPE_GLES2_CLEAR
779d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	};
780d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
781043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi	const ResizeType resizeTypes[] =
782043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi	{
783043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi		RESIZETYPE_NONE,
784043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi		RESIZETYPE_BEFORE_SWAP,
785043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi		RESIZETYPE_AFTER_SWAP
786043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi	};
787043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi
788d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	vector< vector<DrawType> > frameDrawTypes;
789d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	frameDrawTypes.push_back(vector<DrawType> (1, DRAWTYPE_GLES2_CLEAR));
790d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	frameDrawTypes.push_back(vector<DrawType> (1, DRAWTYPE_GLES2_RENDER));
791d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	frameDrawTypes.push_back(vector<DrawType> (2, DRAWTYPE_GLES2_CLEAR));
792d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	frameDrawTypes.push_back(vector<DrawType> (2, DRAWTYPE_GLES2_RENDER));
793d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	frameDrawTypes.push_back(vector<DrawType> (DE_ARRAY_BEGIN(clearRender), DE_ARRAY_END(clearRender)));
794d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	frameDrawTypes.push_back(vector<DrawType> (DE_ARRAY_BEGIN(renderClear), DE_ARRAY_END(renderClear)));
795d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
796043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi	for (size_t resizeTypeNdx = 0; resizeTypeNdx < DE_LENGTH_OF_ARRAY(resizeTypes); resizeTypeNdx++)
797d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	{
798043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi		const ResizeType		resizeType	= resizeTypes[resizeTypeNdx];
799043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi		TestCaseGroup* const	resizeGroup	= new TestCaseGroup(m_eglTestCtx, generateResizeGroupName(resizeType).c_str(), "");
800d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
801043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi		for (size_t drawTypeNdx = 0; drawTypeNdx < frameDrawTypes.size(); drawTypeNdx++)
802043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi		{
803043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi			string name = generateTestName(frameDrawTypes[drawTypeNdx]);
804043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi			resizeGroup->addChild(new SwapBuffersWithDamageTest(m_eglTestCtx, frameDrawTypes[drawTypeNdx], 4, resizeType, name.c_str(), ""));
805043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi		}
806d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
807043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi		for (size_t drawTypeNdx = 0; drawTypeNdx < frameDrawTypes.size(); drawTypeNdx++)
808043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi		{
809043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi			string name = "preserve_buffer_" + generateTestName(frameDrawTypes[drawTypeNdx]);
810043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi			resizeGroup->addChild(new SwapBuffersWithDamageAndPreserveBufferTest(m_eglTestCtx, frameDrawTypes[drawTypeNdx], 4, resizeType, name.c_str(), ""));
811043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi		}
812043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi
813043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi		for (size_t drawTypeNdx = 0; drawTypeNdx < frameDrawTypes.size(); drawTypeNdx++)
814043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi		{
815043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi			string name = "buffer_age_" + generateTestName(frameDrawTypes[drawTypeNdx]);
816043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi			resizeGroup->addChild(new SwapBuffersWithDamageAndBufferAgeTest(m_eglTestCtx, frameDrawTypes[drawTypeNdx], 4, resizeType, name.c_str(),  ""));
817043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi		}
818043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi
819043056f99f5caae4360e20c9dfe813edf281a13fMika Isojärvi		addChild(resizeGroup);
820d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu	}
821d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu}
822d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu
823d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu} // egl
824d6dd725e589a38ca15c98b74846a6f59ae35fe27Hengyuan Hu} // deqp
825