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			&currentAcquireSemaphore,
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			&currentRenderSemaphore
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			&region
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			&regionInfo,
124493e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi			1u,
124593e2af037c07511c2ac415ec3e55452d9cfc341dMika Isojärvi			&currentRenderSemaphore,
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			&currentRenderSemaphore,
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