193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi/*------------------------------------------------------------------------- 293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi * Vulkan Conformance Tests 393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi * ------------------------ 493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi * 593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi * Copyright (c) 2016 Google Inc. 693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi * 793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi * Licensed under the Apache License, Version 2.0 (the "License"); 893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi * you may not use this file except in compliance with the License. 993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi * You may obtain a copy of the License at 1093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi * 1193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi * http://www.apache.org/licenses/LICENSE-2.0 1293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi * 1393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi * Unless required by applicable law or agreed to in writing, software 1493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi * distributed under the License is distributed on an "AS IS" BASIS, 1593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi * See the License for the specific language governing permissions and 1793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi * limitations under the License. 1893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi * 1993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi *//*! 2093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi * \file 2193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi * \brief Tests for incremental present extension 2293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi *//*--------------------------------------------------------------------*/ 2393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 2493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi#include "vktWsiIncrementalPresentTests.hpp" 2593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 2693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi#include "vktTestCaseUtil.hpp" 2793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi#include "vktTestGroupUtil.hpp" 2893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi#include "vkRefUtil.hpp" 2993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi#include "vkWsiPlatform.hpp" 3093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi#include "vkWsiUtil.hpp" 3193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi#include "vkQueryUtil.hpp" 3293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi#include "vkDeviceUtil.hpp" 3393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi#include "vkPlatform.hpp" 3493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi#include "vkTypeUtil.hpp" 3593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi#include "vkPrograms.hpp" 3693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 3793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi#include "vkWsiUtil.hpp" 3893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 3993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi#include "tcuPlatform.hpp" 4093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi#include "tcuResultCollector.hpp" 41b5c2f56daa415384202d097073cd8cb5dfcf2408Pyry Haulos#include "tcuTestLog.hpp" 4293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 4393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi#include <vector> 4493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi#include <string> 4593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 4693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärviusing std::vector; 4793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärviusing std::string; 4893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 4993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärviusing tcu::Maybe; 5093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärviusing tcu::UVec2; 5193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärviusing tcu::TestLog; 5293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 5393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvinamespace vkt 5493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi{ 5593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvinamespace wsi 5693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi{ 5793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvinamespace 5893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi{ 5993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvienum Scaling 6093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi{ 6193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi SCALING_NONE, 6293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi SCALING_UP, 6393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi SCALING_DOWN 6493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi}; 6593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 6693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvitypedef vector<vk::VkExtensionProperties> Extensions; 6793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 6893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvivoid checkAllSupported (const Extensions& supportedExtensions, const vector<string>& requiredExtensions) 6993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi{ 7093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi for (vector<string>::const_iterator requiredExtName = requiredExtensions.begin(); 7193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi requiredExtName != requiredExtensions.end(); 7293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi ++requiredExtName) 7393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 7493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi if (!isExtensionSupported(supportedExtensions, vk::RequiredExtension(*requiredExtName))) 7593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi TCU_THROW(NotSupportedError, (*requiredExtName + " is not supported").c_str()); 7693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi } 7793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi} 7893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 7993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvivk::Move<vk::VkInstance> createInstanceWithWsi (const vk::PlatformInterface& vkp, 80aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin deUint32 version, 8193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const Extensions& supportedExtensions, 8293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::wsi::Type wsiType) 8393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi{ 8493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vector<string> extensions; 8593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 8693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi extensions.push_back("VK_KHR_surface"); 8793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi extensions.push_back(getExtensionName(wsiType)); 8893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 8993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi checkAllSupported(supportedExtensions, extensions); 9093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 91aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin return vk::createDefaultInstance(vkp, version, vector<string>(), extensions); 9293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi} 9393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 9493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvivk::VkPhysicalDeviceFeatures getDeviceNullFeatures (void) 9593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi{ 9693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VkPhysicalDeviceFeatures features; 9793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi deMemset(&features, 0, sizeof(features)); 9893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi return features; 9993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi} 10093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 10193e2af037c07511c2ac415ec3e55452d9cfc341dMika IsojärvideUint32 getNumQueueFamilyIndices (const vk::InstanceInterface& vki, vk::VkPhysicalDevice physicalDevice) 10293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi{ 10393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi deUint32 numFamilies = 0; 10493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 10593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vki.getPhysicalDeviceQueueFamilyProperties(physicalDevice, &numFamilies, DE_NULL); 10693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 10793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi return numFamilies; 10893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi} 10993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 11093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvivector<deUint32> getSupportedQueueFamilyIndices (const vk::InstanceInterface& vki, vk::VkPhysicalDevice physicalDevice, vk::VkSurfaceKHR surface) 11193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi{ 11293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const deUint32 numTotalFamilyIndices = getNumQueueFamilyIndices(vki, physicalDevice); 11393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vector<deUint32> supportedFamilyIndices; 11493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 11593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi for (deUint32 queueFamilyNdx = 0; queueFamilyNdx < numTotalFamilyIndices; ++queueFamilyNdx) 11693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 11793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi if (vk::wsi::getPhysicalDeviceSurfaceSupport(vki, physicalDevice, queueFamilyNdx, surface) != VK_FALSE) 11893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi supportedFamilyIndices.push_back(queueFamilyNdx); 11993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi } 12093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 12193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi return supportedFamilyIndices; 12293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi} 12393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 12493e2af037c07511c2ac415ec3e55452d9cfc341dMika IsojärvideUint32 chooseQueueFamilyIndex (const vk::InstanceInterface& vki, vk::VkPhysicalDevice physicalDevice, vk::VkSurfaceKHR surface) 12593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi{ 12693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const vector<deUint32> supportedFamilyIndices = getSupportedQueueFamilyIndices(vki, physicalDevice, surface); 12793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 12893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi if (supportedFamilyIndices.empty()) 12993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi TCU_THROW(NotSupportedError, "Device doesn't support presentation"); 13093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 13193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi return supportedFamilyIndices[0]; 13293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi} 13393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 13493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvivk::Move<vk::VkDevice> createDeviceWithWsi (const vk::InstanceInterface& vki, 13593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VkPhysicalDevice physicalDevice, 13693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const Extensions& supportedExtensions, 13793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const deUint32 queueFamilyIndex, 13893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi bool requiresIncrementalPresent, 13993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const vk::VkAllocationCallbacks* pAllocator = DE_NULL) 14093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi{ 14193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const float queuePriorities[] = { 1.0f }; 14293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const vk::VkDeviceQueueCreateInfo queueInfos[] = 14393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 14493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 14593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO, 14693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi DE_NULL, 14793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi (vk::VkDeviceQueueCreateFlags)0, 14893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi queueFamilyIndex, 14993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi DE_LENGTH_OF_ARRAY(queuePriorities), 15093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi &queuePriorities[0] 15193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi } 15293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi }; 15393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const vk::VkPhysicalDeviceFeatures features = getDeviceNullFeatures(); 15493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const char* const extensions[] = 15593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 15693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi "VK_KHR_swapchain", 15793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi "VK_KHR_incremental_present" 15893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi }; 15993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 16093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const vk::VkDeviceCreateInfo deviceParams = 16193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 16293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO, 16393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi DE_NULL, 16493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi (vk::VkDeviceCreateFlags)0, 16593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi DE_LENGTH_OF_ARRAY(queueInfos), 16693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi &queueInfos[0], 16793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 0u, 16893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi DE_NULL, 16993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi requiresIncrementalPresent ? 2u : 1u, 17093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi DE_ARRAY_BEGIN(extensions), 17193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi &features 17293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi }; 17393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 17493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(extensions); ++ndx) 17593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 17693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi if (!isExtensionSupported(supportedExtensions, vk::RequiredExtension(extensions[ndx]))) 17793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi TCU_THROW(NotSupportedError, (string(extensions[ndx]) + " is not supported").c_str()); 17893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi } 17993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 18093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi return createDevice(vki, physicalDevice, &deviceParams, pAllocator); 18193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi} 18293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 18393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvide::MovePtr<vk::wsi::Display> createDisplay (const vk::Platform& platform, 18493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const Extensions& supportedExtensions, 18593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::wsi::Type wsiType) 18693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi{ 18793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi try 18893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 18993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi return de::MovePtr<vk::wsi::Display>(platform.createWsiDisplay(wsiType)); 19093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi } 19193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi catch (const tcu::NotSupportedError& e) 19293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 19393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi if (isExtensionSupported(supportedExtensions, vk::RequiredExtension(getExtensionName(wsiType)))) 19493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 19593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi // If VK_KHR_{platform}_surface was supported, vk::Platform implementation 19693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi // must support creating native display & window for that WSI type. 19793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi throw tcu::TestError(e.getMessage()); 19893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi } 19993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi else 20093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi throw; 20193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi } 20293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi} 20393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 20493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvide::MovePtr<vk::wsi::Window> createWindow (const vk::wsi::Display& display, const Maybe<UVec2>& initialSize) 20593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi{ 20693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi try 20793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 20893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi return de::MovePtr<vk::wsi::Window>(display.createWindow(initialSize)); 20993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi } 21093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi catch (const tcu::NotSupportedError& e) 21193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 21293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi // See createDisplay - assuming that wsi::Display was supported platform port 21393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi // should also support creating a window. 21493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi throw tcu::TestError(e.getMessage()); 21593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi } 21693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi} 21793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 21893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvivoid initSemaphores (const vk::DeviceInterface& vkd, 21993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VkDevice device, 22093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi std::vector<vk::VkSemaphore>& semaphores) 22193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi{ 22293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi for (size_t ndx = 0; ndx < semaphores.size(); ndx++) 22393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi semaphores[ndx] = createSemaphore(vkd, device).disown(); 22493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi} 22593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 22693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvivoid deinitSemaphores (const vk::DeviceInterface& vkd, 22793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VkDevice device, 22893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi std::vector<vk::VkSemaphore>& semaphores) 22993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi{ 23093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi for (size_t ndx = 0; ndx < semaphores.size(); ndx++) 23193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 23293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi if (semaphores[ndx] != (vk::VkSemaphore)0) 23393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vkd.destroySemaphore(device, semaphores[ndx], DE_NULL); 23493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 23593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi semaphores[ndx] = (vk::VkSemaphore)0; 23693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi } 23793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 23893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi semaphores.clear(); 23993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi} 24093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 24193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvivoid initFences (const vk::DeviceInterface& vkd, 24293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VkDevice device, 24393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi std::vector<vk::VkFence>& fences) 24493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi{ 24593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi for (size_t ndx = 0; ndx < fences.size(); ndx++) 24693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi fences[ndx] = createFence(vkd, device).disown(); 24793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi} 24893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 24993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvivoid deinitFences (const vk::DeviceInterface& vkd, 25093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VkDevice device, 25193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi std::vector<vk::VkFence>& fences) 25293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi{ 25393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi for (size_t ndx = 0; ndx < fences.size(); ndx++) 25493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 25593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi if (fences[ndx] != (vk::VkFence)0) 25693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vkd.destroyFence(device, fences[ndx], DE_NULL); 25793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 25893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi fences[ndx] = (vk::VkFence)0; 25993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi } 26093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 26193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi fences.clear(); 26293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi} 26393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 26493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvivk::VkRect2D getRenderFrameRect (size_t frameNdx, 26593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi deUint32 imageWidth, 26693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi deUint32 imageHeight) 26793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi{ 26893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const deUint32 x = frameNdx == 0 26993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi ? 0 27093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi : de::min(((deUint32)frameNdx) % imageWidth, imageWidth - 1u); 27193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const deUint32 y = frameNdx == 0 27293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi ? 0 27393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi : de::min(((deUint32)frameNdx) % imageHeight, imageHeight - 1u); 27493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const deUint32 width = frameNdx == 0 27593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi ? imageWidth 27693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi : 1 + de::min((deUint32)(frameNdx) % de::min<deUint32>(100, imageWidth / 3), imageWidth - x); 27793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const deUint32 height = frameNdx == 0 27893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi ? imageHeight 27993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi : 1 + de::min((deUint32)(frameNdx) % de::min<deUint32>(100, imageHeight / 3), imageHeight - y); 28093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const vk::VkRect2D rect = 28193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 28293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { (deInt32)x, (deInt32)y }, 28393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { width, height } 28493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi }; 28593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 28693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi DE_ASSERT(width > 0); 28793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi DE_ASSERT(height > 0); 28893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 28993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi return rect; 29093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi} 29193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 29293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvivector<vk::VkRectLayerKHR> getUpdatedRects (size_t firstFrameNdx, 29393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi size_t lastFrameNdx, 29493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi deUint32 width, 29593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi deUint32 height) 29693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi{ 29793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vector<vk::VkRectLayerKHR> rects; 29893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 29993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi for (size_t frameNdx = firstFrameNdx; frameNdx <= lastFrameNdx; frameNdx++) 30093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 30193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const vk::VkRect2D rect = getRenderFrameRect(frameNdx, width, height); 30293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const vk::VkRectLayerKHR rectLayer = 30393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 30493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi rect.offset, 30593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi rect.extent, 30693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 0 30793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi }; 30893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 30993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi rects.push_back(rectLayer); 31093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi } 31193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 31293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi return rects; 31393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi} 31493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 31593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvivoid cmdRenderFrame (const vk::DeviceInterface& vkd, 31693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VkCommandBuffer commandBuffer, 31793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VkPipelineLayout pipelineLayout, 31893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VkPipeline pipeline, 31993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi size_t frameNdx, 32093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi deUint32 imageWidth, 32193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi deUint32 imageHeight) 32293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi{ 32393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const deUint32 mask = (deUint32)frameNdx; 32493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 32593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi if (frameNdx == 0) 32693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 32793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const vk::VkRect2D scissor = 32893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 32993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 0u, 0u }, 33093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { imageWidth, imageHeight } 33193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi }; 33293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 33393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vkd.cmdSetScissor(commandBuffer, 0u, 1u, &scissor); 33493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const vk::VkClearAttachment attachment = 33593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 33693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VK_IMAGE_ASPECT_COLOR_BIT, 33793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 0u, 33893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::makeClearValueColorF32(0.25f, 0.50, 0.75f, 1.00f) 33993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi }; 34093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const vk::VkClearRect rect = 34193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 34293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi scissor, 34393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 0u, 34493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 1u 34593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi }; 34693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 34793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vkd.cmdClearAttachments(commandBuffer, 1u, &attachment, 1u, &rect); 34893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi } 34993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 35093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 35193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const vk::VkRect2D scissor = getRenderFrameRect(frameNdx, imageWidth, imageHeight); 35293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vkd.cmdSetScissor(commandBuffer, 0u, 1u, &scissor); 35393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 35493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vkd.cmdPushConstants(commandBuffer, pipelineLayout, vk::VK_SHADER_STAGE_FRAGMENT_BIT, 0u, 4u, &mask); 35593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vkd.cmdBindPipeline(commandBuffer, vk::VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline); 35693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vkd.cmdDraw(commandBuffer, 6u, 1u, 0u, 0u); 35793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi } 35893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi} 35993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 36093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvivk::Move<vk::VkCommandBuffer> createCommandBuffer (const vk::DeviceInterface& vkd, 36193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VkDevice device, 36293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VkCommandPool commandPool, 36393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VkPipelineLayout pipelineLayout, 36493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VkRenderPass renderPass, 36593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VkFramebuffer framebuffer, 36693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VkPipeline pipeline, 367e70575ebb8ef9fda3e673240e8469789f22a4d68Oivind Boge vk::VkImage image, 368e70575ebb8ef9fda3e673240e8469789f22a4d68Oivind Boge bool isFirst, 36993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi size_t imageNextFrame, 37093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi size_t currentFrame, 37193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi deUint32 imageWidth, 37293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi deUint32 imageHeight) 37393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi{ 37493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const vk::VkCommandBufferAllocateInfo allocateInfo = 37593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 37693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, 37793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi DE_NULL, 37893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 37993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi commandPool, 38093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VK_COMMAND_BUFFER_LEVEL_PRIMARY, 38193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 1 38293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi }; 38393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const vk::VkCommandBufferBeginInfo beginInfo = 38493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 38593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, 38693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi DE_NULL, 38793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 0u, 38893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi DE_NULL 38993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi }; 39093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 39193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::Move<vk::VkCommandBuffer> commandBuffer (vk::allocateCommandBuffer(vkd, device, &allocateInfo)); 39293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi VK_CHECK(vkd.beginCommandBuffer(*commandBuffer, &beginInfo)); 39393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 39493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 395e70575ebb8ef9fda3e673240e8469789f22a4d68Oivind Boge const vk::VkImageSubresourceRange subRange = 396e70575ebb8ef9fda3e673240e8469789f22a4d68Oivind Boge { 397e70575ebb8ef9fda3e673240e8469789f22a4d68Oivind Boge vk::VK_IMAGE_ASPECT_COLOR_BIT, 398e70575ebb8ef9fda3e673240e8469789f22a4d68Oivind Boge 0, 399e70575ebb8ef9fda3e673240e8469789f22a4d68Oivind Boge 1, 400e70575ebb8ef9fda3e673240e8469789f22a4d68Oivind Boge 0, 401e70575ebb8ef9fda3e673240e8469789f22a4d68Oivind Boge 1 402e70575ebb8ef9fda3e673240e8469789f22a4d68Oivind Boge }; 403e70575ebb8ef9fda3e673240e8469789f22a4d68Oivind Boge const vk::VkImageMemoryBarrier barrier = 404e70575ebb8ef9fda3e673240e8469789f22a4d68Oivind Boge { 405e70575ebb8ef9fda3e673240e8469789f22a4d68Oivind Boge vk::VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, 406e70575ebb8ef9fda3e673240e8469789f22a4d68Oivind Boge DE_NULL, 407e70575ebb8ef9fda3e673240e8469789f22a4d68Oivind Boge vk::VK_ACCESS_TRANSFER_WRITE_BIT, 408e70575ebb8ef9fda3e673240e8469789f22a4d68Oivind Boge vk::VK_ACCESS_TRANSFER_READ_BIT | vk::VK_ACCESS_TRANSFER_WRITE_BIT, 409e70575ebb8ef9fda3e673240e8469789f22a4d68Oivind Boge isFirst ? vk::VK_IMAGE_LAYOUT_UNDEFINED : vk::VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, 410e70575ebb8ef9fda3e673240e8469789f22a4d68Oivind Boge vk::VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 411e70575ebb8ef9fda3e673240e8469789f22a4d68Oivind Boge VK_QUEUE_FAMILY_IGNORED, 412e70575ebb8ef9fda3e673240e8469789f22a4d68Oivind Boge VK_QUEUE_FAMILY_IGNORED, 413e70575ebb8ef9fda3e673240e8469789f22a4d68Oivind Boge image, 414e70575ebb8ef9fda3e673240e8469789f22a4d68Oivind Boge subRange 415e70575ebb8ef9fda3e673240e8469789f22a4d68Oivind Boge }; 416e70575ebb8ef9fda3e673240e8469789f22a4d68Oivind Boge vkd.cmdPipelineBarrier(*commandBuffer, vk::VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, vk::VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, 0, 0, DE_NULL, 0, DE_NULL, 1, &barrier); 417e70575ebb8ef9fda3e673240e8469789f22a4d68Oivind Boge } 418e70575ebb8ef9fda3e673240e8469789f22a4d68Oivind Boge 419e70575ebb8ef9fda3e673240e8469789f22a4d68Oivind Boge { 42093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const vk::VkClearValue clearValue = vk::makeClearValueColorF32(0.25f, 0.50f, 0.75f, 1.00f); 42193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const vk::VkRenderPassBeginInfo renderPassBeginInfo = 42293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 42393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, 42493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi DE_NULL, 42593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 42693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi renderPass, 42793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi framebuffer, 42893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 42993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 43093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { (deInt32)0, (deInt32)0 }, 43193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { imageWidth, imageHeight } 43293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi }, 43393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 1u, 43493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi &clearValue 43593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi }; 43693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vkd.cmdBeginRenderPass(*commandBuffer, &renderPassBeginInfo, vk::VK_SUBPASS_CONTENTS_INLINE); 43793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi } 43893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 43993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi for (size_t frameNdx = imageNextFrame; frameNdx <= currentFrame; frameNdx++) 44093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi cmdRenderFrame(vkd, *commandBuffer, pipelineLayout, pipeline, frameNdx, imageWidth, imageHeight); 44193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 44293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vkd.cmdEndRenderPass(*commandBuffer); 44393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 44493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi VK_CHECK(vkd.endCommandBuffer(*commandBuffer)); 44593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi return commandBuffer; 44693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi} 44793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 44893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvivoid deinitCommandBuffers (const vk::DeviceInterface& vkd, 44993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VkDevice device, 45093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VkCommandPool commandPool, 45193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi std::vector<vk::VkCommandBuffer>& commandBuffers) 45293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi{ 45393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi for (size_t ndx = 0; ndx < commandBuffers.size(); ndx++) 45493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 45593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi if (commandBuffers[ndx] != (vk::VkCommandBuffer)0) 45693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vkd.freeCommandBuffers(device, commandPool, 1u, &commandBuffers[ndx]); 45793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 45893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi commandBuffers[ndx] = (vk::VkCommandBuffer)0; 45993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi } 46093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 46193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi commandBuffers.clear(); 46293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi} 46393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 46493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvivk::Move<vk::VkCommandPool> createCommandPool (const vk::DeviceInterface& vkd, 46593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VkDevice device, 46693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi deUint32 queueFamilyIndex) 46793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi{ 46893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const vk::VkCommandPoolCreateInfo createInfo = 46993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 47093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, 47193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi DE_NULL, 47293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 0u, 47393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi queueFamilyIndex 47493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi }; 47593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 47693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi return vk::createCommandPool(vkd, device, &createInfo); 47793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi} 47893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 47993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvivk::Move<vk::VkFramebuffer> createFramebuffer (const vk::DeviceInterface& vkd, 48093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VkDevice device, 48193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VkRenderPass renderPass, 48293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VkImageView imageView, 48393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi deUint32 width, 48493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi deUint32 height) 48593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi{ 48693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const vk::VkFramebufferCreateInfo createInfo = 48793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 48893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, 48993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi DE_NULL, 49093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 49193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 0u, 49293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi renderPass, 49393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 1u, 49493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi &imageView, 49593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi width, 49693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi height, 49793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 1u 49893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi }; 49993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 50093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi return vk::createFramebuffer(vkd, device, &createInfo); 50193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi} 50293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 50393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvivoid initFramebuffers (const vk::DeviceInterface& vkd, 50493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VkDevice device, 50593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VkRenderPass renderPass, 50693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi std::vector<vk::VkImageView> imageViews, 50793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi deUint32 width, 50893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi deUint32 height, 50993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi std::vector<vk::VkFramebuffer>& framebuffers) 51093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi{ 51193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi DE_ASSERT(framebuffers.size() == imageViews.size()); 51293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 51393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi for (size_t ndx = 0; ndx < framebuffers.size(); ndx++) 51493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi framebuffers[ndx] = createFramebuffer(vkd, device, renderPass, imageViews[ndx], width, height).disown(); 51593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi} 51693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 51793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvivoid deinitFramebuffers (const vk::DeviceInterface& vkd, 51893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VkDevice device, 51993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi std::vector<vk::VkFramebuffer>& framebuffers) 52093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi{ 52193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi for (size_t ndx = 0; ndx < framebuffers.size(); ndx++) 52293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 52393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi if (framebuffers[ndx] != (vk::VkFramebuffer)0) 52493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vkd.destroyFramebuffer(device, framebuffers[ndx], DE_NULL); 52593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 52693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi framebuffers[ndx] = (vk::VkFramebuffer)0; 52793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi } 52893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 52993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi framebuffers.clear(); 53093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi} 53193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 53293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvivk::Move<vk::VkImageView> createImageView (const vk::DeviceInterface& vkd, 53393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VkDevice device, 53493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VkImage image, 53593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VkFormat format) 53693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi{ 53793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const vk::VkImageViewCreateInfo createInfo = 53893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 53993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, 54093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi DE_NULL, 54193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 54293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 0u, 54393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi image, 54493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VK_IMAGE_VIEW_TYPE_2D, 54593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi format, 54693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::makeComponentMappingRGBA(), 54793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 54893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VK_IMAGE_ASPECT_COLOR_BIT, 54993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 0u, 55093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 1u, 55193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 0u, 55293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 1u 55393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi } 55493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi }; 55593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 55693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi return vk::createImageView(vkd, device, &createInfo, DE_NULL); 55793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi} 55893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 55993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvivoid initImageViews (const vk::DeviceInterface& vkd, 56093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VkDevice device, 56193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const std::vector<vk::VkImage>& images, 56293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VkFormat format, 56393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi std::vector<vk::VkImageView>& imageViews) 56493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi{ 56593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi DE_ASSERT(images.size() == imageViews.size()); 56693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 56793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi for (size_t ndx = 0; ndx < imageViews.size(); ndx++) 56893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi imageViews[ndx] = createImageView(vkd, device, images[ndx], format).disown(); 56993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi} 57093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 57193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvivoid deinitImageViews (const vk::DeviceInterface& vkd, 57293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VkDevice device, 57393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi std::vector<vk::VkImageView>& imageViews) 57493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi{ 57593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi for (size_t ndx = 0; ndx < imageViews.size(); ndx++) 57693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 57793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi if (imageViews[ndx] != (vk::VkImageView)0) 57893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vkd.destroyImageView(device, imageViews[ndx], DE_NULL); 57993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 58093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi imageViews[ndx] = (vk::VkImageView)0; 58193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi } 58293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 58393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi imageViews.clear(); 58493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi} 58593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 58693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvivk::Move<vk::VkRenderPass> createRenderPass (const vk::DeviceInterface& vkd, 58793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VkDevice device, 58893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VkFormat format) 58993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi{ 59093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const vk::VkAttachmentDescription attachments[] = 59193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 59293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 59393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 0u, 59493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi format, 59593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VK_SAMPLE_COUNT_1_BIT, 59693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 59793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VK_ATTACHMENT_LOAD_OP_LOAD, 59893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VK_ATTACHMENT_STORE_OP_STORE, 59993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 60093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VK_ATTACHMENT_LOAD_OP_DONT_CARE, 60193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VK_ATTACHMENT_STORE_OP_DONT_CARE, 60293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 60393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 60493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VK_IMAGE_LAYOUT_PRESENT_SRC_KHR 60593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi } 60693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi }; 60793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const vk::VkAttachmentReference colorAttachmentRefs[] = 60893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 60993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 61093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 0u, 61193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL 61293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi } 61393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi }; 61493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const vk::VkSubpassDescription subpasses[] = 61593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 61693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 61793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 0u, 61893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VK_PIPELINE_BIND_POINT_GRAPHICS, 61993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 0u, 62093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi DE_NULL, 62193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 62293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi DE_LENGTH_OF_ARRAY(colorAttachmentRefs), 62393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi colorAttachmentRefs, 62493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi DE_NULL, 62593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 62693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi DE_NULL, 62793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 0u, 62893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi DE_NULL 62993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi } 63093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi }; 63193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 63293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const vk::VkRenderPassCreateInfo createInfo = 63393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 63493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, 63593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi DE_NULL, 63693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 0u, 63793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 63893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi DE_LENGTH_OF_ARRAY(attachments), 63993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi attachments, 64093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 64193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi DE_LENGTH_OF_ARRAY(subpasses), 64293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi subpasses, 64393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 64493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 0u, 64593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi DE_NULL 64693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi }; 64793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 64893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi return vk::createRenderPass(vkd, device, &createInfo); 64993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi} 65093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 65193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvivk::Move<vk::VkPipeline> createPipeline (const vk::DeviceInterface& vkd, 65293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VkDevice device, 65393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VkRenderPass renderPass, 65493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VkPipelineLayout layout, 65593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VkShaderModule vertexShaderModule, 65693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VkShaderModule fragmentShaderModule, 65793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi deUint32 width, 65893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi deUint32 height) 65993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi{ 66093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const vk::VkSpecializationInfo shaderSpecialization = 66193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 66293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 0u, 66393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi DE_NULL, 66493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 0, 66593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi DE_NULL 66693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi }; 66793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const vk::VkPipelineShaderStageCreateInfo stages[] = 66893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 66993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 67093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, 67193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi DE_NULL, 67293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 0u, 67393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VK_SHADER_STAGE_VERTEX_BIT, 67493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vertexShaderModule, 67593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi "main", 67693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi &shaderSpecialization 67793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi }, 67893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 67993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, 68093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi DE_NULL, 68193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 0u, 68293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VK_SHADER_STAGE_FRAGMENT_BIT, 68393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi fragmentShaderModule, 68493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi "main", 68593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi &shaderSpecialization 68693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi } 68793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi }; 68893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const vk::VkPipelineVertexInputStateCreateInfo vertexInputState = 68993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 69093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO, 69193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi DE_NULL, 69293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 0u, 69393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 0u, 69493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi DE_NULL, 69593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 0u, 69693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi DE_NULL 69793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi }; 69893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const vk::VkPipelineInputAssemblyStateCreateInfo inputAssemblyState = 69993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 70093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, 70193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi DE_NULL, 70293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 0u, 70393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, 70493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi VK_FALSE 70593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi }; 70693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const vk::VkViewport viewports[] = 70793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 70893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 70993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 0.0f, 0.0f, 71093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi (float)width, (float)height, 71193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 0.0f, 1.0f 71293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi } 71393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi }; 71493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const vk::VkRect2D scissors[] = 71593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 71693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 71793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 0u, 0u }, 71893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { width, height } 71993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi } 72093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi }; 72193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const vk::VkPipelineViewportStateCreateInfo viewportState = 72293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 72393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO, 72493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi DE_NULL, 72593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 0u, 72693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 72793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi DE_LENGTH_OF_ARRAY(viewports), 72893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi viewports, 72993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi DE_LENGTH_OF_ARRAY(scissors), 73093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi scissors 73193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi }; 73293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const vk::VkPipelineRasterizationStateCreateInfo rasterizationState = 73393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 73493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, 73593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi DE_NULL, 73693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 0u, 73793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi VK_TRUE, 73893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi VK_FALSE, 73993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VK_POLYGON_MODE_FILL, 74093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VK_CULL_MODE_NONE, 74193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VK_FRONT_FACE_CLOCKWISE, 74293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi VK_FALSE, 74393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 0.0f, 74493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 0.0f, 74593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 0.0f, 74693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 1.0f 74793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi }; 74893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const vk::VkSampleMask sampleMask = ~0u; 74993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const vk::VkPipelineMultisampleStateCreateInfo multisampleState = 75093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 75193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO, 75293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi DE_NULL, 75393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 0u, 75493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VK_SAMPLE_COUNT_1_BIT, 75593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi VK_FALSE, 75693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 0.0f, 75793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi &sampleMask, 75893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi VK_FALSE, 75993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi VK_FALSE 76093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi }; 76193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const vk::VkPipelineDepthStencilStateCreateInfo depthStencilState = 76293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 76393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO, 76493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi DE_NULL, 76593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 0u, 76693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi DE_FALSE, 76793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi DE_FALSE, 76893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VK_COMPARE_OP_ALWAYS, 76993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi DE_FALSE, 77093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi DE_FALSE, 77193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 77293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VK_STENCIL_OP_KEEP, 77393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VK_STENCIL_OP_KEEP, 77493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VK_STENCIL_OP_KEEP, 77593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VK_COMPARE_OP_ALWAYS, 77693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 0u, 77793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 0u, 77893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 0u, 77993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi }, 78093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 78193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VK_STENCIL_OP_KEEP, 78293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VK_STENCIL_OP_KEEP, 78393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VK_STENCIL_OP_KEEP, 78493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VK_COMPARE_OP_ALWAYS, 78593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 0u, 78693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 0u, 78793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 0u, 78893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi }, 78993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 0.0f, 79093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 1.0f 79193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi }; 79293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const vk::VkPipelineColorBlendAttachmentState attachmentBlendState = 79393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 79493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi VK_FALSE, 79593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VK_BLEND_FACTOR_ONE, 79693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VK_BLEND_FACTOR_ZERO, 79793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VK_BLEND_OP_ADD, 79893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VK_BLEND_FACTOR_ONE, 79993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VK_BLEND_FACTOR_ZERO, 80093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VK_BLEND_OP_ADD, 80193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi (vk::VK_COLOR_COMPONENT_R_BIT| 80293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VK_COLOR_COMPONENT_G_BIT| 80393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VK_COLOR_COMPONENT_B_BIT| 80493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VK_COLOR_COMPONENT_A_BIT), 80593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi }; 80693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const vk::VkPipelineColorBlendStateCreateInfo blendState = 80793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 80893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO, 80993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi DE_NULL, 81093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 0u, 81193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi DE_FALSE, 81293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VK_LOGIC_OP_COPY, 81393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 1u, 81493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi &attachmentBlendState, 81593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 0.0f, 0.0f, 0.0f, 0.0f } 81693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi }; 81793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const vk::VkDynamicState dynamicStates[] = 81893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 81993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VK_DYNAMIC_STATE_SCISSOR 82093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi }; 82193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const vk::VkPipelineDynamicStateCreateInfo dynamicState = 82293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 82393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO, 82493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi DE_NULL, 82593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 0u, 82693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 82793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi DE_LENGTH_OF_ARRAY(dynamicStates), 82893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi dynamicStates 82993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi }; 83093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const vk::VkGraphicsPipelineCreateInfo createInfo = 83193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 83293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO, 83393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi DE_NULL, 83493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 0u, 83593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 83693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi DE_LENGTH_OF_ARRAY(stages), 83793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi stages, 83893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi &vertexInputState, 83993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi &inputAssemblyState, 84093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi DE_NULL, 84193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi &viewportState, 84293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi &rasterizationState, 84393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi &multisampleState, 84493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi &depthStencilState, 84593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi &blendState, 84693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi &dynamicState, 84793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi layout, 84893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi renderPass, 84993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 0u, 85093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi DE_NULL, 85193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 0u 85293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi }; 85393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 85493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi return vk::createGraphicsPipeline(vkd, device, DE_NULL, &createInfo); 85593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi} 85693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 85793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvivk::Move<vk::VkPipelineLayout> createPipelineLayout (const vk::DeviceInterface& vkd, 85893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VkDevice device) 85993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi{ 86093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const vk::VkPushConstantRange pushConstants[] = 86193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 86293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 86393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VK_SHADER_STAGE_FRAGMENT_BIT, 86493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 0u, 86593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 4u 86693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi } 86793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi }; 86893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const vk::VkPipelineLayoutCreateInfo createInfo = 86993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 87093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, 87193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi DE_NULL, 87293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 0u, 87393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 87493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 0u, 87593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi DE_NULL, 87693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 87793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi DE_LENGTH_OF_ARRAY(pushConstants), 87893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi pushConstants 87993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi }; 88093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 88193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi return vk::createPipelineLayout(vkd, device, &createInfo); 88293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi} 88393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 88493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvistruct TestConfig 88593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi{ 88693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::wsi::Type wsiType; 88793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi Scaling scaling; 88893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi bool useIncrementalPresent; 88993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VkPresentModeKHR presentMode; 89093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi}; 89193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 89293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärviclass IncrementalPresentTestInstance : public TestInstance 89393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi{ 89493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvipublic: 89593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi IncrementalPresentTestInstance (Context& context, const TestConfig& testConfig); 89693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi ~IncrementalPresentTestInstance (void); 89793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 89893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi tcu::TestStatus iterate (void); 89993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 90093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärviprivate: 90193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const TestConfig m_testConfig; 90293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const bool m_useIncrementalPresent; 90393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const vk::PlatformInterface& m_vkp; 90493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const Extensions m_instanceExtensions; 90593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const vk::Unique<vk::VkInstance> m_instance; 90693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const vk::InstanceDriver m_vki; 90793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const vk::VkPhysicalDevice m_physicalDevice; 90893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const de::UniquePtr<vk::wsi::Display> m_nativeDisplay; 90993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const de::UniquePtr<vk::wsi::Window> m_nativeWindow; 91093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const vk::Unique<vk::VkSurfaceKHR> m_surface; 91193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 91293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const deUint32 m_queueFamilyIndex; 91393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const Extensions m_deviceExtensions; 91493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const vk::Unique<vk::VkDevice> m_device; 91593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const vk::DeviceDriver m_vkd; 91693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const vk::VkQueue m_queue; 91793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 91893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const vk::Unique<vk::VkCommandPool> m_commandPool; 91993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const vk::Unique<vk::VkShaderModule> m_vertexShaderModule; 92093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const vk::Unique<vk::VkShaderModule> m_fragmentShaderModule; 92193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const vk::Unique<vk::VkPipelineLayout> m_pipelineLayout; 92293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 92393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const vk::VkSurfaceCapabilitiesKHR m_surfaceProperties; 92493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const vector<vk::VkSurfaceFormatKHR> m_surfaceFormats; 92593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const vector<vk::VkPresentModeKHR> m_presentModes; 92693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 92793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi tcu::ResultCollector m_resultCollector; 92893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 92993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::Move<vk::VkSwapchainKHR> m_swapchain; 93093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi std::vector<vk::VkImage> m_swapchainImages; 93193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi std::vector<size_t> m_imageNextFrames; 932e70575ebb8ef9fda3e673240e8469789f22a4d68Oivind Boge std::vector<bool> m_isFirst; 93393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 93493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::Move<vk::VkRenderPass> m_renderPass; 93593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::Move<vk::VkPipeline> m_pipeline; 93693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 93793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi std::vector<vk::VkImageView> m_swapchainImageViews; 93893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi std::vector<vk::VkFramebuffer> m_framebuffers; 93993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi std::vector<vk::VkCommandBuffer> m_commandBuffers; 94093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi std::vector<vk::VkSemaphore> m_acquireSemaphores; 94193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi std::vector<vk::VkSemaphore> m_renderSemaphores; 94293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi std::vector<vk::VkFence> m_fences; 94393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 94493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VkSemaphore m_freeAcquireSemaphore; 94593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VkSemaphore m_freeRenderSemaphore; 94693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 94793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi std::vector<vk::VkSwapchainCreateInfoKHR> m_swapchainConfigs; 94893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi size_t m_swapchainConfigNdx; 94993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 95093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const size_t m_frameCount; 95193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi size_t m_frameNdx; 95293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 95393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const size_t m_maxOutOfDateCount; 95493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi size_t m_outOfDateCount; 95593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 95693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi void initSwapchainResources (void); 95793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi void deinitSwapchainResources (void); 95893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi void render (void); 95993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi}; 96093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 96193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvistd::vector<vk::VkSwapchainCreateInfoKHR> generateSwapchainConfigs (vk::VkSurfaceKHR surface, 96293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi deUint32 queueFamilyIndex, 96393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi Scaling scaling, 96493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const vk::VkSurfaceCapabilitiesKHR& properties, 96593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const vector<vk::VkSurfaceFormatKHR>& formats, 96693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const vector<vk::VkPresentModeKHR>& presentModes, 96793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VkPresentModeKHR presentMode) 96893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi{ 96993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const deUint32 imageLayers = 1u; 97093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const vk::VkImageUsageFlags imageUsage = properties.supportedUsageFlags; 97193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const vk::VkBool32 clipped = VK_FALSE; 97293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vector<vk::VkSwapchainCreateInfoKHR> createInfos; 97393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 97493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const deUint32 imageWidth = scaling == SCALING_NONE 97593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi ? (properties.currentExtent.width != 0xFFFFFFFFu 97693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi ? properties.currentExtent.width 97793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi : de::min(1024u, properties.minImageExtent.width + ((properties.maxImageExtent.width - properties.minImageExtent.width) / 2))) 97893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi : (scaling == SCALING_UP 97993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi ? de::max(31u, properties.minImageExtent.width) 98093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi : properties.maxImageExtent.width); 98193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const deUint32 imageHeight = scaling == SCALING_NONE 98293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi ? (properties.currentExtent.height != 0xFFFFFFFFu 98393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi ? properties.currentExtent.height 98493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi : de::min(1024u, properties.minImageExtent.height + ((properties.maxImageExtent.height - properties.minImageExtent.height) / 2))) 98593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi : (scaling == SCALING_UP 98693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi ? de::max(31u, properties.minImageExtent.height) 98793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi : properties.maxImageExtent.height); 98893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const vk::VkExtent2D imageSize = { imageWidth, imageHeight }; 98993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 99093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 99193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi size_t presentModeNdx; 99293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 99393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi for (presentModeNdx = 0; presentModeNdx < presentModes.size(); presentModeNdx++) 99493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 99593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi if (presentModes[presentModeNdx] == presentMode) 99693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi break; 99793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi } 99893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 99993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi if (presentModeNdx == presentModes.size()) 100093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi TCU_THROW(NotSupportedError, "Present mode not supported"); 100193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi } 100293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 100393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi for (size_t formatNdx = 0; formatNdx < formats.size(); formatNdx++) 100493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 100593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi for (vk::VkSurfaceTransformFlagsKHR transform = 1u; transform <= properties.supportedTransforms; transform = transform << 1u) 100693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 100793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi if ((properties.supportedTransforms & transform) == 0) 100893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi continue; 100993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 101093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi for (vk::VkCompositeAlphaFlagsKHR alpha = 1u; alpha <= properties.supportedCompositeAlpha; alpha = alpha << 1u) 101193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 101293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi if ((alpha & properties.supportedCompositeAlpha) == 0) 101393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi continue; 101493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 101593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const vk::VkSurfaceTransformFlagBitsKHR preTransform = (vk::VkSurfaceTransformFlagBitsKHR)transform; 101693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const vk::VkCompositeAlphaFlagBitsKHR compositeAlpha = (vk::VkCompositeAlphaFlagBitsKHR)alpha; 101793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const vk::VkFormat imageFormat = formats[formatNdx].format; 101893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const vk::VkColorSpaceKHR imageColorSpace = formats[formatNdx].colorSpace; 101993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const vk::VkSwapchainCreateInfoKHR createInfo = 102093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 102193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR, 102293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi DE_NULL, 102393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 0u, 102493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi surface, 102593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi properties.minImageCount, 102693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi imageFormat, 102793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi imageColorSpace, 102893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi imageSize, 102993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi imageLayers, 103093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi imageUsage, 103193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VK_SHARING_MODE_EXCLUSIVE, 103293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 1u, 103393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi &queueFamilyIndex, 103493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi preTransform, 103593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi compositeAlpha, 103693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi presentMode, 103793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi clipped, 103893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi (vk::VkSwapchainKHR)0 103993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi }; 104093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 104193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi createInfos.push_back(createInfo); 104293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi } 104393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi } 104493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi } 104593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 104693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi return createInfos; 104793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi} 104893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 104993e2af037c07511c2ac415ec3e55452d9cfc341dMika IsojärviIncrementalPresentTestInstance::IncrementalPresentTestInstance (Context& context, const TestConfig& testConfig) 105093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi : TestInstance (context) 105193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi , m_testConfig (testConfig) 105293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi , m_useIncrementalPresent (testConfig.useIncrementalPresent) 105393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi , m_vkp (context.getPlatformInterface()) 105493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi , m_instanceExtensions (vk::enumerateInstanceExtensionProperties(m_vkp, DE_NULL)) 1055aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin , m_instance (createInstanceWithWsi(m_vkp, context.getUsedApiVersion(), m_instanceExtensions, testConfig.wsiType)) 105693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi , m_vki (m_vkp, *m_instance) 105793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi , m_physicalDevice (vk::chooseDevice(m_vki, *m_instance, context.getTestContext().getCommandLine())) 105893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi , m_nativeDisplay (createDisplay(context.getTestContext().getPlatform().getVulkanPlatform(), m_instanceExtensions, testConfig.wsiType)) 105993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi , m_nativeWindow (createWindow(*m_nativeDisplay, tcu::nothing<UVec2>())) 106093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi , m_surface (vk::wsi::createSurface(m_vki, *m_instance, testConfig.wsiType, *m_nativeDisplay, *m_nativeWindow)) 106193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 106293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi , m_queueFamilyIndex (chooseQueueFamilyIndex(m_vki, m_physicalDevice, *m_surface)) 106393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi , m_deviceExtensions (vk::enumerateDeviceExtensionProperties(m_vki, m_physicalDevice, DE_NULL)) 106493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi , m_device (createDeviceWithWsi(m_vki, m_physicalDevice, m_deviceExtensions, m_queueFamilyIndex, testConfig.useIncrementalPresent)) 106593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi , m_vkd (m_vki, *m_device) 106693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi , m_queue (getDeviceQueue(m_vkd, *m_device, m_queueFamilyIndex, 0u)) 106793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 106893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi , m_commandPool (createCommandPool(m_vkd, *m_device, m_queueFamilyIndex)) 106993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi , m_vertexShaderModule (vk::createShaderModule(m_vkd, *m_device, context.getBinaryCollection().get("quad-vert"), 0u)) 107093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi , m_fragmentShaderModule (vk::createShaderModule(m_vkd, *m_device, context.getBinaryCollection().get("quad-frag"), 0u)) 107193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi , m_pipelineLayout (createPipelineLayout(m_vkd, *m_device)) 107293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 107393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi , m_surfaceProperties (vk::wsi::getPhysicalDeviceSurfaceCapabilities(m_vki, m_physicalDevice, *m_surface)) 107493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi , m_surfaceFormats (vk::wsi::getPhysicalDeviceSurfaceFormats(m_vki, m_physicalDevice, *m_surface)) 107593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi , m_presentModes (vk::wsi::getPhysicalDeviceSurfacePresentModes(m_vki, m_physicalDevice, *m_surface)) 107693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 107793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi , m_freeAcquireSemaphore ((vk::VkSemaphore)0) 107893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi , m_freeRenderSemaphore ((vk::VkSemaphore)0) 107993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 108093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi , m_swapchainConfigs (generateSwapchainConfigs(*m_surface, m_queueFamilyIndex, testConfig.scaling, m_surfaceProperties, m_surfaceFormats, m_presentModes, testConfig.presentMode)) 108193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi , m_swapchainConfigNdx (0u) 108293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 108393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi , m_frameCount (60u * 5u) 108493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi , m_frameNdx (0u) 108593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 108693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi , m_maxOutOfDateCount (20u) 108793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi , m_outOfDateCount (0u) 108893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi{ 108993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 109093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const tcu::ScopedLogSection surfaceInfo (m_context.getTestContext().getLog(), "SurfaceCapabilities", "SurfaceCapabilities"); 109193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi m_context.getTestContext().getLog() << TestLog::Message << m_surfaceProperties << TestLog::EndMessage; 109293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi } 109393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi} 109493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 109593e2af037c07511c2ac415ec3e55452d9cfc341dMika IsojärviIncrementalPresentTestInstance::~IncrementalPresentTestInstance (void) 109693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi{ 109793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi deinitSwapchainResources(); 109893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi} 109993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 110093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvivoid IncrementalPresentTestInstance::initSwapchainResources (void) 110193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi{ 110293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const size_t fenceCount = 6; 110393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const deUint32 imageWidth = m_swapchainConfigs[m_swapchainConfigNdx].imageExtent.width; 110493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const deUint32 imageHeight = m_swapchainConfigs[m_swapchainConfigNdx].imageExtent.height; 110593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const vk::VkFormat imageFormat = m_swapchainConfigs[m_swapchainConfigNdx].imageFormat; 110693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 110793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi m_swapchain = vk::createSwapchainKHR(m_vkd, *m_device, &m_swapchainConfigs[m_swapchainConfigNdx]); 110893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi m_swapchainImages = vk::wsi::getSwapchainImages(m_vkd, *m_device, *m_swapchain); 110993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 111093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi m_imageNextFrames.resize(m_swapchainImages.size(), 0); 1111e70575ebb8ef9fda3e673240e8469789f22a4d68Oivind Boge m_isFirst.resize(m_swapchainImages.size(), true); 111293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 111393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi m_renderPass = createRenderPass(m_vkd, *m_device, imageFormat); 111493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi m_pipeline = createPipeline(m_vkd, *m_device, *m_renderPass, *m_pipelineLayout, *m_vertexShaderModule, *m_fragmentShaderModule, imageWidth, imageHeight); 111593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 111693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi m_swapchainImageViews = std::vector<vk::VkImageView>(m_swapchainImages.size(), (vk::VkImageView)0); 111793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi m_framebuffers = std::vector<vk::VkFramebuffer>(m_swapchainImages.size(), (vk::VkFramebuffer)0); 111893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi m_acquireSemaphores = std::vector<vk::VkSemaphore>(m_swapchainImages.size(), (vk::VkSemaphore)0); 111993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi m_renderSemaphores = std::vector<vk::VkSemaphore>(m_swapchainImages.size(), (vk::VkSemaphore)0); 112093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 112193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi m_fences = std::vector<vk::VkFence>(fenceCount, (vk::VkFence)0); 112293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi m_commandBuffers = std::vector<vk::VkCommandBuffer>(m_fences.size(), (vk::VkCommandBuffer)0); 112393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 112493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi m_freeAcquireSemaphore = (vk::VkSemaphore)0; 112593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi m_freeRenderSemaphore = (vk::VkSemaphore)0; 112693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 112793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi m_freeAcquireSemaphore = createSemaphore(m_vkd, *m_device).disown(); 112893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi m_freeRenderSemaphore = createSemaphore(m_vkd, *m_device).disown(); 112993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 113093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi initImageViews(m_vkd, *m_device, m_swapchainImages, imageFormat, m_swapchainImageViews); 113193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi initFramebuffers(m_vkd, *m_device, *m_renderPass, m_swapchainImageViews, imageWidth, imageHeight, m_framebuffers); 113293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi initSemaphores(m_vkd, *m_device, m_acquireSemaphores); 113393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi initSemaphores(m_vkd, *m_device, m_renderSemaphores); 113493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 113593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi initFences(m_vkd, *m_device, m_fences); 113693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi} 113793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 113893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvivoid IncrementalPresentTestInstance::deinitSwapchainResources (void) 113993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi{ 114093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi VK_CHECK(m_vkd.queueWaitIdle(m_queue)); 114193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 114293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi if (m_freeAcquireSemaphore != (vk::VkSemaphore)0) 114393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 114493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi m_vkd.destroySemaphore(*m_device, m_freeAcquireSemaphore, DE_NULL); 114593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi m_freeAcquireSemaphore = (vk::VkSemaphore)0; 114693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi } 114793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 114893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi if (m_freeRenderSemaphore != (vk::VkSemaphore)0) 114993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 115093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi m_vkd.destroySemaphore(*m_device, m_freeRenderSemaphore, DE_NULL); 115193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi m_freeRenderSemaphore = (vk::VkSemaphore)0; 115293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi } 115393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 115493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi deinitSemaphores(m_vkd, *m_device, m_acquireSemaphores); 115593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi deinitSemaphores(m_vkd, *m_device, m_renderSemaphores); 115693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi deinitFences(m_vkd, *m_device, m_fences); 115793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi deinitCommandBuffers(m_vkd, *m_device, *m_commandPool, m_commandBuffers); 115893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi deinitFramebuffers(m_vkd, *m_device, m_framebuffers); 115993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi deinitImageViews(m_vkd, *m_device, m_swapchainImageViews); 116093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 116193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi m_swapchainImages.clear(); 116293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi m_imageNextFrames.clear(); 1163e70575ebb8ef9fda3e673240e8469789f22a4d68Oivind Boge m_isFirst.clear(); 116493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 116593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi m_swapchain = vk::Move<vk::VkSwapchainKHR>(); 116693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi m_renderPass = vk::Move<vk::VkRenderPass>(); 116793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi m_pipeline = vk::Move<vk::VkPipeline>(); 116893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 116993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi} 117093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 117193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvivoid IncrementalPresentTestInstance::render (void) 117293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi{ 117393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const deUint64 foreverNs = 0xFFFFFFFFFFFFFFFFul; 117493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const vk::VkFence fence = m_fences[m_frameNdx % m_fences.size()]; 117593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const deUint32 width = m_swapchainConfigs[m_swapchainConfigNdx].imageExtent.width; 117693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const deUint32 height = m_swapchainConfigs[m_swapchainConfigNdx].imageExtent.height; 117793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi size_t imageNextFrame; 117893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 117993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi // Throttle execution 118093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi if (m_frameNdx >= m_fences.size()) 118193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 118293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi VK_CHECK(m_vkd.waitForFences(*m_device, 1u, &fence, VK_TRUE, foreverNs)); 118393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi VK_CHECK(m_vkd.resetFences(*m_device, 1u, &fence)); 118493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 118593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi m_vkd.freeCommandBuffers(*m_device, *m_commandPool, 1u, &m_commandBuffers[m_frameNdx % m_commandBuffers.size()]); 118693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi m_commandBuffers[m_frameNdx % m_commandBuffers.size()] = (vk::VkCommandBuffer)0; 118793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi } 118893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 118993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VkSemaphore currentAcquireSemaphore = m_freeAcquireSemaphore; 119093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VkSemaphore currentRenderSemaphore = m_freeRenderSemaphore; 119193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi deUint32 imageIndex; 119293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 119393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi // Acquire next image 1194db916576a76a17c02c14390fc5d5b3db1488d1d2Jason Ekstrand VK_CHECK(m_vkd.acquireNextImageKHR(*m_device, *m_swapchain, foreverNs, currentAcquireSemaphore, (vk::VkFence)0, &imageIndex)); 119593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 119693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi // Create command buffer 119793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 119893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi imageNextFrame = m_imageNextFrames[imageIndex]; 1199e70575ebb8ef9fda3e673240e8469789f22a4d68Oivind Boge m_commandBuffers[m_frameNdx % m_commandBuffers.size()] = createCommandBuffer(m_vkd, *m_device, *m_commandPool, *m_pipelineLayout, *m_renderPass, m_framebuffers[imageIndex], *m_pipeline, m_swapchainImages[imageIndex], m_isFirst[imageIndex], imageNextFrame, m_frameNdx, width, height).disown(); 120093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi m_imageNextFrames[imageIndex] = m_frameNdx + 1; 1201e70575ebb8ef9fda3e673240e8469789f22a4d68Oivind Boge m_isFirst[imageIndex] = false; 120293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi } 120393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 120493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi // Submit command buffer 120593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 120693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const vk::VkPipelineStageFlags dstStageMask = vk::VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; 120793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const vk::VkSubmitInfo submitInfo = 120893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 120993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VK_STRUCTURE_TYPE_SUBMIT_INFO, 121093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi DE_NULL, 121193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 1u, 121293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi ¤tAcquireSemaphore, 121393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi &dstStageMask, 121493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 1u, 121593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi &m_commandBuffers[m_frameNdx % m_commandBuffers.size()], 121693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 1u, 121793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi ¤tRenderSemaphore 121893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi }; 121993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 1220db916576a76a17c02c14390fc5d5b3db1488d1d2Jason Ekstrand VK_CHECK(m_vkd.queueSubmit(m_queue, 1u, &submitInfo, fence)); 122193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi } 122293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 122393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi // Present frame 122493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi if (m_useIncrementalPresent) 122593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 122693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VkResult result; 122793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const vector<vk::VkRectLayerKHR> rects = getUpdatedRects(imageNextFrame, m_frameNdx, width, height); 122893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const vk::VkPresentRegionKHR region = 122993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 123093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi (deUint32)rects.size(), 123193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi rects.empty() ? DE_NULL : &rects[0] 123293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi }; 123393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const vk::VkPresentRegionsKHR regionInfo = 123493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 123593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VK_STRUCTURE_TYPE_PRESENT_REGIONS_KHR, 123693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi DE_NULL, 123793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 1u, 123893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi ®ion 123993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi }; 124093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const vk::VkPresentInfoKHR presentInfo = 124193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 124293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VK_STRUCTURE_TYPE_PRESENT_INFO_KHR, 124393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi ®ionInfo, 124493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 1u, 124593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi ¤tRenderSemaphore, 124693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 1u, 124793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi &*m_swapchain, 124893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi &imageIndex, 124993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi &result 125093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi }; 125193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 125293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi VK_CHECK(m_vkd.queuePresentKHR(m_queue, &presentInfo)); 125393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi VK_CHECK(result); 125493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi } 125593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi else 125693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 125793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VkResult result; 125893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const vk::VkPresentInfoKHR presentInfo = 125993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 126093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VK_STRUCTURE_TYPE_PRESENT_INFO_KHR, 126193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi DE_NULL, 126293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 1u, 126393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi ¤tRenderSemaphore, 126493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 1u, 126593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi &*m_swapchain, 126693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi &imageIndex, 126793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi &result 126893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi }; 126993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 127093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi VK_CHECK(m_vkd.queuePresentKHR(m_queue, &presentInfo)); 127193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi VK_CHECK(result); 127293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi } 127393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 127493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 127593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi m_freeAcquireSemaphore = m_acquireSemaphores[imageIndex]; 127693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi m_acquireSemaphores[imageIndex] = currentAcquireSemaphore; 127793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 127893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi m_freeRenderSemaphore = m_renderSemaphores[imageIndex]; 127993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi m_renderSemaphores[imageIndex] = currentRenderSemaphore; 128093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi } 128193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi} 128293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 128393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvitcu::TestStatus IncrementalPresentTestInstance::iterate (void) 128493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi{ 128593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi // Initialize swapchain specific resources 128693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi // Render test 128793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi try 128893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 128993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi if (m_frameNdx == 0) 129093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 129193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi if (m_outOfDateCount == 0) 129293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi m_context.getTestContext().getLog() << tcu::TestLog::Message << "Swapchain: " << m_swapchainConfigs[m_swapchainConfigNdx] << tcu::TestLog::EndMessage; 129393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 129493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi initSwapchainResources(); 129593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi } 129693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 129793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi render(); 129893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi } 129993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi catch (const vk::Error& error) 130093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 130193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi if (error.getError() == vk::VK_ERROR_OUT_OF_DATE_KHR) 130293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 130393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi m_swapchainConfigs = generateSwapchainConfigs(*m_surface, m_queueFamilyIndex, m_testConfig.scaling, m_surfaceProperties, m_surfaceFormats, m_presentModes, m_testConfig.presentMode); 130493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 130593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi if (m_outOfDateCount < m_maxOutOfDateCount) 130693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 130793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi m_context.getTestContext().getLog() << TestLog::Message << "Frame " << m_frameNdx << ": Swapchain out of date. Recreating resources." << TestLog::EndMessage; 130893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi deinitSwapchainResources(); 130993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi m_frameNdx = 0; 131093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi m_outOfDateCount++; 131193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 131293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi return tcu::TestStatus::incomplete(); 131393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi } 131493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi else 131593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 131693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi m_context.getTestContext().getLog() << TestLog::Message << "Frame " << m_frameNdx << ": Swapchain out of date." << TestLog::EndMessage; 131793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi m_resultCollector.fail("Received too many VK_ERROR_OUT_OF_DATE_KHR errors. Received " + de::toString(m_outOfDateCount) + ", max " + de::toString(m_maxOutOfDateCount)); 131893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi } 131993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi } 132093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi else 132193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 132293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi m_resultCollector.fail(error.what()); 132393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi } 132493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 132593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi deinitSwapchainResources(); 132693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 132793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi m_swapchainConfigNdx++; 132893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi m_frameNdx = 0; 132993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi m_outOfDateCount = 0; 133093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 133193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi if (m_swapchainConfigNdx >= m_swapchainConfigs.size()) 133293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi return tcu::TestStatus(m_resultCollector.getResult(), m_resultCollector.getMessage()); 133393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi else 133493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi return tcu::TestStatus::incomplete(); 133593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi } 133693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 133793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi m_frameNdx++; 133893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 133993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi if (m_frameNdx >= m_frameCount) 134093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 134193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi m_frameNdx = 0; 134293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi m_outOfDateCount = 0; 134393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi m_swapchainConfigNdx++; 134493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 134593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi deinitSwapchainResources(); 134693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 134793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi if (m_swapchainConfigNdx >= m_swapchainConfigs.size()) 134893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi return tcu::TestStatus(m_resultCollector.getResult(), m_resultCollector.getMessage()); 134993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi else 135093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi return tcu::TestStatus::incomplete(); 135193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi } 135293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi else 135393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi return tcu::TestStatus::incomplete(); 135493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi} 135593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 135693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvistruct Programs 135793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi{ 135893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi static void init (vk::SourceCollections& dst, TestConfig) 135993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 136093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi dst.glslSources.add("quad-vert") << glu::VertexSource( 136193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi "#version 450\n" 136293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi "out gl_PerVertex {\n" 136393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi "\tvec4 gl_Position;\n" 136493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi "};\n" 136593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi "highp float;\n" 136693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi "void main (void) {\n" 136793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi "\tgl_Position = vec4(((gl_VertexIndex + 2) / 3) % 2 == 0 ? -1.0 : 1.0,\n" 136893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi "\t ((gl_VertexIndex + 1) / 3) % 2 == 0 ? -1.0 : 1.0, 0.0, 1.0);\n" 136993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi "}\n"); 137093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi dst.glslSources.add("quad-frag") << glu::FragmentSource( 137193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi "#version 310 es\n" 137293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi "layout(location = 0) out highp vec4 o_color;\n" 137393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi "layout(push_constant) uniform PushConstant {\n" 137493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi "\thighp uint mask;\n" 137593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi "} pushConstants;\n" 137693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi "void main (void)\n" 137793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi "{\n" 137893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi "\thighp uint mask = pushConstants.mask;\n" 137993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi "\thighp uint x = mask ^ uint(gl_FragCoord.x);\n" 138093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi "\thighp uint y = mask ^ uint(gl_FragCoord.y);\n" 138193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi "\thighp uint r = 128u * bitfieldExtract(x, 0, 1)\n" 138293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi "\t + 64u * bitfieldExtract(y, 1, 1)\n" 138393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi "\t + 32u * bitfieldExtract(x, 3, 1);\n" 138493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi "\thighp uint g = 128u * bitfieldExtract(y, 0, 1)\n" 138593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi "\t + 64u * bitfieldExtract(x, 2, 1)\n" 138693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi "\t + 32u * bitfieldExtract(y, 3, 1);\n" 138793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi "\thighp uint b = 128u * bitfieldExtract(x, 1, 1)\n" 138893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi "\t + 64u * bitfieldExtract(y, 2, 1)\n" 138993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi "\t + 32u * bitfieldExtract(x, 4, 1);\n" 139093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi "\to_color = vec4(float(r) / 255.0, float(g) / 255.0, float(b) / 255.0, 1.0);\n" 139193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi "}\n"); 139293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi } 139393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi}; 139493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 139593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi} // anonymous 139693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 139793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvivoid createIncrementalPresentTests (tcu::TestCaseGroup* testGroup, vk::wsi::Type wsiType) 139893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi{ 139993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const struct 140093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 140193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi Scaling scaling; 140293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const char* name; 140393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi } scaling [] = 140493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 140593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { SCALING_NONE, "scale_none" }, 140693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { SCALING_UP, "scale_up" }, 140793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { SCALING_DOWN, "scale_down" } 140893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi }; 140993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const struct 141093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 141193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi vk::VkPresentModeKHR mode; 141293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const char* name; 141393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi } presentModes[] = 141493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 141593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { vk::VK_PRESENT_MODE_IMMEDIATE_KHR, "immediate" }, 141693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { vk::VK_PRESENT_MODE_MAILBOX_KHR, "mailbox" }, 141793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { vk::VK_PRESENT_MODE_FIFO_KHR, "fifo" }, 141893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { vk::VK_PRESENT_MODE_FIFO_RELAXED_KHR, "fifo_relaxed" } 141993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi }; 142093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 142193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi for (size_t scalingNdx = 0; scalingNdx < DE_LENGTH_OF_ARRAY(scaling); scalingNdx++) 142293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 142393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi if (scaling[scalingNdx].scaling != SCALING_NONE && wsiType == vk::wsi::TYPE_WAYLAND) 142493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi continue; 142593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 142693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi if (scaling[scalingNdx].scaling != SCALING_NONE && vk::wsi::getPlatformProperties(wsiType).swapchainExtent != vk::wsi::PlatformProperties::SWAPCHAIN_EXTENT_SCALED_TO_WINDOW_SIZE) 142793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi continue; 142893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 142993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 143093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 143193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi de::MovePtr<tcu::TestCaseGroup> scaleGroup (new tcu::TestCaseGroup(testGroup->getTestContext(), scaling[scalingNdx].name, scaling[scalingNdx].name)); 143293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 143393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi for (size_t presentModeNdx = 0; presentModeNdx < DE_LENGTH_OF_ARRAY(presentModes); presentModeNdx++) 143493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 143593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi de::MovePtr<tcu::TestCaseGroup> presentModeGroup (new tcu::TestCaseGroup(testGroup->getTestContext(), presentModes[presentModeNdx].name, presentModes[presentModeNdx].name)); 143693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 143793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi for (size_t ref = 0; ref < 2; ref++) 143893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi { 143993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const bool isReference = (ref == 0); 144093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi const char* const name = isReference ? "reference" : "incremental_present"; 144193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi TestConfig config; 144293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 144393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi config.wsiType = wsiType; 144493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi config.scaling = scaling[scalingNdx].scaling; 144593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi config.useIncrementalPresent = !isReference; 144693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi config.presentMode = presentModes[presentModeNdx].mode; 144793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 144893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi presentModeGroup->addChild(new vkt::InstanceFactory1<IncrementalPresentTestInstance, TestConfig, Programs>(testGroup->getTestContext(), tcu::NODETYPE_SELF_VALIDATE, name, name, Programs(), config)); 144993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi } 145093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 145193e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi scaleGroup->addChild(presentModeGroup.release()); 145293e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi } 145393e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 145493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi testGroup->addChild(scaleGroup.release()); 145593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi } 145693e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi } 145793e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi} 145893e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi 145993e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi} // wsi 146093e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi} // vkt 1461