1/*------------------------------------------------------------------------- 2 * drawElements Quality Program Tester Core 3 * ---------------------------------------- 4 * 5 * Copyright 2014 The Android Open Source Project 6 * 7 * Licensed under the Apache License, Version 2.0 (the "License"); 8 * you may not use this file except in compliance with the License. 9 * You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, software 14 * distributed under the License is distributed on an "AS IS" BASIS, 15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16 * See the License for the specific language governing permissions and 17 * limitations under the License. 18 * 19 *//*! 20 * \file 21 * \brief X11 Platform. 22 *//*--------------------------------------------------------------------*/ 23 24#include "tcuX11Platform.hpp" 25 26#include "deUniquePtr.hpp" 27#include "gluPlatform.hpp" 28#include "vkPlatform.hpp" 29#include "tcuX11.hpp" 30#include "tcuFunctionLibrary.hpp" 31#include "deMemory.h" 32 33#if defined (DEQP_SUPPORT_GLX) 34# include "tcuX11GlxPlatform.hpp" 35#endif 36#if defined (DEQP_SUPPORT_EGL) 37# include "tcuX11EglPlatform.hpp" 38#endif 39 40#include <sys/utsname.h> 41 42namespace tcu 43{ 44namespace x11 45{ 46 47class X11GLPlatform : public glu::Platform 48{ 49public: 50 void registerFactory (de::MovePtr<glu::ContextFactory> factory) 51 { 52 m_contextFactoryRegistry.registerFactory(factory.release()); 53 } 54}; 55 56class VulkanLibrary : public vk::Library 57{ 58public: 59 VulkanLibrary (void) 60 : m_library ("libvulkan.so.1") 61 , m_driver (m_library) 62 { 63 } 64 65 const vk::PlatformInterface& getPlatformInterface (void) const 66 { 67 return m_driver; 68 } 69 70private: 71 const tcu::DynamicFunctionLibrary m_library; 72 const vk::PlatformDriver m_driver; 73}; 74 75class X11VulkanPlatform : public vk::Platform 76{ 77public: 78 vk::Library* createLibrary (void) const 79 { 80 return new VulkanLibrary(); 81 } 82 83 void describePlatform (std::ostream& dst) const 84 { 85 utsname sysInfo; 86 87 deMemset(&sysInfo, 0, sizeof(sysInfo)); 88 89 if (uname(&sysInfo) != 0) 90 throw std::runtime_error("uname() failed"); 91 92 dst << "OS: " << sysInfo.sysname << " " << sysInfo.release << " " << sysInfo.version << "\n"; 93 dst << "CPU: " << sysInfo.machine << "\n"; 94 } 95 96 void getMemoryLimits (vk::PlatformMemoryLimits& limits) const 97 { 98 limits.totalSystemMemory = 256*1024*1024; 99 limits.totalDeviceLocalMemory = 128*1024*1024; 100 limits.deviceMemoryAllocationGranularity = 64*1024; 101 limits.devicePageSize = 4096; 102 limits.devicePageTableEntrySize = 8; 103 limits.devicePageTableHierarchyLevels = 3; 104 } 105}; 106 107class X11Platform : public tcu::Platform 108{ 109public: 110 X11Platform (void); 111 bool processEvents (void) { return !m_eventState.getQuitFlag(); } 112 const glu::Platform& getGLPlatform (void) const { return m_glPlatform; } 113 114#if defined (DEQP_SUPPORT_EGL) 115 const eglu::Platform& getEGLPlatform (void) const { return m_eglPlatform; } 116#endif // DEQP_SUPPORT_EGL 117 118 const vk::Platform& getVulkanPlatform (void) const { return m_vkPlatform; } 119 120private: 121 EventState m_eventState; 122#if defined (DEQP_SUPPORT_EGL) 123 x11::egl::Platform m_eglPlatform; 124#endif // DEQP_SPPORT_EGL 125 X11GLPlatform m_glPlatform; 126 X11VulkanPlatform m_vkPlatform; 127}; 128 129X11Platform::X11Platform (void) 130#if defined (DEQP_SUPPORT_EGL) 131 : m_eglPlatform (m_eventState) 132#endif // DEQP_SUPPORT_EGL 133{ 134#if defined (DEQP_SUPPORT_GLX) 135 m_glPlatform.registerFactory(glx::createContextFactory(m_eventState)); 136#endif // DEQP_SUPPORT_GLX 137#if defined (DEQP_SUPPORT_EGL) 138 m_glPlatform.registerFactory(m_eglPlatform.createContextFactory()); 139#endif // DEQP_SUPPORT_EGL 140} 141 142} // x11 143} // tcu 144 145tcu::Platform* createPlatform (void) 146{ 147 return new tcu::x11::X11Platform(); 148} 149