1294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek/*------------------------------------------------------------------------- 2294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek * drawElements Quality Program EGL Module 3294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek * --------------------------------------- 4294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek * 5294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek * Copyright 2014 The Android Open Source Project 6294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek * 7294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek * Licensed under the Apache License, Version 2.0 (the "License"); 8294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek * you may not use this file except in compliance with the License. 9294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek * You may obtain a copy of the License at 10294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek * 11294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek * http://www.apache.org/licenses/LICENSE-2.0 12294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek * 13294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek * Unless required by applicable law or agreed to in writing, software 14294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek * distributed under the License is distributed on an "AS IS" BASIS, 15294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose * See the License for the specific language governing permissions and 17294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek * limitations under the License. 184a5f724538cbc275370c9504e8169ce92503256cBenjamin Kramer * 194a5f724538cbc275370c9504e8169ce92503256cBenjamin Kramer *//*! 20294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek * \file 21294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek * \brief Surface query tests. 22294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek *//*--------------------------------------------------------------------*/ 23294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek 243070e13dca5bbefa32acb80ce4a7b217a6220983Ted Kremenek#include "teglQuerySurfaceTests.hpp" 253070e13dca5bbefa32acb80ce4a7b217a6220983Ted Kremenek 260849ade4bb3e90c2fc0ce01ccd330f76f91da732Ted Kremenek#include "teglSimpleConfigCase.hpp" 270849ade4bb3e90c2fc0ce01ccd330f76f91da732Ted Kremenek 283070e13dca5bbefa32acb80ce4a7b217a6220983Ted Kremenek#include "egluNativeDisplay.hpp" 293070e13dca5bbefa32acb80ce4a7b217a6220983Ted Kremenek#include "egluNativeWindow.hpp" 303070e13dca5bbefa32acb80ce4a7b217a6220983Ted Kremenek#include "egluNativePixmap.hpp" 313070e13dca5bbefa32acb80ce4a7b217a6220983Ted Kremenek#include "egluStrUtil.hpp" 323070e13dca5bbefa32acb80ce4a7b217a6220983Ted Kremenek#include "egluUtil.hpp" 333070e13dca5bbefa32acb80ce4a7b217a6220983Ted Kremenek 343070e13dca5bbefa32acb80ce4a7b217a6220983Ted Kremenek#include "tcuTestLog.hpp" 353070e13dca5bbefa32acb80ce4a7b217a6220983Ted Kremenek#include "tcuTestContext.hpp" 363070e13dca5bbefa32acb80ce4a7b217a6220983Ted Kremenek#include "tcuCommandLine.hpp" 373070e13dca5bbefa32acb80ce4a7b217a6220983Ted Kremenek 380849ade4bb3e90c2fc0ce01ccd330f76f91da732Ted Kremenek#include "deUniquePtr.hpp" 393070e13dca5bbefa32acb80ce4a7b217a6220983Ted Kremenek#include "deRandom.hpp" 403070e13dca5bbefa32acb80ce4a7b217a6220983Ted Kremenek 413070e13dca5bbefa32acb80ce4a7b217a6220983Ted Kremenek#include <string> 420849ade4bb3e90c2fc0ce01ccd330f76f91da732Ted Kremenek#include <vector> 438bef8238181a30e52dea380789a7e2d760eac532Ted Kremenek 440849ade4bb3e90c2fc0ce01ccd330f76f91da732Ted Kremeneknamespace deqp 453070e13dca5bbefa32acb80ce4a7b217a6220983Ted Kremenek{ 463070e13dca5bbefa32acb80ce4a7b217a6220983Ted Kremeneknamespace egl 473070e13dca5bbefa32acb80ce4a7b217a6220983Ted Kremenek{ 483070e13dca5bbefa32acb80ce4a7b217a6220983Ted Kremenek 493070e13dca5bbefa32acb80ce4a7b217a6220983Ted Kremenekusing eglu::ConfigInfo; 503070e13dca5bbefa32acb80ce4a7b217a6220983Ted Kremenekusing tcu::TestLog; 513070e13dca5bbefa32acb80ce4a7b217a6220983Ted Kremenek 52294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenekstatic void logSurfaceAttribute (tcu::TestLog& log, EGLint attribute, EGLint value) 53294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek{ 540b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks const char* name = eglu::getSurfaceAttribName(attribute); 550b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks const eglu::SurfaceAttribValueFmt valueFmt (attribute, value); 560b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks 570b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks log << TestLog::Message << " " << name << ": " << valueFmt << TestLog::EndMessage; 580b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks} 590b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks 600b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaksstatic void logSurfaceAttributes (tcu::TestLog& log, const tcu::egl::Surface& surface, const EGLint* attributes, int num) 610b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks{ 62256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek for (int ndx = 0; ndx < num; ndx++) 63256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek { 640b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks const EGLint attrib = attributes[ndx]; 650b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks 66256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek logSurfaceAttribute(log, attrib, surface.getAttribute(attrib)); 67256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek } 68256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek} 690b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks 700b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaksstatic void logCommonSurfaceAttributes (tcu::TestLog& log, const tcu::egl::Surface& surface) 710b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks{ 720b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks static const EGLint attributes[] = 73256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek { 740b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks EGL_CONFIG_ID, 750b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks EGL_WIDTH, 760b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks EGL_HEIGHT, 770b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks EGL_HORIZONTAL_RESOLUTION, 780b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks EGL_VERTICAL_RESOLUTION, 790b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks EGL_MULTISAMPLE_RESOLVE, 800b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks EGL_PIXEL_ASPECT_RATIO, 810b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks EGL_RENDER_BUFFER, 820b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks EGL_SWAP_BEHAVIOR, 830b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks EGL_VG_ALPHA_FORMAT, 840b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks EGL_VG_COLORSPACE 850b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks }; 860b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks 87256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek logSurfaceAttributes(log, surface, attributes, DE_LENGTH_OF_ARRAY(attributes)); 88256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek} 89256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek 900b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaksstatic void logPbufferSurfaceAttributes (tcu::TestLog& log, const tcu::egl::Surface& surface) 91256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek{ 92256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek static const EGLint attributes[] = { 930b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks EGL_LARGEST_PBUFFER, 940b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks EGL_TEXTURE_FORMAT, 950b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks EGL_TEXTURE_TARGET, 960b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks EGL_MIPMAP_TEXTURE, 970b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks EGL_MIPMAP_LEVEL, 980b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks }; 990b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks 1000b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks logSurfaceAttributes(log, surface, attributes, DE_LENGTH_OF_ARRAY(attributes)); 1010b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks} 1020b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks 1030b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaksclass QuerySurfaceCase : public SimpleConfigCase 1040b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks{ 1050b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zakspublic: 106256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek QuerySurfaceCase (EglTestContext& eglTestCtx, const char* name, const char* description, const std::vector<EGLint>& configIds); 107294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek 1080b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks void checkCommonAttributes (const tcu::egl::Surface& surface, const ConfigInfo& info); 1090b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks void checkNonPbufferAttributes (EGLDisplay display, const tcu::egl::Surface& surface); 1100b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks}; 1110b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks 1120b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna ZaksQuerySurfaceCase::QuerySurfaceCase (EglTestContext& eglTestCtx, const char* name, const char* description, const std::vector<EGLint>& configIds) 1130b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks : SimpleConfigCase(eglTestCtx, name, description, configIds) 1140b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks{ 1150b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks} 116294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek 1170b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaksvoid QuerySurfaceCase::checkCommonAttributes (const tcu::egl::Surface& surface, const ConfigInfo& info) 1180b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks{ 119256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek tcu::TestLog& log = m_testCtx.getLog(); 120256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek 121294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek // Attributes which are common to all surface types 1220b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks 123294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek // Config ID 124294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek { 125294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek const EGLint id = surface.getAttribute(EGL_CONFIG_ID); 1260b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks 1270b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks if (id != info.configId) 128294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek { 129294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek log << TestLog::Message << " Fail, config ID " << id << " does not match the one used to create the surface" << TestLog::EndMessage; 1300b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Config ID mismatch"); 131294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek } 1320b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks } 1330b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks 1340b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks // Width and height 135894212e9510299abb203801e014fec76b7926a05Ted Kremenek { 1360b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks const EGLint width = surface.getWidth(); 1370b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks const EGLint height = surface.getHeight(); 138894212e9510299abb203801e014fec76b7926a05Ted Kremenek 139894212e9510299abb203801e014fec76b7926a05Ted Kremenek if (width <= 0 || height <= 0) 1400b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks { 1410b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks log << TestLog::Message << " Fail, invalid surface size " << width << "x" << height << TestLog::EndMessage; 1420b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Invalid surface size"); 1430b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks } 1440b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks } 1450b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks 1460b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks // Horizontal and vertical resolution 1470b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks { 1480b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks const EGLint hRes = surface.getAttribute(EGL_HORIZONTAL_RESOLUTION); 1490b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks const EGLint vRes = surface.getAttribute(EGL_VERTICAL_RESOLUTION); 1500b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks 1510b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks if ((hRes <= 0 || vRes <= 0) && (hRes != EGL_UNKNOWN && vRes != EGL_UNKNOWN)) 1520b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks { 1530b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks log << TestLog::Message << " Fail, invalid surface resolution " << hRes << "x" << vRes << TestLog::EndMessage; 1540b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Invalid surface resolution"); 1550b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks } 1560b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks } 1570b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks 1580b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks // Pixel aspect ratio 1590b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks { 1600b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks const EGLint pixelRatio = surface.getAttribute(EGL_PIXEL_ASPECT_RATIO); 1610b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks 1620b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks if (pixelRatio <= 0 && pixelRatio != EGL_UNKNOWN) 1630b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks { 1640b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks log << TestLog::Message << " Fail, invalid pixel aspect ratio " << surface.getAttribute(EGL_PIXEL_ASPECT_RATIO) << TestLog::EndMessage; 1650b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Invalid pixel aspect ratio"); 1660b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks } 1670b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks } 1680b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks 1690b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks // Render buffer 1700b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks { 1710b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks const EGLint renderBuffer = surface.getAttribute(EGL_RENDER_BUFFER); 1720b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks 1730b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks if (renderBuffer != EGL_BACK_BUFFER && renderBuffer != EGL_SINGLE_BUFFER) 1740b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks { 1750b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks log << TestLog::Message << " Fail, invalid render buffer value " << renderBuffer << TestLog::EndMessage; 1760b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Invalid render buffer"); 1770b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks } 1780b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks } 1790b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks 1800b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks // Multisample resolve 1810b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks { 1820b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks const EGLint multisampleResolve = surface.getAttribute(EGL_MULTISAMPLE_RESOLVE); 1830b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks 1840b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks if (multisampleResolve != EGL_MULTISAMPLE_RESOLVE_DEFAULT && multisampleResolve != EGL_MULTISAMPLE_RESOLVE_BOX) 1850b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks { 1860b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks log << TestLog::Message << " Fail, invalid multisample resolve value " << multisampleResolve << TestLog::EndMessage; 1870b3ade86a1c60cf0c7b56aa238aff458eb7f5974Anna Zaks m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Invalid multisample resolve"); 188242384ddb0e0b65dd7e9e0ac0cf3c31cf98b06a6Ted Kremenek } 189294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek 190294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek if (multisampleResolve == EGL_MULTISAMPLE_RESOLVE_BOX && !(info.surfaceType & EGL_MULTISAMPLE_RESOLVE_BOX_BIT)) 1910849ade4bb3e90c2fc0ce01ccd330f76f91da732Ted Kremenek { 1920849ade4bb3e90c2fc0ce01ccd330f76f91da732Ted Kremenek log << TestLog::Message << " Fail, multisample resolve is reported as box filter but configuration does not support it." << TestLog::EndMessage; 1930849ade4bb3e90c2fc0ce01ccd330f76f91da732Ted Kremenek m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Invalid multisample resolve"); 1940849ade4bb3e90c2fc0ce01ccd330f76f91da732Ted Kremenek } 1950849ade4bb3e90c2fc0ce01ccd330f76f91da732Ted Kremenek } 1960849ade4bb3e90c2fc0ce01ccd330f76f91da732Ted Kremenek 1970849ade4bb3e90c2fc0ce01ccd330f76f91da732Ted Kremenek // Swap behavior 1980849ade4bb3e90c2fc0ce01ccd330f76f91da732Ted Kremenek { 1990849ade4bb3e90c2fc0ce01ccd330f76f91da732Ted Kremenek const EGLint swapBehavior = surface.getAttribute(EGL_SWAP_BEHAVIOR); 2000849ade4bb3e90c2fc0ce01ccd330f76f91da732Ted Kremenek 2016cc0969ab37c614d6cf496f2ed6d2fca397a0133Anna Zaks if (swapBehavior != EGL_BUFFER_DESTROYED && swapBehavior != EGL_BUFFER_PRESERVED) 2025903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks { 2036cc0969ab37c614d6cf496f2ed6d2fca397a0133Anna Zaks log << TestLog::Message << " Fail, invalid swap behavior value " << swapBehavior << TestLog::EndMessage; 2046cc0969ab37c614d6cf496f2ed6d2fca397a0133Anna Zaks m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Invalid swap behavior"); 2056cc0969ab37c614d6cf496f2ed6d2fca397a0133Anna Zaks } 20601561d1039bfdda61edd20eed939011a8632c7c7Ted Kremenek 20701561d1039bfdda61edd20eed939011a8632c7c7Ted Kremenek if (swapBehavior == EGL_BUFFER_PRESERVED && !(info.surfaceType & EGL_SWAP_BEHAVIOR_PRESERVED_BIT)) 20801561d1039bfdda61edd20eed939011a8632c7c7Ted Kremenek { 20901561d1039bfdda61edd20eed939011a8632c7c7Ted Kremenek log << TestLog::Message << " Fail, swap behavior is reported as preserve but configuration does not support it." << TestLog::EndMessage; 21001561d1039bfdda61edd20eed939011a8632c7c7Ted Kremenek m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Invalid swap behavior"); 2116cc0969ab37c614d6cf496f2ed6d2fca397a0133Anna Zaks } 2126cc0969ab37c614d6cf496f2ed6d2fca397a0133Anna Zaks } 2136cc0969ab37c614d6cf496f2ed6d2fca397a0133Anna Zaks 2146cc0969ab37c614d6cf496f2ed6d2fca397a0133Anna Zaks // OpenVG alpha format 215e62f048960645b79363408fdead53fec2a063c52Anna Zaks { 2163bbd8cd831788c506f2980293eb3c7e1b3ca2501Anna Zaks const EGLint vgAlphaFormat = surface.getAttribute(EGL_VG_ALPHA_FORMAT); 2173bbd8cd831788c506f2980293eb3c7e1b3ca2501Anna Zaks 2186cc0969ab37c614d6cf496f2ed6d2fca397a0133Anna Zaks if (vgAlphaFormat != EGL_VG_ALPHA_FORMAT_NONPRE && vgAlphaFormat != EGL_VG_ALPHA_FORMAT_PRE) 2196cc0969ab37c614d6cf496f2ed6d2fca397a0133Anna Zaks { 2206cc0969ab37c614d6cf496f2ed6d2fca397a0133Anna Zaks log << TestLog::Message << " Fail, invalid OpenVG alpha format value " << vgAlphaFormat << TestLog::EndMessage; 2216cc0969ab37c614d6cf496f2ed6d2fca397a0133Anna Zaks m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Invalid OpenVG alpha format"); 2226cc0969ab37c614d6cf496f2ed6d2fca397a0133Anna Zaks } 2236cc0969ab37c614d6cf496f2ed6d2fca397a0133Anna Zaks 2245903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks if (vgAlphaFormat == EGL_VG_ALPHA_FORMAT_PRE && !(info.surfaceType & EGL_VG_ALPHA_FORMAT_PRE_BIT)) 2255903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks { 2265903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks log << TestLog::Message << " Fail, OpenVG is set to use premultiplied alpha but configuration does not support it." << TestLog::EndMessage; 2275903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Invalid OpenVG alpha format"); 2285903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks } 2295903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks } 2305903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks 2315903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks // OpenVG color space 2325903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks { 2335903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks const EGLint vgColorspace = surface.getAttribute(EGL_VG_COLORSPACE); 2345903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks 2355903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks if (vgColorspace != EGL_VG_COLORSPACE_sRGB && vgColorspace != EGL_VG_COLORSPACE_LINEAR) 2365903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks { 2375903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks log << TestLog::Message << " Fail, invalid OpenVG color space value " << vgColorspace << TestLog::EndMessage; 2385903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Invalid OpenVG color space"); 2395903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks } 2405903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks 2415903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks if (vgColorspace == EGL_VG_COLORSPACE_LINEAR && !(info.surfaceType & EGL_VG_COLORSPACE_LINEAR_BIT)) 2425903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks { 2435903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks log << TestLog::Message << " Fail, OpenVG is set to use a linear color space but configuration does not support it." << TestLog::EndMessage; 2445903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Invalid OpenVG color space"); 2455903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks } 2465903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks } 247256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek} 248256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek 249256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenekvoid QuerySurfaceCase::checkNonPbufferAttributes (EGLDisplay display, const tcu::egl::Surface& surface) 2505903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks{ 2515903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks const EGLint uninitializedMagicValue = -42; 2525903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks tcu::TestLog& log = m_testCtx.getLog(); 2538bef8238181a30e52dea380789a7e2d760eac532Ted Kremenek EGLint value = uninitializedMagicValue; 254256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek 255256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek static const EGLint pbufferAttribs[] = { 2566cc0969ab37c614d6cf496f2ed6d2fca397a0133Anna Zaks EGL_LARGEST_PBUFFER, 257256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek EGL_TEXTURE_FORMAT, 258256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek EGL_TEXTURE_TARGET, 259256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek EGL_MIPMAP_TEXTURE, 260256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek EGL_MIPMAP_LEVEL, 261256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek }; 262256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek 263256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(pbufferAttribs); ndx++) 264256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek { 2655903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks const EGLint attribute = pbufferAttribs[ndx]; 2668235f9c9c8b3d1737d1c6bd57f7ba3f616b92392Anna Zaks const std::string name = eglu::getSurfaceAttribName(pbufferAttribs[ndx]); 2678235f9c9c8b3d1737d1c6bd57f7ba3f616b92392Anna Zaks 2688235f9c9c8b3d1737d1c6bd57f7ba3f616b92392Anna Zaks eglQuerySurface(display, surface.getEGLSurface(), attribute, &value); 2696cc0969ab37c614d6cf496f2ed6d2fca397a0133Anna Zaks 270256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek { 271256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek const EGLint error = eglGetError(); 272256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek 273256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek if (error != EGL_SUCCESS) 274256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek { 275256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek log << TestLog::Message << " Fail, querying " << name << " from a non-pbuffer surface should not result in an error, received " 276256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek << eglu::getErrorStr(error) << TestLog::EndMessage; 277256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Illegal error condition"); 278256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek } 279d9b795524eb3dc035523f82f135d0a8adf15cd72Ted Kremenek 280d9b795524eb3dc035523f82f135d0a8adf15cd72Ted Kremenek break; 281d9b795524eb3dc035523f82f135d0a8adf15cd72Ted Kremenek } 282d9b795524eb3dc035523f82f135d0a8adf15cd72Ted Kremenek 283d9b795524eb3dc035523f82f135d0a8adf15cd72Ted Kremenek // "For a window or pixmap surface, the contents of value are not modified." 284256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek if (value != uninitializedMagicValue) 285256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek { 286256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek log << TestLog::Message << " Fail, return value contents were modified when querying " << name << " from a non-pbuffer surface." << TestLog::EndMessage; 287256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Illegal modification of return value"); 288256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek } 289256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek } 2902cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks} 2912cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks 2922cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaksclass QuerySurfaceSimpleWindowCase : public QuerySurfaceCase 2932cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks{ 2942cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zakspublic: 2952cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks QuerySurfaceSimpleWindowCase (EglTestContext& eglTestCtx, const char* name, const char* description, const std::vector<EGLint>& configIds) 2962cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks : QuerySurfaceCase(eglTestCtx, name, description, configIds) 2972cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks { 2982cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks } 2992cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks 3002cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks void executeForConfig (tcu::egl::Display& display, EGLConfig config) 3012cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks { 3022cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks tcu::TestLog& log = m_testCtx.getLog(); 3032cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks const int width = 64; 3042cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks const int height = 64; 3052cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks 3062cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks ConfigInfo info; 3072cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks display.describeConfig(config, info); 3082cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks 3090d389b819c33bdf0375694a8f141c8f02e002b18Anna Zaks log << TestLog::Message << "Creating window surface with config ID " << info.configId << TestLog::EndMessage; 3100d389b819c33bdf0375694a8f141c8f02e002b18Anna Zaks TCU_CHECK_EGL(); 3110d389b819c33bdf0375694a8f141c8f02e002b18Anna Zaks 3120d389b819c33bdf0375694a8f141c8f02e002b18Anna Zaks de::UniquePtr<eglu::NativeWindow> window(m_eglTestCtx.createNativeWindow(display.getEGLDisplay(), config, DE_NULL, width, height, eglu::parseWindowVisibility(m_testCtx.getCommandLine()))); 3130d389b819c33bdf0375694a8f141c8f02e002b18Anna Zaks tcu::egl::WindowSurface surface(display, eglu::createWindowSurface(m_eglTestCtx.getNativeDisplay(), *window, display.getEGLDisplay(), config, DE_NULL)); 3140d389b819c33bdf0375694a8f141c8f02e002b18Anna Zaks 31507d39a479cf8f20294407e749f9933da34ebecb7Anna Zaks logCommonSurfaceAttributes(log, surface); 31607d39a479cf8f20294407e749f9933da34ebecb7Anna Zaks 3170d389b819c33bdf0375694a8f141c8f02e002b18Anna Zaks checkCommonAttributes(surface, info); 3180d389b819c33bdf0375694a8f141c8f02e002b18Anna Zaks checkNonPbufferAttributes(display.getEGLDisplay(), surface); 319ca23eb212c78ac5bc62d0881635579dbe7095639Anna Zaks } 32007d39a479cf8f20294407e749f9933da34ebecb7Anna Zaks}; 32107d39a479cf8f20294407e749f9933da34ebecb7Anna Zaks 322ca23eb212c78ac5bc62d0881635579dbe7095639Anna Zaksclass QuerySurfaceSimplePixmapCase : public QuerySurfaceCase 323ca23eb212c78ac5bc62d0881635579dbe7095639Anna Zaks{ 32462a5c34ddc54696725683f6c5af1c8e1592c5c38Anna Zakspublic: 32562a5c34ddc54696725683f6c5af1c8e1592c5c38Anna Zaks QuerySurfaceSimplePixmapCase (EglTestContext& eglTestCtx, const char* name, const char* description, const std::vector<EGLint>& configIds) 32607d39a479cf8f20294407e749f9933da34ebecb7Anna Zaks : QuerySurfaceCase(eglTestCtx, name, description, configIds) 327ca23eb212c78ac5bc62d0881635579dbe7095639Anna Zaks { 328ca23eb212c78ac5bc62d0881635579dbe7095639Anna Zaks } 32962a5c34ddc54696725683f6c5af1c8e1592c5c38Anna Zaks 33062a5c34ddc54696725683f6c5af1c8e1592c5c38Anna Zaks void executeForConfig (tcu::egl::Display& display, EGLConfig config) 331ca23eb212c78ac5bc62d0881635579dbe7095639Anna Zaks { 3320d389b819c33bdf0375694a8f141c8f02e002b18Anna Zaks tcu::TestLog& log = m_testCtx.getLog(); 3330d389b819c33bdf0375694a8f141c8f02e002b18Anna Zaks const int width = 64; 3340d389b819c33bdf0375694a8f141c8f02e002b18Anna Zaks const int height = 64; 3352cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks 3362cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks ConfigInfo info; 3372cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks display.describeConfig(config, info); 3382cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks 3392cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks log << TestLog::Message << "Creating pixmap surface with config ID " << info.configId << TestLog::EndMessage; 3402cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks TCU_CHECK_EGL(); 3412cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks 3422cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks de::UniquePtr<eglu::NativePixmap> pixmap (m_eglTestCtx.createNativePixmap(display.getEGLDisplay(), config, DE_NULL, width, height)); 3432cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks tcu::egl::PixmapSurface surface (display, eglu::createPixmapSurface(m_eglTestCtx.getNativeDisplay(), *pixmap, display.getEGLDisplay(), config, DE_NULL)); 3442cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks 3452cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks logCommonSurfaceAttributes(log, surface); 3462cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks 3472cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks checkCommonAttributes(surface, info); 3482cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks checkNonPbufferAttributes(display.getEGLDisplay(), surface); 3492cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks } 3502cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks}; 3512cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks 3522cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaksclass QuerySurfaceSimplePbufferCase : public QuerySurfaceCase 3532cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks{ 3542cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zakspublic: 3552cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks QuerySurfaceSimplePbufferCase (EglTestContext& eglTestCtx, const char* name, const char* description, const std::vector<EGLint>& configIds) 3568bef8238181a30e52dea380789a7e2d760eac532Ted Kremenek : QuerySurfaceCase(eglTestCtx, name, description, configIds) 3578bef8238181a30e52dea380789a7e2d760eac532Ted Kremenek { 358e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose } 359e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose 360e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose void executeForConfig (tcu::egl::Display& display, EGLConfig config) 361e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose { 362e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose tcu::TestLog& log = m_testCtx.getLog(); 363e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose int width = 64; 364e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose int height = 64; 365e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose 366e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose ConfigInfo info; 367e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose display.describeConfig(config, info); 368e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose 369e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose log << TestLog::Message << "Creating pbuffer surface with config ID " << info.configId << TestLog::EndMessage; 370e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose TCU_CHECK_EGL(); 371e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose 372e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose // Clamp to maximums reported by implementation 373e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose width = deMin32(width, display.getConfigAttrib(config, EGL_MAX_PBUFFER_WIDTH)); 374e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose height = deMin32(height, display.getConfigAttrib(config, EGL_MAX_PBUFFER_HEIGHT)); 375e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose 376e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose if (width == 0 || height == 0) 3772cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks { 3782cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks log << TestLog::Message << " Fail, maximum pbuffer size of " << width << "x" << height << " reported" << TestLog::EndMessage; 379e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Invalid maximum pbuffer size"); 380e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose return; 381e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose } 382e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose 383e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose const EGLint attribs[] = 3842cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks { 3852cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks EGL_WIDTH, width, 3862cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks EGL_HEIGHT, height, 3872cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks EGL_TEXTURE_FORMAT, EGL_NO_TEXTURE, 388e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose EGL_NONE 3892cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks }; 3902cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks 3912cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks { 392e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose tcu::egl::PbufferSurface surface(display, config, attribs); 393e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose 394e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose logCommonSurfaceAttributes(log, surface); 395e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose logPbufferSurfaceAttributes(log, surface); 396e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose 397e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose checkCommonAttributes(surface, info); 398e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose 399e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose // Pbuffer-specific attributes 400e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose 401e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose // Largest pbuffer 402e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose { 403e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose const EGLint largestPbuffer = surface.getAttribute(EGL_LARGEST_PBUFFER); 404e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose 4052cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks if (largestPbuffer != EGL_FALSE && largestPbuffer != EGL_TRUE) 406e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose { 407e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose log << TestLog::Message << " Fail, invalid largest pbuffer value " << largestPbuffer << TestLog::EndMessage; 408e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Invalid largest pbuffer"); 409e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose } 410e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose } 411e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose 412e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose // Texture format 413e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose { 414e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose const EGLint textureFormat = surface.getAttribute(EGL_TEXTURE_FORMAT); 415e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose 4162cbe791d3e9b26f30196c4852da75d9ad67b4ad9Anna Zaks if (textureFormat != EGL_NO_TEXTURE && textureFormat != EGL_TEXTURE_RGB && textureFormat != EGL_TEXTURE_RGBA) 417e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose { 418e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose log << TestLog::Message << " Fail, invalid texture format value " << textureFormat << TestLog::EndMessage; 419e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Invalid texture format"); 420e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose } 421e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose } 422e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose 423e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose // Texture target 424e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose { 425e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose const EGLint textureTarget = surface.getAttribute(EGL_TEXTURE_TARGET); 426e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose 427e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose if (textureTarget != EGL_NO_TEXTURE && textureTarget != EGL_TEXTURE_2D) 428e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose { 429e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose log << TestLog::Message << " Fail, invalid texture target value " << textureTarget << TestLog::EndMessage; 430e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Invalid texture target"); 431e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose } 432e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose } 433e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose 434e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose // Mipmap texture 435e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose { 436e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose const EGLint mipmapTexture = surface.getAttribute(EGL_MIPMAP_TEXTURE); 437e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose 438e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose if (mipmapTexture != EGL_FALSE && mipmapTexture != EGL_TRUE) 439e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose { 440e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose log << TestLog::Message << " Fail, invalid mipmap texture value " << mipmapTexture << TestLog::EndMessage; 441e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Invalid mipmap texture"); 442e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose } 443e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose } 444e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose } 445e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose } 446ebae6d0209e1ec3d5ea14f9e63bd0d740218ed14Anna Zaks}; 447e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose 448e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Roseclass SurfaceAttribCase : public SimpleConfigCase 449e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose{ 450e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rosepublic: 451e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose SurfaceAttribCase (EglTestContext& eglTestCtx, const char* name, const char* description, const std::vector<EGLint>& configIds); 4523133f79cf451e6302dd05262b4bb53a3e4fd6300Ted Kremenek virtual ~SurfaceAttribCase (void) {} 453eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 454e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose void testAttributes (tcu::egl::Surface& surface, const ConfigInfo& info); 455e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose}; 456e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose 4575903a373db3d27794c90b25687e0dd6adb0e497dAnna ZaksSurfaceAttribCase::SurfaceAttribCase (EglTestContext& eglTestCtx, const char* name, const char* description, const std::vector<EGLint>& configIds) 4585903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks : SimpleConfigCase(eglTestCtx, name, description, configIds) 4595903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks{ 4605903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks} 4615903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks 4625903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaksvoid SurfaceAttribCase::testAttributes (tcu::egl::Surface& surface, const ConfigInfo& info) 4635903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks{ 4645903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks const tcu::egl::Display& display = surface.getDisplay(); 46510520d76044e8fff71d414f30c21b449fd104960Ted Kremenek tcu::TestLog& log = m_testCtx.getLog(); 4665903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks const int majorVersion = display.getEGLMajorVersion(); 46710520d76044e8fff71d414f30c21b449fd104960Ted Kremenek const int minorVersion = display.getEGLMinorVersion(); 46810520d76044e8fff71d414f30c21b449fd104960Ted Kremenek de::Random rnd (deStringHash(m_name.c_str()) ^ 0xf215918f); 469294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek 470294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek if (majorVersion == 1 && minorVersion == 0) 471294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek { 472294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek log << TestLog::Message << "No attributes can be set in EGL 1.0" << TestLog::EndMessage; 473294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek return; 474294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek } 475294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek 476294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek // Mipmap level 477294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek if (info.renderableType & EGL_OPENGL_ES_BIT || info.renderableType & EGL_OPENGL_ES2_BIT) 478294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek { 479294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek const EGLint initialValue = 0xDEADBAAD; 480294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek EGLint value = initialValue; 481294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek 482294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek TCU_CHECK_EGL_CALL(eglQuerySurface(surface.getDisplay().getEGLDisplay(), surface.getEGLSurface(), EGL_MIPMAP_LEVEL, &value)); 483294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek 4845903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks logSurfaceAttribute(log, EGL_MIPMAP_LEVEL, value); 4855903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks 4865903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks if (dynamic_cast<tcu::egl::PbufferSurface*>(&surface)) 4875903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks { 4885903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks if (value != 0) 489294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek { 490500abad7edfcc2409b18dd616cdbc28a094926f5Jordy Rose log << TestLog::Message << " Fail, initial mipmap level value should be 0, is " << value << TestLog::EndMessage; 491500abad7edfcc2409b18dd616cdbc28a094926f5Jordy Rose m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Invalid default mipmap level"); 492aa0aeb1cbe117db68d35700cb3a34aace0f99b99Anna Zaks } 493500abad7edfcc2409b18dd616cdbc28a094926f5Jordy Rose } 494500abad7edfcc2409b18dd616cdbc28a094926f5Jordy Rose else if (value != initialValue) 495294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek { 4965903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks log << TestLog::Message << " Fail, eglQuerySurface changed value when querying EGL_MIPMAP_LEVEL for non-pbuffer surface. Result: " << value << ". Expected: " << initialValue << TestLog::EndMessage; 4975903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "EGL_MIPMAP_LEVEL query modified result for non-pbuffer surface."); 4985eca482fe895ea57bc82410222e6426c09e63284Ted Kremenek } 499500abad7edfcc2409b18dd616cdbc28a094926f5Jordy Rose 500500abad7edfcc2409b18dd616cdbc28a094926f5Jordy Rose eglSurfaceAttrib(display.getEGLDisplay(), surface.getEGLSurface(), EGL_MIPMAP_LEVEL, 1); 501500abad7edfcc2409b18dd616cdbc28a094926f5Jordy Rose 502500abad7edfcc2409b18dd616cdbc28a094926f5Jordy Rose { 503500abad7edfcc2409b18dd616cdbc28a094926f5Jordy Rose const EGLint error = eglGetError(); 504500abad7edfcc2409b18dd616cdbc28a094926f5Jordy Rose 505500abad7edfcc2409b18dd616cdbc28a094926f5Jordy Rose if (error != EGL_SUCCESS) 506500abad7edfcc2409b18dd616cdbc28a094926f5Jordy Rose { 507500abad7edfcc2409b18dd616cdbc28a094926f5Jordy Rose log << TestLog::Message << " Fail, setting EGL_MIPMAP_LEVEL should not result in an error, received " << eglu::getErrorStr(error) << TestLog::EndMessage; 508500abad7edfcc2409b18dd616cdbc28a094926f5Jordy Rose 509500abad7edfcc2409b18dd616cdbc28a094926f5Jordy Rose m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Illegal error condition"); 510500abad7edfcc2409b18dd616cdbc28a094926f5Jordy Rose } 511500abad7edfcc2409b18dd616cdbc28a094926f5Jordy Rose } 512ebae6d0209e1ec3d5ea14f9e63bd0d740218ed14Anna Zaks } 5133133f79cf451e6302dd05262b4bb53a3e4fd6300Ted Kremenek 5143133f79cf451e6302dd05262b4bb53a3e4fd6300Ted Kremenek // Only mipmap level can be set in EGL 1.3 and lower 515500abad7edfcc2409b18dd616cdbc28a094926f5Jordy Rose if (majorVersion == 1 && minorVersion <= 3) return; 516e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose 5175eca482fe895ea57bc82410222e6426c09e63284Ted Kremenek // Multisample resolve 518e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose { 519e38dd95dddb8f1b38469c8d0e28aa1c660489324Jordy Rose const EGLint value = surface.getAttribute(EGL_MULTISAMPLE_RESOLVE); 5205eca482fe895ea57bc82410222e6426c09e63284Ted Kremenek 5215eca482fe895ea57bc82410222e6426c09e63284Ted Kremenek logSurfaceAttribute(log, EGL_MULTISAMPLE_RESOLVE, value); 522500abad7edfcc2409b18dd616cdbc28a094926f5Jordy Rose 523fe27971d54d26997149d6b84057f04ff398d1d5dJordy Rose if (value != EGL_MULTISAMPLE_RESOLVE_DEFAULT) 524ebae6d0209e1ec3d5ea14f9e63bd0d740218ed14Anna Zaks { 525294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek log << TestLog::Message << " Fail, initial multisample resolve value should be EGL_MULTISAMPLE_RESOLVE_DEFAULT, is " 526294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek << eglu::getSurfaceAttribValueStr(EGL_MULTISAMPLE_RESOLVE, value) << TestLog::EndMessage; 527294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Invalid default multisample resolve"); 528294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek } 529294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek 530294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek if (info.renderableType & EGL_MULTISAMPLE_RESOLVE_BOX_BIT) 531294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek { 532294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek log << TestLog::Message << " Box filter is supported by surface, trying to set." << TestLog::EndMessage; 533294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek 534294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek surface.setAttribute(EGL_MULTISAMPLE_RESOLVE, EGL_MULTISAMPLE_RESOLVE_BOX); 535294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek 536294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek if (surface.getAttribute(EGL_MULTISAMPLE_RESOLVE) != EGL_MULTISAMPLE_RESOLVE_BOX) 537294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek { 538294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek log << TestLog::Message << " Fail, tried to enable box filter but value did not change."; 539294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Failed to set multisample resolve"); 540294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek } 541294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek } 542294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek } 543294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek 544256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek // Swap behavior 545256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek { 546256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek const EGLint value = surface.getAttribute(EGL_SWAP_BEHAVIOR); 547256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek 548256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek logSurfaceAttribute(log, EGL_SWAP_BEHAVIOR, value); 549256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek 550256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek if (info.renderableType & EGL_SWAP_BEHAVIOR_PRESERVED_BIT) 551256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek { 552256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek const EGLint nextValue = (value == EGL_BUFFER_DESTROYED) ? EGL_BUFFER_PRESERVED : EGL_BUFFER_DESTROYED; 553256ef642f8feef22fd53be7efa868e8e34752eedTed Kremenek 554294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek surface.setAttribute(EGL_SWAP_BEHAVIOR, nextValue); 555294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek 556294fd0a62b95f512637910bf85c7efa6c2354b50Ted Kremenek if (surface.getAttribute(EGL_SWAP_BEHAVIOR) != nextValue) 557 { 558 log << TestLog::Message << " Fail, tried to set swap behavior to " << eglu::getSurfaceAttribStr(nextValue) << TestLog::EndMessage; 559 m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Failed to set swap behavior"); 560 } 561 } 562 } 563} 564 565class SurfaceAttribWindowCase : public SurfaceAttribCase 566{ 567public: 568 SurfaceAttribWindowCase (EglTestContext& eglTestCtx, const char* name, const char* description, const std::vector<EGLint>& configIds) 569 : SurfaceAttribCase(eglTestCtx, name, description, configIds) 570 { 571 } 572 573 void executeForConfig (tcu::egl::Display& display, EGLConfig config) 574 { 575 tcu::TestLog& log = m_testCtx.getLog(); 576 const int width = 64; 577 const int height = 64; 578 579 ConfigInfo info; 580 display.describeConfig(config, info); 581 582 log << TestLog::Message << "Creating window surface with config ID " << info.configId << TestLog::EndMessage; 583 TCU_CHECK_EGL(); 584 585 de::UniquePtr<eglu::NativeWindow> window(m_eglTestCtx.createNativeWindow(display.getEGLDisplay(), config, DE_NULL, width, height, eglu::parseWindowVisibility(m_testCtx.getCommandLine()))); 586 tcu::egl::WindowSurface surface(display, eglu::createWindowSurface(m_eglTestCtx.getNativeDisplay(), *window, display.getEGLDisplay(), config, DE_NULL)); 587 588 testAttributes(surface, info); 589 } 590}; 591 592class SurfaceAttribPixmapCase : public SurfaceAttribCase 593{ 594public: 595 SurfaceAttribPixmapCase (EglTestContext& eglTestCtx, const char* name, const char* description, const std::vector<EGLint>& configIds) 596 : SurfaceAttribCase(eglTestCtx, name, description, configIds) 597 { 598 } 599 600 void executeForConfig (tcu::egl::Display& display, EGLConfig config) 601 { 602 tcu::TestLog& log = m_testCtx.getLog(); 603 const int width = 64; 604 const int height = 64; 605 606 ConfigInfo info; 607 display.describeConfig(config, info); 608 609 log << TestLog::Message << "Creating pixmap surface with config ID " << info.configId << TestLog::EndMessage; 610 TCU_CHECK_EGL(); 611 612 de::UniquePtr<eglu::NativePixmap> pixmap (m_eglTestCtx.createNativePixmap(display.getEGLDisplay(), config, DE_NULL, width, height)); 613 tcu::egl::PixmapSurface surface (display, eglu::createPixmapSurface(m_eglTestCtx.getNativeDisplay(), *pixmap, display.getEGLDisplay(), config, DE_NULL)); 614 615 testAttributes(surface, info); 616 } 617}; 618 619class SurfaceAttribPbufferCase : public SurfaceAttribCase 620{ 621public: 622 SurfaceAttribPbufferCase (EglTestContext& eglTestCtx, const char* name, const char* description, const std::vector<EGLint>& configIds) 623 : SurfaceAttribCase(eglTestCtx, name, description, configIds) 624 { 625 } 626 627 void executeForConfig (tcu::egl::Display& display, EGLConfig config) 628 { 629 tcu::TestLog& log = m_testCtx.getLog(); 630 int width = 64; 631 int height = 64; 632 633 ConfigInfo info; 634 display.describeConfig(config, info); 635 636 log << TestLog::Message << "Creating pbuffer surface with config ID " << info.configId << TestLog::EndMessage; 637 TCU_CHECK_EGL(); 638 639 // Clamp to maximums reported by implementation 640 width = deMin32(width, display.getConfigAttrib(config, EGL_MAX_PBUFFER_WIDTH)); 641 height = deMin32(height, display.getConfigAttrib(config, EGL_MAX_PBUFFER_HEIGHT)); 642 643 if (width == 0 || height == 0) 644 { 645 log << TestLog::Message << " Fail, maximum pbuffer size of " << width << "x" << height << " reported" << TestLog::EndMessage; 646 m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Invalid maximum pbuffer size"); 647 return; 648 } 649 650 const EGLint attribs[] = 651 { 652 EGL_WIDTH, width, 653 EGL_HEIGHT, height, 654 EGL_TEXTURE_FORMAT, EGL_NO_TEXTURE, 655 EGL_NONE 656 }; 657 658 tcu::egl::PbufferSurface surface(display, config, attribs); 659 660 testAttributes(surface, info); 661 } 662}; 663 664QuerySurfaceTests::QuerySurfaceTests (EglTestContext& eglTestCtx) 665 : TestCaseGroup(eglTestCtx, "query_surface", "Surface Query Tests") 666{ 667} 668 669QuerySurfaceTests::~QuerySurfaceTests (void) 670{ 671} 672 673std::vector<EGLint> getConfigs (const tcu::egl::Display& display, EGLint surfaceType) 674{ 675 std::vector<EGLint> out; 676 677 std::vector<EGLConfig> eglConfigs; 678 display.getConfigs(eglConfigs); 679 680 for (size_t ndx = 0; ndx < eglConfigs.size(); ndx++) 681 { 682 ConfigInfo info; 683 display.describeConfig(eglConfigs[ndx], info); 684 685 if (info.surfaceType & surfaceType) 686 out.push_back(info.configId); 687 } 688 689 return out; 690} 691 692void QuerySurfaceTests::init (void) 693{ 694 // Simple queries 695 { 696 tcu::TestCaseGroup* simpleGroup = new tcu::TestCaseGroup(m_testCtx, "simple", "Simple queries"); 697 addChild(simpleGroup); 698 699 // Window 700 { 701 tcu::TestCaseGroup* windowGroup = new tcu::TestCaseGroup(m_testCtx, "window", "Window surfaces"); 702 simpleGroup->addChild(windowGroup); 703 704 eglu::FilterList filters; 705 filters << (eglu::ConfigSurfaceType() & EGL_WINDOW_BIT); 706 707 std::vector<NamedConfigIdSet> configIdSets; 708 NamedConfigIdSet::getDefaultSets(configIdSets, m_eglTestCtx.getConfigs(), filters); 709 710 for (std::vector<NamedConfigIdSet>::iterator i = configIdSets.begin(); i != configIdSets.end(); i++) 711 windowGroup->addChild(new QuerySurfaceSimpleWindowCase(m_eglTestCtx, i->getName(), i->getDescription(), i->getConfigIds())); 712 } 713 714 // Pixmap 715 { 716 tcu::TestCaseGroup* pixmapGroup = new tcu::TestCaseGroup(m_testCtx, "pixmap", "Pixmap surfaces"); 717 simpleGroup->addChild(pixmapGroup); 718 719 eglu::FilterList filters; 720 filters << (eglu::ConfigSurfaceType() & EGL_PIXMAP_BIT); 721 722 std::vector<NamedConfigIdSet> configIdSets; 723 NamedConfigIdSet::getDefaultSets(configIdSets, m_eglTestCtx.getConfigs(), filters); 724 725 for (std::vector<NamedConfigIdSet>::iterator i = configIdSets.begin(); i != configIdSets.end(); i++) 726 pixmapGroup->addChild(new QuerySurfaceSimplePixmapCase(m_eglTestCtx, i->getName(), i->getDescription(), i->getConfigIds())); 727 } 728 729 // Pbuffer 730 { 731 tcu::TestCaseGroup* pbufferGroup = new tcu::TestCaseGroup(m_testCtx, "pbuffer", "Pbuffer surfaces"); 732 simpleGroup->addChild(pbufferGroup); 733 734 eglu::FilterList filters; 735 filters << (eglu::ConfigSurfaceType() & EGL_PBUFFER_BIT); 736 737 std::vector<NamedConfigIdSet> configIdSets; 738 NamedConfigIdSet::getDefaultSets(configIdSets, m_eglTestCtx.getConfigs(), filters); 739 740 for (std::vector<NamedConfigIdSet>::iterator i = configIdSets.begin(); i != configIdSets.end(); i++) 741 pbufferGroup->addChild(new QuerySurfaceSimplePbufferCase(m_eglTestCtx, i->getName(), i->getDescription(), i->getConfigIds())); 742 } 743 } 744 745 // Set surface attributes 746 { 747 tcu::TestCaseGroup* setAttributeGroup = new tcu::TestCaseGroup(m_testCtx, "set_attribute", "Setting attributes"); 748 addChild(setAttributeGroup); 749 750 // Window 751 { 752 tcu::TestCaseGroup* windowGroup = new tcu::TestCaseGroup(m_testCtx, "window", "Window surfaces"); 753 setAttributeGroup->addChild(windowGroup); 754 755 eglu::FilterList filters; 756 filters << (eglu::ConfigSurfaceType() & EGL_WINDOW_BIT); 757 758 std::vector<NamedConfigIdSet> configIdSets; 759 NamedConfigIdSet::getDefaultSets(configIdSets, m_eglTestCtx.getConfigs(), filters); 760 761 for (std::vector<NamedConfigIdSet>::iterator i = configIdSets.begin(); i != configIdSets.end(); i++) 762 windowGroup->addChild(new SurfaceAttribWindowCase(m_eglTestCtx, i->getName(), i->getDescription(), i->getConfigIds())); 763 } 764 765 // Pixmap 766 { 767 tcu::TestCaseGroup* pixmapGroup = new tcu::TestCaseGroup(m_testCtx, "pixmap", "Pixmap surfaces"); 768 setAttributeGroup->addChild(pixmapGroup); 769 770 eglu::FilterList filters; 771 filters << (eglu::ConfigSurfaceType() & EGL_PIXMAP_BIT); 772 773 std::vector<NamedConfigIdSet> configIdSets; 774 NamedConfigIdSet::getDefaultSets(configIdSets, m_eglTestCtx.getConfigs(), filters); 775 776 for (std::vector<NamedConfigIdSet>::iterator i = configIdSets.begin(); i != configIdSets.end(); i++) 777 pixmapGroup->addChild(new SurfaceAttribPixmapCase(m_eglTestCtx, i->getName(), i->getDescription(), i->getConfigIds())); 778 } 779 780 // Pbuffer 781 { 782 tcu::TestCaseGroup* pbufferGroup = new tcu::TestCaseGroup(m_testCtx, "pbuffer", "Pbuffer surfaces"); 783 setAttributeGroup->addChild(pbufferGroup); 784 785 eglu::FilterList filters; 786 filters << (eglu::ConfigSurfaceType() & EGL_PBUFFER_BIT); 787 788 std::vector<NamedConfigIdSet> configIdSets; 789 NamedConfigIdSet::getDefaultSets(configIdSets, m_eglTestCtx.getConfigs(), filters); 790 791 for (std::vector<NamedConfigIdSet>::iterator i = configIdSets.begin(); i != configIdSets.end(); i++) 792 pbufferGroup->addChild(new SurfaceAttribPbufferCase(m_eglTestCtx, i->getName(), i->getDescription(), i->getConfigIds())); 793 } 794 } 795} 796 797} // egl 798} // deqp 799