131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project/*-------------------------------------------------------------------------
231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * drawElements Quality Program EGL Module
331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * ---------------------------------------
431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project *
531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * Copyright 2014 The Android Open Source Project
631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project *
731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * you may not use this file except in compliance with the License.
931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * You may obtain a copy of the License at
1031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project *
1131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
1231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project *
1331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
1431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
1531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * See the License for the specific language governing permissions and
17325dc23624160689e59fbac708cf6f222b20d025Daniel Sandler * limitations under the License.
1831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project *
190280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka *//*!
20b1254a6bdb11024042fb6c27e179210c1bbd6e1cChet Haase * \file
210280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka * \brief Tests for resizing the native window of a surface.
22cd68ff5b88de9b5136ff5a9ef698e4db2fc5db66Patrick Dubroy *//*--------------------------------------------------------------------*/
23cd68ff5b88de9b5136ff5a9ef698e4db2fc5db66Patrick Dubroy
24cd68ff5b88de9b5136ff5a9ef698e4db2fc5db66Patrick Dubroy#include "teglResizeTests.hpp"
258f573952b8729b4319043ae0908997ecd2d68951Dianne Hackborn
26bed61d22bdbfcdbe04f92675c7751b83c7a8947cMichael Jurka#include "teglSimpleConfigCase.hpp"
27629de3ef739883c0962423cc0c3a26299f162d3dRomain Guy
28495f2892288504f4ab87e62957b3f71144dd73c2Adam Powell#include "tcuImageCompare.hpp"
2931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project#include "tcuSurface.hpp"
3031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project#include "tcuPlatform.hpp"
312efec4e29f80db4293664d3ed4a89d37454510e1Winson Chung#include "tcuTestLog.hpp"
3299894d9bb73fdc4bf9bba8423b5c5d5715a4f5d5Adam Cohen#include "tcuInterval.hpp"
337247f6315baf16eacb3286f21bd80321385c1defPatrick Dubroy#include "tcuTextureUtil.hpp"
3431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project#include "tcuResultCollector.hpp"
354be866d3a1665aa2098cb5d38d535b1ad1aab6d6Joe Onorato
3631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project#include "egluNativeDisplay.hpp"
37a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka#include "egluNativeWindow.hpp"
38b8c69f3c17a40adc2d85e8e996f754c383c293dcWinson Chung#include "egluNativePixmap.hpp"
39043f2af567178b82b0b41f12d379e7dd12da2936Winson Chung#include "egluUnique.hpp"
4031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project#include "egluUtil.hpp"
414be866d3a1665aa2098cb5d38d535b1ad1aab6d6Joe Onorato
42f96811cdf564469a7a654a0c876288c9fd14f35eThe Android Open Source Project#include "eglwLibrary.hpp"
4399894d9bb73fdc4bf9bba8423b5c5d5715a4f5d5Adam Cohen#include "eglwEnums.hpp"
44956091ba7863bd72086275e61084864994dd6fa7Joe Onorato
45495f2892288504f4ab87e62957b3f71144dd73c2Adam Powell#include "gluDefs.hpp"
4631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project#include "glwFunctions.hpp"
47291ad12232c98e383d44d76ffe09e97e204c61bcDaniel Sandler#include "glwEnums.hpp"
481462de39f01cec0ba785386532719cb0207dd827Adam Cohen
49a34abf8c781485b788fddacb352d586bffca886cWinson Chung#include "tcuTestLog.hpp"
5031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project#include "tcuVector.hpp"
5131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
526e3140865d3f0def2e55934d8b0b2c1503386e54Winson Chung#include "deThread.h"
53cd68ff5b88de9b5136ff5a9ef698e4db2fc5db66Patrick Dubroy#include "deUniquePtr.hpp"
54a6427b15c18d5b8f3078f553d78f8432de9f46e9Winson Chung
55f96811cdf564469a7a654a0c876288c9fd14f35eThe Android Open Source Project#include <sstream>
5631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
57325dc23624160689e59fbac708cf6f222b20d025Daniel Sandlernamespace deqp
58325dc23624160689e59fbac708cf6f222b20d025Daniel Sandler{
59325dc23624160689e59fbac708cf6f222b20d025Daniel Sandlernamespace egl
60edcce099c98a6c40d10109ac092ab50f9d2668f3Romain Guy{
612efec4e29f80db4293664d3ed4a89d37454510e1Winson Chung
62716b51e030f9c6ed34af2b947760e46a280c65a6Adam Cohenusing std::vector;
63dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohenusing std::string;
64716b51e030f9c6ed34af2b947760e46a280c65a6Adam Cohenusing std::ostringstream;
658bd65f5c57b8bae2fb82256e89ac30ddc0769319Michael Jurkausing de::MovePtr;
6699894d9bb73fdc4bf9bba8423b5c5d5715a4f5d5Adam Cohenusing tcu::CommandLine;
672efec4e29f80db4293664d3ed4a89d37454510e1Winson Chungusing tcu::ConstPixelBufferAccess;
68716b51e030f9c6ed34af2b947760e46a280c65a6Adam Cohenusing tcu::Interval;
6931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectusing tcu::IVec2;
700142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurkausing tcu::Vec3;
710142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurkausing tcu::Vec4;
72aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chungusing tcu::UVec4;
7331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectusing tcu::ResultCollector;
740142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurkausing tcu::Surface;
75d74c984fcc61f86160476a2543faff715e3ee2fdMichael Jurkausing tcu::TestLog;
768b805b17158886035b38261eb611d8641701ae43Michael Jurkausing eglu::AttribMap;
773a8820bdbad90642cf5cda4b00a8c92ecb699159Joe Onoratousing eglu::NativeDisplay;
780142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurkausing eglu::NativeWindow;
79f34bab59fc0260f926aec44d044883dce1b4191fAdam Cohenusing eglu::ScopedCurrentContext;
80b5ba097015c4794fa822f30b38a60a7070a00097Adam Cohenusing eglu::UniqueSurface;
81a985e598f6071f4caca15ba3cb6b2cd3e38b217dAdam Cohenusing eglu::UniqueContext;
8268d739365bf650fe7fecf99cd3bfe63a0d41bd12Adam Cohenusing eglu::NativeWindowFactory;
8368d739365bf650fe7fecf99cd3bfe63a0d41bd12Adam Cohenusing eglu::WindowParams;
849171e6d8a2b7b5aa136617b9779a8bbadc5259f7Winson Chungusing namespace eglw;
85f34bab59fc0260f926aec44d044883dce1b4191fAdam Cohen
86f135c6c364e92cddb84c1b4a94ed535214b712a6Winson Chungtypedef	eglu::WindowParams::Visibility	Visibility;
87ed51cc9a12c50d12e7d30ed209a49f1a40858043Adam Cohentypedef	TestCase::IterateResult			IterateResult;
88265b9a66542148e0ff13971001cb9461065e1e0eAdam Cohen
89ed51cc9a12c50d12e7d30ed209a49f1a40858043Adam Cohenstruct ResizeParams
909171e6d8a2b7b5aa136617b9779a8bbadc5259f7Winson Chung{
919171e6d8a2b7b5aa136617b9779a8bbadc5259f7Winson Chung	string	name;
929171e6d8a2b7b5aa136617b9779a8bbadc5259f7Winson Chung	string	description;
939171e6d8a2b7b5aa136617b9779a8bbadc5259f7Winson Chung	IVec2	oldSize;
949171e6d8a2b7b5aa136617b9779a8bbadc5259f7Winson Chung	IVec2	newSize;
959171e6d8a2b7b5aa136617b9779a8bbadc5259f7Winson Chung};
96e0f5a61a1f105216b0067124bacac69194c0ef70Michael Jurka
97e0f5a61a1f105216b0067124bacac69194c0ef70Michael Jurkaclass ResizeTest : public TestCase
989171e6d8a2b7b5aa136617b9779a8bbadc5259f7Winson Chung{
9925356e75ebae5d6e0be43f38d2c73b5cb59d05f2Michael Jurkapublic:
100f34bab59fc0260f926aec44d044883dce1b4191fAdam Cohen								ResizeTest	(EglTestContext&		eglTestCtx,
101f34bab59fc0260f926aec44d044883dce1b4191fAdam Cohen											 const ResizeParams&	params)
102beff8c6a13d5b5ad69f5a85ee0150cecd28e6341Adam Cohen									: TestCase	(eglTestCtx,
10337990b4b4fc241fcf12a4b6d1725c69605b26605Michael Jurka												 params.name.c_str(),
104beff8c6a13d5b5ad69f5a85ee0150cecd28e6341Adam Cohen												 params.description.c_str())
1058f573952b8729b4319043ae0908997ecd2d68951Dianne Hackborn									, m_oldSize	(params.oldSize)
1069c6fbed48783dacd9bc6b4ec5f2cc8e59ec7ee37Michael Jurka									, m_newSize	(params.newSize)
1071670698ff3502548aa066e32c28ecf62c5592a34Michael Jurka									, m_display	(EGL_NO_DISPLAY)
108aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung									, m_config	(DE_NULL)
1090142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka									, m_log		(m_testCtx.getLog())
11031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project									, m_status	(m_log) {}
111dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen
112dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen	void						init		(void);
113dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen	void						deinit		(void);
114dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen
115dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohenprotected:
116dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen	virtual EGLenum				surfaceType	(void) const { return EGL_WINDOW_BIT; }
117dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen	void						resize		(IVec2 size);
11831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
11931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project	const IVec2					m_oldSize;
12031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project	const IVec2					m_newSize;
12131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project	EGLDisplay					m_display;
122aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung	EGLConfig					m_config;
12370864289fba6daf07b8de98524cdfb765a62552dJeff Sharkey	MovePtr<NativeWindow>		m_nativeWindow;
12470864289fba6daf07b8de98524cdfb765a62552dJeff Sharkey	MovePtr<UniqueSurface>		m_surface;
12570864289fba6daf07b8de98524cdfb765a62552dJeff Sharkey	MovePtr<UniqueContext>		m_context;
126c0dcf597084d00e4c23a7fea5fd0738f6c095a6bAdam Cohen	TestLog&					m_log;
127c6cc61d45836e4081920883cc4d448ccb0bb8417Adam Cohen	ResultCollector				m_status;
128c6cc61d45836e4081920883cc4d448ccb0bb8417Adam Cohen	glw::Functions				m_gl;
12931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project};
130a897f397e553826f327d853d5728d0e1d24513a6Adam Cohen
131a897f397e553826f327d853d5728d0e1d24513a6Adam CohenEGLConfig getEGLConfig (const Library& egl, const EGLDisplay eglDisplay, EGLenum surfaceType)
132a897f397e553826f327d853d5728d0e1d24513a6Adam Cohen{
1336569f2c80e179c2f8ed73dae6b01d971ec20f005Patrick Dubroy	AttribMap attribMap;
1346569f2c80e179c2f8ed73dae6b01d971ec20f005Patrick Dubroy
1356569f2c80e179c2f8ed73dae6b01d971ec20f005Patrick Dubroy	attribMap[EGL_SURFACE_TYPE]		= surfaceType;
1366569f2c80e179c2f8ed73dae6b01d971ec20f005Patrick Dubroy	attribMap[EGL_RENDERABLE_TYPE]	= EGL_OPENGL_ES2_BIT;
137c6cc61d45836e4081920883cc4d448ccb0bb8417Adam Cohen
138c6cc61d45836e4081920883cc4d448ccb0bb8417Adam Cohen	return eglu::chooseSingleConfig(egl, eglDisplay, attribMap);
139c6cc61d45836e4081920883cc4d448ccb0bb8417Adam Cohen}
140c6cc61d45836e4081920883cc4d448ccb0bb8417Adam Cohen
141c6cc61d45836e4081920883cc4d448ccb0bb8417Adam Cohenvoid ResizeTest::init (void)
142c6cc61d45836e4081920883cc4d448ccb0bb8417Adam Cohen{
143c6cc61d45836e4081920883cc4d448ccb0bb8417Adam Cohen	TestCase::init();
144c6cc61d45836e4081920883cc4d448ccb0bb8417Adam Cohen
145c6cc61d45836e4081920883cc4d448ccb0bb8417Adam Cohen	const Library&				egl				= m_eglTestCtx.getLibrary();
146c6cc61d45836e4081920883cc4d448ccb0bb8417Adam Cohen	const CommandLine&			cmdLine			= m_testCtx.getCommandLine();
14731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project	const EGLDisplay			eglDisplay		= eglu::getAndInitDisplay(m_eglTestCtx.getNativeDisplay());
1480589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato	const EGLConfig				eglConfig		= getEGLConfig(egl, eglDisplay, surfaceType());
14900acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato	const EGLint				ctxAttribs[]	=
150aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung	{
1514516c11039d77066281f69f9b5d30fdaf1bc05aeMichael Jurka		EGL_CONTEXT_CLIENT_VERSION, 2,
1524516c11039d77066281f69f9b5d30fdaf1bc05aeMichael Jurka		EGL_NONE
15331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project	};
15470864289fba6daf07b8de98524cdfb765a62552dJeff Sharkey	EGLContext					eglContext		= egl.createContext(eglDisplay,
155e3e27a854f3eca363d3c5ce353d19de475272d87Adam Cohen																   eglConfig,
156a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka																   EGL_NO_CONTEXT,
1574516c11039d77066281f69f9b5d30fdaf1bc05aeMichael Jurka																   ctxAttribs);
158a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka	EGLU_CHECK_MSG(egl, "eglCreateContext()");
1590280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka	MovePtr<UniqueContext>		context			(new UniqueContext(egl, eglDisplay, eglContext));
16031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project	const EGLint				configId		= eglu::getConfigAttribInt(egl,
161c2f7f4794867cd1b3e97fd0f379ad8ad15958a6cMichael Jurka																		   eglDisplay,
162b26f3d6a8c62e7c1a603b6c7979375d8dd4f20d4Winson Chung																		   eglConfig,
163d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka																		   EGL_CONFIG_ID);
164d22015cd37ea6ef53762eca5be57daca123ff607Adam Cohen	const Visibility			visibility		= eglu::parseWindowVisibility(cmdLine);
165d22015cd37ea6ef53762eca5be57daca123ff607Adam Cohen	NativeDisplay&				nativeDisplay	= m_eglTestCtx.getNativeDisplay();
16631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project	const NativeWindowFactory&	windowFactory	= eglu::selectNativeWindowFactory(m_eglTestCtx.getNativeDisplayFactory(),
1671262e369484ce7f2565655ed80e6299232c70bd7Patrick Dubroy																				  cmdLine);
168dee0589388ba0f6373912e18bf86243282fb3b9bMichael Jurka
169d74c984fcc61f86160476a2543faff715e3ee2fdMichael Jurka	const WindowParams			windowParams	(m_oldSize.x(), m_oldSize.y(), visibility);
170d74c984fcc61f86160476a2543faff715e3ee2fdMichael Jurka	MovePtr<NativeWindow>		nativeWindow	(windowFactory.createWindow(&nativeDisplay,
1717777d967a60ecfd34ad2d94141d598fca4021058Adam Cohen																			 eglDisplay,
172d74c984fcc61f86160476a2543faff715e3ee2fdMichael Jurka																			 eglConfig,
173d74c984fcc61f86160476a2543faff715e3ee2fdMichael Jurka																			 DE_NULL,
174d74c984fcc61f86160476a2543faff715e3ee2fdMichael Jurka																			 windowParams));
175d74c984fcc61f86160476a2543faff715e3ee2fdMichael Jurka	const EGLSurface			eglSurface		= eglu::createWindowSurface(nativeDisplay,
176d74c984fcc61f86160476a2543faff715e3ee2fdMichael Jurka																			*nativeWindow,
177dee0589388ba0f6373912e18bf86243282fb3b9bMichael Jurka																			eglDisplay,
17854fa3b95557c283976e8c1aa8a157b460b0b4513Patrick Dubroy																			eglConfig,
1791262e369484ce7f2565655ed80e6299232c70bd7Patrick Dubroy																			DE_NULL);
1801262e369484ce7f2565655ed80e6299232c70bd7Patrick Dubroy	MovePtr<UniqueSurface>		surface			(new UniqueSurface(egl, eglDisplay, eglSurface));
181e572fe46f75adfb1adbf3c2a6812d1e3dbdee5e1Daniel Sandler
1824be866d3a1665aa2098cb5d38d535b1ad1aab6d6Joe Onorato	m_log << TestLog::Message
1838e58e916061cbe2623697efac0924f2aa3753a92Patrick Dubroy		  << "Chose EGLConfig with id " << configId << ".\n"
1848e58e916061cbe2623697efac0924f2aa3753a92Patrick Dubroy		  << "Created initial surface with size " << m_oldSize
185d51f33a6316c34fc69b8040946ed9a62519bb225Michael Jurka		  << TestLog::EndMessage;
18621b411074e39fd10cbc8dd0220bb159da4af2c76Adam Cohen
187b06d95fc79389ce49dc97ecaae23e05d931a6ac2Michael Jurka	m_eglTestCtx.initGLFunctions(&m_gl, glu::ApiType::es(2, 0));
188f8304f05db24b504b7a3bc113929af29df7daf6eMichael Jurka	m_config		= eglConfig;
189869390b6abd6e005a5ce85a8ee3c11daeecce919Michael Jurka	m_surface		= surface;
1904be866d3a1665aa2098cb5d38d535b1ad1aab6d6Joe Onorato	m_context		= context;
191c5b262ccf639fedac2aff5bb8238342f95396338Michael Jurka	m_display		= eglDisplay;
192c5b262ccf639fedac2aff5bb8238342f95396338Michael Jurka	m_nativeWindow	= nativeWindow;
193c5b262ccf639fedac2aff5bb8238342f95396338Michael Jurka	EGLU_CHECK_MSG(egl, "init");
194ab1983f46ce0ee0c94ea1170d21a67eb4e3c7967Michael Jurka}
195c5b262ccf639fedac2aff5bb8238342f95396338Michael Jurka
19626976d9b53161f80faf822d482ac771b8621cf31Adam Cohenvoid ResizeTest::deinit (void)
197f0c6ae0e35d3e020db55b5b826955da66b14b7f6Winson Chung{
19884f2ce77a6aafa30ff1f8d27edece01c8a89d436Michael Jurka	if (m_display != EGL_NO_DISPLAY)
1999551537718c191a829fd285890833225c023203dMichael Jurka		m_eglTestCtx.getLibrary().terminate(m_display);
200cff6af81d721415785bddc2efd74e179d2def9daAdam Cohen
2018aad610dc58d810ec848a579c548f50c613c8641Winson Chung	m_config		= DE_NULL;
20294309887fe7ebcbb7236da2b261546be9649f7deAdam Cohen	m_display		= EGL_NO_DISPLAY;
203c5b262ccf639fedac2aff5bb8238342f95396338Michael Jurka	m_context.clear();
20419072da7441e07d5e90026d9e9e1b38f11245e44Adam Cohen	m_surface.clear();
205482ed823afb4c7452e037ce8add7ea425fc83da2Adam Cohen	m_nativeWindow.clear();
206482ed823afb4c7452e037ce8add7ea425fc83da2Adam Cohen}
20719072da7441e07d5e90026d9e9e1b38f11245e44Adam Cohen
208482ed823afb4c7452e037ce8add7ea425fc83da2Adam Cohenvoid ResizeTest::resize (IVec2 size)
20919072da7441e07d5e90026d9e9e1b38f11245e44Adam Cohen{
210c6cc61d45836e4081920883cc4d448ccb0bb8417Adam Cohen	m_nativeWindow->setSurfaceSize(size);
21119072da7441e07d5e90026d9e9e1b38f11245e44Adam Cohen	m_testCtx.getPlatform().processEvents();
212c6cc61d45836e4081920883cc4d448ccb0bb8417Adam Cohen	m_log << TestLog::Message
213c6cc61d45836e4081920883cc4d448ccb0bb8417Adam Cohen		  << "Resized surface to size " << size
2143aff81c759a2912bed45643f7e1fb503fcfe69b0Adam Cohen		  << TestLog::EndMessage;
215073a46ff635d089cbcb15d939d1de42dd2b86c97Adam Cohen}
216f8d2823d885ba682140aee1ae0504c1c5e67a24bAdam Cohen
217f8d2823d885ba682140aee1ae0504c1c5e67a24bAdam Cohenclass ChangeSurfaceSizeCase : public ResizeTest
218f8d2823d885ba682140aee1ae0504c1c5e67a24bAdam Cohen{
219f8d2823d885ba682140aee1ae0504c1c5e67a24bAdam Cohenpublic:
220f8d2823d885ba682140aee1ae0504c1c5e67a24bAdam Cohen					ChangeSurfaceSizeCase	(EglTestContext&		eglTestCtx,
221f8d2823d885ba682140aee1ae0504c1c5e67a24bAdam Cohen											 const ResizeParams&	params)
222f8d2823d885ba682140aee1ae0504c1c5e67a24bAdam Cohen						: ResizeTest(eglTestCtx, params) {}
223ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen
224d41fbf5680750e34335bba6b38298186c144a4b7Adam Cohen	IterateResult	iterate					(void);
225d41fbf5680750e34335bba6b38298186c144a4b7Adam Cohen};
226d41fbf5680750e34335bba6b38298186c144a4b7Adam Cohen
227d41fbf5680750e34335bba6b38298186c144a4b7Adam Cohenvoid drawRectangle (const glw::Functions& gl, IVec2 pos, IVec2 size, Vec3 color)
228d41fbf5680750e34335bba6b38298186c144a4b7Adam Cohen{
229ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen	gl.clearColor(color.x(), color.y(), color.z(), 1.0);
230482ed823afb4c7452e037ce8add7ea425fc83da2Adam Cohen	gl.scissor(pos.x(), pos.y(), size.x(), size.y());
231482ed823afb4c7452e037ce8add7ea425fc83da2Adam Cohen	gl.enable(GL_SCISSOR_TEST);
232482ed823afb4c7452e037ce8add7ea425fc83da2Adam Cohen	gl.clear(GL_COLOR_BUFFER_BIT);
233482ed823afb4c7452e037ce8add7ea425fc83da2Adam Cohen	gl.disable(GL_SCISSOR_TEST);
234482ed823afb4c7452e037ce8add7ea425fc83da2Adam Cohen	GLU_EXPECT_NO_ERROR(gl.getError(),
235482ed823afb4c7452e037ce8add7ea425fc83da2Adam Cohen						"Rectangle drawing with glScissor and glClear failed.");
236482ed823afb4c7452e037ce8add7ea425fc83da2Adam Cohen}
237482ed823afb4c7452e037ce8add7ea425fc83da2Adam Cohen
238482ed823afb4c7452e037ce8add7ea425fc83da2Adam Cohenvoid initSurface (const glw::Functions& gl, IVec2 oldSize)
2391462de39f01cec0ba785386532719cb0207dd827Adam Cohen{
2401462de39f01cec0ba785386532719cb0207dd827Adam Cohen	const Vec3	frameColor	(0.0f, 0.0f, 1.0f);
2411462de39f01cec0ba785386532719cb0207dd827Adam Cohen	const Vec3	fillColor	(1.0f, 0.0f, 0.0f);
2424b285c5a60028f7c9ce39cfb318a730d0ae95c27Adam Cohen	const Vec3	markColor	(0.0f, 1.0f, 0.0f);
243ed51cc9a12c50d12e7d30ed209a49f1a40858043Adam Cohen
244ed51cc9a12c50d12e7d30ed209a49f1a40858043Adam Cohen	drawRectangle(gl, IVec2(0, 0), oldSize, frameColor);
245ed51cc9a12c50d12e7d30ed209a49f1a40858043Adam Cohen	drawRectangle(gl, IVec2(2, 2), oldSize - IVec2(4, 4), fillColor);
2464b285c5a60028f7c9ce39cfb318a730d0ae95c27Adam Cohen
2474b285c5a60028f7c9ce39cfb318a730d0ae95c27Adam Cohen	drawRectangle(gl, IVec2(0, 0), IVec2(8, 4), markColor);
2484b285c5a60028f7c9ce39cfb318a730d0ae95c27Adam Cohen	drawRectangle(gl, oldSize - IVec2(16, 16), IVec2(8, 4), markColor);
2494b285c5a60028f7c9ce39cfb318a730d0ae95c27Adam Cohen	drawRectangle(gl, IVec2(0, oldSize.y() - 16), IVec2(8, 4), markColor);
2504b285c5a60028f7c9ce39cfb318a730d0ae95c27Adam Cohen	drawRectangle(gl, IVec2(oldSize.x() - 16, 0), IVec2(8, 4), markColor);
2514b285c5a60028f7c9ce39cfb318a730d0ae95c27Adam Cohen}
2524b285c5a60028f7c9ce39cfb318a730d0ae95c27Adam Cohen
2534b285c5a60028f7c9ce39cfb318a730d0ae95c27Adam Cohenbool compareRectangles (const ConstPixelBufferAccess& rectA,
2544b285c5a60028f7c9ce39cfb318a730d0ae95c27Adam Cohen						const ConstPixelBufferAccess& rectB)
2554b285c5a60028f7c9ce39cfb318a730d0ae95c27Adam Cohen{
2564b285c5a60028f7c9ce39cfb318a730d0ae95c27Adam Cohen	const int width		= rectA.getWidth();
2574b285c5a60028f7c9ce39cfb318a730d0ae95c27Adam Cohen	const int height	= rectA.getHeight();
2584b285c5a60028f7c9ce39cfb318a730d0ae95c27Adam Cohen	const int depth		= rectA.getDepth();
2594b285c5a60028f7c9ce39cfb318a730d0ae95c27Adam Cohen
2604b285c5a60028f7c9ce39cfb318a730d0ae95c27Adam Cohen	if (rectB.getWidth() != width || rectB.getHeight() != height || rectB.getDepth() != depth)
2614b285c5a60028f7c9ce39cfb318a730d0ae95c27Adam Cohen		return false;
2624b285c5a60028f7c9ce39cfb318a730d0ae95c27Adam Cohen
2634b285c5a60028f7c9ce39cfb318a730d0ae95c27Adam Cohen	for (int z = 0; z < depth; ++z)
264dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen		for (int y = 0; y < height; ++y)
2657044272f180d34ab29866f6c59ee75376e8a1df5Winson Chung			for (int x = 0; x < width; ++x)
2664b285c5a60028f7c9ce39cfb318a730d0ae95c27Adam Cohen				if (rectA.getPixel(x, y, z) != rectB.getPixel(x, y, z))
267eeacd56cc922632bf087a7fd7a20ebe5b7a5ca04Romain Guy					return false;
268eeacd56cc922632bf087a7fd7a20ebe5b7a5ca04Romain Guy
269eeacd56cc922632bf087a7fd7a20ebe5b7a5ca04Romain Guy	return true;
270eeacd56cc922632bf087a7fd7a20ebe5b7a5ca04Romain Guy}
271eeacd56cc922632bf087a7fd7a20ebe5b7a5ca04Romain Guy
272eeacd56cc922632bf087a7fd7a20ebe5b7a5ca04Romain Guy// Check whether `oldSurface` and `newSurface` share a common corner.
273eeacd56cc922632bf087a7fd7a20ebe5b7a5ca04Romain Guybool compareCorners (const Surface& oldSurface, const Surface& newSurface)
27431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project{
27531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project	const int	oldWidth	= oldSurface.getWidth();
27631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project	const int	oldHeight	= oldSurface.getHeight();
27731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project	const int	newWidth	= newSurface.getWidth();
2780142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka	const int	newHeight	= newSurface.getHeight();
27931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project	const int	minWidth	= de::min(oldWidth, newWidth);
28031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project	const int	minHeight	= de::min(oldHeight, newHeight);
28131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
28231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project	for (int xCorner = 0; xCorner < 2; ++xCorner)
28331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project	{
28431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project		const int oldX = xCorner == 0 ? 0 : oldWidth - minWidth;
28531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project		const int newX = xCorner == 0 ? 0 : newWidth - minWidth;
28631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
28731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project		for (int yCorner = 0; yCorner < 2; ++yCorner)
2880142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka		{
28931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project			const int				oldY		= yCorner == 0 ? 0 : oldHeight - minHeight;
29031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project			const int				newY		= yCorner == 0 ? 0 : newHeight - minHeight;
29131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project			ConstPixelBufferAccess	oldAccess	=
29231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project				getSubregion(oldSurface.getAccess(), oldX, oldY, minWidth, minHeight);
2930142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka			ConstPixelBufferAccess	newAccess	=
29437990b4b4fc241fcf12a4b6d1725c69605b26605Michael Jurka				getSubregion(newSurface.getAccess(), newX, newY, minWidth, minHeight);
2955f1c509d5ad1954a7e38e77db4d5f27c7345fd39Michael Jurka
296c6cc61d45836e4081920883cc4d448ccb0bb8417Adam Cohen			if (compareRectangles(oldAccess, newAccess))
297f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung				return true;
298f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung		}
299f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung	}
3008bc66c7fe4d8f7ac1715010806f49840194279a5Michael Jurka
301867ca62c0e4b811d46734ff940d59c7a787525c8Winson Chung	return false;
302869390b6abd6e005a5ce85a8ee3c11daeecce919Michael Jurka}
303869390b6abd6e005a5ce85a8ee3c11daeecce919Michael Jurka
3048f573952b8729b4319043ae0908997ecd2d68951Dianne HackbornSurface readSurface (const glw::Functions& gl, IVec2 size)
305aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung{
306f6440da9d02f3ee1553db4bd431a202eb1d1a9ddMichael Jurka	Surface ret (size.x(), size.y());
307f6440da9d02f3ee1553db4bd431a202eb1d1a9ddMichael Jurka	gl.readPixels(0, 0, size.x(), size.y(), GL_RGBA, GL_UNSIGNED_BYTE,
308f6440da9d02f3ee1553db4bd431a202eb1d1a9ddMichael Jurka				  ret.getAccess().getDataPtr());
309aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung
310aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung	GLU_EXPECT_NO_ERROR(gl.getError(), "glReadPixels() failed");
311f6440da9d02f3ee1553db4bd431a202eb1d1a9ddMichael Jurka	return ret;
312cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler}
313f61249b79948a4b37b38104cbe81c98086d1f30bMichael Jurka
314f61249b79948a4b37b38104cbe81c98086d1f30bMichael Jurkatemplate <typename T>
315f61249b79948a4b37b38104cbe81c98086d1f30bMichael Jurkainline bool hasBits (T bitSet, T requiredBits)
316f61249b79948a4b37b38104cbe81c98086d1f30bMichael Jurka{
317f6440da9d02f3ee1553db4bd431a202eb1d1a9ddMichael Jurka	return (bitSet & requiredBits) == requiredBits;
318f6440da9d02f3ee1553db4bd431a202eb1d1a9ddMichael Jurka}
319f61249b79948a4b37b38104cbe81c98086d1f30bMichael Jurka
3208bc66c7fe4d8f7ac1715010806f49840194279a5Michael JurkaIVec2 getNativeSurfaceSize (const NativeWindow& nativeWindow,
3218bc66c7fe4d8f7ac1715010806f49840194279a5Michael Jurka							IVec2				reqSize)
3228bc66c7fe4d8f7ac1715010806f49840194279a5Michael Jurka{
3238bc66c7fe4d8f7ac1715010806f49840194279a5Michael Jurka	if (hasBits(nativeWindow.getCapabilities(), NativeWindow::CAPABILITY_GET_SURFACE_SIZE))
324f6440da9d02f3ee1553db4bd431a202eb1d1a9ddMichael Jurka		return nativeWindow.getSurfaceSize();
325f61249b79948a4b37b38104cbe81c98086d1f30bMichael Jurka	return reqSize; // assume we got the requested size
3268bc66c7fe4d8f7ac1715010806f49840194279a5Michael Jurka}
327f61249b79948a4b37b38104cbe81c98086d1f30bMichael Jurka
328f6440da9d02f3ee1553db4bd431a202eb1d1a9ddMichael JurkaIVec2 checkSurfaceSize (const Library&		egl,
329f6440da9d02f3ee1553db4bd431a202eb1d1a9ddMichael Jurka						EGLDisplay			eglDisplay,
330f61249b79948a4b37b38104cbe81c98086d1f30bMichael Jurka						EGLSurface			eglSurface,
331f61249b79948a4b37b38104cbe81c98086d1f30bMichael Jurka						const NativeWindow&	nativeWindow,
3328bc66c7fe4d8f7ac1715010806f49840194279a5Michael Jurka						IVec2				reqSize,
333f61249b79948a4b37b38104cbe81c98086d1f30bMichael Jurka						ResultCollector&	status)
334f6440da9d02f3ee1553db4bd431a202eb1d1a9ddMichael Jurka{
335f6440da9d02f3ee1553db4bd431a202eb1d1a9ddMichael Jurka	const IVec2		nativeSize	= getNativeSurfaceSize(nativeWindow, reqSize);
336f6440da9d02f3ee1553db4bd431a202eb1d1a9ddMichael Jurka	IVec2			eglSize		= eglu::getSurfaceSize(egl, eglDisplay, eglSurface);
337b26f3d6a8c62e7c1a603b6c7979375d8dd4f20d4Winson Chung	ostringstream	oss;
338b26f3d6a8c62e7c1a603b6c7979375d8dd4f20d4Winson Chung
3398aad610dc58d810ec848a579c548f50c613c8641Winson Chung	oss << "Size of EGL surface " << eglSize
3408aad610dc58d810ec848a579c548f50c613c8641Winson Chung		<< " differs from size of native window " << nativeSize;
34194309887fe7ebcbb7236da2b261546be9649f7deAdam Cohen	status.check(eglSize == nativeSize, oss.str());
342b26f3d6a8c62e7c1a603b6c7979375d8dd4f20d4Winson Chung
343f6440da9d02f3ee1553db4bd431a202eb1d1a9ddMichael Jurka	return eglSize;
344f6440da9d02f3ee1553db4bd431a202eb1d1a9ddMichael Jurka}
345f6440da9d02f3ee1553db4bd431a202eb1d1a9ddMichael Jurka
3460142d49e1378a7155bcca1fb59965d9e73016dbcMichael JurkaIterateResult ChangeSurfaceSizeCase::iterate (void)
34731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project{
34831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project	const Library&			egl			= m_eglTestCtx.getLibrary();
3498b805b17158886035b38261eb611d8641701ae43Michael Jurka	ScopedCurrentContext	currentCtx	(egl, m_display, **m_surface, **m_surface, **m_context);
3508b805b17158886035b38261eb611d8641701ae43Michael Jurka	IVec2					oldEglSize	= checkSurfaceSize(egl,
351d22015cd37ea6ef53762eca5be57daca123ff607Adam Cohen														   m_display,
3520d44e9482b95d8f163b28bf20131c4349185b589Joe Onorato														   **m_surface,
3530142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka														   *m_nativeWindow,
35431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project														   m_oldSize,
355c35afb2c9df8cc56c77bf21ce2eaa213f6f31251Winson Chung														   m_status);
356c35afb2c9df8cc56c77bf21ce2eaa213f6f31251Winson Chung
357c35afb2c9df8cc56c77bf21ce2eaa213f6f31251Winson Chung	initSurface(m_gl, oldEglSize);
35808055f66528330ff1a1d1d13c856647d86dd967dSvetoslav Ganov
35908055f66528330ff1a1d1d13c856647d86dd967dSvetoslav Ganov	this->resize(m_newSize);
36008055f66528330ff1a1d1d13c856647d86dd967dSvetoslav Ganov
36108055f66528330ff1a1d1d13c856647d86dd967dSvetoslav Ganov	egl.swapBuffers(m_display, **m_surface);
36208055f66528330ff1a1d1d13c856647d86dd967dSvetoslav Ganov	EGLU_CHECK_MSG(egl, "eglSwapBuffers()");
36331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project	checkSurfaceSize(egl, m_display, **m_surface, *m_nativeWindow, m_newSize, m_status);
36431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
365038f9d8bfb53288e7cf5812f62ec3d5b25fec965Michael Jurka	m_status.setTestContextResult(m_testCtx);
366038f9d8bfb53288e7cf5812f62ec3d5b25fec965Michael Jurka	return STOP;
367038f9d8bfb53288e7cf5812f62ec3d5b25fec965Michael Jurka}
368d41fbf5680750e34335bba6b38298186c144a4b7Adam Cohen
369038f9d8bfb53288e7cf5812f62ec3d5b25fec965Michael Jurkaclass PreserveBackBufferCase : public ResizeTest
370038f9d8bfb53288e7cf5812f62ec3d5b25fec965Michael Jurka{
371038f9d8bfb53288e7cf5812f62ec3d5b25fec965Michael Jurkapublic:
372d41fbf5680750e34335bba6b38298186c144a4b7Adam Cohen					PreserveBackBufferCase	(EglTestContext&		eglTestCtx,
373d41fbf5680750e34335bba6b38298186c144a4b7Adam Cohen											 const ResizeParams&	params)
374d41fbf5680750e34335bba6b38298186c144a4b7Adam Cohen						: ResizeTest(eglTestCtx, params) {}
375038f9d8bfb53288e7cf5812f62ec3d5b25fec965Michael Jurka
376038f9d8bfb53288e7cf5812f62ec3d5b25fec965Michael Jurka	IterateResult	iterate					(void);
377038f9d8bfb53288e7cf5812f62ec3d5b25fec965Michael Jurka	EGLenum			surfaceType				(void) const;
378038f9d8bfb53288e7cf5812f62ec3d5b25fec965Michael Jurka};
379038f9d8bfb53288e7cf5812f62ec3d5b25fec965Michael Jurka
380038f9d8bfb53288e7cf5812f62ec3d5b25fec965Michael JurkaEGLenum PreserveBackBufferCase::surfaceType (void) const
381038f9d8bfb53288e7cf5812f62ec3d5b25fec965Michael Jurka{
382038f9d8bfb53288e7cf5812f62ec3d5b25fec965Michael Jurka	return EGL_WINDOW_BIT | EGL_SWAP_BEHAVIOR_PRESERVED_BIT;
383038f9d8bfb53288e7cf5812f62ec3d5b25fec965Michael Jurka}
384038f9d8bfb53288e7cf5812f62ec3d5b25fec965Michael Jurka
385038f9d8bfb53288e7cf5812f62ec3d5b25fec965Michael JurkaIterateResult PreserveBackBufferCase::iterate (void)
386dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen{
387d41fbf5680750e34335bba6b38298186c144a4b7Adam Cohen	const Library&			egl			= m_eglTestCtx.getLibrary();
388038f9d8bfb53288e7cf5812f62ec3d5b25fec965Michael Jurka	ScopedCurrentContext	currentCtx	(egl, m_display, **m_surface, **m_surface, **m_context);
389d41fbf5680750e34335bba6b38298186c144a4b7Adam Cohen
390038f9d8bfb53288e7cf5812f62ec3d5b25fec965Michael Jurka	EGLU_CHECK_CALL(egl, surfaceAttrib(m_display, **m_surface, EGL_SWAP_BEHAVIOR, EGL_BUFFER_PRESERVED));
391038f9d8bfb53288e7cf5812f62ec3d5b25fec965Michael Jurka
392038f9d8bfb53288e7cf5812f62ec3d5b25fec965Michael Jurka	GLU_EXPECT_NO_ERROR(m_gl.getError(), "GL state erroneous upon initialization!");
393038f9d8bfb53288e7cf5812f62ec3d5b25fec965Michael Jurka
394d74c984fcc61f86160476a2543faff715e3ee2fdMichael Jurka	{
395d74c984fcc61f86160476a2543faff715e3ee2fdMichael Jurka		const IVec2 oldEglSize = eglu::getSurfaceSize(egl, m_display, **m_surface);
3963a0469d1e40459529e2d4d57ebc493f930f7c01aMichael Jurka		initSurface(m_gl, oldEglSize);
397641d71d6da6c77cc32e5d0f65ccae89caed1ac34Winson Chung
398a3d30adbfd4f013260f1f5ba3a56bc9bb4a11717Michael Jurka		m_gl.finish();
399f561bdf68dd304e1d7c3f7796621a4cc39ca15f2Winson Chung		GLU_EXPECT_NO_ERROR(m_gl.getError(), "glFinish() failed");
400f561bdf68dd304e1d7c3f7796621a4cc39ca15f2Winson Chung
401f561bdf68dd304e1d7c3f7796621a4cc39ca15f2Winson Chung		{
402d74c984fcc61f86160476a2543faff715e3ee2fdMichael Jurka			const Surface oldSurface = readSurface(m_gl, oldEglSize);
403d74c984fcc61f86160476a2543faff715e3ee2fdMichael Jurka
404d74c984fcc61f86160476a2543faff715e3ee2fdMichael Jurka			egl.swapBuffers(m_display, **m_surface);
405d74c984fcc61f86160476a2543faff715e3ee2fdMichael Jurka			this->resize(m_newSize);
4063a0469d1e40459529e2d4d57ebc493f930f7c01aMichael Jurka			egl.swapBuffers(m_display, **m_surface);
4074b919f813f4e5e0323a4c1747392551fce4a8758Winson Chung			EGLU_CHECK_MSG(egl, "eglSwapBuffers()");
408f561bdf68dd304e1d7c3f7796621a4cc39ca15f2Winson Chung
409f561bdf68dd304e1d7c3f7796621a4cc39ca15f2Winson Chung			{
410f561bdf68dd304e1d7c3f7796621a4cc39ca15f2Winson Chung				const IVec2		newEglSize	= eglu::getSurfaceSize(egl, m_display, **m_surface);
411f561bdf68dd304e1d7c3f7796621a4cc39ca15f2Winson Chung				const Surface	newSurface	= readSurface(m_gl, newEglSize);
412d74c984fcc61f86160476a2543faff715e3ee2fdMichael Jurka
413d74c984fcc61f86160476a2543faff715e3ee2fdMichael Jurka				m_log << TestLog::ImageSet("Corner comparison",
41431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project										   "Comparing old and new surfaces at all corners")
41531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project					  << TestLog::Image("Before resizing", "Before resizing", oldSurface)
41631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project					  << TestLog::Image("After resizing", "After resizing", newSurface)
4170142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka					  << TestLog::EndImageSet;
4180589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato
4190142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka				m_status.checkResult(compareCorners(oldSurface, newSurface),
4200142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka									 QP_TEST_RESULT_QUALITY_WARNING,
421cc8befac3550c81d04ea206c170adae36c9a6c93Daniel Sandler									 "Resizing the native window changed the contents of "
4220589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato									 "the EGL surface");
423cd68ff5b88de9b5136ff5a9ef698e4db2fc5db66Patrick Dubroy			}
424ce3cbd145b4222779abae32869da8dd3c2aefb67Romain Guy		}
425ce3cbd145b4222779abae32869da8dd3c2aefb67Romain Guy	}
4267777d967a60ecfd34ad2d94141d598fca4021058Adam Cohen
42731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project	m_status.setTestContextResult(m_testCtx);
428482ed823afb4c7452e037ce8add7ea425fc83da2Adam Cohen	return STOP;
429b4b7fa7c0383b6af58d73d3e024b91d586148cf8Winson Chung}
430fd3385fe9e0f034b04f99d5d59a58d74fe040da4Winson Chung
431b4b7fa7c0383b6af58d73d3e024b91d586148cf8Winson Chungtypedef tcu::Vector<Interval, 2> IvVec2;
432b4b7fa7c0383b6af58d73d3e024b91d586148cf8Winson Chung
433b4b7fa7c0383b6af58d73d3e024b91d586148cf8Winson Chungclass UpdateResolutionCase : public ResizeTest
4349171e6d8a2b7b5aa136617b9779a8bbadc5259f7Winson Chung{
435ab1983f46ce0ee0c94ea1170d21a67eb4e3c7967Michael Jurkapublic:
436cff6af81d721415785bddc2efd74e179d2def9daAdam Cohen					UpdateResolutionCase	(EglTestContext&		eglTestCtx,
43784f2ce77a6aafa30ff1f8d27edece01c8a89d436Michael Jurka											 const ResizeParams&	params)
43884f2ce77a6aafa30ff1f8d27edece01c8a89d436Michael Jurka						: ResizeTest(eglTestCtx, params) {}
43984f2ce77a6aafa30ff1f8d27edece01c8a89d436Michael Jurka
440265b9a66542148e0ff13971001cb9461065e1e0eAdam Cohen	IterateResult	iterate					(void);
4413aff81c759a2912bed45643f7e1fb503fcfe69b0Adam Cohen
442265b9a66542148e0ff13971001cb9461065e1e0eAdam Cohenprivate:
44331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project	IvVec2			getNativePixelsPerInch	(void);
44431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project};
44531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
446f34bab59fc0260f926aec44d044883dce1b4191fAdam CohenIvVec2 ivVec2 (const IVec2& vec)
447b26f3d6a8c62e7c1a603b6c7979375d8dd4f20d4Winson Chung{
448f34bab59fc0260f926aec44d044883dce1b4191fAdam Cohen	return IvVec2(double(vec.x()), double(vec.y()));
449f34bab59fc0260f926aec44d044883dce1b4191fAdam Cohen}
45008ee77090f1fef565142e9341914369b1aa342d1Michael Jurka
4518b805b17158886035b38261eb611d8641701ae43Michael JurkaInterval approximateInt (int i)
45231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project{
45331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project	const Interval margin(-1.0, 1.0); // The resolution may be rounded
45431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
4552801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen	return (Interval(i) + margin) & Interval(0.0, TCU_INFINITY);
4562801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen}
4572801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen
45851944f1ba43f46ddb8fa9d89025ff7360fe483f0alanvIvVec2 UpdateResolutionCase::getNativePixelsPerInch	(void)
45951944f1ba43f46ddb8fa9d89025ff7360fe483f0alanv{
460e5fb0f27bca7afb996258a7163c76ca7390d7bffMichael Jurka	const Library&	egl			= m_eglTestCtx.getLibrary();
4612801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen	const int		inchPer10km	= 254 * EGL_DISPLAY_SCALING;
4628b805b17158886035b38261eb611d8641701ae43Michael Jurka	const IVec2		bufSize		= eglu::getSurfaceSize(egl, m_display, **m_surface);
4638b805b17158886035b38261eb611d8641701ae43Michael Jurka	const IVec2		winSize		= m_nativeWindow->getScreenSize();
4648b805b17158886035b38261eb611d8641701ae43Michael Jurka	const IVec2		bufPp10km	= eglu::getSurfaceResolution(egl, m_display, **m_surface);
4658b805b17158886035b38261eb611d8641701ae43Michael Jurka	const IvVec2	bufPpiI		= (IvVec2(approximateInt(bufPp10km.x()),
466920d7f433e5be7b928fe52312c2e65d278b13ee5Michael Jurka										  approximateInt(bufPp10km.y()))
467920d7f433e5be7b928fe52312c2e65d278b13ee5Michael Jurka								   / Interval(inchPer10km));
468920d7f433e5be7b928fe52312c2e65d278b13ee5Michael Jurka	const IvVec2	winPpiI		= ivVec2(winSize) * bufPpiI / ivVec2(bufSize);
469920d7f433e5be7b928fe52312c2e65d278b13ee5Michael Jurka	const IVec2		winPpi		(int(winPpiI.x().midpoint()), int(winPpiI.y().midpoint()));
470920d7f433e5be7b928fe52312c2e65d278b13ee5Michael Jurka
471920d7f433e5be7b928fe52312c2e65d278b13ee5Michael Jurka	m_log << TestLog::Message
472920d7f433e5be7b928fe52312c2e65d278b13ee5Michael Jurka		  << "EGL surface size: "							<< bufSize		<< "\n"
47331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project		  << "EGL surface pixel density (pixels / 10 km): "	<< bufPp10km	<< "\n"
47431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project		  << "Native window size: "							<< winSize		<< "\n"
47531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project		  << "Native pixel density (ppi): "					<< winPpi		<< "\n"
47631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project		  << TestLog::EndMessage;
477716b51e030f9c6ed34af2b947760e46a280c65a6Adam Cohen
4788e776a62c5cc60737f5cdbbeacfec5f958112fa7Adam Cohen	m_status.checkResult(bufPp10km.x() >= 1 && bufPp10km.y() >= 1,
47931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project						 QP_TEST_RESULT_QUALITY_WARNING,
4808e776a62c5cc60737f5cdbbeacfec5f958112fa7Adam Cohen						 "Surface pixel density is less than one pixel per 10 km. "
481aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung						 "Is the surface really visible from space?");
482aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung
483aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung	return winPpiI;
484aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung}
48531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
48631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source ProjectIterateResult UpdateResolutionCase::iterate (void)
48731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project{
48831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project	const Library&			egl			= m_eglTestCtx.getLibrary();
48931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project	ScopedCurrentContext	currentCtx	(egl, m_display, **m_surface, **m_surface, **m_context);
490a0aa0121b91fde17e427ab2763ce312e64cf5d33Patrick Dubroy
491a0aa0121b91fde17e427ab2763ce312e64cf5d33Patrick Dubroy	if (!hasBits(m_nativeWindow->getCapabilities(),
49231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project				 NativeWindow::CAPABILITY_GET_SCREEN_SIZE))
49331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project		TCU_THROW(NotSupportedError, "Unable to determine surface size in screen pixels");
494dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen
495dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen	{
496dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen		const IVec2 oldEglSize = eglu::getSurfaceSize(egl, m_display, **m_surface);
497dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen		initSurface(m_gl, oldEglSize);
498dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen	}
499dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen	{
500dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen		const IvVec2 oldPpi = this->getNativePixelsPerInch();
501dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen		this->resize(m_newSize);
502dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen		EGLU_CHECK_CALL(egl, swapBuffers(m_display, **m_surface));
503dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen		{
504dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen			const IvVec2 newPpi = this->getNativePixelsPerInch();
505dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen			m_status.check(oldPpi.x().intersects(newPpi.x()) &&
506dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen						   oldPpi.y().intersects(newPpi.y()),
507dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen						   "Window PPI differs after resizing");
508dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen		}
509dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen	}
510dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen
511dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen	m_status.setTestContextResult(m_testCtx);
512dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen	return STOP;
513dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen}
514dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen
515dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam CohenResizeTests::ResizeTests (EglTestContext& eglTestCtx)
516dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen	: TestCaseGroup(eglTestCtx, "resize", "Tests resizing the native surface")
517dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen{
518dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen}
519dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen
520dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohentemplate <class Case>
521dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam CohenTestCaseGroup* createCaseGroup(EglTestContext&	eglTestCtx,
522dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen							   const string&	name,
523dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen							   const string&	desc)
524dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen{
525dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen	const ResizeParams		params[]	=
526dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen	{
527dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen		{ "shrink",			"Shrink in both dimensions",
528dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen		  IVec2(128, 128),	IVec2(32, 32) },
529dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen		{ "grow",			"Grow in both dimensions",
530dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen		  IVec2(32, 32),	IVec2(128, 128) },
531dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen		{ "stretch_width",	"Grow horizontally, shrink vertically",
532dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen		  IVec2(32, 128),	IVec2(128, 32) },
533dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen		{ "stretch_height",	"Grow vertically, shrink horizontally",
534dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen		  IVec2(128, 32),	IVec2(32, 128) },
535dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen	};
536dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen	TestCaseGroup* const	group		=
537dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen		new TestCaseGroup(eglTestCtx, name.c_str(), desc.c_str());
538dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen
539dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen	for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(params); ++ndx)
540dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen		group->addChild(new Case(eglTestCtx, params[ndx]));
541dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen
542dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen	return group;
543dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen}
544dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen
545dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohenvoid ResizeTests::init (void)
546dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen{
547dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen	addChild(createCaseGroup<ChangeSurfaceSizeCase>(m_eglTestCtx,
548dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen													"surface_size",
549dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen													"EGL surface size update"));
550dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen	addChild(createCaseGroup<PreserveBackBufferCase>(m_eglTestCtx,
551dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen													 "back_buffer",
552dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen													 "Back buffer contents"));
553dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen	addChild(createCaseGroup<UpdateResolutionCase>(m_eglTestCtx,
554dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen												   "pixel_density",
555dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen												   "Pixel density"));
556dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen}
557dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen
558dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen} // egl
559dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen} // deqp
560dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen