13c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*------------------------------------------------------------------------- 23c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * drawElements Quality Program EGL Module 33c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * --------------------------------------- 43c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * 53c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Copyright 2014 The Android Open Source Project 63c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * 73c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Licensed under the Apache License, Version 2.0 (the "License"); 83c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * you may not use this file except in compliance with the License. 93c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * You may obtain a copy of the License at 103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * 113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * http://www.apache.org/licenses/LICENSE-2.0 123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * 133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Unless required by applicable law or agreed to in writing, software 143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * distributed under the License is distributed on an "AS IS" BASIS, 153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * See the License for the specific language governing permissions and 173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * limitations under the License. 183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * 193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*! 203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \file 213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief Base class for rendering tests. 223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/ 233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "teglRenderCase.hpp" 253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "teglSimpleConfigCase.hpp" 273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "egluNativeDisplay.hpp" 293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "egluNativeWindow.hpp" 303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "egluNativePixmap.hpp" 313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "egluUtil.hpp" 323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuRenderTarget.hpp" 343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuTestLog.hpp" 353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuCommandLine.hpp" 363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "deStringUtil.hpp" 383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "deUniquePtr.hpp" 393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include <algorithm> 413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include <iterator> 423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include <memory> 433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include <set> 443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include <EGL/eglext.h> 463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#if !defined(EGL_OPENGL_ES3_BIT_KHR) 483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry# define EGL_OPENGL_ES3_BIT_KHR 0x0040 493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#endif 503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#if !defined(EGL_CONTEXT_MAJOR_VERSION_KHR) 513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry# define EGL_CONTEXT_MAJOR_VERSION_KHR EGL_CONTEXT_CLIENT_VERSION 523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#endif 533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 543c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing std::string; 553c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing std::vector; 563c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing std::set; 573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 583c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing tcu::TestLog; 593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 603c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace deqp 613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 623c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace egl 633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// \todo [2013-04-24 pyry] Should we instead store surface bit somewhere? 663c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate<class Derived, class Base> 673c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline bool instanceOf (Base& obj) 683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return dynamic_cast<Derived*>(&obj) != DE_NULL; 703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 723c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void postSurface (tcu::egl::Surface& surface) 733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const bool isWindow = instanceOf<tcu::egl::WindowSurface>(surface); 753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const bool isPixmap = instanceOf<tcu::egl::PixmapSurface>(surface); 763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const bool isPbuffer = instanceOf<tcu::egl::PbufferSurface>(surface); 773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry DE_ASSERT((isWindow?1:0) + (isPixmap?1:0) + (isPbuffer?1:0) == 1); 793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (isWindow) 813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::egl::WindowSurface& window = static_cast<tcu::egl::WindowSurface&>(surface); 833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry window.swapBuffers(); 843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else if (isPixmap) 863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry TCU_CHECK_EGL_CALL(eglWaitClient()); 883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else 903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry DE_ASSERT(isPbuffer); 923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry DE_UNREF(isPbuffer); 933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry TCU_CHECK_EGL_CALL(eglWaitClient()); 943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// RenderCase 983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 993c827367444ee418f129b2c238299f49d3264554Jarkko PoyryRenderCase::RenderCase (EglTestContext& eglTestCtx, const char* name, const char* description, EGLint apiMask, EGLint surfaceTypeMask, const vector<EGLint>& configIds) 1003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry : SimpleConfigCase (eglTestCtx, name, description, configIds) 1013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , m_apiMask (apiMask) 1023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , m_surfaceTypeMask (surfaceTypeMask) 1033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 1043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 1053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1063c827367444ee418f129b2c238299f49d3264554Jarkko PoyryRenderCase::~RenderCase (void) 1073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 1083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 1093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1103c827367444ee418f129b2c238299f49d3264554Jarkko PoyryEGLint RenderCase::getSupportedApis (void) 1113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 1123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry EGLint apiMask = 0; 1133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#if defined(DEQP_SUPPORT_GLES2) 1153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry apiMask |= EGL_OPENGL_ES2_BIT; 1163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#endif 1173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#if defined(DEQP_SUPPORT_GLES3) 1193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry apiMask |= EGL_OPENGL_ES3_BIT_KHR; 1203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#endif 1213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#if defined(DEQP_SUPPORT_GLES1) 1233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry apiMask |= EGL_OPENGL_ES_BIT; 1243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#endif 1253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#if defined(DEQP_SUPPORT_VG) 1273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry apiMask |= EGL_OPENVG_BIT; 1283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#endif 1293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return apiMask; 1313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 1323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1333c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid RenderCase::executeForConfig (tcu::egl::Display& defaultDisplay, EGLConfig config) 1343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 1353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::TestLog& log = m_testCtx.getLog(); 1363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry int width = 128; 1373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry int height = 128; 1383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry EGLint configId = defaultDisplay.getConfigAttrib(config, EGL_CONFIG_ID); 1393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry bool isOk = true; 1403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry string failReason = ""; 1413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (m_surfaceTypeMask & EGL_WINDOW_BIT) 1433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 1443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::ScopedLogSection(log, (string("Config") + de::toString(configId) + "-Window").c_str(), 1453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry (string("Config ID ") + de::toString(configId) + ", window surface").c_str()); 1463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry try 1483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 1493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::egl::Display& display = m_eglTestCtx.getDisplay(); 1503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry de::UniquePtr<eglu::NativeWindow> window (m_eglTestCtx.createNativeWindow(display.getEGLDisplay(), config, DE_NULL, width, height, eglu::parseWindowVisibility(m_testCtx.getCommandLine()))); 1513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry EGLSurface eglSurface = createWindowSurface(m_eglTestCtx.getNativeDisplay(), *window, display.getEGLDisplay(), config, DE_NULL); 1523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::egl::WindowSurface surface (display, eglSurface); 1533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry executeForSurface(display, surface, config); 1553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 1563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry catch (const tcu::TestError& e) 1573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 1583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry log << e; 1593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry isOk = false; 1603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry failReason = e.what(); 1613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 1623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 1633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (m_surfaceTypeMask & EGL_PIXMAP_BIT) 1653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 1663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::ScopedLogSection(log, (string("Config") + de::toString(configId) + "-Pixmap").c_str(), 1673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry (string("Config ID ") + de::toString(configId) + ", pixmap surface").c_str()); 1683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry try 1703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 1713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::egl::Display& display = m_eglTestCtx.getDisplay(); 1723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry std::auto_ptr<eglu::NativePixmap> pixmap (m_eglTestCtx.createNativePixmap(display.getEGLDisplay(), config, DE_NULL, width, height)); 1733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry EGLSurface eglSurface = createPixmapSurface(m_eglTestCtx.getNativeDisplay(), *pixmap, display.getEGLDisplay(), config, DE_NULL); 1743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::egl::PixmapSurface surface (display, eglSurface); 1753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry executeForSurface(display, surface, config); 1773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 1783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry catch (const tcu::TestError& e) 1793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 1803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry log << e; 1813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry isOk = false; 1823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry failReason = e.what(); 1833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 1843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 1853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (m_surfaceTypeMask & EGL_PBUFFER_BIT) 1873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 1883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::ScopedLogSection(log, (string("Config") + de::toString(configId) + "-Pbuffer").c_str(), 1893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry (string("Config ID ") + de::toString(configId) + ", pbuffer surface").c_str()); 1903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry try 1913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 1923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry EGLint surfaceAttribs[] = 1933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 1943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry EGL_WIDTH, width, 1953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry EGL_HEIGHT, height, 1963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry EGL_NONE 1973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }; 1983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::egl::PbufferSurface surface(defaultDisplay, config, surfaceAttribs); 2003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry executeForSurface(defaultDisplay, surface, config); 2023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 2033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry catch (const tcu::TestError& e) 2043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 2053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry log << e; 2063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry isOk = false; 2073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry failReason = e.what(); 2083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 2093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 2103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (!isOk && m_testCtx.getTestResult() == QP_TEST_RESULT_PASS) 2123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, failReason.c_str()); 2133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 2143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// SingleContextRenderCase 2163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2173c827367444ee418f129b2c238299f49d3264554Jarkko PoyrySingleContextRenderCase::SingleContextRenderCase (EglTestContext& eglTestCtx, const char* name, const char* description, EGLint apiMask, EGLint surfaceTypeMask, const std::vector<EGLint>& configIds) 2183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry : RenderCase(eglTestCtx, name, description, apiMask, surfaceTypeMask, configIds) 2193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 2203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 2213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2223c827367444ee418f129b2c238299f49d3264554Jarkko PoyrySingleContextRenderCase::~SingleContextRenderCase (void) 2233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 2243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 2253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2263c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid SingleContextRenderCase::executeForSurface (tcu::egl::Display& display, tcu::egl::Surface& surface, EGLConfig config) 2273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 2283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry EGLint supportedApis = getSupportedApis(); 2293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const EGLint apis[] = { EGL_OPENGL_ES2_BIT, EGL_OPENGL_ES3_BIT_KHR, EGL_OPENGL_ES_BIT, EGL_OPENVG_BIT }; 2303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::TestLog& log = m_testCtx.getLog(); 2313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Check if case is supported 2333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if ((m_apiMask & supportedApis) != m_apiMask) 2343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry throw tcu::NotSupportedError("Client APIs not supported", "", __FILE__, __LINE__); 2353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int apiNdx = 0; apiNdx < DE_LENGTH_OF_ARRAY(apis); apiNdx++) 2373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 2383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry EGLint apiBit = apis[apiNdx]; 2393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if ((apiBit & m_apiMask) == 0) 2413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry continue; // Skip this api. 2423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry EGLint api = EGL_NONE; 2443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const char* apiName = DE_NULL; 2453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry vector<EGLint> contextAttribs; 2463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Select api enum and build context attributes. 2483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry switch (apiBit) 2493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 2503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case EGL_OPENGL_ES2_BIT: 2513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry api = EGL_OPENGL_ES_API; 2523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry apiName = "OpenGL ES 2.x"; 2533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry contextAttribs.push_back(EGL_CONTEXT_CLIENT_VERSION); 2543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry contextAttribs.push_back(2); 2553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry break; 2563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case EGL_OPENGL_ES3_BIT_KHR: 2583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry api = EGL_OPENGL_ES_API; 2593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry apiName = "OpenGL ES 3.x"; 2603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry contextAttribs.push_back(EGL_CONTEXT_MAJOR_VERSION_KHR); 2613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry contextAttribs.push_back(3); 2623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry break; 2633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case EGL_OPENGL_ES_BIT: 2653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry api = EGL_OPENGL_ES_API; 2663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry apiName = "OpenGL ES 1.x"; 2673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry contextAttribs.push_back(EGL_CONTEXT_CLIENT_VERSION); 2683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry contextAttribs.push_back(1); 2693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry break; 2703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case EGL_OPENVG_BIT: 2723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry api = EGL_OPENVG_API; 2733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry apiName = "OpenVG"; 2743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry break; 2753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry default: 2773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry DE_ASSERT(DE_FALSE); 2783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 2793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry contextAttribs.push_back(EGL_NONE); 2813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry log << TestLog::Message << apiName << TestLog::EndMessage; 2833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::egl::Context context(display, config, &contextAttribs[0], api); 2853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry context.makeCurrent(surface, surface); 2873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry executeForContext(display, context, surface, apiBit); 2883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Call SwapBuffers() / WaitClient() to finish rendering 2903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry postSurface(surface); 2913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 2923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 2933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// MultiContextRenderCase 2953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2963c827367444ee418f129b2c238299f49d3264554Jarkko PoyryMultiContextRenderCase::MultiContextRenderCase (EglTestContext& eglTestCtx, const char* name, const char* description, EGLint api, EGLint surfaceType, const vector<EGLint>& configIds, int numContextsPerApi) 2973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry : RenderCase (eglTestCtx, name, description, api, surfaceType, configIds) 2983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , m_numContextsPerApi (numContextsPerApi) 2993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 3003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 3013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3023c827367444ee418f129b2c238299f49d3264554Jarkko PoyryMultiContextRenderCase::~MultiContextRenderCase (void) 3033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 3043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 3053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3063c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid MultiContextRenderCase::executeForSurface (tcu::egl::Display& display, tcu::egl::Surface& surface, EGLConfig config) 3073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 3083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry vector<std::pair<EGLint, tcu::egl::Context*> > contexts; 3093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry contexts.reserve(3*m_numContextsPerApi); // 3 types of contexts at maximum. 3103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry try 3123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 3133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Create contexts that will participate in rendering. 3143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int ndx = 0; ndx < m_numContextsPerApi; ndx++) 3153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 3163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (m_apiMask & EGL_OPENGL_ES2_BIT) 3173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 3183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const EGLint attribs[] = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE }; 3193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry contexts.push_back(std::make_pair(EGL_OPENGL_ES2_BIT, new tcu::egl::Context(display, config, &attribs[0], EGL_OPENGL_ES_API))); 3203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 3213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (m_apiMask & EGL_OPENGL_ES3_BIT_KHR) 3233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 3243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const EGLint attribs[] = { EGL_CONTEXT_MAJOR_VERSION_KHR, 3, EGL_NONE }; 3253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry contexts.push_back(std::make_pair(EGL_OPENGL_ES3_BIT_KHR, new tcu::egl::Context(display, config, &attribs[0], EGL_OPENGL_ES_API))); 3263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 3273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (m_apiMask & EGL_OPENGL_ES_BIT) 3293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 3303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const EGLint attribs[] = { EGL_CONTEXT_CLIENT_VERSION, 1, EGL_NONE }; 3313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry contexts.push_back(std::make_pair(EGL_OPENGL_ES_BIT, new tcu::egl::Context(display, config, &attribs[0], EGL_OPENGL_ES_API))); 3323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 3333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (m_apiMask & EGL_OPENVG_BIT) 3353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 3363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const EGLint attribs[] = { EGL_NONE }; 3373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry contexts.push_back(std::make_pair(EGL_OPENVG_BIT, new tcu::egl::Context(display, config, &attribs[0], EGL_OPENVG_API))); 3383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 3393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 3403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Execute for contexts. 3423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry executeForContexts(display, surface, config, contexts); 3433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 3443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry catch (const std::exception&) 3453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 3463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Make sure all contexts have been destroyed. 3473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (vector<std::pair<EGLint, tcu::egl::Context*> >::iterator i = contexts.begin(); i != contexts.end(); i++) 3483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry delete i->second; 3493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry throw; 3503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 3513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Destroy contexts. 3533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (vector<std::pair<EGLint, tcu::egl::Context*> >::iterator i = contexts.begin(); i != contexts.end(); i++) 3543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry delete i->second; 3553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 3563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// Utilities 3583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3593c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid addRenderConfigIdSet ( 3603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry vector<RenderConfigIdSet>& configSets, 3613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const vector<eglu::ConfigInfo>& configInfos, 3623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const eglu::FilterList& baseFilters, 3633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const char* name, 3643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::RGBA colorBits, 3653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry EGLint surfaceType) 3663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 3673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry eglu::FilterList filters = baseFilters; 3683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry filters << (eglu::ConfigColorBits() == colorBits) << (eglu::ConfigSurfaceType() & surfaceType); 3693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry vector<EGLint> matchingConfigs; 3713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (vector<eglu::ConfigInfo>::const_iterator configIter = configInfos.begin(); configIter != configInfos.end(); configIter++) 3733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 3743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (!filters.match(*configIter)) 3753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry continue; 3763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry matchingConfigs.push_back(configIter->configId); 3783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 3793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry configSets.push_back(RenderConfigIdSet(name, "", matchingConfigs, surfaceType)); 3813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 3823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3833c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid addRenderConfigIdSet ( 3843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry vector<RenderConfigIdSet>& configSets, 3853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const vector<eglu::ConfigInfo>& configInfos, 3863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const eglu::FilterList& baseFilters, 3873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const char* name, 3883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::RGBA colorBits) 3893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 3903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry addRenderConfigIdSet(configSets, configInfos, baseFilters, (string(name) + "_window").c_str(), colorBits, EGL_WINDOW_BIT); 3913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry addRenderConfigIdSet(configSets, configInfos, baseFilters, (string(name) + "_pixmap").c_str(), colorBits, EGL_PIXMAP_BIT); 3923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry addRenderConfigIdSet(configSets, configInfos, baseFilters, (string(name) + "_pbuffer").c_str(), colorBits, EGL_PBUFFER_BIT); 3933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 3943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3953c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid getDefaultRenderConfigIdSets (vector<RenderConfigIdSet>& configSets, const vector<eglu::ConfigInfo>& configInfos, const eglu::FilterList& baseFilters) 3963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 3973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry using tcu::RGBA; 3983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry addRenderConfigIdSet(configSets, configInfos, baseFilters, "rgb565", RGBA(5, 6, 5, 0)); 4003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry addRenderConfigIdSet(configSets, configInfos, baseFilters, "rgb888", RGBA(8, 8, 8, 0)); 4013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry addRenderConfigIdSet(configSets, configInfos, baseFilters, "rgba4444", RGBA(4, 4, 4, 4)); 4023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry addRenderConfigIdSet(configSets, configInfos, baseFilters, "rgba5551", RGBA(5, 5, 5, 1)); 4033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry addRenderConfigIdSet(configSets, configInfos, baseFilters, "rgba8888", RGBA(8, 8, 8, 8)); 4043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Add other config ids to "other" set 4063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 4073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry set<EGLint> usedConfigs; 4083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry vector<EGLint> otherCfgSet; 4093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (vector<RenderConfigIdSet>::const_iterator setIter = configSets.begin(); setIter != configSets.end(); setIter++) 4113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 4123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const vector<EGLint>& setCfgs = setIter->getConfigIds(); 4133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (vector<EGLint>::const_iterator i = setCfgs.begin(); i != setCfgs.end(); i++) 4143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry usedConfigs.insert(*i); 4153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 4163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (vector<eglu::ConfigInfo>::const_iterator cfgIter = configInfos.begin(); cfgIter != configInfos.end(); cfgIter++) 4183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 4193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (!baseFilters.match(*cfgIter)) 4203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry continue; 4213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry EGLint id = cfgIter->configId; 4233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (usedConfigs.find(id) == usedConfigs.end()) 4253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry otherCfgSet.push_back(id); 4263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 4273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry configSets.push_back(RenderConfigIdSet("other", "", otherCfgSet, EGL_WINDOW_BIT|EGL_PIXMAP_BIT|EGL_PBUFFER_BIT)); 4293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 4303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 4313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // egl 4333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // deqp 434