166980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski/*------------------------------------------------------------------------
266980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski * Vulkan Conformance Tests
366980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski * ------------------------
466980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski *
566980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski * Copyright (c) 2016 The Khronos Group Inc.
666980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski *
766980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski * Licensed under the Apache License, Version 2.0 (the "License");
866980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski * you may not use this file except in compliance with the License.
966980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski * You may obtain a copy of the License at
1066980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski *
1166980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski *      http://www.apache.org/licenses/LICENSE-2.0
1266980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski *
1366980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski * Unless required by applicable law or agreed to in writing, software
1466980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski * distributed under the License is distributed on an "AS IS" BASIS,
1566980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1666980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski * See the License for the specific language governing permissions and
1766980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski * limitations under the License.
1866980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski *
1966980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski *//*!
2066980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski * \file
2166980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski * \brief Pipeline specialization constants test utilities
2266980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski *//*--------------------------------------------------------------------*/
2366980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski
2466980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski#include "vktPipelineSpecConstantUtil.hpp"
2566980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski#include "vkTypeUtil.hpp"
2666980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski#include <vector>
2766980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski
2866980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowskinamespace vkt
2966980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski{
3066980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowskinamespace pipeline
3166980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski{
3266980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowskiusing namespace vk;
3366980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski
3466980a8d7f3440111c785bc782bfd9411364269aMaciej JesionowskiGraphicsPipelineBuilder& GraphicsPipelineBuilder::setShader (const DeviceInterface&			vk,
3566980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski															 const VkDevice					device,
3666980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski															 const VkShaderStageFlagBits	stage,
3766980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski															 const ProgramBinary&			binary,
3866980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski															 const VkSpecializationInfo*	specInfo)
3966980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski{
4066980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski	VkShaderModule module;
4166980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski	switch (stage)
4266980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski	{
4366980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		case (VK_SHADER_STAGE_VERTEX_BIT):
4466980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski			DE_ASSERT(m_vertexShaderModule.get() == DE_NULL);
4566980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski			m_vertexShaderModule = createShaderModule(vk, device, binary, (VkShaderModuleCreateFlags)0);
4666980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski			module = *m_vertexShaderModule;
4766980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski			break;
4866980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski
4966980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		case (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT):
5066980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski			DE_ASSERT(m_tessControlShaderModule.get() == DE_NULL);
5166980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski			m_tessControlShaderModule = createShaderModule(vk, device, binary, (VkShaderModuleCreateFlags)0);
5266980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski			module = *m_tessControlShaderModule;
5366980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski			break;
5466980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski
5566980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		case (VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT):
5666980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski			DE_ASSERT(m_tessEvaluationShaderModule.get() == DE_NULL);
5766980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski			m_tessEvaluationShaderModule = createShaderModule(vk, device, binary, (VkShaderModuleCreateFlags)0);
5866980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski			module = *m_tessEvaluationShaderModule;
5966980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski			break;
6066980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski
6166980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		case (VK_SHADER_STAGE_GEOMETRY_BIT):
6266980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski			DE_ASSERT(m_geometryShaderModule.get() == DE_NULL);
6366980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski			m_geometryShaderModule = createShaderModule(vk, device, binary, (VkShaderModuleCreateFlags)0);
6466980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski			module = *m_geometryShaderModule;
6566980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski			break;
6666980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski
6766980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		case (VK_SHADER_STAGE_FRAGMENT_BIT):
6866980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski			DE_ASSERT(m_fragmentShaderModule.get() == DE_NULL);
6966980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski			m_fragmentShaderModule = createShaderModule(vk, device, binary, (VkShaderModuleCreateFlags)0);
7066980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski			module = *m_fragmentShaderModule;
7166980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski			break;
7266980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski
7366980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		default:
7466980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski			DE_FATAL("Invalid shader stage");
7566980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski			return *this;
7666980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski	}
7766980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski
7866980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski	const VkPipelineShaderStageCreateInfo pipelineShaderStageInfo =
7966980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski	{
8066980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,	// VkStructureType						sType;
8166980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		DE_NULL,												// const void*							pNext;
8266980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		(VkPipelineShaderStageCreateFlags)0,					// VkPipelineShaderStageCreateFlags		flags;
8366980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		stage,													// VkShaderStageFlagBits				stage;
8466980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		module,													// VkShaderModule						module;
8566980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		"main",													// const char*							pName;
8666980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		specInfo,												// const VkSpecializationInfo*			pSpecializationInfo;
8766980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski	};
8866980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski
8966980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski	m_shaderStageFlags |= stage;
9066980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski	m_shaderStages.push_back(pipelineShaderStageInfo);
9166980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski
9266980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski	return *this;
9366980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski}
9466980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski
9566980a8d7f3440111c785bc782bfd9411364269aMaciej JesionowskiMove<VkPipeline> GraphicsPipelineBuilder::build (const DeviceInterface&	vk,
9666980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski												 const VkDevice			device,
9766980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski												 const VkPipelineLayout	pipelineLayout,
9866980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski												 const VkRenderPass		renderPass)
9966980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski{
10066980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski	const VkVertexInputBindingDescription vertexInputBindingDescription =
10166980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski	{
10266980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		0u,								// uint32_t				binding;
10366980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		sizeof(tcu::Vec4),				// uint32_t				stride;		// Vertex is a 4-element vector XYZW, position only
10466980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		VK_VERTEX_INPUT_RATE_VERTEX,	// VkVertexInputRate	inputRate;
10566980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski	};
10666980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski
10766980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski	const VkVertexInputAttributeDescription vertexInputAttributeDescription =
10866980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski	{
10966980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		0u,									// uint32_t			location;
11066980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		0u,									// uint32_t			binding;
11166980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		VK_FORMAT_R32G32B32A32_SFLOAT,		// VkFormat			format;
11266980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		0u,									// uint32_t			offset;
11366980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski	};
11466980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski
11566980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski	const VkPipelineVertexInputStateCreateInfo vertexInputStateInfo =
11666980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski	{
11766980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO,	// VkStructureType                             sType;
11866980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		DE_NULL,													// const void*                                 pNext;
11966980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		(VkPipelineVertexInputStateCreateFlags)0,					// VkPipelineVertexInputStateCreateFlags       flags;
12066980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		1u,															// uint32_t                                    vertexBindingDescriptionCount;
12166980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		&vertexInputBindingDescription,								// const VkVertexInputBindingDescription*      pVertexBindingDescriptions;
12266980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		1u,															// uint32_t                                    vertexAttributeDescriptionCount;
12366980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		&vertexInputAttributeDescription,							// const VkVertexInputAttributeDescription*    pVertexAttributeDescriptions;
12466980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski	};
12566980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski
12666980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski	const VkPrimitiveTopology topology = (m_shaderStageFlags & VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT) ? VK_PRIMITIVE_TOPOLOGY_PATCH_LIST : VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
12766980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski	const VkPipelineInputAssemblyStateCreateInfo pipelineInputAssemblyStateInfo =
12866980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski	{
12966980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,	// VkStructureType                             sType;
13066980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		DE_NULL,														// const void*                                 pNext;
13166980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		(VkPipelineInputAssemblyStateCreateFlags)0,						// VkPipelineInputAssemblyStateCreateFlags     flags;
13266980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		topology,														// VkPrimitiveTopology                         topology;
13366980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		VK_FALSE,														// VkBool32                                    primitiveRestartEnable;
13466980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski	};
13566980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski
13666980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski	const VkPipelineTessellationStateCreateInfo pipelineTessellationStateInfo =
13766980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski	{
13866980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,		// VkStructureType                             sType;
13966980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		DE_NULL,														// const void*                                 pNext;
14066980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		(VkPipelineTessellationStateCreateFlags)0,						// VkPipelineTessellationStateCreateFlags      flags;
14166980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		3u,																// uint32_t                                    patchControlPoints;
14266980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski	};
14366980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski
14466980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski	const VkViewport viewport = makeViewport(
14566980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		0.0f, 0.0f,
14666980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		static_cast<float>(m_renderSize.x()), static_cast<float>(m_renderSize.y()),
14766980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		0.0f, 1.0f);
14866980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski
14966980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski	const VkRect2D scissor = {
15066980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		makeOffset2D(0, 0),
15166980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		makeExtent2D(m_renderSize.x(), m_renderSize.y()),
15266980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski	};
15366980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski
15466980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski	const VkPipelineViewportStateCreateInfo pipelineViewportStateInfo =
15566980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski	{
15666980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO,	// VkStructureType                             sType;
15766980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		DE_NULL,												// const void*                                 pNext;
15866980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		(VkPipelineViewportStateCreateFlags)0,					// VkPipelineViewportStateCreateFlags          flags;
15966980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		1u,														// uint32_t                                    viewportCount;
16066980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		&viewport,												// const VkViewport*                           pViewports;
16166980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		1u,														// uint32_t                                    scissorCount;
16266980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		&scissor,												// const VkRect2D*                             pScissors;
16366980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski	};
16466980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski
16566980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski	const VkPipelineRasterizationStateCreateInfo pipelineRasterizationStateInfo =
16666980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski	{
16766980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO,		// VkStructureType                          sType;
16866980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		DE_NULL,														// const void*                              pNext;
16966980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		(VkPipelineRasterizationStateCreateFlags)0,						// VkPipelineRasterizationStateCreateFlags  flags;
17066980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		VK_FALSE,														// VkBool32                                 depthClampEnable;
17166980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		VK_FALSE,														// VkBool32                                 rasterizerDiscardEnable;
17266980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		VK_POLYGON_MODE_FILL,											// VkPolygonMode							polygonMode;
17366980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		VK_CULL_MODE_NONE,												// VkCullModeFlags							cullMode;
17466980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		VK_FRONT_FACE_COUNTER_CLOCKWISE,								// VkFrontFace								frontFace;
17566980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		VK_FALSE,														// VkBool32									depthBiasEnable;
17666980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		0.0f,															// float									depthBiasConstantFactor;
17766980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		0.0f,															// float									depthBiasClamp;
17866980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		0.0f,															// float									depthBiasSlopeFactor;
17966980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		1.0f,															// float									lineWidth;
18066980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski	};
18166980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski
18266980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski	const VkPipelineMultisampleStateCreateInfo pipelineMultisampleStateInfo =
18366980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski	{
18466980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO,	// VkStructureType							sType;
18566980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		DE_NULL,													// const void*								pNext;
18666980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		(VkPipelineMultisampleStateCreateFlags)0,					// VkPipelineMultisampleStateCreateFlags	flags;
18766980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		VK_SAMPLE_COUNT_1_BIT,										// VkSampleCountFlagBits					rasterizationSamples;
18866980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		VK_FALSE,													// VkBool32									sampleShadingEnable;
18966980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		0.0f,														// float									minSampleShading;
19066980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		DE_NULL,													// const VkSampleMask*						pSampleMask;
19166980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		VK_FALSE,													// VkBool32									alphaToCoverageEnable;
19266980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		VK_FALSE													// VkBool32									alphaToOneEnable;
19366980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski	};
19466980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski
19566980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski	const VkStencilOpState stencilOpStateBasic = makeStencilOpState(
19666980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		VK_STENCIL_OP_KEEP,		// stencil fail
19766980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		VK_STENCIL_OP_KEEP,		// depth & stencil pass
19866980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		VK_STENCIL_OP_KEEP,		// depth only fail
19966980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		VK_COMPARE_OP_NEVER,	// compare op
20066980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		0u,						// compare mask
20166980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		0u,						// write mask
20266980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		0u);					// reference
20366980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski
20466980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski	VkPipelineDepthStencilStateCreateInfo pipelineDepthStencilStateInfo =
20566980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski	{
20666980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO,	// VkStructureType							sType;
20766980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		DE_NULL,													// const void*								pNext;
20866980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		(VkPipelineDepthStencilStateCreateFlags)0,					// VkPipelineDepthStencilStateCreateFlags	flags;
20966980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		VK_FALSE,													// VkBool32									depthTestEnable;
21066980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		VK_FALSE,													// VkBool32									depthWriteEnable;
21166980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		VK_COMPARE_OP_LESS,											// VkCompareOp								depthCompareOp;
21266980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		VK_FALSE,													// VkBool32									depthBoundsTestEnable;
21366980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		VK_FALSE,													// VkBool32									stencilTestEnable;
21466980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		stencilOpStateBasic,										// VkStencilOpState							front;
21566980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		stencilOpStateBasic,										// VkStencilOpState							back;
21666980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		0.0f,														// float									minDepthBounds;
21766980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		1.0f,														// float									maxDepthBounds;
21866980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski	};
21966980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski
22066980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski	const VkColorComponentFlags colorComponentsAll = VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT;
22166980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski	const VkPipelineColorBlendAttachmentState pipelineColorBlendAttachmentState =
22266980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski	{
22366980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		VK_FALSE,							// VkBool32					blendEnable;
22466980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		VK_BLEND_FACTOR_ONE,				// VkBlendFactor			srcColorBlendFactor;
22566980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		VK_BLEND_FACTOR_ZERO,				// VkBlendFactor			dstColorBlendFactor;
22666980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		VK_BLEND_OP_ADD,					// VkBlendOp				colorBlendOp;
22766980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		VK_BLEND_FACTOR_ONE,				// VkBlendFactor			srcAlphaBlendFactor;
22866980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		VK_BLEND_FACTOR_ZERO,				// VkBlendFactor			dstAlphaBlendFactor;
22966980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		VK_BLEND_OP_ADD,					// VkBlendOp				alphaBlendOp;
23066980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		colorComponentsAll,					// VkColorComponentFlags	colorWriteMask;
23166980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski	};
23266980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski
23366980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski	const VkPipelineColorBlendStateCreateInfo pipelineColorBlendStateInfo =
23466980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski	{
23566980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO,	// VkStructureType								sType;
23666980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		DE_NULL,													// const void*									pNext;
23766980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		(VkPipelineColorBlendStateCreateFlags)0,					// VkPipelineColorBlendStateCreateFlags			flags;
23866980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		VK_FALSE,													// VkBool32										logicOpEnable;
23966980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		VK_LOGIC_OP_COPY,											// VkLogicOp									logicOp;
24066980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		1u,															// deUint32										attachmentCount;
24166980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		&pipelineColorBlendAttachmentState,							// const VkPipelineColorBlendAttachmentState*	pAttachments;
24266980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		{ 0.0f, 0.0f, 0.0f, 0.0f },									// float										blendConstants[4];
24366980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski	};
24466980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski
24566980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski	const VkGraphicsPipelineCreateInfo graphicsPipelineInfo =
24666980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski	{
24766980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,	// VkStructureType									sType;
24866980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		DE_NULL,											// const void*										pNext;
24966980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		(VkPipelineCreateFlags)0,							// VkPipelineCreateFlags							flags;
25066980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		static_cast<deUint32>(m_shaderStages.size()),		// deUint32											stageCount;
25166980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		&m_shaderStages[0],									// const VkPipelineShaderStageCreateInfo*			pStages;
25266980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		&vertexInputStateInfo,								// const VkPipelineVertexInputStateCreateInfo*		pVertexInputState;
25366980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		&pipelineInputAssemblyStateInfo,					// const VkPipelineInputAssemblyStateCreateInfo*	pInputAssemblyState;
25466980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		(m_shaderStageFlags & VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT ? &pipelineTessellationStateInfo : DE_NULL), // const VkPipelineTessellationStateCreateInfo*		pTessellationState;
25566980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		&pipelineViewportStateInfo,							// const VkPipelineViewportStateCreateInfo*			pViewportState;
25666980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		&pipelineRasterizationStateInfo,					// const VkPipelineRasterizationStateCreateInfo*	pRasterizationState;
25766980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		&pipelineMultisampleStateInfo,						// const VkPipelineMultisampleStateCreateInfo*		pMultisampleState;
25866980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		&pipelineDepthStencilStateInfo,						// const VkPipelineDepthStencilStateCreateInfo*		pDepthStencilState;
25966980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		&pipelineColorBlendStateInfo,						// const VkPipelineColorBlendStateCreateInfo*		pColorBlendState;
26066980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		DE_NULL,											// const VkPipelineDynamicStateCreateInfo*			pDynamicState;
26166980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		pipelineLayout,										// VkPipelineLayout									layout;
26266980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		renderPass,											// VkRenderPass										renderPass;
26366980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		0u,													// deUint32											subpass;
26466980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		DE_NULL,											// VkPipeline										basePipelineHandle;
26566980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		0,													// deInt32											basePipelineIndex;
26666980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski	};
26766980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski
26866980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski	return createGraphicsPipeline(vk, device, DE_NULL, &graphicsPipelineInfo);
26966980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski}
27066980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski
271acac4e187ea3f08812cd101eba2abd760c602615Maciej JesionowskiMove<VkRenderPass> makeRenderPass (const DeviceInterface&	vk,
272acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski								   const VkDevice			device,
273acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski								   const VkFormat			colorFormat)
274acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski{
275acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski	const VkAttachmentDescription colorAttachmentDescription =
276acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski	{
277acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski		(VkAttachmentDescriptionFlags)0,					// VkAttachmentDescriptionFlags		flags;
278acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski		colorFormat,										// VkFormat							format;
279acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski		VK_SAMPLE_COUNT_1_BIT,								// VkSampleCountFlagBits			samples;
280acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski		VK_ATTACHMENT_LOAD_OP_CLEAR,						// VkAttachmentLoadOp				loadOp;
281acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski		VK_ATTACHMENT_STORE_OP_STORE,						// VkAttachmentStoreOp				storeOp;
282acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski		VK_ATTACHMENT_LOAD_OP_DONT_CARE,					// VkAttachmentLoadOp				stencilLoadOp;
283acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski		VK_ATTACHMENT_STORE_OP_DONT_CARE,					// VkAttachmentStoreOp				stencilStoreOp;
284acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski		VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,			// VkImageLayout					initialLayout;
285acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski		VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL			// VkImageLayout					finalLayout;
286acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski	};
287acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski
288acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski	const VkAttachmentReference colorAttachmentReference =
289acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski	{
290acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski		0u,													// deUint32			attachment;
291acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski		VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL			// VkImageLayout	layout;
292acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski	};
293acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski
294acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski	const VkAttachmentReference depthAttachmentReference =
295acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski	{
296acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski		VK_ATTACHMENT_UNUSED,								// deUint32			attachment;
297acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski		VK_IMAGE_LAYOUT_UNDEFINED							// VkImageLayout	layout;
298acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski	};
299acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski
300acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski	const VkSubpassDescription subpassDescription =
301acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski	{
302acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski		(VkSubpassDescriptionFlags)0,						// VkSubpassDescriptionFlags		flags;
303acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski		VK_PIPELINE_BIND_POINT_GRAPHICS,					// VkPipelineBindPoint				pipelineBindPoint;
304acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski		0u,													// deUint32							inputAttachmentCount;
305acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski		DE_NULL,											// const VkAttachmentReference*		pInputAttachments;
306acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski		1u,													// deUint32							colorAttachmentCount;
307acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski		&colorAttachmentReference,							// const VkAttachmentReference*		pColorAttachments;
308acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski		DE_NULL,											// const VkAttachmentReference*		pResolveAttachments;
309acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski		&depthAttachmentReference,							// const VkAttachmentReference*		pDepthStencilAttachment;
310acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski		0u,													// deUint32							preserveAttachmentCount;
311acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski		DE_NULL												// const deUint32*					pPreserveAttachments;
312acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski	};
313acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski
314acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski	const VkRenderPassCreateInfo renderPassInfo =
315acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski	{
316acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski		VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,			// VkStructureType					sType;
317acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski		DE_NULL,											// const void*						pNext;
318acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski		(VkRenderPassCreateFlags)0,							// VkRenderPassCreateFlags			flags;
319acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski		1u,													// deUint32							attachmentCount;
320acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski		&colorAttachmentDescription,						// const VkAttachmentDescription*	pAttachments;
321acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski		1u,													// deUint32							subpassCount;
322acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski		&subpassDescription,								// const VkSubpassDescription*		pSubpasses;
323acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski		0u,													// deUint32							dependencyCount;
324acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski		DE_NULL												// const VkSubpassDependency*		pDependencies;
325acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski	};
326acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski
327acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski	return createRenderPass(vk, device, &renderPassInfo);
328acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski}
329acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski
330acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowskivoid beginRenderPass (const DeviceInterface&	vk,
331acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski					  const VkCommandBuffer		commandBuffer,
332acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski					  const VkRenderPass		renderPass,
333acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski					  const VkFramebuffer		framebuffer,
334acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski					  const VkRect2D&			renderArea,
335acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski					  const tcu::Vec4&			clearColor)
336acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski{
337acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski	const VkClearValue clearValue = makeClearValueColor(clearColor);
338acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski
339acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski	const VkRenderPassBeginInfo renderPassBeginInfo = {
340acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski		VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,		// VkStructureType         sType;
341acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski		DE_NULL,										// const void*             pNext;
342acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski		renderPass,										// VkRenderPass            renderPass;
343acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski		framebuffer,									// VkFramebuffer           framebuffer;
344acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski		renderArea,										// VkRect2D                renderArea;
345acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski		1u,												// uint32_t                clearValueCount;
346acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski		&clearValue,									// const VkClearValue*     pClearValues;
347acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski	};
348acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski
349acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski	vk.cmdBeginRenderPass(commandBuffer, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
350acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski}
351acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski
352acac4e187ea3f08812cd101eba2abd760c602615Maciej JesionowskiVkImageCreateInfo makeImageCreateInfo (const tcu::IVec2& size, const VkFormat format, const VkImageUsageFlags usage)
353acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski{
354acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski	const VkImageCreateInfo imageInfo =
355acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski	{
356acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski		VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,		// VkStructureType          sType;
357acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski		DE_NULL,									// const void*              pNext;
358acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski		(VkImageCreateFlags)0,						// VkImageCreateFlags       flags;
359acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski		VK_IMAGE_TYPE_2D,							// VkImageType              imageType;
360acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski		format,										// VkFormat                 format;
361acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski		makeExtent3D(size.x(), size.y(), 1),		// VkExtent3D               extent;
362acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski		1u,											// uint32_t                 mipLevels;
363acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski		1u,											// uint32_t                 arrayLayers;
364acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski		VK_SAMPLE_COUNT_1_BIT,						// VkSampleCountFlagBits    samples;
365acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski		VK_IMAGE_TILING_OPTIMAL,					// VkImageTiling            tiling;
366acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski		usage,										// VkImageUsageFlags        usage;
367acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski		VK_SHARING_MODE_EXCLUSIVE,					// VkSharingMode            sharingMode;
368acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski		0u,											// uint32_t                 queueFamilyIndexCount;
369acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski		DE_NULL,									// const uint32_t*          pQueueFamilyIndices;
370acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski		VK_IMAGE_LAYOUT_UNDEFINED,					// VkImageLayout            initialLayout;
371acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski	};
372acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski	return imageInfo;
373acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski}
374acac4e187ea3f08812cd101eba2abd760c602615Maciej Jesionowski
37566980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowskivoid requireFeatures (const InstanceInterface& vki, const VkPhysicalDevice physDevice, const FeatureFlags flags)
37666980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski{
37766980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski	const VkPhysicalDeviceFeatures features = getPhysicalDeviceFeatures(vki, physDevice);
37866980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski
37966980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski	if (((flags & FEATURE_TESSELLATION_SHADER) != 0) && !features.tessellationShader)
38066980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		throw tcu::NotSupportedError("Tessellation shader not supported");
38166980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski
38266980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski	if (((flags & FEATURE_GEOMETRY_SHADER) != 0) && !features.geometryShader)
38366980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		throw tcu::NotSupportedError("Geometry shader not supported");
38466980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski
38566980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski	if (((flags & FEATURE_SHADER_FLOAT_64) != 0) && !features.shaderFloat64)
38666980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		throw tcu::NotSupportedError("Double-precision floats not supported");
38766980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski
38866980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski	if (((flags & FEATURE_VERTEX_PIPELINE_STORES_AND_ATOMICS) != 0) && !features.vertexPipelineStoresAndAtomics)
38966980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		throw tcu::NotSupportedError("SSBO and image writes not supported in vertex pipeline");
39066980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski
39166980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski	if (((flags & FEATURE_FRAGMENT_STORES_AND_ATOMICS) != 0) && !features.fragmentStoresAndAtomics)
39266980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski		throw tcu::NotSupportedError("SSBO and image writes not supported in fragment shader");
39366980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski}
39466980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski
39566980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski} // pipeline
39666980a8d7f3440111c785bc782bfd9411364269aMaciej Jesionowski} // vkt
397