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