10b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand/*------------------------------------------------------------------------- 20b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand * drawElements Quality Program Tester Core 30b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand * ---------------------------------------- 40b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand * 50b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand * Copyright (c) 2016 The Khronos Group Inc. 60b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand * 70b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand * Licensed under the Apache License, Version 2.0 (the "License"); 80b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand * you may not use this file except in compliance with the License. 90b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand * You may obtain a copy of the License at 100b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand * 110b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand * http://www.apache.org/licenses/LICENSE-2.0 120b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand * 130b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand * Unless required by applicable law or agreed to in writing, software 140b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand * distributed under the License is distributed on an "AS IS" BASIS, 150b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 160b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand * See the License for the specific language governing permissions and 170b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand * limitations under the License. 180b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand * 190b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand *//*! 200b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand * \file 210b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand * \brief Wayland Vulkan Platform. 220b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand *//*--------------------------------------------------------------------*/ 230b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand 240b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand#include "tcuWaylandVulkanPlatform.hpp" 250b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand#include "tcuWaylandPlatform.hpp" 260b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand#include "vkWsiPlatform.hpp" 270b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand#include "gluPlatform.hpp" 280b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand#include "tcuWayland.hpp" 290b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand#include "tcuFunctionLibrary.hpp" 300b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand#include "deUniquePtr.hpp" 310b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand#include "deMemory.h" 320b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand 330b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand#include <sys/utsname.h> 340b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand 350b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrandusing de::MovePtr; 360b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrandusing de::UniquePtr; 370b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand 380b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrandnamespace tcu 390b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand{ 400b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrandnamespace wayland 410b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand{ 420b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand 430b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrandclass VulkanWindowWayland : public vk::wsi::WaylandWindowInterface 440b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand{ 450b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrandpublic: 460b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand VulkanWindowWayland (MovePtr<wayland::Window> window) 470b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand : vk::wsi::WaylandWindowInterface (vk::pt::WaylandSurfacePtr(window->getSurface())) 480b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand , m_window (window) 490b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand { 500b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand } 510b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand 520b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand void resize (const UVec2& newSize) 530b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand { 540b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand m_window->setDimensions((int)newSize.x(), (int)newSize.y()); 550b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand } 560b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand 570b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrandprivate: 580b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand UniquePtr<wayland::Window> m_window; 590b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand}; 600b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand 610b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrandclass VulkanDisplayWayland : public vk::wsi::WaylandDisplayInterface 620b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand{ 630b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrandpublic: 640b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand VulkanDisplayWayland (MovePtr<wayland::Display> display) 650b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand : vk::wsi::WaylandDisplayInterface (vk::pt::WaylandDisplayPtr(display->getDisplay())) 660b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand , m_display (display) 670b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand { 680b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand } 690b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand 700b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand vk::wsi::Window* createWindow (const Maybe<UVec2>& initialSize) const 710b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand { 720b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand const deUint32 height = !initialSize ? (deUint32)DEFAULT_WINDOW_HEIGHT : initialSize->y(); 730b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand const deUint32 width = !initialSize ? (deUint32)DEFAULT_WINDOW_WIDTH : initialSize->x(); 740b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand return new VulkanWindowWayland(MovePtr<wayland::Window>(new wayland::Window(*m_display, (int)width, (int)height))); 750b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand } 760b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand 770b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrandprivate: 780b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand MovePtr<wayland::Display> m_display; 790b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand}; 800b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand 810b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrandclass VulkanLibrary : public vk::Library 820b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand{ 830b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrandpublic: 840b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand VulkanLibrary (void) 850b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand : m_library ("libvulkan.so.1") 860b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand , m_driver (m_library) 870b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand { 880b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand } 890b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand 900b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand const vk::PlatformInterface& getPlatformInterface (void) const 910b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand { 920b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand return m_driver; 930b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand } 940b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand 950b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrandprivate: 960b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand const DynamicFunctionLibrary m_library; 970b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand const vk::PlatformDriver m_driver; 980b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand}; 990b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand 1000b77517458f4c6d0139de6bd27e1544f68cf6525Jason EkstrandWaylandVulkanPlatform::WaylandVulkanPlatform (EventState& eventState) 1010b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand : m_eventState(eventState) 1020b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand{ 1030b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand} 1040b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand 1050b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrandvk::wsi::Display* WaylandVulkanPlatform::createWsiDisplay (vk::wsi::Type wsiType) const 1060b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand{ 1070b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand switch(wsiType) 1080b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand { 1090b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand case vk::wsi::TYPE_WAYLAND: 1100b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand return new VulkanDisplayWayland(MovePtr<Display>(new Display(m_eventState, DE_NULL))); 1110b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand break; 1120b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand default: 1130b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand TCU_THROW(NotSupportedError, "WSI type not supported"); 1140b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand 1150b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand }; 1160b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand} 1170b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand 1180b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrandvk::Library* WaylandVulkanPlatform::createLibrary (void) const 1190b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand{ 1200b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand return new VulkanLibrary(); 1210b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand} 1220b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand 1230b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrandvoid WaylandVulkanPlatform::describePlatform (std::ostream& dst) const 1240b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand{ 1250b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand utsname sysInfo; 1260b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand deMemset(&sysInfo, 0, sizeof(sysInfo)); 1270b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand 1280b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand if (uname(&sysInfo) != 0) 1290b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand throw std::runtime_error("uname() failed"); 1300b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand 1310b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand dst << "OS: " << sysInfo.sysname << " " << sysInfo.release << " " << sysInfo.version << "\n"; 1320b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand dst << "CPU: " << sysInfo.machine << "\n"; 1330b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand} 1340b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand 1350b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrandvoid WaylandVulkanPlatform::getMemoryLimits (vk::PlatformMemoryLimits& limits) const 1360b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand{ 1370b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand limits.totalSystemMemory = 256*1024*1024; 1380b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand limits.totalDeviceLocalMemory = 128*1024*1024; 1390b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand limits.deviceMemoryAllocationGranularity = 64*1024; 1400b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand limits.devicePageSize = 4096; 1410b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand limits.devicePageTableEntrySize = 8; 1420b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand limits.devicePageTableHierarchyLevels = 3; 1430b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand} 1440b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand 1450b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand} // wayland 1460b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand} // tcu 1470b77517458f4c6d0139de6bd27e1544f68cf6525Jason Ekstrand 148