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 Simple Context construction test. 223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/ 233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "teglCreateContextTests.hpp" 253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "teglSimpleConfigCase.hpp" 263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "egluStrUtil.hpp" 273c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos#include "egluUtil.hpp" 28d7ec39dd049741a9ebfb39fa7fbe763ce81fb98ePyry Haulos#include "egluUnique.hpp" 293c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos#include "eglwLibrary.hpp" 303c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos#include "eglwEnums.hpp" 313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuTestLog.hpp" 32d7ec39dd049741a9ebfb39fa7fbe763ce81fb98ePyry Haulos#include "deSTLUtil.hpp" 333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 343c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace deqp 353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 363c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace egl 373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 393c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulosusing std::vector; 403c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulosusing tcu::TestLog; 413c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulosusing namespace eglw; 423c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos 43d7ec39dd049741a9ebfb39fa7fbe763ce81fb98ePyry Haulosstatic const EGLint s_es1Attrs[] = { EGL_CONTEXT_CLIENT_VERSION, 1, EGL_NONE }; 44d7ec39dd049741a9ebfb39fa7fbe763ce81fb98ePyry Haulosstatic const EGLint s_es2Attrs[] = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE }; 45d7ec39dd049741a9ebfb39fa7fbe763ce81fb98ePyry Haulosstatic const EGLint s_es3Attrs[] = { EGL_CONTEXT_MAJOR_VERSION_KHR, 3, EGL_NONE }; 46d7ec39dd049741a9ebfb39fa7fbe763ce81fb98ePyry Haulos 47d7ec39dd049741a9ebfb39fa7fbe763ce81fb98ePyry Haulosstatic const struct 48d7ec39dd049741a9ebfb39fa7fbe763ce81fb98ePyry Haulos{ 49d7ec39dd049741a9ebfb39fa7fbe763ce81fb98ePyry Haulos const char* name; 50d7ec39dd049741a9ebfb39fa7fbe763ce81fb98ePyry Haulos EGLenum api; 51d7ec39dd049741a9ebfb39fa7fbe763ce81fb98ePyry Haulos EGLint apiBit; 52d7ec39dd049741a9ebfb39fa7fbe763ce81fb98ePyry Haulos const EGLint* ctxAttrs; 53d7ec39dd049741a9ebfb39fa7fbe763ce81fb98ePyry Haulos} s_apis[] = 54d7ec39dd049741a9ebfb39fa7fbe763ce81fb98ePyry Haulos{ 55d7ec39dd049741a9ebfb39fa7fbe763ce81fb98ePyry Haulos { "OpenGL", EGL_OPENGL_API, EGL_OPENGL_BIT, DE_NULL }, 56d7ec39dd049741a9ebfb39fa7fbe763ce81fb98ePyry Haulos { "OpenGL ES 1", EGL_OPENGL_ES_API, EGL_OPENGL_ES_BIT, s_es1Attrs }, 57d7ec39dd049741a9ebfb39fa7fbe763ce81fb98ePyry Haulos { "OpenGL ES 2", EGL_OPENGL_ES_API, EGL_OPENGL_ES2_BIT, s_es2Attrs }, 58d7ec39dd049741a9ebfb39fa7fbe763ce81fb98ePyry Haulos { "OpenGL ES 3", EGL_OPENGL_ES_API, EGL_OPENGL_ES3_BIT_KHR, s_es3Attrs }, 59d7ec39dd049741a9ebfb39fa7fbe763ce81fb98ePyry Haulos { "OpenVG", EGL_OPENVG_API, EGL_OPENVG_BIT, DE_NULL } 60d7ec39dd049741a9ebfb39fa7fbe763ce81fb98ePyry Haulos}; 61d7ec39dd049741a9ebfb39fa7fbe763ce81fb98ePyry Haulos 623c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass CreateContextCase : public SimpleConfigCase 633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 643c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic: 653c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos CreateContextCase (EglTestContext& eglTestCtx, const char* name, const char* description, const eglu::FilterList& filters); 663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ~CreateContextCase (void); 673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 683c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos void executeForConfig (EGLDisplay display, EGLConfig config); 693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}; 703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 713c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry HaulosCreateContextCase::CreateContextCase (EglTestContext& eglTestCtx, const char* name, const char* description, const eglu::FilterList& filters) 723c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos : SimpleConfigCase(eglTestCtx, name, description, filters) 733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 763c827367444ee418f129b2c238299f49d3264554Jarkko PoyryCreateContextCase::~CreateContextCase (void) 773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 803c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulosvoid CreateContextCase::executeForConfig (EGLDisplay display, EGLConfig config) 813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 823c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos const Library& egl = m_eglTestCtx.getLibrary(); 833c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos TestLog& log = m_testCtx.getLog(); 843c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos EGLint id = eglu::getConfigAttribInt(egl, display, config, EGL_CONFIG_ID); 853c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos EGLint apiBits = eglu::getConfigAttribInt(egl, display, config, EGL_RENDERABLE_TYPE); 863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 87d7ec39dd049741a9ebfb39fa7fbe763ce81fb98ePyry Haulos for (int apiNdx = 0; apiNdx < (int)DE_LENGTH_OF_ARRAY(s_apis); apiNdx++) 883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 89d7ec39dd049741a9ebfb39fa7fbe763ce81fb98ePyry Haulos if ((apiBits & s_apis[apiNdx].apiBit) == 0) 903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry continue; // Not supported API 913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 92d7ec39dd049741a9ebfb39fa7fbe763ce81fb98ePyry Haulos log << TestLog::Message << "Creating " << s_apis[apiNdx].name << " context with config ID " << id << TestLog::EndMessage; 933c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos EGLU_CHECK_MSG(egl, "init"); 943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 95d7ec39dd049741a9ebfb39fa7fbe763ce81fb98ePyry Haulos EGLU_CHECK_CALL(egl, bindAPI(s_apis[apiNdx].api)); 963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 97d7ec39dd049741a9ebfb39fa7fbe763ce81fb98ePyry Haulos EGLContext context = egl.createContext(display, config, EGL_NO_CONTEXT, s_apis[apiNdx].ctxAttrs); 983c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos EGLenum err = egl.getError(); 993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (context == EGL_NO_CONTEXT || err != EGL_SUCCESS) 1013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 1023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry log << TestLog::Message << " Fail, context: " << tcu::toHex(context) << ", error: " << eglu::getErrorName(err) << TestLog::EndMessage; 1033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Failed to create context"); 1043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 1053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else 1063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 1073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Destroy 1083c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos EGLU_CHECK_CALL(egl, destroyContext(display, context)); 1093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry log << TestLog::Message << " Pass" << TestLog::EndMessage; 1103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 1113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 1123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 1133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 114d7ec39dd049741a9ebfb39fa7fbe763ce81fb98ePyry Haulosclass CreateContextNoConfigCase : public TestCase 115d7ec39dd049741a9ebfb39fa7fbe763ce81fb98ePyry Haulos{ 116d7ec39dd049741a9ebfb39fa7fbe763ce81fb98ePyry Haulospublic: 117d7ec39dd049741a9ebfb39fa7fbe763ce81fb98ePyry Haulos CreateContextNoConfigCase (EglTestContext& eglTestCtx) 118d7ec39dd049741a9ebfb39fa7fbe763ce81fb98ePyry Haulos : TestCase(eglTestCtx, "no_config", "EGL_KHR_no_config_context") 119d7ec39dd049741a9ebfb39fa7fbe763ce81fb98ePyry Haulos { 120d7ec39dd049741a9ebfb39fa7fbe763ce81fb98ePyry Haulos } 121d7ec39dd049741a9ebfb39fa7fbe763ce81fb98ePyry Haulos 122d7ec39dd049741a9ebfb39fa7fbe763ce81fb98ePyry Haulos IterateResult iterate (void) 123d7ec39dd049741a9ebfb39fa7fbe763ce81fb98ePyry Haulos { 124d7ec39dd049741a9ebfb39fa7fbe763ce81fb98ePyry Haulos const eglw::Library& egl = m_eglTestCtx.getLibrary(); 125d7ec39dd049741a9ebfb39fa7fbe763ce81fb98ePyry Haulos const eglu::UniqueDisplay display (egl, eglu::getAndInitDisplay(m_eglTestCtx.getNativeDisplay(), DE_NULL)); 126d7ec39dd049741a9ebfb39fa7fbe763ce81fb98ePyry Haulos tcu::TestLog& log = m_testCtx.getLog(); 127d7ec39dd049741a9ebfb39fa7fbe763ce81fb98ePyry Haulos 128d7ec39dd049741a9ebfb39fa7fbe763ce81fb98ePyry Haulos if (!eglu::hasExtension(egl, *display, "EGL_KHR_no_config_context")) 129d7ec39dd049741a9ebfb39fa7fbe763ce81fb98ePyry Haulos TCU_THROW(NotSupportedError, "EGL_KHR_no_config_context is not supported"); 130d7ec39dd049741a9ebfb39fa7fbe763ce81fb98ePyry Haulos 1312a2a2ab8c79d7c4c6aa8bcdf15be42269e96c9a2Kenneth Graunke m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "pass"); 1322a2a2ab8c79d7c4c6aa8bcdf15be42269e96c9a2Kenneth Graunke 133d7ec39dd049741a9ebfb39fa7fbe763ce81fb98ePyry Haulos for (int apiNdx = 0; apiNdx < (int)DE_LENGTH_OF_ARRAY(s_apis); apiNdx++) 134d7ec39dd049741a9ebfb39fa7fbe763ce81fb98ePyry Haulos { 135d7ec39dd049741a9ebfb39fa7fbe763ce81fb98ePyry Haulos const EGLenum api = s_apis[apiNdx].api; 136d7ec39dd049741a9ebfb39fa7fbe763ce81fb98ePyry Haulos 1372a2a2ab8c79d7c4c6aa8bcdf15be42269e96c9a2Kenneth Graunke if (egl.bindAPI(api) == EGL_FALSE) 138d7ec39dd049741a9ebfb39fa7fbe763ce81fb98ePyry Haulos { 139d7ec39dd049741a9ebfb39fa7fbe763ce81fb98ePyry Haulos TCU_CHECK(egl.getError() == EGL_BAD_PARAMETER); 140d7ec39dd049741a9ebfb39fa7fbe763ce81fb98ePyry Haulos log << TestLog::Message << "eglBindAPI(" << eglu::getAPIStr(api) << ") failed, skipping" << TestLog::EndMessage; 141d7ec39dd049741a9ebfb39fa7fbe763ce81fb98ePyry Haulos continue; 142d7ec39dd049741a9ebfb39fa7fbe763ce81fb98ePyry Haulos } 143d7ec39dd049741a9ebfb39fa7fbe763ce81fb98ePyry Haulos 144d7ec39dd049741a9ebfb39fa7fbe763ce81fb98ePyry Haulos log << TestLog::Message << "Creating " << s_apis[apiNdx].name << " context" << TestLog::EndMessage; 145d7ec39dd049741a9ebfb39fa7fbe763ce81fb98ePyry Haulos 146d7ec39dd049741a9ebfb39fa7fbe763ce81fb98ePyry Haulos const EGLContext context = egl.createContext(*display, (EGLConfig)0, EGL_NO_CONTEXT, s_apis[apiNdx].ctxAttrs); 147d7ec39dd049741a9ebfb39fa7fbe763ce81fb98ePyry Haulos const EGLenum err = egl.getError(); 148d7ec39dd049741a9ebfb39fa7fbe763ce81fb98ePyry Haulos 149d7ec39dd049741a9ebfb39fa7fbe763ce81fb98ePyry Haulos if (context == EGL_NO_CONTEXT || err != EGL_SUCCESS) 150d7ec39dd049741a9ebfb39fa7fbe763ce81fb98ePyry Haulos { 151d7ec39dd049741a9ebfb39fa7fbe763ce81fb98ePyry Haulos log << TestLog::Message << " Fail, context: " << tcu::toHex(context) << ", error: " << eglu::getErrorName(err) << TestLog::EndMessage; 152d7ec39dd049741a9ebfb39fa7fbe763ce81fb98ePyry Haulos m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Failed to create context"); 153d7ec39dd049741a9ebfb39fa7fbe763ce81fb98ePyry Haulos } 154d7ec39dd049741a9ebfb39fa7fbe763ce81fb98ePyry Haulos else 155d7ec39dd049741a9ebfb39fa7fbe763ce81fb98ePyry Haulos { 156d7ec39dd049741a9ebfb39fa7fbe763ce81fb98ePyry Haulos // Destroy 157d7ec39dd049741a9ebfb39fa7fbe763ce81fb98ePyry Haulos EGLU_CHECK_CALL(egl, destroyContext(*display, context)); 158d7ec39dd049741a9ebfb39fa7fbe763ce81fb98ePyry Haulos log << TestLog::Message << " Pass" << TestLog::EndMessage; 159d7ec39dd049741a9ebfb39fa7fbe763ce81fb98ePyry Haulos } 160d7ec39dd049741a9ebfb39fa7fbe763ce81fb98ePyry Haulos } 161d7ec39dd049741a9ebfb39fa7fbe763ce81fb98ePyry Haulos 162d7ec39dd049741a9ebfb39fa7fbe763ce81fb98ePyry Haulos return STOP; 163d7ec39dd049741a9ebfb39fa7fbe763ce81fb98ePyry Haulos } 164d7ec39dd049741a9ebfb39fa7fbe763ce81fb98ePyry Haulos}; 1653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1663c827367444ee418f129b2c238299f49d3264554Jarkko PoyryCreateContextTests::CreateContextTests (EglTestContext& eglTestCtx) 1673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry : TestCaseGroup(eglTestCtx, "create_context", "Basic eglCreateContext() tests") 1683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 1693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 1703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1713c827367444ee418f129b2c238299f49d3264554Jarkko PoyryCreateContextTests::~CreateContextTests (void) 1723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 1733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 1743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1753c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid CreateContextTests::init (void) 1763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 1773c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos vector<NamedFilterList> filterLists; 1783c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos getDefaultFilterLists(filterLists, eglu::FilterList()); 1793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1803c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos for (vector<NamedFilterList>::iterator i = filterLists.begin(); i != filterLists.end(); i++) 1813c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos addChild(new CreateContextCase(m_eglTestCtx, i->getName(), i->getDescription(), *i)); 182d7ec39dd049741a9ebfb39fa7fbe763ce81fb98ePyry Haulos 183d7ec39dd049741a9ebfb39fa7fbe763ce81fb98ePyry Haulos addChild(new CreateContextNoConfigCase(m_eglTestCtx)); 1843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 1853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // egl 1873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // deqp 188