183a6066224454de177655eb414dd3453c2059536Dae Kim/*------------------------------------------------------------------------
283a6066224454de177655eb414dd3453c2059536Dae Kim * Vulkan Conformance Tests
383a6066224454de177655eb414dd3453c2059536Dae Kim * ------------------------
483a6066224454de177655eb414dd3453c2059536Dae Kim *
583a6066224454de177655eb414dd3453c2059536Dae Kim * Copyright (c) 2015 The Khronos Group Inc.
683a6066224454de177655eb414dd3453c2059536Dae Kim * Copyright (c) 2015 Imagination Technologies Ltd.
783a6066224454de177655eb414dd3453c2059536Dae Kim *
8978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * Licensed under the Apache License, Version 2.0 (the "License");
9978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * you may not use this file except in compliance with the License.
10978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * You may obtain a copy of the License at
1183a6066224454de177655eb414dd3453c2059536Dae Kim *
12978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos *      http://www.apache.org/licenses/LICENSE-2.0
1383a6066224454de177655eb414dd3453c2059536Dae Kim *
14978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * Unless required by applicable law or agreed to in writing, software
15978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * distributed under the License is distributed on an "AS IS" BASIS,
16978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * See the License for the specific language governing permissions and
18978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * limitations under the License.
1983a6066224454de177655eb414dd3453c2059536Dae Kim *
2083a6066224454de177655eb414dd3453c2059536Dae Kim *//*!
2183a6066224454de177655eb414dd3453c2059536Dae Kim * \file
2283a6066224454de177655eb414dd3453c2059536Dae Kim * \brief Image sampling case
2383a6066224454de177655eb414dd3453c2059536Dae Kim *//*--------------------------------------------------------------------*/
2483a6066224454de177655eb414dd3453c2059536Dae Kim
2583a6066224454de177655eb414dd3453c2059536Dae Kim#include "vktPipelineImageSamplingInstance.hpp"
2683a6066224454de177655eb414dd3453c2059536Dae Kim#include "vktPipelineClearUtil.hpp"
2783a6066224454de177655eb414dd3453c2059536Dae Kim#include "vktPipelineReferenceRenderer.hpp"
2883a6066224454de177655eb414dd3453c2059536Dae Kim#include "vkBuilderUtil.hpp"
2983a6066224454de177655eb414dd3453c2059536Dae Kim#include "vkImageUtil.hpp"
3083a6066224454de177655eb414dd3453c2059536Dae Kim#include "vkPrograms.hpp"
3183a6066224454de177655eb414dd3453c2059536Dae Kim#include "vkQueryUtil.hpp"
3283a6066224454de177655eb414dd3453c2059536Dae Kim#include "vkRefUtil.hpp"
33387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos#include "tcuTexLookupVerifier.hpp"
34387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos#include "tcuTextureUtil.hpp"
35b5c2f56daa415384202d097073cd8cb5dfcf2408Pyry Haulos#include "tcuTestLog.hpp"
36ed8561a07cdb1bb7730eccf9025b738838392464Pyry Haulos#include "deSTLUtil.hpp"
3783a6066224454de177655eb414dd3453c2059536Dae Kim
3883a6066224454de177655eb414dd3453c2059536Dae Kimnamespace vkt
3983a6066224454de177655eb414dd3453c2059536Dae Kim{
4083a6066224454de177655eb414dd3453c2059536Dae Kimnamespace pipeline
4183a6066224454de177655eb414dd3453c2059536Dae Kim{
4283a6066224454de177655eb414dd3453c2059536Dae Kim
4383a6066224454de177655eb414dd3453c2059536Dae Kimusing namespace vk;
4483a6066224454de177655eb414dd3453c2059536Dae Kimusing de::MovePtr;
45387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulosusing de::UniquePtr;
4683a6066224454de177655eb414dd3453c2059536Dae Kim
4783a6066224454de177655eb414dd3453c2059536Dae Kimnamespace
4883a6066224454de177655eb414dd3453c2059536Dae Kim{
4912b099d59111b60518c581364fd026b6cfadf7d1Boris Zaninde::MovePtr<Allocation> allocateBuffer (const InstanceInterface&	vki,
5012b099d59111b60518c581364fd026b6cfadf7d1Boris Zanin										const DeviceInterface&		vkd,
5112b099d59111b60518c581364fd026b6cfadf7d1Boris Zanin										const VkPhysicalDevice&		physDevice,
5212b099d59111b60518c581364fd026b6cfadf7d1Boris Zanin										const VkDevice				device,
5312b099d59111b60518c581364fd026b6cfadf7d1Boris Zanin										const VkBuffer&				buffer,
5412b099d59111b60518c581364fd026b6cfadf7d1Boris Zanin										const MemoryRequirement		requirement,
5512b099d59111b60518c581364fd026b6cfadf7d1Boris Zanin										Allocator&					allocator,
5612b099d59111b60518c581364fd026b6cfadf7d1Boris Zanin										AllocationKind				allocationKind)
5712b099d59111b60518c581364fd026b6cfadf7d1Boris Zanin{
5812b099d59111b60518c581364fd026b6cfadf7d1Boris Zanin	switch (allocationKind)
5912b099d59111b60518c581364fd026b6cfadf7d1Boris Zanin	{
6012b099d59111b60518c581364fd026b6cfadf7d1Boris Zanin		case ALLOCATION_KIND_SUBALLOCATED:
6112b099d59111b60518c581364fd026b6cfadf7d1Boris Zanin		{
6212b099d59111b60518c581364fd026b6cfadf7d1Boris Zanin			const VkMemoryRequirements	memoryRequirements	= getBufferMemoryRequirements(vkd, device, buffer);
6312b099d59111b60518c581364fd026b6cfadf7d1Boris Zanin
6412b099d59111b60518c581364fd026b6cfadf7d1Boris Zanin			return allocator.allocate(memoryRequirements, requirement);
6512b099d59111b60518c581364fd026b6cfadf7d1Boris Zanin		}
6612b099d59111b60518c581364fd026b6cfadf7d1Boris Zanin
6712b099d59111b60518c581364fd026b6cfadf7d1Boris Zanin		case ALLOCATION_KIND_DEDICATED:
6812b099d59111b60518c581364fd026b6cfadf7d1Boris Zanin		{
6912b099d59111b60518c581364fd026b6cfadf7d1Boris Zanin			return allocateDedicated(vki, vkd, physDevice, device, buffer, requirement);
7012b099d59111b60518c581364fd026b6cfadf7d1Boris Zanin		}
7112b099d59111b60518c581364fd026b6cfadf7d1Boris Zanin
7212b099d59111b60518c581364fd026b6cfadf7d1Boris Zanin		default:
7312b099d59111b60518c581364fd026b6cfadf7d1Boris Zanin		{
7412b099d59111b60518c581364fd026b6cfadf7d1Boris Zanin			TCU_THROW(InternalError, "Invalid allocation kind");
7512b099d59111b60518c581364fd026b6cfadf7d1Boris Zanin		}
7612b099d59111b60518c581364fd026b6cfadf7d1Boris Zanin	}
7712b099d59111b60518c581364fd026b6cfadf7d1Boris Zanin}
7812b099d59111b60518c581364fd026b6cfadf7d1Boris Zanin
7912b099d59111b60518c581364fd026b6cfadf7d1Boris Zaninde::MovePtr<Allocation> allocateImage (const InstanceInterface&		vki,
8012b099d59111b60518c581364fd026b6cfadf7d1Boris Zanin									   const DeviceInterface&		vkd,
8112b099d59111b60518c581364fd026b6cfadf7d1Boris Zanin									   const VkPhysicalDevice&		physDevice,
8212b099d59111b60518c581364fd026b6cfadf7d1Boris Zanin									   const VkDevice				device,
8312b099d59111b60518c581364fd026b6cfadf7d1Boris Zanin									   const VkImage&				image,
8412b099d59111b60518c581364fd026b6cfadf7d1Boris Zanin									   const MemoryRequirement		requirement,
8512b099d59111b60518c581364fd026b6cfadf7d1Boris Zanin									   Allocator&					allocator,
8612b099d59111b60518c581364fd026b6cfadf7d1Boris Zanin									   AllocationKind				allocationKind)
8712b099d59111b60518c581364fd026b6cfadf7d1Boris Zanin{
8812b099d59111b60518c581364fd026b6cfadf7d1Boris Zanin	switch (allocationKind)
8912b099d59111b60518c581364fd026b6cfadf7d1Boris Zanin	{
9012b099d59111b60518c581364fd026b6cfadf7d1Boris Zanin		case ALLOCATION_KIND_SUBALLOCATED:
9112b099d59111b60518c581364fd026b6cfadf7d1Boris Zanin		{
9212b099d59111b60518c581364fd026b6cfadf7d1Boris Zanin			const VkMemoryRequirements	memoryRequirements	= getImageMemoryRequirements(vkd, device, image);
9312b099d59111b60518c581364fd026b6cfadf7d1Boris Zanin
9412b099d59111b60518c581364fd026b6cfadf7d1Boris Zanin			return allocator.allocate(memoryRequirements, requirement);
9512b099d59111b60518c581364fd026b6cfadf7d1Boris Zanin		}
9612b099d59111b60518c581364fd026b6cfadf7d1Boris Zanin
9712b099d59111b60518c581364fd026b6cfadf7d1Boris Zanin		case ALLOCATION_KIND_DEDICATED:
9812b099d59111b60518c581364fd026b6cfadf7d1Boris Zanin		{
9912b099d59111b60518c581364fd026b6cfadf7d1Boris Zanin			return allocateDedicated(vki, vkd, physDevice, device, image, requirement);
10012b099d59111b60518c581364fd026b6cfadf7d1Boris Zanin		}
10112b099d59111b60518c581364fd026b6cfadf7d1Boris Zanin
10212b099d59111b60518c581364fd026b6cfadf7d1Boris Zanin		default:
10312b099d59111b60518c581364fd026b6cfadf7d1Boris Zanin		{
10412b099d59111b60518c581364fd026b6cfadf7d1Boris Zanin			TCU_THROW(InternalError, "Invalid allocation kind");
10512b099d59111b60518c581364fd026b6cfadf7d1Boris Zanin		}
10612b099d59111b60518c581364fd026b6cfadf7d1Boris Zanin	}
10712b099d59111b60518c581364fd026b6cfadf7d1Boris Zanin}
10883a6066224454de177655eb414dd3453c2059536Dae Kim
10983a6066224454de177655eb414dd3453c2059536Dae Kimstatic VkImageType getCompatibleImageType (VkImageViewType viewType)
11083a6066224454de177655eb414dd3453c2059536Dae Kim{
11183a6066224454de177655eb414dd3453c2059536Dae Kim	switch (viewType)
11283a6066224454de177655eb414dd3453c2059536Dae Kim	{
11383a6066224454de177655eb414dd3453c2059536Dae Kim		case VK_IMAGE_VIEW_TYPE_1D:				return VK_IMAGE_TYPE_1D;
11483a6066224454de177655eb414dd3453c2059536Dae Kim		case VK_IMAGE_VIEW_TYPE_1D_ARRAY:		return VK_IMAGE_TYPE_1D;
11583a6066224454de177655eb414dd3453c2059536Dae Kim		case VK_IMAGE_VIEW_TYPE_2D:				return VK_IMAGE_TYPE_2D;
11683a6066224454de177655eb414dd3453c2059536Dae Kim		case VK_IMAGE_VIEW_TYPE_2D_ARRAY:		return VK_IMAGE_TYPE_2D;
11783a6066224454de177655eb414dd3453c2059536Dae Kim		case VK_IMAGE_VIEW_TYPE_3D:				return VK_IMAGE_TYPE_3D;
11883a6066224454de177655eb414dd3453c2059536Dae Kim		case VK_IMAGE_VIEW_TYPE_CUBE:			return VK_IMAGE_TYPE_2D;
11983a6066224454de177655eb414dd3453c2059536Dae Kim		case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY:		return VK_IMAGE_TYPE_2D;
12083a6066224454de177655eb414dd3453c2059536Dae Kim		default:
12183a6066224454de177655eb414dd3453c2059536Dae Kim			break;
12283a6066224454de177655eb414dd3453c2059536Dae Kim	}
12383a6066224454de177655eb414dd3453c2059536Dae Kim
12483a6066224454de177655eb414dd3453c2059536Dae Kim	DE_ASSERT(false);
12583a6066224454de177655eb414dd3453c2059536Dae Kim	return VK_IMAGE_TYPE_1D;
12683a6066224454de177655eb414dd3453c2059536Dae Kim}
12783a6066224454de177655eb414dd3453c2059536Dae Kim
12883a6066224454de177655eb414dd3453c2059536Dae Kimtemplate<typename TcuFormatType>
129120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kimstatic MovePtr<TestTexture> createTestTexture (const TcuFormatType format, VkImageViewType viewType, const tcu::IVec3& size, int layerCount)
13083a6066224454de177655eb414dd3453c2059536Dae Kim{
13183a6066224454de177655eb414dd3453c2059536Dae Kim	MovePtr<TestTexture>	texture;
13283a6066224454de177655eb414dd3453c2059536Dae Kim	const VkImageType		imageType = getCompatibleImageType(viewType);
13383a6066224454de177655eb414dd3453c2059536Dae Kim
13483a6066224454de177655eb414dd3453c2059536Dae Kim	switch (imageType)
13583a6066224454de177655eb414dd3453c2059536Dae Kim	{
13683a6066224454de177655eb414dd3453c2059536Dae Kim		case VK_IMAGE_TYPE_1D:
137120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			if (layerCount == 1)
13883a6066224454de177655eb414dd3453c2059536Dae Kim				texture = MovePtr<TestTexture>(new TestTexture1D(format, size.x()));
13983a6066224454de177655eb414dd3453c2059536Dae Kim			else
140120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				texture = MovePtr<TestTexture>(new TestTexture1DArray(format, size.x(), layerCount));
14183a6066224454de177655eb414dd3453c2059536Dae Kim
14283a6066224454de177655eb414dd3453c2059536Dae Kim			break;
14383a6066224454de177655eb414dd3453c2059536Dae Kim
14483a6066224454de177655eb414dd3453c2059536Dae Kim		case VK_IMAGE_TYPE_2D:
145120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			if (layerCount == 1)
14683a6066224454de177655eb414dd3453c2059536Dae Kim			{
14783a6066224454de177655eb414dd3453c2059536Dae Kim				texture = MovePtr<TestTexture>(new TestTexture2D(format, size.x(), size.y()));
14883a6066224454de177655eb414dd3453c2059536Dae Kim			}
14983a6066224454de177655eb414dd3453c2059536Dae Kim			else
15083a6066224454de177655eb414dd3453c2059536Dae Kim			{
15183a6066224454de177655eb414dd3453c2059536Dae Kim				if (viewType == VK_IMAGE_VIEW_TYPE_CUBE || viewType == VK_IMAGE_VIEW_TYPE_CUBE_ARRAY)
15283a6066224454de177655eb414dd3453c2059536Dae Kim				{
153387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos					if (layerCount == tcu::CUBEFACE_LAST && viewType == VK_IMAGE_VIEW_TYPE_CUBE)
15483a6066224454de177655eb414dd3453c2059536Dae Kim					{
15583a6066224454de177655eb414dd3453c2059536Dae Kim						texture = MovePtr<TestTexture>(new TestTextureCube(format, size.x()));
15683a6066224454de177655eb414dd3453c2059536Dae Kim					}
15783a6066224454de177655eb414dd3453c2059536Dae Kim					else
15883a6066224454de177655eb414dd3453c2059536Dae Kim					{
159120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim						DE_ASSERT(layerCount % tcu::CUBEFACE_LAST == 0);
16083a6066224454de177655eb414dd3453c2059536Dae Kim
161120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim						texture = MovePtr<TestTexture>(new TestTextureCubeArray(format, size.x(), layerCount));
16283a6066224454de177655eb414dd3453c2059536Dae Kim					}
16383a6066224454de177655eb414dd3453c2059536Dae Kim				}
16483a6066224454de177655eb414dd3453c2059536Dae Kim				else
16583a6066224454de177655eb414dd3453c2059536Dae Kim				{
166120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim					texture = MovePtr<TestTexture>(new TestTexture2DArray(format, size.x(), size.y(), layerCount));
16783a6066224454de177655eb414dd3453c2059536Dae Kim				}
16883a6066224454de177655eb414dd3453c2059536Dae Kim			}
16983a6066224454de177655eb414dd3453c2059536Dae Kim
17083a6066224454de177655eb414dd3453c2059536Dae Kim			break;
17183a6066224454de177655eb414dd3453c2059536Dae Kim
17283a6066224454de177655eb414dd3453c2059536Dae Kim		case VK_IMAGE_TYPE_3D:
17383a6066224454de177655eb414dd3453c2059536Dae Kim			texture = MovePtr<TestTexture>(new TestTexture3D(format, size.x(), size.y(), size.z()));
17483a6066224454de177655eb414dd3453c2059536Dae Kim			break;
17583a6066224454de177655eb414dd3453c2059536Dae Kim
17683a6066224454de177655eb414dd3453c2059536Dae Kim		default:
17783a6066224454de177655eb414dd3453c2059536Dae Kim			DE_ASSERT(false);
17883a6066224454de177655eb414dd3453c2059536Dae Kim	}
17983a6066224454de177655eb414dd3453c2059536Dae Kim
18083a6066224454de177655eb414dd3453c2059536Dae Kim	return texture;
18183a6066224454de177655eb414dd3453c2059536Dae Kim}
18283a6066224454de177655eb414dd3453c2059536Dae Kim
18383a6066224454de177655eb414dd3453c2059536Dae Kim} // anonymous
18483a6066224454de177655eb414dd3453c2059536Dae Kim
18583a6066224454de177655eb414dd3453c2059536Dae KimImageSamplingInstance::ImageSamplingInstance (Context&							context,
186689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos											  const tcu::UVec2&					renderSize,
18783a6066224454de177655eb414dd3453c2059536Dae Kim											  VkImageViewType					imageViewType,
18883a6066224454de177655eb414dd3453c2059536Dae Kim											  VkFormat							imageFormat,
18983a6066224454de177655eb414dd3453c2059536Dae Kim											  const tcu::IVec3&					imageSize,
190120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim											  int								layerCount,
191120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim											  const VkComponentMapping&			componentMapping,
19283a6066224454de177655eb414dd3453c2059536Dae Kim											  const VkImageSubresourceRange&	subresourceRange,
19383a6066224454de177655eb414dd3453c2059536Dae Kim											  const VkSamplerCreateInfo&		samplerParams,
19483a6066224454de177655eb414dd3453c2059536Dae Kim											  float								samplerLod,
195235561df842620267f9a58552f1506ae1012133fDominik Witczak											  const std::vector<Vertex4Tex4>&	vertices,
196235561df842620267f9a58552f1506ae1012133fDominik Witczak											  VkDescriptorType					samplingType,
19712b099d59111b60518c581364fd026b6cfadf7d1Boris Zanin											  int								imageCount,
19812b099d59111b60518c581364fd026b6cfadf7d1Boris Zanin											  AllocationKind					allocationKind)
19983a6066224454de177655eb414dd3453c2059536Dae Kim	: vkt::TestInstance		(context)
20012b099d59111b60518c581364fd026b6cfadf7d1Boris Zanin	, m_allocationKind		(allocationKind)
201235561df842620267f9a58552f1506ae1012133fDominik Witczak	, m_samplingType		(samplingType)
20283a6066224454de177655eb414dd3453c2059536Dae Kim	, m_imageViewType		(imageViewType)
20359b191bc5c165338ac771b536cb804e7a9d3230czeppelin	, m_imageFormat			(imageFormat)
20483a6066224454de177655eb414dd3453c2059536Dae Kim	, m_imageSize			(imageSize)
205120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	, m_layerCount			(layerCount)
206235561df842620267f9a58552f1506ae1012133fDominik Witczak	, m_imageCount			(imageCount)
207120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	, m_componentMapping	(componentMapping)
20883a6066224454de177655eb414dd3453c2059536Dae Kim	, m_subresourceRange	(subresourceRange)
20983a6066224454de177655eb414dd3453c2059536Dae Kim	, m_samplerParams		(samplerParams)
21083a6066224454de177655eb414dd3453c2059536Dae Kim	, m_samplerLod			(samplerLod)
21183a6066224454de177655eb414dd3453c2059536Dae Kim	, m_renderSize			(renderSize)
21283a6066224454de177655eb414dd3453c2059536Dae Kim	, m_colorFormat			(VK_FORMAT_R8G8B8A8_UNORM)
21383a6066224454de177655eb414dd3453c2059536Dae Kim	, m_vertices			(vertices)
21483a6066224454de177655eb414dd3453c2059536Dae Kim{
21512b099d59111b60518c581364fd026b6cfadf7d1Boris Zanin	const InstanceInterface&	vki						= context.getInstanceInterface();
216120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	const DeviceInterface&		vk						= context.getDeviceInterface();
21712b099d59111b60518c581364fd026b6cfadf7d1Boris Zanin	const VkPhysicalDevice		physDevice				= context.getPhysicalDevice();
218120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	const VkDevice				vkDevice				= context.getDevice();
219120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	const VkQueue				queue					= context.getUniversalQueue();
220120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	const deUint32				queueFamilyIndex		= context.getUniversalQueueFamilyIndex();
221120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	SimpleAllocator				memAlloc				(vk, vkDevice, getPhysicalDeviceMemoryProperties(context.getInstanceInterface(), context.getPhysicalDevice()));
222120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	const VkComponentMapping	componentMappingRGBA	= { VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A };
22383a6066224454de177655eb414dd3453c2059536Dae Kim
22483a6066224454de177655eb414dd3453c2059536Dae Kim	if (!isSupportedSamplableFormat(context.getInstanceInterface(), context.getPhysicalDevice(), imageFormat))
22583a6066224454de177655eb414dd3453c2059536Dae Kim		throw tcu::NotSupportedError(std::string("Unsupported format for sampling: ") + getFormatName(imageFormat));
22683a6066224454de177655eb414dd3453c2059536Dae Kim
22738e234b24b602d525739185b861a169bb708a09bSteve Hill	if ((deUint32)imageCount > context.getDeviceProperties().limits.maxColorAttachments)
22838e234b24b602d525739185b861a169bb708a09bSteve Hill		throw tcu::NotSupportedError(std::string("Unsupported render target count: ") + de::toString(imageCount));
22938e234b24b602d525739185b861a169bb708a09bSteve Hill
230549732add51d3906362b924a946a015eef134df5Pyry Haulos	if ((samplerParams.minFilter == VK_FILTER_LINEAR ||
231549732add51d3906362b924a946a015eef134df5Pyry Haulos		 samplerParams.magFilter == VK_FILTER_LINEAR ||
232549732add51d3906362b924a946a015eef134df5Pyry Haulos		 samplerParams.mipmapMode == VK_SAMPLER_MIPMAP_MODE_LINEAR) &&
233549732add51d3906362b924a946a015eef134df5Pyry Haulos		!isLinearFilteringSupported(context.getInstanceInterface(), context.getPhysicalDevice(), imageFormat, VK_IMAGE_TILING_OPTIMAL))
234549732add51d3906362b924a946a015eef134df5Pyry Haulos		throw tcu::NotSupportedError(std::string("Unsupported format for linear filtering: ") + getFormatName(imageFormat));
235549732add51d3906362b924a946a015eef134df5Pyry Haulos
236ed8561a07cdb1bb7730eccf9025b738838392464Pyry Haulos	if ((samplerParams.addressModeU == VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE ||
237ed8561a07cdb1bb7730eccf9025b738838392464Pyry Haulos		 samplerParams.addressModeV == VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE ||
238ed8561a07cdb1bb7730eccf9025b738838392464Pyry Haulos		 samplerParams.addressModeW == VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE) &&
239ed8561a07cdb1bb7730eccf9025b738838392464Pyry Haulos		!de::contains(context.getDeviceExtensions().begin(), context.getDeviceExtensions().end(), "VK_KHR_sampler_mirror_clamp_to_edge"))
240ed8561a07cdb1bb7730eccf9025b738838392464Pyry Haulos		TCU_THROW(NotSupportedError, "VK_KHR_sampler_mirror_clamp_to_edge not supported");
241ed8561a07cdb1bb7730eccf9025b738838392464Pyry Haulos
24273d1b62ab9f3fea5cf26e8d80763bf150de6319bPyry Haulos	if (isCompressedFormat(imageFormat) && imageViewType == VK_IMAGE_VIEW_TYPE_3D)
24373d1b62ab9f3fea5cf26e8d80763bf150de6319bPyry Haulos	{
24473d1b62ab9f3fea5cf26e8d80763bf150de6319bPyry Haulos		// \todo [2016-01-22 pyry] Mandate VK_ERROR_FORMAT_NOT_SUPPORTED
24573d1b62ab9f3fea5cf26e8d80763bf150de6319bPyry Haulos		try
24673d1b62ab9f3fea5cf26e8d80763bf150de6319bPyry Haulos		{
24773d1b62ab9f3fea5cf26e8d80763bf150de6319bPyry Haulos			const VkImageFormatProperties	formatProperties	= getPhysicalDeviceImageFormatProperties(context.getInstanceInterface(),
24873d1b62ab9f3fea5cf26e8d80763bf150de6319bPyry Haulos																										 context.getPhysicalDevice(),
24973d1b62ab9f3fea5cf26e8d80763bf150de6319bPyry Haulos																										 imageFormat,
25073d1b62ab9f3fea5cf26e8d80763bf150de6319bPyry Haulos																										 VK_IMAGE_TYPE_3D,
25173d1b62ab9f3fea5cf26e8d80763bf150de6319bPyry Haulos																										 VK_IMAGE_TILING_OPTIMAL,
25273d1b62ab9f3fea5cf26e8d80763bf150de6319bPyry Haulos																										 VK_IMAGE_USAGE_SAMPLED_BIT,
25373d1b62ab9f3fea5cf26e8d80763bf150de6319bPyry Haulos																										 (VkImageCreateFlags)0);
25473d1b62ab9f3fea5cf26e8d80763bf150de6319bPyry Haulos
25573d1b62ab9f3fea5cf26e8d80763bf150de6319bPyry Haulos			if (formatProperties.maxExtent.width == 0 &&
25673d1b62ab9f3fea5cf26e8d80763bf150de6319bPyry Haulos				formatProperties.maxExtent.height == 0 &&
25773d1b62ab9f3fea5cf26e8d80763bf150de6319bPyry Haulos				formatProperties.maxExtent.depth == 0)
25873d1b62ab9f3fea5cf26e8d80763bf150de6319bPyry Haulos				TCU_THROW(NotSupportedError, "3D compressed format not supported");
25973d1b62ab9f3fea5cf26e8d80763bf150de6319bPyry Haulos		}
26073d1b62ab9f3fea5cf26e8d80763bf150de6319bPyry Haulos		catch (const Error&)
26173d1b62ab9f3fea5cf26e8d80763bf150de6319bPyry Haulos		{
26273d1b62ab9f3fea5cf26e8d80763bf150de6319bPyry Haulos			TCU_THROW(NotSupportedError, "3D compressed format not supported");
26373d1b62ab9f3fea5cf26e8d80763bf150de6319bPyry Haulos		}
26473d1b62ab9f3fea5cf26e8d80763bf150de6319bPyry Haulos	}
26573d1b62ab9f3fea5cf26e8d80763bf150de6319bPyry Haulos
266263ff91cbcd09fb4f97d2bd8479788e648184cd4Yanjun Zhang	if (imageViewType == VK_IMAGE_VIEW_TYPE_CUBE_ARRAY && !context.getDeviceFeatures().imageCubeArray)
267263ff91cbcd09fb4f97d2bd8479788e648184cd4Yanjun Zhang		TCU_THROW(NotSupportedError, "imageCubeArray feature is not supported");
268263ff91cbcd09fb4f97d2bd8479788e648184cd4Yanjun Zhang
26912b099d59111b60518c581364fd026b6cfadf7d1Boris Zanin	if (m_allocationKind == ALLOCATION_KIND_DEDICATED)
27012b099d59111b60518c581364fd026b6cfadf7d1Boris Zanin	{
27112b099d59111b60518c581364fd026b6cfadf7d1Boris Zanin		const std::string extensionName("VK_KHR_dedicated_allocation");
27212b099d59111b60518c581364fd026b6cfadf7d1Boris Zanin
27312b099d59111b60518c581364fd026b6cfadf7d1Boris Zanin		if (!de::contains(context.getDeviceExtensions().begin(), context.getDeviceExtensions().end(), extensionName))
27412b099d59111b60518c581364fd026b6cfadf7d1Boris Zanin			TCU_THROW(NotSupportedError, std::string(extensionName + " is not supported").c_str());
27512b099d59111b60518c581364fd026b6cfadf7d1Boris Zanin	}
27612b099d59111b60518c581364fd026b6cfadf7d1Boris Zanin
277235561df842620267f9a58552f1506ae1012133fDominik Witczak	// Create texture images, views and samplers
27883a6066224454de177655eb414dd3453c2059536Dae Kim	{
27983a6066224454de177655eb414dd3453c2059536Dae Kim		VkImageCreateFlags			imageFlags			= 0u;
28083a6066224454de177655eb414dd3453c2059536Dae Kim
28183a6066224454de177655eb414dd3453c2059536Dae Kim		if (m_imageViewType == VK_IMAGE_VIEW_TYPE_CUBE || m_imageViewType == VK_IMAGE_VIEW_TYPE_CUBE_ARRAY)
28283a6066224454de177655eb414dd3453c2059536Dae Kim			imageFlags = VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT;
28383a6066224454de177655eb414dd3453c2059536Dae Kim
28483a6066224454de177655eb414dd3453c2059536Dae Kim		// Initialize texture data
28583a6066224454de177655eb414dd3453c2059536Dae Kim		if (isCompressedFormat(imageFormat))
286120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			m_texture = createTestTexture(mapVkCompressedFormat(imageFormat), imageViewType, imageSize, layerCount);
28783a6066224454de177655eb414dd3453c2059536Dae Kim		else
288120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			m_texture = createTestTexture(mapVkFormat(imageFormat), imageViewType, imageSize, layerCount);
28983a6066224454de177655eb414dd3453c2059536Dae Kim
29083a6066224454de177655eb414dd3453c2059536Dae Kim		const VkImageCreateInfo	imageParams =
29183a6066224454de177655eb414dd3453c2059536Dae Kim		{
292120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,							// VkStructureType			sType;
293120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			DE_NULL,														// const void*				pNext;
294120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			imageFlags,														// VkImageCreateFlags		flags;
295120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			getCompatibleImageType(m_imageViewType),						// VkImageType				imageType;
296120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			imageFormat,													// VkFormat					format;
297120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			{																// VkExtent3D				extent;
298689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos				(deUint32)m_imageSize.x(),
299689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos				(deUint32)m_imageSize.y(),
300689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos				(deUint32)m_imageSize.z()
30183a6066224454de177655eb414dd3453c2059536Dae Kim			},
302120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			(deUint32)m_texture->getNumLevels(),							// deUint32					mipLevels;
303120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			(deUint32)m_layerCount,											// deUint32					arrayLayers;
304120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_SAMPLE_COUNT_1_BIT,											// VkSampleCountFlagBits	samples;
305120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_IMAGE_TILING_OPTIMAL,										// VkImageTiling			tiling;
306120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,	// VkImageUsageFlags		usage;
307120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_SHARING_MODE_EXCLUSIVE,										// VkSharingMode			sharingMode;
308120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			1u,																// deUint32					queueFamilyIndexCount;
309120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			&queueFamilyIndex,												// const deUint32*			pQueueFamilyIndices;
310120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_IMAGE_LAYOUT_UNDEFINED										// VkImageLayout			initialLayout;
31183a6066224454de177655eb414dd3453c2059536Dae Kim		};
31283a6066224454de177655eb414dd3453c2059536Dae Kim
313235561df842620267f9a58552f1506ae1012133fDominik Witczak		m_images.resize(m_imageCount);
314235561df842620267f9a58552f1506ae1012133fDominik Witczak		m_imageAllocs.resize(m_imageCount);
315235561df842620267f9a58552f1506ae1012133fDominik Witczak		m_imageViews.resize(m_imageCount);
31683a6066224454de177655eb414dd3453c2059536Dae Kim
317235561df842620267f9a58552f1506ae1012133fDominik Witczak		for (int imgNdx = 0; imgNdx < m_imageCount; ++imgNdx)
31883a6066224454de177655eb414dd3453c2059536Dae Kim		{
319235561df842620267f9a58552f1506ae1012133fDominik Witczak			m_images[imgNdx] = SharedImagePtr(new UniqueImage(createImage(vk, vkDevice, &imageParams)));
32012b099d59111b60518c581364fd026b6cfadf7d1Boris Zanin			m_imageAllocs[imgNdx] = SharedAllocPtr(new UniqueAlloc(allocateImage(vki, vk, physDevice, vkDevice, **m_images[imgNdx], MemoryRequirement::Any, memAlloc, m_allocationKind)));
321235561df842620267f9a58552f1506ae1012133fDominik Witczak			VK_CHECK(vk.bindImageMemory(vkDevice, **m_images[imgNdx], (*m_imageAllocs[imgNdx])->getMemory(), (*m_imageAllocs[imgNdx])->getOffset()));
322235561df842620267f9a58552f1506ae1012133fDominik Witczak
323235561df842620267f9a58552f1506ae1012133fDominik Witczak			// Upload texture data
324235561df842620267f9a58552f1506ae1012133fDominik Witczak			uploadTestTexture(vk, vkDevice, queue, queueFamilyIndex, memAlloc, *m_texture, **m_images[imgNdx]);
325235561df842620267f9a58552f1506ae1012133fDominik Witczak
326235561df842620267f9a58552f1506ae1012133fDominik Witczak			// Create image view and sampler
327235561df842620267f9a58552f1506ae1012133fDominik Witczak			const VkImageViewCreateInfo imageViewParams =
328235561df842620267f9a58552f1506ae1012133fDominik Witczak			{
329235561df842620267f9a58552f1506ae1012133fDominik Witczak				VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,	// VkStructureType			sType;
330235561df842620267f9a58552f1506ae1012133fDominik Witczak				DE_NULL,									// const void*				pNext;
331235561df842620267f9a58552f1506ae1012133fDominik Witczak				0u,											// VkImageViewCreateFlags	flags;
332235561df842620267f9a58552f1506ae1012133fDominik Witczak				**m_images[imgNdx],							// VkImage					image;
333235561df842620267f9a58552f1506ae1012133fDominik Witczak				m_imageViewType,							// VkImageViewType			viewType;
334235561df842620267f9a58552f1506ae1012133fDominik Witczak				imageFormat,								// VkFormat					format;
335235561df842620267f9a58552f1506ae1012133fDominik Witczak				m_componentMapping,							// VkComponentMapping		components;
336235561df842620267f9a58552f1506ae1012133fDominik Witczak				m_subresourceRange,							// VkImageSubresourceRange	subresourceRange;
337235561df842620267f9a58552f1506ae1012133fDominik Witczak			};
338235561df842620267f9a58552f1506ae1012133fDominik Witczak
339235561df842620267f9a58552f1506ae1012133fDominik Witczak			m_imageViews[imgNdx] = SharedImageViewPtr(new UniqueImageView(createImageView(vk, vkDevice, &imageViewParams)));
340235561df842620267f9a58552f1506ae1012133fDominik Witczak		}
34183a6066224454de177655eb414dd3453c2059536Dae Kim
34283a6066224454de177655eb414dd3453c2059536Dae Kim		m_sampler	= createSampler(vk, vkDevice, &m_samplerParams);
34383a6066224454de177655eb414dd3453c2059536Dae Kim	}
34483a6066224454de177655eb414dd3453c2059536Dae Kim
345235561df842620267f9a58552f1506ae1012133fDominik Witczak	// Create descriptor set for image and sampler
34683a6066224454de177655eb414dd3453c2059536Dae Kim	{
34783a6066224454de177655eb414dd3453c2059536Dae Kim		DescriptorPoolBuilder descriptorPoolBuilder;
348235561df842620267f9a58552f1506ae1012133fDominik Witczak		if (m_samplingType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE)
349235561df842620267f9a58552f1506ae1012133fDominik Witczak			descriptorPoolBuilder.addType(VK_DESCRIPTOR_TYPE_SAMPLER, 1u);
350235561df842620267f9a58552f1506ae1012133fDominik Witczak		descriptorPoolBuilder.addType(m_samplingType, m_imageCount);
351235561df842620267f9a58552f1506ae1012133fDominik Witczak		m_descriptorPool = descriptorPoolBuilder.build(vk, vkDevice, VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT,
352235561df842620267f9a58552f1506ae1012133fDominik Witczak			m_samplingType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE ? m_imageCount + 1u : m_imageCount);
35383a6066224454de177655eb414dd3453c2059536Dae Kim
35483a6066224454de177655eb414dd3453c2059536Dae Kim		DescriptorSetLayoutBuilder setLayoutBuilder;
355235561df842620267f9a58552f1506ae1012133fDominik Witczak		if (m_samplingType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE)
356235561df842620267f9a58552f1506ae1012133fDominik Witczak			setLayoutBuilder.addSingleBinding(VK_DESCRIPTOR_TYPE_SAMPLER, VK_SHADER_STAGE_FRAGMENT_BIT);
357235561df842620267f9a58552f1506ae1012133fDominik Witczak		setLayoutBuilder.addArrayBinding(m_samplingType, m_imageCount, VK_SHADER_STAGE_FRAGMENT_BIT);
35883a6066224454de177655eb414dd3453c2059536Dae Kim		m_descriptorSetLayout = setLayoutBuilder.build(vk, vkDevice);
35983a6066224454de177655eb414dd3453c2059536Dae Kim
360120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		const VkDescriptorSetAllocateInfo descriptorSetAllocateInfo =
361120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		{
362120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO,		// VkStructureType				sType;
363120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			DE_NULL,											// const void*					pNext;
364120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			*m_descriptorPool,									// VkDescriptorPool				descriptorPool;
365120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			1u,													// deUint32						setLayoutCount;
366120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			&m_descriptorSetLayout.get()						// const VkDescriptorSetLayout*	pSetLayouts;
367120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		};
368120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim
369120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		m_descriptorSet = allocateDescriptorSet(vk, vkDevice, &descriptorSetAllocateInfo);
37083a6066224454de177655eb414dd3453c2059536Dae Kim
371235561df842620267f9a58552f1506ae1012133fDominik Witczak		const VkSampler sampler = m_samplingType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE ? DE_NULL : *m_sampler;
372235561df842620267f9a58552f1506ae1012133fDominik Witczak		std::vector<VkDescriptorImageInfo> descriptorImageInfo(m_imageCount);
373235561df842620267f9a58552f1506ae1012133fDominik Witczak		for (int imgNdx = 0; imgNdx < m_imageCount; ++imgNdx)
37483a6066224454de177655eb414dd3453c2059536Dae Kim		{
375235561df842620267f9a58552f1506ae1012133fDominik Witczak			descriptorImageInfo[imgNdx].sampler		= sampler;									// VkSampler		sampler;
376235561df842620267f9a58552f1506ae1012133fDominik Witczak			descriptorImageInfo[imgNdx].imageView	= **m_imageViews[imgNdx];					// VkImageView		imageView;
377235561df842620267f9a58552f1506ae1012133fDominik Witczak			descriptorImageInfo[imgNdx].imageLayout	= VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;	// VkImageLayout	imageLayout;
378235561df842620267f9a58552f1506ae1012133fDominik Witczak		}
37983a6066224454de177655eb414dd3453c2059536Dae Kim
38083a6066224454de177655eb414dd3453c2059536Dae Kim		DescriptorSetUpdateBuilder setUpdateBuilder;
381235561df842620267f9a58552f1506ae1012133fDominik Witczak		if (m_samplingType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE)
382235561df842620267f9a58552f1506ae1012133fDominik Witczak		{
383235561df842620267f9a58552f1506ae1012133fDominik Witczak			const VkDescriptorImageInfo descriptorSamplerInfo =
384235561df842620267f9a58552f1506ae1012133fDominik Witczak			{
385235561df842620267f9a58552f1506ae1012133fDominik Witczak				*m_sampler,									// VkSampler		sampler;
386235561df842620267f9a58552f1506ae1012133fDominik Witczak				DE_NULL,									// VkImageView		imageView;
387235561df842620267f9a58552f1506ae1012133fDominik Witczak				VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL	// VkImageLayout	imageLayout;
388235561df842620267f9a58552f1506ae1012133fDominik Witczak			};
389235561df842620267f9a58552f1506ae1012133fDominik Witczak			setUpdateBuilder.writeSingle(*m_descriptorSet, DescriptorSetUpdateBuilder::Location::binding(0), VK_DESCRIPTOR_TYPE_SAMPLER, &descriptorSamplerInfo);
390235561df842620267f9a58552f1506ae1012133fDominik Witczak		}
391235561df842620267f9a58552f1506ae1012133fDominik Witczak
392235561df842620267f9a58552f1506ae1012133fDominik Witczak		const deUint32 binding = m_samplingType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE ? 1u : 0u;
393235561df842620267f9a58552f1506ae1012133fDominik Witczak		setUpdateBuilder.writeArray(*m_descriptorSet, DescriptorSetUpdateBuilder::Location::binding(binding), m_samplingType, m_imageCount, descriptorImageInfo.data());
39483a6066224454de177655eb414dd3453c2059536Dae Kim		setUpdateBuilder.update(vk, vkDevice);
39583a6066224454de177655eb414dd3453c2059536Dae Kim	}
39683a6066224454de177655eb414dd3453c2059536Dae Kim
397235561df842620267f9a58552f1506ae1012133fDominik Witczak	// Create color images and views
39883a6066224454de177655eb414dd3453c2059536Dae Kim	{
39983a6066224454de177655eb414dd3453c2059536Dae Kim		const VkImageCreateInfo colorImageParams =
40083a6066224454de177655eb414dd3453c2059536Dae Kim		{
401120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,										// VkStructureType			sType;
402120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			DE_NULL,																	// const void*				pNext;
403120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,																			// VkImageCreateFlags		flags;
404120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_IMAGE_TYPE_2D,															// VkImageType				imageType;
405120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			m_colorFormat,																// VkFormat					format;
406689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos			{ (deUint32)m_renderSize.x(), (deUint32)m_renderSize.y(), 1u },				// VkExtent3D				extent;
407120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			1u,																			// deUint32					mipLevels;
408120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			1u,																			// deUint32					arrayLayers;
409120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_SAMPLE_COUNT_1_BIT,														// VkSampleCountFlagBits	samples;
410120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_IMAGE_TILING_OPTIMAL,													// VkImageTiling			tiling;
411120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT,		// VkImageUsageFlags		usage;
412120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_SHARING_MODE_EXCLUSIVE,													// VkSharingMode			sharingMode;
413120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			1u,																			// deUint32					queueFamilyIndexCount;
414120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			&queueFamilyIndex,															// const deUint32*			pQueueFamilyIndices;
415120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_IMAGE_LAYOUT_UNDEFINED													// VkImageLayout			initialLayout;
41683a6066224454de177655eb414dd3453c2059536Dae Kim		};
41783a6066224454de177655eb414dd3453c2059536Dae Kim
418235561df842620267f9a58552f1506ae1012133fDominik Witczak		m_colorImages.resize(m_imageCount);
419235561df842620267f9a58552f1506ae1012133fDominik Witczak		m_colorImageAllocs.resize(m_imageCount);
420235561df842620267f9a58552f1506ae1012133fDominik Witczak		m_colorAttachmentViews.resize(m_imageCount);
42183a6066224454de177655eb414dd3453c2059536Dae Kim
422235561df842620267f9a58552f1506ae1012133fDominik Witczak		for (int imgNdx = 0; imgNdx < m_imageCount; ++imgNdx)
42383a6066224454de177655eb414dd3453c2059536Dae Kim		{
424235561df842620267f9a58552f1506ae1012133fDominik Witczak			m_colorImages[imgNdx] = SharedImagePtr(new UniqueImage(createImage(vk, vkDevice, &colorImageParams)));
42512b099d59111b60518c581364fd026b6cfadf7d1Boris Zanin			m_colorImageAllocs[imgNdx] = SharedAllocPtr(new UniqueAlloc(allocateImage(vki, vk, physDevice, vkDevice, **m_colorImages[imgNdx], MemoryRequirement::Any, memAlloc, m_allocationKind)));
426235561df842620267f9a58552f1506ae1012133fDominik Witczak			VK_CHECK(vk.bindImageMemory(vkDevice, **m_colorImages[imgNdx], (*m_colorImageAllocs[imgNdx])->getMemory(), (*m_colorImageAllocs[imgNdx])->getOffset()));
42783a6066224454de177655eb414dd3453c2059536Dae Kim
428235561df842620267f9a58552f1506ae1012133fDominik Witczak			const VkImageViewCreateInfo colorAttachmentViewParams =
429235561df842620267f9a58552f1506ae1012133fDominik Witczak			{
430235561df842620267f9a58552f1506ae1012133fDominik Witczak				VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,			// VkStructureType			sType;
431235561df842620267f9a58552f1506ae1012133fDominik Witczak				DE_NULL,											// const void*				pNext;
432235561df842620267f9a58552f1506ae1012133fDominik Witczak				0u,													// VkImageViewCreateFlags	flags;
433235561df842620267f9a58552f1506ae1012133fDominik Witczak				**m_colorImages[imgNdx],							// VkImage					image;
434235561df842620267f9a58552f1506ae1012133fDominik Witczak				VK_IMAGE_VIEW_TYPE_2D,								// VkImageViewType			viewType;
435235561df842620267f9a58552f1506ae1012133fDominik Witczak				m_colorFormat,										// VkFormat					format;
436235561df842620267f9a58552f1506ae1012133fDominik Witczak				componentMappingRGBA,								// VkComponentMapping		components;
437235561df842620267f9a58552f1506ae1012133fDominik Witczak				{ VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u }		// VkImageSubresourceRange	subresourceRange;
438235561df842620267f9a58552f1506ae1012133fDominik Witczak			};
439235561df842620267f9a58552f1506ae1012133fDominik Witczak
440235561df842620267f9a58552f1506ae1012133fDominik Witczak			m_colorAttachmentViews[imgNdx] = SharedImageViewPtr(new UniqueImageView(createImageView(vk, vkDevice, &colorAttachmentViewParams)));
441235561df842620267f9a58552f1506ae1012133fDominik Witczak		}
44283a6066224454de177655eb414dd3453c2059536Dae Kim	}
44383a6066224454de177655eb414dd3453c2059536Dae Kim
44483a6066224454de177655eb414dd3453c2059536Dae Kim	// Create render pass
44583a6066224454de177655eb414dd3453c2059536Dae Kim	{
446235561df842620267f9a58552f1506ae1012133fDominik Witczak		std::vector<VkAttachmentDescription>	colorAttachmentDescriptions(m_imageCount);
447235561df842620267f9a58552f1506ae1012133fDominik Witczak		std::vector<VkAttachmentReference>		colorAttachmentReferences(m_imageCount);
44883a6066224454de177655eb414dd3453c2059536Dae Kim
449235561df842620267f9a58552f1506ae1012133fDominik Witczak		for (int imgNdx = 0; imgNdx < m_imageCount; ++imgNdx)
45083a6066224454de177655eb414dd3453c2059536Dae Kim		{
451235561df842620267f9a58552f1506ae1012133fDominik Witczak			colorAttachmentDescriptions[imgNdx].flags			= 0u;										// VkAttachmentDescriptionFlags		flags;
452235561df842620267f9a58552f1506ae1012133fDominik Witczak			colorAttachmentDescriptions[imgNdx].format			= m_colorFormat;							// VkFormat							format;
453235561df842620267f9a58552f1506ae1012133fDominik Witczak			colorAttachmentDescriptions[imgNdx].samples			= VK_SAMPLE_COUNT_1_BIT;					// VkSampleCountFlagBits			samples;
454235561df842620267f9a58552f1506ae1012133fDominik Witczak			colorAttachmentDescriptions[imgNdx].loadOp			= VK_ATTACHMENT_LOAD_OP_CLEAR;				// VkAttachmentLoadOp				loadOp;
455235561df842620267f9a58552f1506ae1012133fDominik Witczak			colorAttachmentDescriptions[imgNdx].storeOp			= VK_ATTACHMENT_STORE_OP_STORE;				// VkAttachmentStoreOp				storeOp;
456235561df842620267f9a58552f1506ae1012133fDominik Witczak			colorAttachmentDescriptions[imgNdx].stencilLoadOp	= VK_ATTACHMENT_LOAD_OP_DONT_CARE;			// VkAttachmentLoadOp				stencilLoadOp;
457235561df842620267f9a58552f1506ae1012133fDominik Witczak			colorAttachmentDescriptions[imgNdx].stencilStoreOp	= VK_ATTACHMENT_STORE_OP_DONT_CARE;			// VkAttachmentStoreOp				stencilStoreOp;
458235561df842620267f9a58552f1506ae1012133fDominik Witczak			colorAttachmentDescriptions[imgNdx].initialLayout	= VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;	// VkImageLayout					initialLayout;
459235561df842620267f9a58552f1506ae1012133fDominik Witczak			colorAttachmentDescriptions[imgNdx].finalLayout		= VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;	// VkImageLayout					finalLayout;
460235561df842620267f9a58552f1506ae1012133fDominik Witczak
461235561df842620267f9a58552f1506ae1012133fDominik Witczak			colorAttachmentReferences[imgNdx].attachment		= (deUint32)imgNdx;							// deUint32							attachment;
462235561df842620267f9a58552f1506ae1012133fDominik Witczak			colorAttachmentReferences[imgNdx].layout			= VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;	// VkImageLayout					layout;
463235561df842620267f9a58552f1506ae1012133fDominik Witczak		}
46483a6066224454de177655eb414dd3453c2059536Dae Kim
46583a6066224454de177655eb414dd3453c2059536Dae Kim		const VkSubpassDescription subpassDescription =
46683a6066224454de177655eb414dd3453c2059536Dae Kim		{
46783a6066224454de177655eb414dd3453c2059536Dae Kim			0u,													// VkSubpassDescriptionFlags	flags;
468120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_PIPELINE_BIND_POINT_GRAPHICS,					// VkPipelineBindPoint			pipelineBindPoint;
469120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,													// deUint32						inputAttachmentCount;
47083a6066224454de177655eb414dd3453c2059536Dae Kim			DE_NULL,											// const VkAttachmentReference*	pInputAttachments;
471235561df842620267f9a58552f1506ae1012133fDominik Witczak			(deUint32)m_imageCount,								// deUint32						colorAttachmentCount;
472235561df842620267f9a58552f1506ae1012133fDominik Witczak			&colorAttachmentReferences[0],						// const VkAttachmentReference*	pColorAttachments;
47383a6066224454de177655eb414dd3453c2059536Dae Kim			DE_NULL,											// const VkAttachmentReference*	pResolveAttachments;
474120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			DE_NULL,											// const VkAttachmentReference*	pDepthStencilAttachment;
475120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,													// deUint32						preserveAttachmentCount;
47683a6066224454de177655eb414dd3453c2059536Dae Kim			DE_NULL												// const VkAttachmentReference*	pPreserveAttachments;
47783a6066224454de177655eb414dd3453c2059536Dae Kim		};
47883a6066224454de177655eb414dd3453c2059536Dae Kim
47983a6066224454de177655eb414dd3453c2059536Dae Kim		const VkRenderPassCreateInfo renderPassParams =
48083a6066224454de177655eb414dd3453c2059536Dae Kim		{
48183a6066224454de177655eb414dd3453c2059536Dae Kim			VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,			// VkStructureType					sType;
48283a6066224454de177655eb414dd3453c2059536Dae Kim			DE_NULL,											// const void*						pNext;
483120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,													// VkRenderPassCreateFlags			flags;
484235561df842620267f9a58552f1506ae1012133fDominik Witczak			(deUint32)m_imageCount,								// deUint32							attachmentCount;
485235561df842620267f9a58552f1506ae1012133fDominik Witczak			&colorAttachmentDescriptions[0],					// const VkAttachmentDescription*	pAttachments;
48683a6066224454de177655eb414dd3453c2059536Dae Kim			1u,													// deUint32							subpassCount;
48783a6066224454de177655eb414dd3453c2059536Dae Kim			&subpassDescription,								// const VkSubpassDescription*		pSubpasses;
48883a6066224454de177655eb414dd3453c2059536Dae Kim			0u,													// deUint32							dependencyCount;
48983a6066224454de177655eb414dd3453c2059536Dae Kim			DE_NULL												// const VkSubpassDependency*		pDependencies;
49083a6066224454de177655eb414dd3453c2059536Dae Kim		};
49183a6066224454de177655eb414dd3453c2059536Dae Kim
49283a6066224454de177655eb414dd3453c2059536Dae Kim		m_renderPass = createRenderPass(vk, vkDevice, &renderPassParams);
49383a6066224454de177655eb414dd3453c2059536Dae Kim	}
49483a6066224454de177655eb414dd3453c2059536Dae Kim
49583a6066224454de177655eb414dd3453c2059536Dae Kim	// Create framebuffer
49683a6066224454de177655eb414dd3453c2059536Dae Kim	{
497235561df842620267f9a58552f1506ae1012133fDominik Witczak		std::vector<VkImageView> pAttachments(m_imageCount);
498235561df842620267f9a58552f1506ae1012133fDominik Witczak		for (int imgNdx = 0; imgNdx < m_imageCount; ++imgNdx)
499235561df842620267f9a58552f1506ae1012133fDominik Witczak			pAttachments[imgNdx] = m_colorAttachmentViews[imgNdx]->get();
500235561df842620267f9a58552f1506ae1012133fDominik Witczak
50183a6066224454de177655eb414dd3453c2059536Dae Kim		const VkFramebufferCreateInfo framebufferParams =
50283a6066224454de177655eb414dd3453c2059536Dae Kim		{
503120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO,			// VkStructureType			sType;
504120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			DE_NULL,											// const void*				pNext;
505120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,													// VkFramebufferCreateFlags	flags;
506120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			*m_renderPass,										// VkRenderPass				renderPass;
507235561df842620267f9a58552f1506ae1012133fDominik Witczak			(deUint32)m_imageCount,								// deUint32					attachmentCount;
508235561df842620267f9a58552f1506ae1012133fDominik Witczak			&pAttachments[0],									// const VkImageView*		pAttachments;
509120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			(deUint32)m_renderSize.x(),							// deUint32					width;
510120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			(deUint32)m_renderSize.y(),							// deUint32					height;
511120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			1u													// deUint32					layers;
51283a6066224454de177655eb414dd3453c2059536Dae Kim		};
51383a6066224454de177655eb414dd3453c2059536Dae Kim
51483a6066224454de177655eb414dd3453c2059536Dae Kim		m_framebuffer = createFramebuffer(vk, vkDevice, &framebufferParams);
51583a6066224454de177655eb414dd3453c2059536Dae Kim	}
51683a6066224454de177655eb414dd3453c2059536Dae Kim
51783a6066224454de177655eb414dd3453c2059536Dae Kim	// Create pipeline layout
51883a6066224454de177655eb414dd3453c2059536Dae Kim	{
51983a6066224454de177655eb414dd3453c2059536Dae Kim		const VkPipelineLayoutCreateInfo pipelineLayoutParams =
52083a6066224454de177655eb414dd3453c2059536Dae Kim		{
52183a6066224454de177655eb414dd3453c2059536Dae Kim			VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,		// VkStructureType				sType;
52283a6066224454de177655eb414dd3453c2059536Dae Kim			DE_NULL,											// const void*					pNext;
523120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,													// VkPipelineLayoutCreateFlags	flags;
524120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			1u,													// deUint32						setLayoutCount;
52583a6066224454de177655eb414dd3453c2059536Dae Kim			&m_descriptorSetLayout.get(),						// const VkDescriptorSetLayout*	pSetLayouts;
52683a6066224454de177655eb414dd3453c2059536Dae Kim			0u,													// deUint32						pushConstantRangeCount;
52783a6066224454de177655eb414dd3453c2059536Dae Kim			DE_NULL												// const VkPushConstantRange*	pPushConstantRanges;
52883a6066224454de177655eb414dd3453c2059536Dae Kim		};
52983a6066224454de177655eb414dd3453c2059536Dae Kim
53083a6066224454de177655eb414dd3453c2059536Dae Kim		m_pipelineLayout = createPipelineLayout(vk, vkDevice, &pipelineLayoutParams);
53183a6066224454de177655eb414dd3453c2059536Dae Kim	}
53283a6066224454de177655eb414dd3453c2059536Dae Kim
533120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	m_vertexShaderModule	= createShaderModule(vk, vkDevice, m_context.getBinaryCollection().get("tex_vert"), 0);
534120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	m_fragmentShaderModule	= createShaderModule(vk, vkDevice, m_context.getBinaryCollection().get("tex_frag"), 0);
53583a6066224454de177655eb414dd3453c2059536Dae Kim
53683a6066224454de177655eb414dd3453c2059536Dae Kim	// Create pipeline
53783a6066224454de177655eb414dd3453c2059536Dae Kim	{
538120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		const VkPipelineShaderStageCreateInfo shaderStages[2] =
53983a6066224454de177655eb414dd3453c2059536Dae Kim		{
54083a6066224454de177655eb414dd3453c2059536Dae Kim			{
541120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,		// VkStructureType						sType;
542120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				DE_NULL,													// const void*							pNext;
543120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				0u,															// VkPipelineShaderStageCreateFlags		flags;
544120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				VK_SHADER_STAGE_VERTEX_BIT,									// VkShaderStageFlagBits				stage;
545120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				*m_vertexShaderModule,										// VkShaderModule						module;
546120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				"main",														// const char*							pName;
547120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				DE_NULL														// const VkSpecializationInfo*			pSpecializationInfo;
54883a6066224454de177655eb414dd3453c2059536Dae Kim			},
54983a6066224454de177655eb414dd3453c2059536Dae Kim			{
550120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,		// VkStructureType						sType;
551120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				DE_NULL,													// const void*							pNext;
552120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				0u,															// VkPipelineShaderStageCreateFlags		flags;
553120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				VK_SHADER_STAGE_FRAGMENT_BIT,								// VkShaderStageFlagBits				stage;
554120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				*m_fragmentShaderModule,									// VkShaderModule						module;
555120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				"main",														// const char*							pName;
556120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				DE_NULL														// const VkSpecializationInfo*			pSpecializationInfo;
55783a6066224454de177655eb414dd3453c2059536Dae Kim			}
55883a6066224454de177655eb414dd3453c2059536Dae Kim		};
55983a6066224454de177655eb414dd3453c2059536Dae Kim
56083a6066224454de177655eb414dd3453c2059536Dae Kim		const VkVertexInputBindingDescription vertexInputBindingDescription =
56183a6066224454de177655eb414dd3453c2059536Dae Kim		{
562120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,									// deUint32					binding;
563120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			sizeof(Vertex4Tex4),				// deUint32					strideInBytes;
564120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_VERTEX_INPUT_RATE_VERTEX			// VkVertexInputStepRate	inputRate;
56583a6066224454de177655eb414dd3453c2059536Dae Kim		};
56683a6066224454de177655eb414dd3453c2059536Dae Kim
56783a6066224454de177655eb414dd3453c2059536Dae Kim		const VkVertexInputAttributeDescription vertexInputAttributeDescriptions[2] =
56883a6066224454de177655eb414dd3453c2059536Dae Kim		{
56983a6066224454de177655eb414dd3453c2059536Dae Kim			{
57083a6066224454de177655eb414dd3453c2059536Dae Kim				0u,										// deUint32	location;
57183a6066224454de177655eb414dd3453c2059536Dae Kim				0u,										// deUint32	binding;
57283a6066224454de177655eb414dd3453c2059536Dae Kim				VK_FORMAT_R32G32B32A32_SFLOAT,			// VkFormat	format;
573120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				0u										// deUint32	offset;
57483a6066224454de177655eb414dd3453c2059536Dae Kim			},
57583a6066224454de177655eb414dd3453c2059536Dae Kim			{
57683a6066224454de177655eb414dd3453c2059536Dae Kim				1u,										// deUint32	location;
57783a6066224454de177655eb414dd3453c2059536Dae Kim				0u,										// deUint32	binding;
57883a6066224454de177655eb414dd3453c2059536Dae Kim				VK_FORMAT_R32G32B32A32_SFLOAT,			// VkFormat	format;
579120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				DE_OFFSET_OF(Vertex4Tex4, texCoord),	// deUint32	offset;
58083a6066224454de177655eb414dd3453c2059536Dae Kim			}
58183a6066224454de177655eb414dd3453c2059536Dae Kim		};
58283a6066224454de177655eb414dd3453c2059536Dae Kim
58383a6066224454de177655eb414dd3453c2059536Dae Kim		const VkPipelineVertexInputStateCreateInfo vertexInputStateParams =
58483a6066224454de177655eb414dd3453c2059536Dae Kim		{
58583a6066224454de177655eb414dd3453c2059536Dae Kim			VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO,		// VkStructureType							sType;
58683a6066224454de177655eb414dd3453c2059536Dae Kim			DE_NULL,														// const void*								pNext;
587120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,																// VkPipelineVertexInputStateCreateFlags	flags;
588120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			1u,																// deUint32									vertexBindingDescriptionCount;
58983a6066224454de177655eb414dd3453c2059536Dae Kim			&vertexInputBindingDescription,									// const VkVertexInputBindingDescription*	pVertexBindingDescriptions;
590120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			2u,																// deUint32									vertexAttributeDescriptionCount;
59183a6066224454de177655eb414dd3453c2059536Dae Kim			vertexInputAttributeDescriptions								// const VkVertexInputAttributeDescription*	pVertexAttributeDescriptions;
59283a6066224454de177655eb414dd3453c2059536Dae Kim		};
59383a6066224454de177655eb414dd3453c2059536Dae Kim
59483a6066224454de177655eb414dd3453c2059536Dae Kim		const VkPipelineInputAssemblyStateCreateInfo inputAssemblyStateParams =
59583a6066224454de177655eb414dd3453c2059536Dae Kim		{
596120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,	// VkStructureType							sType;
597120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			DE_NULL,														// const void*								pNext;
598120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,																// VkPipelineInputAssemblyStateCreateFlags	flags;
599120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST,							// VkPrimitiveTopology						topology;
600120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			false															// VkBool32									primitiveRestartEnable;
60183a6066224454de177655eb414dd3453c2059536Dae Kim		};
60283a6066224454de177655eb414dd3453c2059536Dae Kim
60383a6066224454de177655eb414dd3453c2059536Dae Kim		const VkViewport viewport =
60483a6066224454de177655eb414dd3453c2059536Dae Kim		{
605120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0.0f,						// float	x;
606120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0.0f,						// float	y;
60783a6066224454de177655eb414dd3453c2059536Dae Kim			(float)m_renderSize.x(),	// float	width;
60883a6066224454de177655eb414dd3453c2059536Dae Kim			(float)m_renderSize.y(),	// float	height;
60983a6066224454de177655eb414dd3453c2059536Dae Kim			0.0f,						// float	minDepth;
61083a6066224454de177655eb414dd3453c2059536Dae Kim			1.0f						// float	maxDepth;
61183a6066224454de177655eb414dd3453c2059536Dae Kim		};
61283a6066224454de177655eb414dd3453c2059536Dae Kim
613689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos		const VkRect2D scissor = { { 0, 0 }, { (deUint32)m_renderSize.x(), (deUint32)m_renderSize.y() } };
61483a6066224454de177655eb414dd3453c2059536Dae Kim
61583a6066224454de177655eb414dd3453c2059536Dae Kim		const VkPipelineViewportStateCreateInfo viewportStateParams =
61683a6066224454de177655eb414dd3453c2059536Dae Kim		{
617120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO,			// VkStructureType						sType;
618120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			DE_NULL,														// const void*							pNext;
619120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,																// VkPipelineViewportStateCreateFlags	flags;
620120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			1u,																// deUint32								viewportCount;
621120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			&viewport,														// const VkViewport*					pViewports;
622120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			1u,																// deUint32								scissorCount;
623120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			&scissor														// const VkRect2D*						pScissors;
62483a6066224454de177655eb414dd3453c2059536Dae Kim		};
62583a6066224454de177655eb414dd3453c2059536Dae Kim
626120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		const VkPipelineRasterizationStateCreateInfo rasterStateParams =
62783a6066224454de177655eb414dd3453c2059536Dae Kim		{
628120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO,		// VkStructureType							sType;
629120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			DE_NULL,														// const void*								pNext;
630120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,																// VkPipelineRasterizationStateCreateFlags	flags;
631120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			false,															// VkBool32									depthClampEnable;
632120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			false,															// VkBool32									rasterizerDiscardEnable;
633120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_POLYGON_MODE_FILL,											// VkPolygonMode							polygonMode;
634120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_CULL_MODE_NONE,												// VkCullModeFlags							cullMode;
635120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_FRONT_FACE_COUNTER_CLOCKWISE,								// VkFrontFace								frontFace;
636120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			false,															// VkBool32									depthBiasEnable;
637120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0.0f,															// float									depthBiasConstantFactor;
638120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0.0f,															// float									depthBiasClamp;
639120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0.0f,															// float									depthBiasSlopeFactor;
640120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			1.0f															// float									lineWidth;
64183a6066224454de177655eb414dd3453c2059536Dae Kim		};
64283a6066224454de177655eb414dd3453c2059536Dae Kim
643235561df842620267f9a58552f1506ae1012133fDominik Witczak		std::vector<VkPipelineColorBlendAttachmentState>	colorBlendAttachmentStates(m_imageCount);
644235561df842620267f9a58552f1506ae1012133fDominik Witczak
645235561df842620267f9a58552f1506ae1012133fDominik Witczak		for (int imgNdx = 0; imgNdx < m_imageCount; ++imgNdx)
64683a6066224454de177655eb414dd3453c2059536Dae Kim		{
647235561df842620267f9a58552f1506ae1012133fDominik Witczak			colorBlendAttachmentStates[imgNdx].blendEnable			= false;												// VkBool32					blendEnable;
648235561df842620267f9a58552f1506ae1012133fDominik Witczak			colorBlendAttachmentStates[imgNdx].srcColorBlendFactor	= VK_BLEND_FACTOR_ONE;									// VkBlendFactor			srcColorBlendFactor;
649235561df842620267f9a58552f1506ae1012133fDominik Witczak			colorBlendAttachmentStates[imgNdx].dstColorBlendFactor	= VK_BLEND_FACTOR_ZERO;									// VkBlendFactor			dstColorBlendFactor;
650235561df842620267f9a58552f1506ae1012133fDominik Witczak			colorBlendAttachmentStates[imgNdx].colorBlendOp			= VK_BLEND_OP_ADD;										// VkBlendOp				colorBlendOp;
651235561df842620267f9a58552f1506ae1012133fDominik Witczak			colorBlendAttachmentStates[imgNdx].srcAlphaBlendFactor	= VK_BLEND_FACTOR_ONE;									// VkBlendFactor			srcAlphaBlendFactor;
652235561df842620267f9a58552f1506ae1012133fDominik Witczak			colorBlendAttachmentStates[imgNdx].dstAlphaBlendFactor	= VK_BLEND_FACTOR_ZERO;									// VkBlendFactor			dstAlphaBlendFactor;
653235561df842620267f9a58552f1506ae1012133fDominik Witczak			colorBlendAttachmentStates[imgNdx].alphaBlendOp			= VK_BLEND_OP_ADD;										// VkBlendOp				alphaBlendOp;
654235561df842620267f9a58552f1506ae1012133fDominik Witczak			colorBlendAttachmentStates[imgNdx].colorWriteMask		= VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT |	// VkColorComponentFlags	colorWriteMask;
655235561df842620267f9a58552f1506ae1012133fDominik Witczak																		VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT;
656235561df842620267f9a58552f1506ae1012133fDominik Witczak		}
65783a6066224454de177655eb414dd3453c2059536Dae Kim
65883a6066224454de177655eb414dd3453c2059536Dae Kim		const VkPipelineColorBlendStateCreateInfo colorBlendStateParams =
65983a6066224454de177655eb414dd3453c2059536Dae Kim		{
66083a6066224454de177655eb414dd3453c2059536Dae Kim			VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO,	// VkStructureType								sType;
66183a6066224454de177655eb414dd3453c2059536Dae Kim			DE_NULL,													// const void*									pNext;
662120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,															// VkPipelineColorBlendStateCreateFlags			flags;
66383a6066224454de177655eb414dd3453c2059536Dae Kim			false,														// VkBool32										logicOpEnable;
66483a6066224454de177655eb414dd3453c2059536Dae Kim			VK_LOGIC_OP_COPY,											// VkLogicOp									logicOp;
665235561df842620267f9a58552f1506ae1012133fDominik Witczak			(deUint32)m_imageCount,										// deUint32										attachmentCount;
666235561df842620267f9a58552f1506ae1012133fDominik Witczak			&colorBlendAttachmentStates[0],								// const VkPipelineColorBlendAttachmentState*	pAttachments;
667120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			{ 0.0f, 0.0f, 0.0f, 0.0f }									// float										blendConstants[4];
66883a6066224454de177655eb414dd3453c2059536Dae Kim		};
66983a6066224454de177655eb414dd3453c2059536Dae Kim
67083a6066224454de177655eb414dd3453c2059536Dae Kim		const VkPipelineMultisampleStateCreateInfo multisampleStateParams =
67183a6066224454de177655eb414dd3453c2059536Dae Kim		{
672120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO,	// VkStructureType							sType;
673120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			DE_NULL,													// const void*								pNext;
674120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,															// VkPipelineMultisampleStateCreateFlags	flags;
675120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_SAMPLE_COUNT_1_BIT,										// VkSampleCountFlagBits					rasterizationSamples;
676120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			false,														// VkBool32									sampleShadingEnable;
677120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0.0f,														// float									minSampleShading;
678120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			DE_NULL,													// const VkSampleMask*						pSampleMask;
679120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			false,														// VkBool32									alphaToCoverageEnable;
680120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			false														// VkBool32									alphaToOneEnable;
68183a6066224454de177655eb414dd3453c2059536Dae Kim		};
68283a6066224454de177655eb414dd3453c2059536Dae Kim
68383a6066224454de177655eb414dd3453c2059536Dae Kim		VkPipelineDepthStencilStateCreateInfo depthStencilStateParams =
68483a6066224454de177655eb414dd3453c2059536Dae Kim		{
685120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO,	// VkStructureType							sType;
686120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			DE_NULL,													// const void*								pNext;
687120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,															// VkPipelineDepthStencilStateCreateFlags	flags;
688120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			false,														// VkBool32									depthTestEnable;
689120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			false,														// VkBool32									depthWriteEnable;
690120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_COMPARE_OP_LESS,											// VkCompareOp								depthCompareOp;
691120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			false,														// VkBool32									depthBoundsTestEnable;
692120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			false,														// VkBool32									stencilTestEnable;
693120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			{															// VkStencilOpState							front;
694120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				VK_STENCIL_OP_ZERO,		// VkStencilOp	failOp;
695120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				VK_STENCIL_OP_ZERO,		// VkStencilOp	passOp;
696120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				VK_STENCIL_OP_ZERO,		// VkStencilOp	depthFailOp;
697120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				VK_COMPARE_OP_NEVER,	// VkCompareOp	compareOp;
698120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				0u,						// deUint32		compareMask;
699120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				0u,						// deUint32		writeMask;
700120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				0u						// deUint32		reference;
70183a6066224454de177655eb414dd3453c2059536Dae Kim			},
70283a6066224454de177655eb414dd3453c2059536Dae Kim			{															// VkStencilOpState	back;
703120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				VK_STENCIL_OP_ZERO,		// VkStencilOp	failOp;
704120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				VK_STENCIL_OP_ZERO,		// VkStencilOp	passOp;
705120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				VK_STENCIL_OP_ZERO,		// VkStencilOp	depthFailOp;
706120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				VK_COMPARE_OP_NEVER,	// VkCompareOp	compareOp;
707120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				0u,						// deUint32		compareMask;
708120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				0u,						// deUint32		writeMask;
709120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				0u						// deUint32		reference;
71083a6066224454de177655eb414dd3453c2059536Dae Kim			},
7111d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski			0.0f,														// float			minDepthBounds;
7121d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski			1.0f														// float			maxDepthBounds;
71383a6066224454de177655eb414dd3453c2059536Dae Kim		};
71483a6066224454de177655eb414dd3453c2059536Dae Kim
71583a6066224454de177655eb414dd3453c2059536Dae Kim		const VkGraphicsPipelineCreateInfo graphicsPipelineParams =
71683a6066224454de177655eb414dd3453c2059536Dae Kim		{
71783a6066224454de177655eb414dd3453c2059536Dae Kim			VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,	// VkStructureType									sType;
71883a6066224454de177655eb414dd3453c2059536Dae Kim			DE_NULL,											// const void*										pNext;
719120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,													// VkPipelineCreateFlags							flags;
72083a6066224454de177655eb414dd3453c2059536Dae Kim			2u,													// deUint32											stageCount;
721120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			shaderStages,										// const VkPipelineShaderStageCreateInfo*			pStages;
72283a6066224454de177655eb414dd3453c2059536Dae Kim			&vertexInputStateParams,							// const VkPipelineVertexInputStateCreateInfo*		pVertexInputState;
72383a6066224454de177655eb414dd3453c2059536Dae Kim			&inputAssemblyStateParams,							// const VkPipelineInputAssemblyStateCreateInfo*	pInputAssemblyState;
72483a6066224454de177655eb414dd3453c2059536Dae Kim			DE_NULL,											// const VkPipelineTessellationStateCreateInfo*		pTessellationState;
72583a6066224454de177655eb414dd3453c2059536Dae Kim			&viewportStateParams,								// const VkPipelineViewportStateCreateInfo*			pViewportState;
726120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			&rasterStateParams,									// const VkPipelineRasterizationStateCreateInfo*	pRasterizationState;
72783a6066224454de177655eb414dd3453c2059536Dae Kim			&multisampleStateParams,							// const VkPipelineMultisampleStateCreateInfo*		pMultisampleState;
72883a6066224454de177655eb414dd3453c2059536Dae Kim			&depthStencilStateParams,							// const VkPipelineDepthStencilStateCreateInfo*		pDepthStencilState;
72983a6066224454de177655eb414dd3453c2059536Dae Kim			&colorBlendStateParams,								// const VkPipelineColorBlendStateCreateInfo*		pColorBlendState;
73086a8ae9e0d61bbfe1f1e273fdbb026369bdb5f29Pyry Haulos			(const VkPipelineDynamicStateCreateInfo*)DE_NULL,	// const VkPipelineDynamicStateCreateInfo*			pDynamicState;
73183a6066224454de177655eb414dd3453c2059536Dae Kim			*m_pipelineLayout,									// VkPipelineLayout									layout;
73283a6066224454de177655eb414dd3453c2059536Dae Kim			*m_renderPass,										// VkRenderPass										renderPass;
73383a6066224454de177655eb414dd3453c2059536Dae Kim			0u,													// deUint32											subpass;
73483a6066224454de177655eb414dd3453c2059536Dae Kim			0u,													// VkPipeline										basePipelineHandle;
73583a6066224454de177655eb414dd3453c2059536Dae Kim			0u													// deInt32											basePipelineIndex;
73683a6066224454de177655eb414dd3453c2059536Dae Kim		};
73783a6066224454de177655eb414dd3453c2059536Dae Kim
73883a6066224454de177655eb414dd3453c2059536Dae Kim		m_graphicsPipeline	= createGraphicsPipeline(vk, vkDevice, DE_NULL, &graphicsPipelineParams);
73983a6066224454de177655eb414dd3453c2059536Dae Kim	}
74083a6066224454de177655eb414dd3453c2059536Dae Kim
74183a6066224454de177655eb414dd3453c2059536Dae Kim	// Create vertex buffer
74283a6066224454de177655eb414dd3453c2059536Dae Kim	{
743120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		const VkDeviceSize			vertexBufferSize	= (VkDeviceSize)(m_vertices.size() * sizeof(Vertex4Tex4));
744120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		const VkBufferCreateInfo	vertexBufferParams	=
74583a6066224454de177655eb414dd3453c2059536Dae Kim		{
74683a6066224454de177655eb414dd3453c2059536Dae Kim			VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,		// VkStructureType		sType;
74783a6066224454de177655eb414dd3453c2059536Dae Kim			DE_NULL,									// const void*			pNext;
74883a6066224454de177655eb414dd3453c2059536Dae Kim			0u,											// VkBufferCreateFlags	flags;
749120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			vertexBufferSize,							// VkDeviceSize			size;
750120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_BUFFER_USAGE_VERTEX_BUFFER_BIT,			// VkBufferUsageFlags	usage;
75183a6066224454de177655eb414dd3453c2059536Dae Kim			VK_SHARING_MODE_EXCLUSIVE,					// VkSharingMode		sharingMode;
752120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			1u,											// deUint32				queueFamilyIndexCount;
75383a6066224454de177655eb414dd3453c2059536Dae Kim			&queueFamilyIndex							// const deUint32*		pQueueFamilyIndices;
75483a6066224454de177655eb414dd3453c2059536Dae Kim		};
75583a6066224454de177655eb414dd3453c2059536Dae Kim
756120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		DE_ASSERT(vertexBufferSize > 0);
757120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim
75883a6066224454de177655eb414dd3453c2059536Dae Kim		m_vertexBuffer		= createBuffer(vk, vkDevice, &vertexBufferParams);
75912b099d59111b60518c581364fd026b6cfadf7d1Boris Zanin		m_vertexBufferAlloc = allocateBuffer(vki, vk, physDevice, vkDevice, *m_vertexBuffer, MemoryRequirement::HostVisible, memAlloc, m_allocationKind);
76083a6066224454de177655eb414dd3453c2059536Dae Kim		VK_CHECK(vk.bindBufferMemory(vkDevice, *m_vertexBuffer, m_vertexBufferAlloc->getMemory(), m_vertexBufferAlloc->getOffset()));
76183a6066224454de177655eb414dd3453c2059536Dae Kim
76283a6066224454de177655eb414dd3453c2059536Dae Kim		// Load vertices into vertex buffer
763c898c7d8e107a11ad4268ffc74d0c4d0a96877d3Pyry Haulos		deMemcpy(m_vertexBufferAlloc->getHostPtr(), &m_vertices[0], (size_t)vertexBufferSize);
76483a6066224454de177655eb414dd3453c2059536Dae Kim		flushMappedMemoryRange(vk, vkDevice, m_vertexBufferAlloc->getMemory(), m_vertexBufferAlloc->getOffset(), vertexBufferParams.size);
76583a6066224454de177655eb414dd3453c2059536Dae Kim	}
76683a6066224454de177655eb414dd3453c2059536Dae Kim
76783a6066224454de177655eb414dd3453c2059536Dae Kim	// Create command pool
76855dd4426673bd260dde56addcfea802f21c31304Mika Isojärvi	m_cmdPool = createCommandPool(vk, vkDevice, VK_COMMAND_POOL_CREATE_TRANSIENT_BIT, queueFamilyIndex);
76983a6066224454de177655eb414dd3453c2059536Dae Kim
77083a6066224454de177655eb414dd3453c2059536Dae Kim	// Create command buffer
77183a6066224454de177655eb414dd3453c2059536Dae Kim	{
772120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		const VkCommandBufferBeginInfo cmdBufferBeginInfo =
77383a6066224454de177655eb414dd3453c2059536Dae Kim		{
774120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,	// VkStructureType					sType;
775120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			DE_NULL,										// const void*						pNext;
776120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,												// VkCommandBufferUsageFlags		flags;
777689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos			(const VkCommandBufferInheritanceInfo*)DE_NULL,
77883a6066224454de177655eb414dd3453c2059536Dae Kim		};
77983a6066224454de177655eb414dd3453c2059536Dae Kim
780f6fec4bb68bf60b1625d3bd9571aac0081f41107Maciej Jesionowski		const std::vector<VkClearValue> attachmentClearValues (m_imageCount, defaultClearValue(m_colorFormat));
78183a6066224454de177655eb414dd3453c2059536Dae Kim
78283a6066224454de177655eb414dd3453c2059536Dae Kim		const VkRenderPassBeginInfo renderPassBeginInfo =
78383a6066224454de177655eb414dd3453c2059536Dae Kim		{
78483a6066224454de177655eb414dd3453c2059536Dae Kim			VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,				// VkStructureType		sType;
78583a6066224454de177655eb414dd3453c2059536Dae Kim			DE_NULL,												// const void*			pNext;
78683a6066224454de177655eb414dd3453c2059536Dae Kim			*m_renderPass,											// VkRenderPass			renderPass;
78783a6066224454de177655eb414dd3453c2059536Dae Kim			*m_framebuffer,											// VkFramebuffer		framebuffer;
788689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos			{
789689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos				{ 0, 0 },
790689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos				{ (deUint32)m_renderSize.x(), (deUint32)m_renderSize.y() }
791689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos			},														// VkRect2D				renderArea;
792f6fec4bb68bf60b1625d3bd9571aac0081f41107Maciej Jesionowski			static_cast<deUint32>(attachmentClearValues.size()),	// deUint32				clearValueCount;
793f6fec4bb68bf60b1625d3bd9571aac0081f41107Maciej Jesionowski			&attachmentClearValues[0]								// const VkClearValue*	pClearValues;
79483a6066224454de177655eb414dd3453c2059536Dae Kim		};
79583a6066224454de177655eb414dd3453c2059536Dae Kim
796235561df842620267f9a58552f1506ae1012133fDominik Witczak		std::vector<VkImageMemoryBarrier> preAttachmentBarriers(m_imageCount);
797235561df842620267f9a58552f1506ae1012133fDominik Witczak
798235561df842620267f9a58552f1506ae1012133fDominik Witczak		for (int imgNdx = 0; imgNdx < m_imageCount; ++imgNdx)
7991d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski		{
800235561df842620267f9a58552f1506ae1012133fDominik Witczak			preAttachmentBarriers[imgNdx].sType								= VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;	// VkStructureType			sType;
801235561df842620267f9a58552f1506ae1012133fDominik Witczak			preAttachmentBarriers[imgNdx].pNext								= DE_NULL;									// const void*				pNext;
802235561df842620267f9a58552f1506ae1012133fDominik Witczak			preAttachmentBarriers[imgNdx].srcAccessMask						= 0u;										// VkAccessFlags			srcAccessMask;
803235561df842620267f9a58552f1506ae1012133fDominik Witczak			preAttachmentBarriers[imgNdx].dstAccessMask						= VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;		// VkAccessFlags			dstAccessMask;
804235561df842620267f9a58552f1506ae1012133fDominik Witczak			preAttachmentBarriers[imgNdx].oldLayout							= VK_IMAGE_LAYOUT_UNDEFINED;				// VkImageLayout			oldLayout;
805235561df842620267f9a58552f1506ae1012133fDominik Witczak			preAttachmentBarriers[imgNdx].newLayout							= VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;	// VkImageLayout			newLayout;
806235561df842620267f9a58552f1506ae1012133fDominik Witczak			preAttachmentBarriers[imgNdx].srcQueueFamilyIndex				= VK_QUEUE_FAMILY_IGNORED;					// deUint32					srcQueueFamilyIndex;
807235561df842620267f9a58552f1506ae1012133fDominik Witczak			preAttachmentBarriers[imgNdx].dstQueueFamilyIndex				= VK_QUEUE_FAMILY_IGNORED;					// deUint32					dstQueueFamilyIndex;
808235561df842620267f9a58552f1506ae1012133fDominik Witczak			preAttachmentBarriers[imgNdx].image								= **m_colorImages[imgNdx];					// VkImage					image;
809235561df842620267f9a58552f1506ae1012133fDominik Witczak			preAttachmentBarriers[imgNdx].subresourceRange.aspectMask		= VK_IMAGE_ASPECT_COLOR_BIT;				// VkImageSubresourceRange	subresourceRange;
810235561df842620267f9a58552f1506ae1012133fDominik Witczak			preAttachmentBarriers[imgNdx].subresourceRange.baseMipLevel		= 0u;
811235561df842620267f9a58552f1506ae1012133fDominik Witczak			preAttachmentBarriers[imgNdx].subresourceRange.levelCount		= 1u;
812235561df842620267f9a58552f1506ae1012133fDominik Witczak			preAttachmentBarriers[imgNdx].subresourceRange.baseArrayLayer	= 0u;
813235561df842620267f9a58552f1506ae1012133fDominik Witczak			preAttachmentBarriers[imgNdx].subresourceRange.layerCount		= 1u;
814235561df842620267f9a58552f1506ae1012133fDominik Witczak		}
8151d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski
81655dd4426673bd260dde56addcfea802f21c31304Mika Isojärvi		m_cmdBuffer = allocateCommandBuffer(vk, vkDevice, *m_cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY);
81783a6066224454de177655eb414dd3453c2059536Dae Kim
81883a6066224454de177655eb414dd3453c2059536Dae Kim		VK_CHECK(vk.beginCommandBuffer(*m_cmdBuffer, &cmdBufferBeginInfo));
8191d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski
8201d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski		vk.cmdPipelineBarrier(*m_cmdBuffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, (VkDependencyFlags)0,
821235561df842620267f9a58552f1506ae1012133fDominik Witczak			0u, DE_NULL, 0u, DE_NULL, (deUint32)m_imageCount, &preAttachmentBarriers[0]);
8221d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski
823120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		vk.cmdBeginRenderPass(*m_cmdBuffer, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
82483a6066224454de177655eb414dd3453c2059536Dae Kim
82583a6066224454de177655eb414dd3453c2059536Dae Kim		vk.cmdBindPipeline(*m_cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *m_graphicsPipeline);
82683a6066224454de177655eb414dd3453c2059536Dae Kim
82783a6066224454de177655eb414dd3453c2059536Dae Kim		vk.cmdBindDescriptorSets(*m_cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *m_pipelineLayout, 0, 1, &m_descriptorSet.get(), 0, DE_NULL);
82883a6066224454de177655eb414dd3453c2059536Dae Kim
82983a6066224454de177655eb414dd3453c2059536Dae Kim		const VkDeviceSize vertexBufferOffset = 0;
83083a6066224454de177655eb414dd3453c2059536Dae Kim		vk.cmdBindVertexBuffers(*m_cmdBuffer, 0, 1, &m_vertexBuffer.get(), &vertexBufferOffset);
83183a6066224454de177655eb414dd3453c2059536Dae Kim		vk.cmdDraw(*m_cmdBuffer, (deUint32)m_vertices.size(), 1, 0, 0);
83283a6066224454de177655eb414dd3453c2059536Dae Kim
83383a6066224454de177655eb414dd3453c2059536Dae Kim		vk.cmdEndRenderPass(*m_cmdBuffer);
83483a6066224454de177655eb414dd3453c2059536Dae Kim		VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
83583a6066224454de177655eb414dd3453c2059536Dae Kim	}
83683a6066224454de177655eb414dd3453c2059536Dae Kim
83783a6066224454de177655eb414dd3453c2059536Dae Kim	// Create fence
83855dd4426673bd260dde56addcfea802f21c31304Mika Isojärvi	m_fence = createFence(vk, vkDevice);
83983a6066224454de177655eb414dd3453c2059536Dae Kim}
84083a6066224454de177655eb414dd3453c2059536Dae Kim
84183a6066224454de177655eb414dd3453c2059536Dae KimImageSamplingInstance::~ImageSamplingInstance (void)
84283a6066224454de177655eb414dd3453c2059536Dae Kim{
84383a6066224454de177655eb414dd3453c2059536Dae Kim}
84483a6066224454de177655eb414dd3453c2059536Dae Kim
84583a6066224454de177655eb414dd3453c2059536Dae Kimtcu::TestStatus ImageSamplingInstance::iterate (void)
84683a6066224454de177655eb414dd3453c2059536Dae Kim{
84783a6066224454de177655eb414dd3453c2059536Dae Kim	const DeviceInterface&		vk			= m_context.getDeviceInterface();
84883a6066224454de177655eb414dd3453c2059536Dae Kim	const VkDevice				vkDevice	= m_context.getDevice();
84983a6066224454de177655eb414dd3453c2059536Dae Kim	const VkQueue				queue		= m_context.getUniversalQueue();
850120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	const VkSubmitInfo			submitInfo	=
851120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	{
852120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		VK_STRUCTURE_TYPE_SUBMIT_INFO,	// VkStructureType			sType;
853120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		DE_NULL,						// const void*				pNext;
854120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		0u,								// deUint32					waitSemaphoreCount;
855120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		DE_NULL,						// const VkSemaphore*		pWaitSemaphores;
856689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos		DE_NULL,
857120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		1u,								// deUint32					commandBufferCount;
858120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		&m_cmdBuffer.get(),				// const VkCommandBuffer*	pCommandBuffers;
859120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		0u,								// deUint32					signalSemaphoreCount;
860120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		DE_NULL							// const VkSemaphore*		pSignalSemaphores;
861120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	};
86283a6066224454de177655eb414dd3453c2059536Dae Kim
86383a6066224454de177655eb414dd3453c2059536Dae Kim	VK_CHECK(vk.resetFences(vkDevice, 1, &m_fence.get()));
864120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	VK_CHECK(vk.queueSubmit(queue, 1, &submitInfo, *m_fence));
86583a6066224454de177655eb414dd3453c2059536Dae Kim	VK_CHECK(vk.waitForFences(vkDevice, 1, &m_fence.get(), true, ~(0ull) /* infinity */));
86683a6066224454de177655eb414dd3453c2059536Dae Kim
86783a6066224454de177655eb414dd3453c2059536Dae Kim	return verifyImage();
86883a6066224454de177655eb414dd3453c2059536Dae Kim}
86983a6066224454de177655eb414dd3453c2059536Dae Kim
870387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulosnamespace
871387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos{
872387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
873387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulosbool isLookupResultValid (const tcu::Texture1DView&		texture,
874387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos						  const tcu::Sampler&			sampler,
875387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos						  const tcu::LookupPrecision&	precision,
876387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos						  const tcu::Vec4&				coords,
877387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos						  const tcu::Vec2&				lodBounds,
878387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos						  const tcu::Vec4&				result)
879387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos{
880387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	return tcu::isLookupResultValid(texture, sampler, precision, coords.x(), lodBounds, result);
881387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos}
882387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
883387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulosbool isLookupResultValid (const tcu::Texture1DArrayView&	texture,
884387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos						  const tcu::Sampler&				sampler,
885387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos						  const tcu::LookupPrecision&		precision,
886387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos						  const tcu::Vec4&					coords,
887387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos						  const tcu::Vec2&					lodBounds,
888387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos						  const tcu::Vec4&					result)
889387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos{
890387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	return tcu::isLookupResultValid(texture, sampler, precision, coords.swizzle(0,1), lodBounds, result);
891387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos}
892387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
893387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulosbool isLookupResultValid (const tcu::Texture2DView&		texture,
894387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos						  const tcu::Sampler&			sampler,
895387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos						  const tcu::LookupPrecision&	precision,
896387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos						  const tcu::Vec4&				coords,
897387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos						  const tcu::Vec2&				lodBounds,
898387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos						  const tcu::Vec4&				result)
899387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos{
900387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	return tcu::isLookupResultValid(texture, sampler, precision, coords.swizzle(0,1), lodBounds, result);
901387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos}
902387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
903387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulosbool isLookupResultValid (const tcu::Texture2DArrayView&	texture,
904387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos						  const tcu::Sampler&				sampler,
905387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos						  const tcu::LookupPrecision&		precision,
906387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos						  const tcu::Vec4&					coords,
907387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos						  const tcu::Vec2&					lodBounds,
908387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos						  const tcu::Vec4&					result)
909387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos{
910387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	return tcu::isLookupResultValid(texture, sampler, precision, coords.swizzle(0,1,2), lodBounds, result);
911387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos}
912387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
913387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulosbool isLookupResultValid (const tcu::TextureCubeView&	texture,
914387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos						  const tcu::Sampler&			sampler,
915387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos						  const tcu::LookupPrecision&	precision,
916387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos						  const tcu::Vec4&				coords,
917387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos						  const tcu::Vec2&				lodBounds,
918387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos						  const tcu::Vec4&				result)
919387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos{
920387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	return tcu::isLookupResultValid(texture, sampler, precision, coords.swizzle(0,1,2), lodBounds, result);
921387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos}
922387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
923387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulosbool isLookupResultValid (const tcu::TextureCubeArrayView&	texture,
924387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos						  const tcu::Sampler&				sampler,
925387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos						  const tcu::LookupPrecision&		precision,
926387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos						  const tcu::Vec4&					coords,
927387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos						  const tcu::Vec2&					lodBounds,
928387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos						  const tcu::Vec4&					result)
929387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos{
930387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	return tcu::isLookupResultValid(texture, sampler, precision, tcu::IVec4(precision.coordBits.x()), coords, lodBounds, result);
931387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos}
932387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
933387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulosbool isLookupResultValid(const tcu::Texture3DView&		texture,
934387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos						 const tcu::Sampler&			sampler,
935387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos						 const tcu::LookupPrecision&	precision,
936387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos						 const tcu::Vec4&				coords,
937387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos						 const tcu::Vec2&				lodBounds,
938387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos						 const tcu::Vec4&				result)
939387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos{
940387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	return tcu::isLookupResultValid(texture, sampler, precision, coords.swizzle(0,1,2), lodBounds, result);
941387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos}
942387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
943387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulostemplate<typename TextureViewType>
944387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulosbool validateResultImage (const TextureViewType&				texture,
945387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos						  const tcu::Sampler&					sampler,
946387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos						  const tcu::ConstPixelBufferAccess&	texCoords,
947387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos						  const tcu::Vec2&						lodBounds,
948387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos						  const tcu::LookupPrecision&			lookupPrecision,
949387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos						  const tcu::Vec4&						lookupScale,
950387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos						  const tcu::Vec4&						lookupBias,
951387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos						  const tcu::ConstPixelBufferAccess&	result,
952387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos						  const tcu::PixelBufferAccess&			errorMask)
953387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos{
954387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	const int	w		= result.getWidth();
955387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	const int	h		= result.getHeight();
956387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	bool		allOk	= true;
957387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
958387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	for (int y = 0; y < h; ++y)
959387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	{
960387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos		for (int x = 0; x < w; ++x)
961387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos		{
962387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos			const tcu::Vec4		resultPixel	= result.getPixel(x, y);
963387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos			const tcu::Vec4		resultColor	= (resultPixel - lookupBias) / lookupScale;
964387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos			const tcu::Vec4		texCoord	= texCoords.getPixel(x, y);
965387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos			const bool			pixelOk		= isLookupResultValid(texture, sampler, lookupPrecision, texCoord, lodBounds, resultColor);
966387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
967387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos			errorMask.setPixel(tcu::Vec4(pixelOk?0.0f:1.0f, pixelOk?1.0f:0.0f, 0.0f, 1.0f), x, y);
968387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
969387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos			if (!pixelOk)
970387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos				allOk = false;
971387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos		}
972387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	}
973387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
974387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	return allOk;
975387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos}
976387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
977387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulostemplate<typename ScalarType>
978387999c58e55306e26ea6a8abd371174d35ee640Pyry HaulosScalarType getSwizzledComp (const tcu::Vector<ScalarType, 4>& vec, vk::VkComponentSwizzle comp, int identityNdx)
979387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos{
980387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	if (comp == vk::VK_COMPONENT_SWIZZLE_IDENTITY)
981387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos		return vec[identityNdx];
982387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	else if (comp == vk::VK_COMPONENT_SWIZZLE_ZERO)
983387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos		return ScalarType(0);
984387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	else if (comp == vk::VK_COMPONENT_SWIZZLE_ONE)
985387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos		return ScalarType(1);
986387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	else
987387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos		return vec[comp - vk::VK_COMPONENT_SWIZZLE_R];
988387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos}
989387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
990387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulostemplate<typename ScalarType>
991387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulostcu::Vector<ScalarType, 4> swizzle (const tcu::Vector<ScalarType, 4>& vec, const vk::VkComponentMapping& swz)
992387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos{
993387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	return tcu::Vector<ScalarType, 4>(getSwizzledComp(vec, swz.r, 0),
994387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos									  getSwizzledComp(vec, swz.g, 1),
995387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos									  getSwizzledComp(vec, swz.b, 2),
996387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos									  getSwizzledComp(vec, swz.a, 3));
997387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos}
998387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
999387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulostcu::Vec4 swizzleScaleBias (const tcu::Vec4& vec, const vk::VkComponentMapping& swz)
1000387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos{
1001387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	const float channelValues[] =
1002387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	{
1003387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos		1.0f, // -1
1004387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos		1.0f, // 0
1005387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos		1.0f,
1006387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos		vec.x(),
1007387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos		vec.y(),
1008387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos		vec.z(),
1009387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos		vec.w()
1010387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	};
1011387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
1012387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	return tcu::Vec4(channelValues[swz.r], channelValues[swz.g], channelValues[swz.b], channelValues[swz.a]);
1013387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos}
1014387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
1015387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulostemplate<typename ScalarType>
1016387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulosvoid swizzleT (const tcu::ConstPixelBufferAccess& src, const tcu::PixelBufferAccess& dst, const vk::VkComponentMapping& swz)
1017387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos{
1018387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	for (int z = 0; z < dst.getDepth(); ++z)
1019387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	for (int y = 0; y < dst.getHeight(); ++y)
1020387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	for (int x = 0; x < dst.getWidth(); ++x)
1021387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos		dst.setPixel(swizzle(src.getPixelT<ScalarType>(x, y, z), swz), x, y, z);
1022387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos}
1023387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
1024387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulosvoid swizzleFromSRGB (const tcu::ConstPixelBufferAccess& src, const tcu::PixelBufferAccess& dst, const vk::VkComponentMapping& swz)
1025387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos{
1026387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	for (int z = 0; z < dst.getDepth(); ++z)
1027387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	for (int y = 0; y < dst.getHeight(); ++y)
1028387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	for (int x = 0; x < dst.getWidth(); ++x)
1029387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos		dst.setPixel(swizzle(tcu::sRGBToLinear(src.getPixelT<float>(x, y, z)), swz), x, y, z);
1030387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos}
1031387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
1032387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulosvoid swizzle (const tcu::ConstPixelBufferAccess& src, const tcu::PixelBufferAccess& dst, const vk::VkComponentMapping& swz)
1033387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos{
1034387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	const tcu::TextureChannelClass	chnClass	= tcu::getTextureChannelClass(dst.getFormat().type);
1035387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
1036387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	DE_ASSERT(src.getWidth() == dst.getWidth() &&
1037387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos			  src.getHeight() == dst.getHeight() &&
1038387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos			  src.getDepth() == dst.getDepth());
1039387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
1040387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	if (chnClass == tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER)
1041387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos		swizzleT<deInt32>(src, dst, swz);
1042387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	else if (chnClass == tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER)
1043387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos		swizzleT<deUint32>(src, dst, swz);
1044387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	else if (tcu::isSRGB(src.getFormat()) && !tcu::isSRGB(dst.getFormat()))
1045387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos		swizzleFromSRGB(src, dst, swz);
1046387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	else
1047387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos		swizzleT<float>(src, dst, swz);
1048387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos}
1049387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
1050387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulosbool isIdentitySwizzle (const vk::VkComponentMapping& swz)
1051387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos{
1052387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	return (swz.r == vk::VK_COMPONENT_SWIZZLE_IDENTITY || swz.r == vk::VK_COMPONENT_SWIZZLE_R) &&
1053387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos		   (swz.g == vk::VK_COMPONENT_SWIZZLE_IDENTITY || swz.g == vk::VK_COMPONENT_SWIZZLE_G) &&
1054387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos		   (swz.b == vk::VK_COMPONENT_SWIZZLE_IDENTITY || swz.b == vk::VK_COMPONENT_SWIZZLE_B) &&
1055387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos		   (swz.a == vk::VK_COMPONENT_SWIZZLE_IDENTITY || swz.a == vk::VK_COMPONENT_SWIZZLE_A);
1056387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos}
1057387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
1058387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulostemplate<typename TextureViewType> struct TexViewTraits;
1059387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
1060387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulostemplate<> struct TexViewTraits<tcu::Texture1DView>			{ typedef tcu::Texture1D		TextureType; };
1061387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulostemplate<> struct TexViewTraits<tcu::Texture1DArrayView>	{ typedef tcu::Texture1DArray	TextureType; };
1062387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulostemplate<> struct TexViewTraits<tcu::Texture2DView>			{ typedef tcu::Texture2D		TextureType; };
1063387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulostemplate<> struct TexViewTraits<tcu::Texture2DArrayView>	{ typedef tcu::Texture2DArray	TextureType; };
1064387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulostemplate<> struct TexViewTraits<tcu::TextureCubeView>		{ typedef tcu::TextureCube		TextureType; };
1065387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulostemplate<> struct TexViewTraits<tcu::TextureCubeArrayView>	{ typedef tcu::TextureCubeArray	TextureType; };
1066387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulostemplate<> struct TexViewTraits<tcu::Texture3DView>			{ typedef tcu::Texture3D		TextureType; };
1067387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
1068387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulostemplate<typename TextureViewType>
1069387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulostypename TexViewTraits<TextureViewType>::TextureType* createSkeletonClone (tcu::TextureFormat format, const tcu::ConstPixelBufferAccess& level0);
1070387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
1071387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulostcu::TextureFormat getSwizzleTargetFormat (tcu::TextureFormat format)
1072387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos{
1073387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	// Swizzled texture needs to hold all four channels
1074387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	// \todo [2016-09-21 pyry] We could save some memory by using smaller formats
1075387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	//						   when possible (for example U8).
1076387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
1077387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	const tcu::TextureChannelClass	chnClass	= tcu::getTextureChannelClass(format.type);
1078387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
1079387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	if (chnClass == tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER)
1080387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos		return tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::SIGNED_INT32);
1081387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	else if (chnClass == tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER)
1082387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos		return tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNSIGNED_INT32);
1083387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	else
1084387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos		return tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::FLOAT);
1085387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos}
1086387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
1087387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulostemplate<>
1088387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulostcu::Texture1D* createSkeletonClone<tcu::Texture1DView> (tcu::TextureFormat format, const tcu::ConstPixelBufferAccess& level0)
1089387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos{
1090387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	return new tcu::Texture1D(format, level0.getWidth());
1091387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos}
1092387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
1093387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulostemplate<>
1094387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulostcu::Texture1DArray* createSkeletonClone<tcu::Texture1DArrayView> (tcu::TextureFormat format, const tcu::ConstPixelBufferAccess& level0)
1095387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos{
1096387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	return new tcu::Texture1DArray(format, level0.getWidth(), level0.getHeight());
1097387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos}
1098387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
1099387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulostemplate<>
1100387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulostcu::Texture2D* createSkeletonClone<tcu::Texture2DView> (tcu::TextureFormat format, const tcu::ConstPixelBufferAccess& level0)
1101387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos{
1102387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	return new tcu::Texture2D(format, level0.getWidth(), level0.getHeight());
1103387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos}
1104387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
1105387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulostemplate<>
1106387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulostcu::Texture2DArray* createSkeletonClone<tcu::Texture2DArrayView> (tcu::TextureFormat format, const tcu::ConstPixelBufferAccess& level0)
1107387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos{
1108387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	return new tcu::Texture2DArray(format, level0.getWidth(), level0.getHeight(), level0.getDepth());
1109387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos}
1110387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
1111387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulostemplate<>
1112387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulostcu::Texture3D* createSkeletonClone<tcu::Texture3DView> (tcu::TextureFormat format, const tcu::ConstPixelBufferAccess& level0)
1113387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos{
1114387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	return new tcu::Texture3D(format, level0.getWidth(), level0.getHeight(), level0.getDepth());
1115387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos}
1116387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
1117387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulostemplate<>
1118387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulostcu::TextureCubeArray* createSkeletonClone<tcu::TextureCubeArrayView> (tcu::TextureFormat format, const tcu::ConstPixelBufferAccess& level0)
1119387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos{
1120387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	return new tcu::TextureCubeArray(format, level0.getWidth(), level0.getDepth());
1121387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos}
1122387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
1123387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulostemplate<typename TextureViewType>
1124387999c58e55306e26ea6a8abd371174d35ee640Pyry HaulosMovePtr<typename TexViewTraits<TextureViewType>::TextureType> createSwizzledCopy (const TextureViewType& texture, const vk::VkComponentMapping& swz)
1125387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos{
1126387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	MovePtr<typename TexViewTraits<TextureViewType>::TextureType>	copy	(createSkeletonClone<TextureViewType>(getSwizzleTargetFormat(texture.getLevel(0).getFormat()), texture.getLevel(0)));
1127387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
1128387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	for (int levelNdx = 0; levelNdx < texture.getNumLevels(); ++levelNdx)
1129387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	{
1130387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos		copy->allocLevel(levelNdx);
1131387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos		swizzle(texture.getLevel(levelNdx), copy->getLevel(levelNdx), swz);
1132387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	}
1133387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
1134387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	return copy;
1135387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos}
1136387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
1137387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulostemplate<>
1138387999c58e55306e26ea6a8abd371174d35ee640Pyry HaulosMovePtr<tcu::TextureCube> createSwizzledCopy (const tcu::TextureCubeView& texture, const vk::VkComponentMapping& swz)
1139387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos{
1140387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	MovePtr<tcu::TextureCube>	copy	(new tcu::TextureCube(getSwizzleTargetFormat(texture.getLevelFace(0, tcu::CUBEFACE_NEGATIVE_X).getFormat()), texture.getSize()));
1141387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
1142387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	for (int faceNdx = 0; faceNdx < tcu::CUBEFACE_LAST; ++faceNdx)
1143387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	{
1144387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos		for (int levelNdx = 0; levelNdx < texture.getNumLevels(); ++levelNdx)
1145387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos		{
1146387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos			copy->allocLevel((tcu::CubeFace)faceNdx, levelNdx);
1147387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos			swizzle(texture.getLevelFace(levelNdx, (tcu::CubeFace)faceNdx), copy->getLevelFace(levelNdx, (tcu::CubeFace)faceNdx), swz);
1148387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos		}
1149387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	}
1150387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
1151387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	return copy;
1152387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos}
1153387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
1154387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulostemplate<typename TextureViewType>
1155387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulosbool validateResultImage (const TextureViewType&				texture,
1156387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos						  const tcu::Sampler&					sampler,
1157387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos						  const vk::VkComponentMapping&			swz,
1158387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos						  const tcu::ConstPixelBufferAccess&	texCoords,
1159387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos						  const tcu::Vec2&						lodBounds,
1160387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos						  const tcu::LookupPrecision&			lookupPrecision,
1161387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos						  const tcu::Vec4&						lookupScale,
1162387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos						  const tcu::Vec4&						lookupBias,
1163387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos						  const tcu::ConstPixelBufferAccess&	result,
1164387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos						  const tcu::PixelBufferAccess&			errorMask)
1165387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos{
1166387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	if (isIdentitySwizzle(swz))
1167387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos		return validateResultImage(texture, sampler, texCoords, lodBounds, lookupPrecision, lookupScale, lookupBias, result, errorMask);
1168387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	else
1169387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	{
1170387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos		// There is (currently) no way to handle swizzling inside validation loop
1171387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos		// and thus we need to pre-swizzle the texture.
1172387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos		UniquePtr<typename TexViewTraits<TextureViewType>::TextureType>	swizzledTex	(createSwizzledCopy(texture, swz));
1173387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
1174387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos		return validateResultImage(*swizzledTex, sampler, texCoords, lodBounds, lookupPrecision, swizzleScaleBias(lookupScale, swz), swizzleScaleBias(lookupBias, swz), result, errorMask);
1175387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	}
1176387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos}
1177387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
1178387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulosvk::VkImageSubresourceRange resolveSubresourceRange (const TestTexture& testTexture, const vk::VkImageSubresourceRange& subresource)
1179387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos{
1180387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	vk::VkImageSubresourceRange	resolved					= subresource;
1181387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
1182387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	if (subresource.levelCount == VK_REMAINING_MIP_LEVELS)
1183387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos		resolved.levelCount = testTexture.getNumLevels()-subresource.baseMipLevel;
1184387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
1185387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	if (subresource.layerCount == VK_REMAINING_ARRAY_LAYERS)
1186387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos		resolved.layerCount = testTexture.getArraySize()-subresource.baseArrayLayer;
1187387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
1188387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	return resolved;
1189387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos}
1190387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
1191387999c58e55306e26ea6a8abd371174d35ee640Pyry HaulosMovePtr<tcu::Texture1DView> getTexture1DView (const TestTexture& testTexture, const vk::VkImageSubresourceRange& subresource, std::vector<tcu::ConstPixelBufferAccess>& levels)
1192387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos{
1193387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	DE_ASSERT(subresource.layerCount == 1);
1194387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
1195387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	levels.resize(subresource.levelCount);
1196387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
1197387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	for (int levelNdx = 0; levelNdx < (int)levels.size(); ++levelNdx)
1198387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	{
1199387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos		const tcu::ConstPixelBufferAccess& srcLevel = testTexture.getLevel((int)subresource.baseMipLevel+levelNdx, subresource.baseArrayLayer);
1200387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
1201387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos		levels[levelNdx] = tcu::getSubregion(srcLevel, 0, 0, 0, srcLevel.getWidth(), 1, 1);
1202387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	}
1203387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
1204387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	return MovePtr<tcu::Texture1DView>(new tcu::Texture1DView((int)levels.size(), &levels[0]));
1205387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos}
1206387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
1207387999c58e55306e26ea6a8abd371174d35ee640Pyry HaulosMovePtr<tcu::Texture1DArrayView> getTexture1DArrayView (const TestTexture& testTexture, const vk::VkImageSubresourceRange& subresource, std::vector<tcu::ConstPixelBufferAccess>& levels)
1208387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos{
1209387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	const TestTexture1D*		tex1D		= dynamic_cast<const TestTexture1D*>(&testTexture);
1210387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	const TestTexture1DArray*	tex1DArray	= dynamic_cast<const TestTexture1DArray*>(&testTexture);
1211387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
1212387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	DE_ASSERT(!!tex1D != !!tex1DArray);
1213387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	DE_ASSERT(tex1DArray || subresource.baseArrayLayer == 0);
1214387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
1215387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	levels.resize(subresource.levelCount);
1216387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
1217387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	for (int levelNdx = 0; levelNdx < (int)levels.size(); ++levelNdx)
1218387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	{
1219387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos		const tcu::ConstPixelBufferAccess& srcLevel = tex1D ? tex1D->getTexture().getLevel((int)subresource.baseMipLevel+levelNdx)
1220387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos															: tex1DArray->getTexture().getLevel((int)subresource.baseMipLevel+levelNdx);
1221387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
1222387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos		levels[levelNdx] = tcu::getSubregion(srcLevel, 0, (int)subresource.baseArrayLayer, 0, srcLevel.getWidth(), (int)subresource.layerCount, 1);
1223387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	}
1224387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
1225387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	return MovePtr<tcu::Texture1DArrayView>(new tcu::Texture1DArrayView((int)levels.size(), &levels[0]));
1226387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos}
1227387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
1228387999c58e55306e26ea6a8abd371174d35ee640Pyry HaulosMovePtr<tcu::Texture2DView> getTexture2DView (const TestTexture& testTexture, const vk::VkImageSubresourceRange& subresource, std::vector<tcu::ConstPixelBufferAccess>& levels)
1229387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos{
1230387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	const TestTexture2D*		tex2D		= dynamic_cast<const TestTexture2D*>(&testTexture);
1231387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	const TestTexture2DArray*	tex2DArray	= dynamic_cast<const TestTexture2DArray*>(&testTexture);
1232387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
1233387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	DE_ASSERT(subresource.layerCount == 1);
1234387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	DE_ASSERT(!!tex2D != !!tex2DArray);
1235387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	DE_ASSERT(tex2DArray || subresource.baseArrayLayer == 0);
1236387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
1237387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	levels.resize(subresource.levelCount);
1238387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
1239387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	for (int levelNdx = 0; levelNdx < (int)levels.size(); ++levelNdx)
1240387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	{
1241387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos		const tcu::ConstPixelBufferAccess& srcLevel = tex2D ? tex2D->getTexture().getLevel((int)subresource.baseMipLevel+levelNdx)
1242387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos															: tex2DArray->getTexture().getLevel((int)subresource.baseMipLevel+levelNdx);
1243387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
1244387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos		levels[levelNdx] = tcu::getSubregion(srcLevel, 0, 0, (int)subresource.baseArrayLayer, srcLevel.getWidth(), srcLevel.getHeight(), 1);
1245387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	}
1246387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
1247387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	return MovePtr<tcu::Texture2DView>(new tcu::Texture2DView((int)levels.size(), &levels[0]));
1248387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos}
1249387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
1250387999c58e55306e26ea6a8abd371174d35ee640Pyry HaulosMovePtr<tcu::Texture2DArrayView> getTexture2DArrayView (const TestTexture& testTexture, const vk::VkImageSubresourceRange& subresource, std::vector<tcu::ConstPixelBufferAccess>& levels)
1251387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos{
1252387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	const TestTexture2D*		tex2D		= dynamic_cast<const TestTexture2D*>(&testTexture);
1253387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	const TestTexture2DArray*	tex2DArray	= dynamic_cast<const TestTexture2DArray*>(&testTexture);
1254387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
1255387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	DE_ASSERT(!!tex2D != !!tex2DArray);
1256387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	DE_ASSERT(tex2DArray || subresource.baseArrayLayer == 0);
1257387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
1258387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	levels.resize(subresource.levelCount);
1259387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
1260387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	for (int levelNdx = 0; levelNdx < (int)levels.size(); ++levelNdx)
1261387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	{
1262387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos		const tcu::ConstPixelBufferAccess& srcLevel = tex2D ? tex2D->getTexture().getLevel((int)subresource.baseMipLevel+levelNdx)
1263387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos															: tex2DArray->getTexture().getLevel((int)subresource.baseMipLevel+levelNdx);
1264387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
1265387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos		levels[levelNdx] = tcu::getSubregion(srcLevel, 0, 0, (int)subresource.baseArrayLayer, srcLevel.getWidth(), srcLevel.getHeight(), (int)subresource.layerCount);
1266387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	}
1267387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
1268387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	return MovePtr<tcu::Texture2DArrayView>(new tcu::Texture2DArrayView((int)levels.size(), &levels[0]));
1269387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos}
1270387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
1271387999c58e55306e26ea6a8abd371174d35ee640Pyry HaulosMovePtr<tcu::TextureCubeView> getTextureCubeView (const TestTexture& testTexture, const vk::VkImageSubresourceRange& subresource, std::vector<tcu::ConstPixelBufferAccess>& levels)
1272387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos{
1273387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	const static tcu::CubeFace s_faceMap[tcu::CUBEFACE_LAST] =
1274387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	{
1275387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos		tcu::CUBEFACE_POSITIVE_X,
1276387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos		tcu::CUBEFACE_NEGATIVE_X,
1277387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos		tcu::CUBEFACE_POSITIVE_Y,
1278387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos		tcu::CUBEFACE_NEGATIVE_Y,
1279387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos		tcu::CUBEFACE_POSITIVE_Z,
1280387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos		tcu::CUBEFACE_NEGATIVE_Z
1281387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	};
1282387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
1283387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	const TestTextureCube*		texCube			= dynamic_cast<const TestTextureCube*>(&testTexture);
1284387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	const TestTextureCubeArray*	texCubeArray	= dynamic_cast<const TestTextureCubeArray*>(&testTexture);
1285387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
1286387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	DE_ASSERT(!!texCube != !!texCubeArray);
1287387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	DE_ASSERT(subresource.layerCount == 6);
1288387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	DE_ASSERT(texCubeArray || subresource.baseArrayLayer == 0);
1289387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
1290387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	levels.resize(subresource.levelCount*tcu::CUBEFACE_LAST);
1291387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
1292387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	for (int faceNdx = 0; faceNdx < tcu::CUBEFACE_LAST; ++faceNdx)
1293387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	{
1294387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos		for (int levelNdx = 0; levelNdx < (int)subresource.levelCount; ++levelNdx)
1295387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos		{
1296387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos			const tcu::ConstPixelBufferAccess& srcLevel = texCubeArray ? texCubeArray->getTexture().getLevel((int)subresource.baseMipLevel+levelNdx)
1297387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos																	   : texCube->getTexture().getLevelFace(levelNdx, s_faceMap[faceNdx]);
1298387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
1299387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos			levels[faceNdx*subresource.levelCount + levelNdx] = tcu::getSubregion(srcLevel, 0, 0, (int)subresource.baseArrayLayer + (texCubeArray ? faceNdx : 0), srcLevel.getWidth(), srcLevel.getHeight(), 1);
1300387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos		}
1301387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	}
1302387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
1303387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	{
1304387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos		const tcu::ConstPixelBufferAccess*	reordered[tcu::CUBEFACE_LAST];
1305387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
1306387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos		for (int faceNdx = 0; faceNdx < tcu::CUBEFACE_LAST; ++faceNdx)
1307387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos			reordered[s_faceMap[faceNdx]] = &levels[faceNdx*subresource.levelCount];
1308387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
1309387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos		return MovePtr<tcu::TextureCubeView>(new tcu::TextureCubeView((int)subresource.levelCount, reordered));
1310387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	}
1311387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos}
1312387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
1313387999c58e55306e26ea6a8abd371174d35ee640Pyry HaulosMovePtr<tcu::TextureCubeArrayView> getTextureCubeArrayView (const TestTexture& testTexture, const vk::VkImageSubresourceRange& subresource, std::vector<tcu::ConstPixelBufferAccess>& levels)
1314387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos{
1315387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	const TestTextureCubeArray*	texCubeArray	= dynamic_cast<const TestTextureCubeArray*>(&testTexture);
1316387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
1317387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	DE_ASSERT(texCubeArray);
1318387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	DE_ASSERT(subresource.layerCount%6 == 0);
1319387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
1320387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	levels.resize(subresource.levelCount);
1321387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
1322387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	for (int levelNdx = 0; levelNdx < (int)subresource.levelCount; ++levelNdx)
1323387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	{
1324387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos		const tcu::ConstPixelBufferAccess& srcLevel = texCubeArray->getTexture().getLevel((int)subresource.baseMipLevel+levelNdx);
1325387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
1326387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos		levels[levelNdx] = tcu::getSubregion(srcLevel, 0, 0, (int)subresource.baseArrayLayer, srcLevel.getWidth(), srcLevel.getHeight(), (int)subresource.layerCount);
1327387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	}
1328387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
1329387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	return MovePtr<tcu::TextureCubeArrayView>(new tcu::TextureCubeArrayView((int)levels.size(), &levels[0]));
1330387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos}
1331387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
1332387999c58e55306e26ea6a8abd371174d35ee640Pyry HaulosMovePtr<tcu::Texture3DView> getTexture3DView (const TestTexture& testTexture, const vk::VkImageSubresourceRange& subresource, std::vector<tcu::ConstPixelBufferAccess>& levels)
1333387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos{
1334387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	DE_ASSERT(subresource.baseArrayLayer == 0 && subresource.layerCount == 1);
1335387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
1336387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	levels.resize(subresource.levelCount);
1337387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
1338387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	for (int levelNdx = 0; levelNdx < (int)levels.size(); ++levelNdx)
1339387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos		levels[levelNdx] = testTexture.getLevel((int)subresource.baseMipLevel+levelNdx, subresource.baseArrayLayer);
1340387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
1341387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	return MovePtr<tcu::Texture3DView>(new tcu::Texture3DView((int)levels.size(), &levels[0]));
1342387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos}
1343387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
1344edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulosbool validateResultImage (const TestTexture&					texture,
1345edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos						  const VkImageViewType					imageViewType,
1346edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos						  const VkImageSubresourceRange&		subresource,
1347edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos						  const tcu::Sampler&					sampler,
1348edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos						  const vk::VkComponentMapping&			componentMapping,
1349edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos						  const tcu::ConstPixelBufferAccess&	coordAccess,
1350edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos						  const tcu::Vec2&						lodBounds,
1351edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos						  const tcu::LookupPrecision&			lookupPrecision,
1352edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos						  const tcu::Vec4&						lookupScale,
1353edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos						  const tcu::Vec4&						lookupBias,
1354edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos						  const tcu::ConstPixelBufferAccess&	resultAccess,
1355edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos						  const tcu::PixelBufferAccess&			errorAccess)
1356edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos{
1357edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos	std::vector<tcu::ConstPixelBufferAccess>	levels;
1358edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos
1359edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos	switch (imageViewType)
1360edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos	{
1361edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos		case VK_IMAGE_VIEW_TYPE_1D:
1362edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos		{
1363edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos			UniquePtr<tcu::Texture1DView>			texView(getTexture1DView(texture, subresource, levels));
1364edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos
1365edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos			return validateResultImage(*texView, sampler, componentMapping, coordAccess, lodBounds, lookupPrecision, lookupScale, lookupBias, resultAccess, errorAccess);
1366edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos		}
1367edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos
1368edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos		case VK_IMAGE_VIEW_TYPE_1D_ARRAY:
1369edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos		{
1370edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos			UniquePtr<tcu::Texture1DArrayView>		texView(getTexture1DArrayView(texture, subresource, levels));
1371edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos
1372edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos			return validateResultImage(*texView, sampler, componentMapping, coordAccess, lodBounds, lookupPrecision, lookupScale, lookupBias, resultAccess, errorAccess);
1373edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos		}
1374edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos
1375edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos		case VK_IMAGE_VIEW_TYPE_2D:
1376edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos		{
1377edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos			UniquePtr<tcu::Texture2DView>			texView(getTexture2DView(texture, subresource, levels));
1378edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos
1379edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos			return validateResultImage(*texView, sampler, componentMapping, coordAccess, lodBounds, lookupPrecision, lookupScale, lookupBias, resultAccess, errorAccess);
1380edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos		}
1381edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos
1382edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos		case VK_IMAGE_VIEW_TYPE_2D_ARRAY:
1383edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos		{
1384edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos			UniquePtr<tcu::Texture2DArrayView>		texView(getTexture2DArrayView(texture, subresource, levels));
1385edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos
1386edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos			return validateResultImage(*texView, sampler, componentMapping, coordAccess, lodBounds, lookupPrecision, lookupScale, lookupBias, resultAccess, errorAccess);
1387edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos		}
1388edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos
1389edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos		case VK_IMAGE_VIEW_TYPE_CUBE:
1390edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos		{
1391edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos			UniquePtr<tcu::TextureCubeView>			texView(getTextureCubeView(texture, subresource, levels));
1392edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos
1393edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos			return validateResultImage(*texView, sampler, componentMapping, coordAccess, lodBounds, lookupPrecision, lookupScale, lookupBias, resultAccess, errorAccess);
1394edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos		}
1395edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos
1396edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos		case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY:
1397edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos		{
1398edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos			UniquePtr<tcu::TextureCubeArrayView>	texView(getTextureCubeArrayView(texture, subresource, levels));
1399edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos
1400edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos			return validateResultImage(*texView, sampler, componentMapping, coordAccess, lodBounds, lookupPrecision, lookupScale, lookupBias, resultAccess, errorAccess);
1401edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos			break;
1402edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos		}
1403edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos
1404edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos		case VK_IMAGE_VIEW_TYPE_3D:
1405edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos		{
1406edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos			UniquePtr<tcu::Texture3DView>			texView(getTexture3DView(texture, subresource, levels));
1407edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos
1408edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos			return validateResultImage(*texView, sampler, componentMapping, coordAccess, lodBounds, lookupPrecision, lookupScale, lookupBias, resultAccess, errorAccess);
1409edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos		}
1410edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos
1411edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos		default:
1412edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos			DE_ASSERT(false);
1413edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos			return false;
1414edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos	}
1415edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos}
1416edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos
1417387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos} // anonymous
1418387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
141983a6066224454de177655eb414dd3453c2059536Dae Kimtcu::TestStatus ImageSamplingInstance::verifyImage (void)
142083a6066224454de177655eb414dd3453c2059536Dae Kim{
1421813ed770e033537e3e3a68c425c1e6ab4a67e852Maciej Jesionowski	const VkPhysicalDeviceLimits&		limits					= m_context.getDeviceProperties().limits;
1422387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	// \note Color buffer is used to capture coordinates - not sampled texture values
1423387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	const tcu::TextureFormat			colorFormat				(tcu::TextureFormat::RGBA, tcu::TextureFormat::FLOAT);
1424387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	const tcu::TextureFormat			depthStencilFormat;		// Undefined depth/stencil format.
1425387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	const CoordinateCaptureProgram		coordCaptureProgram;
1426387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	const rr::Program					rrProgram				= coordCaptureProgram.getReferenceProgram();
1427387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	ReferenceRenderer					refRenderer				(m_renderSize.x(), m_renderSize.y(), 1, colorFormat, depthStencilFormat, &rrProgram);
1428387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
1429235561df842620267f9a58552f1506ae1012133fDominik Witczak	bool								compareOkAll			= true;
1430edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos	bool								anyWarnings				= false;
1431387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
1432387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	tcu::Vec4							lookupScale				(1.0f);
1433387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	tcu::Vec4							lookupBias				(0.0f);
1434387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
1435387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	getLookupScaleBias(m_imageFormat, lookupScale, lookupBias);
1436387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
1437387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	// Render out coordinates
1438387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	{
1439387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos		const rr::RenderState renderState(refRenderer.getViewportState());
1440387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos		refRenderer.draw(renderState, rr::PRIMITIVETYPE_TRIANGLES, m_vertices);
1441387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	}
1442387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
1443387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	// Verify results
144483a6066224454de177655eb414dd3453c2059536Dae Kim	{
1445387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos		const tcu::Sampler					sampler			= mapVkSampler(m_samplerParams);
1446387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos		const float							referenceLod	= de::clamp(m_samplerParams.mipLodBias + m_samplerLod, m_samplerParams.minLod, m_samplerParams.maxLod);
1447813ed770e033537e3e3a68c425c1e6ab4a67e852Maciej Jesionowski		const float							lodError		= 1.0f / static_cast<float>((1u << limits.mipmapPrecisionBits) - 1u);
1448235561df842620267f9a58552f1506ae1012133fDominik Witczak		const tcu::Vec2						lodBounds		(referenceLod - lodError, referenceLod + lodError);
1449387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos		const vk::VkImageSubresourceRange	subresource		= resolveSubresourceRange(*m_texture, m_subresourceRange);
1450387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
1451387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos		const tcu::ConstPixelBufferAccess	coordAccess		= refRenderer.getAccess();
1452387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos		tcu::TextureLevel					errorMask		(tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8), (int)m_renderSize.x(), (int)m_renderSize.y());
1453387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos		const tcu::PixelBufferAccess		errorAccess		= errorMask.getAccess();
1454387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
1455edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos		const bool							allowSnorm8Bug	= m_texture->getTextureFormat().type == tcu::TextureFormat::SNORM_INT8 &&
1456edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos															  (m_samplerParams.minFilter == VK_FILTER_LINEAR || m_samplerParams.magFilter == VK_FILTER_LINEAR);
14571bea8d8112a20b1380cca52b401ac035642afe3cYanjun Zhang		const bool							isNearestOnly	= (m_samplerParams.minFilter == VK_FILTER_NEAREST && m_samplerParams.magFilter == VK_FILTER_NEAREST);
1458edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos
1459387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos		tcu::LookupPrecision				lookupPrecision;
1460387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
1461387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos		// Set precision requirements - very low for these tests as
1462387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos		// the point of the test is not to validate accuracy.
1463387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos		lookupPrecision.coordBits		= tcu::IVec3(17, 17, 17);
1464387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos		lookupPrecision.uvwBits			= tcu::IVec3(5, 5, 5);
1465387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos		lookupPrecision.colorMask		= tcu::BVec4(true);
14661bea8d8112a20b1380cca52b401ac035642afe3cYanjun Zhang		lookupPrecision.colorThreshold	= tcu::computeFixedPointThreshold(max((tcu::IVec4(8, 8, 8, 8) - (isNearestOnly ? 1 : 2)), tcu::IVec4(0))) / swizzleScaleBias(lookupScale, m_componentMapping);
1467387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
1468387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos		if (tcu::isSRGB(m_texture->getTextureFormat()))
1469387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos			lookupPrecision.colorThreshold += tcu::Vec4(4.f / 255.f);
1470387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
1471235561df842620267f9a58552f1506ae1012133fDominik Witczak		for (int imgNdx = 0; imgNdx < m_imageCount; ++imgNdx)
1472387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos		{
1473235561df842620267f9a58552f1506ae1012133fDominik Witczak			// Read back result image
14745c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos			UniquePtr<tcu::TextureLevel>		result			(readColorAttachment(m_context.getDeviceInterface(),
14755c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos																					 m_context.getDevice(),
14765c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos																					 m_context.getUniversalQueue(),
14775c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos																					 m_context.getUniversalQueueFamilyIndex(),
14785c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos																					 m_context.getDefaultAllocator(),
14795c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos																					 **m_colorImages[imgNdx],
14805c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos																					 m_colorFormat,
14815c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos																					 m_renderSize));
14825c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos			const tcu::ConstPixelBufferAccess	resultAccess	= result->getAccess();
14835c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos			bool								compareOk		= validateResultImage(*m_texture,
14845c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos																					  m_imageViewType,
14855c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos																					  subresource,
14865c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos																					  sampler,
14875c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos																					  m_componentMapping,
14885c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos																					  coordAccess,
14895c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos																					  lodBounds,
14905c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos																					  lookupPrecision,
14915c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos																					  lookupScale,
14925c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos																					  lookupBias,
14935c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos																					  resultAccess,
14945c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos																					  errorAccess);
14955c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos
14965c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos			if (!compareOk && allowSnorm8Bug)
1497387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos			{
14985c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos				// HW waiver (VK-GL-CTS issue: 229)
14995c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos				//
15005c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos				// Due to an error in bit replication of the fixed point SNORM values, linear filtered
15015c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos				// negative SNORM values will differ slightly from ideal precision in the last bit, moving
15025c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos				// the values towards 0.
15035c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos				//
15045c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos				// This occurs on all members of the PowerVR Rogue family of GPUs
15055c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos				tcu::LookupPrecision	relaxedPrecision;
1506387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
15075c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos				relaxedPrecision.colorThreshold += tcu::Vec4(4.f / 255.f);
1508387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
15095c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos				m_context.getTestContext().getLog()
15105c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos					<< tcu::TestLog::Message
15115c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos					<< "Warning: Strict validation failed, re-trying with lower precision for SNORM8 format"
15125c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos					<< tcu::TestLog::EndMessage;
15135c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos				anyWarnings = true;
15145c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos
15155c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos				compareOk = validateResultImage(*m_texture,
15165c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos												m_imageViewType,
15175c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos												subresource,
15185c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos												sampler,
15195c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos												m_componentMapping,
15205c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos												coordAccess,
15215c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos												lodBounds,
15225c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos												relaxedPrecision,
15235c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos												lookupScale,
15245c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos												lookupBias,
15255c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos												resultAccess,
15265c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos												errorAccess);
1527235561df842620267f9a58552f1506ae1012133fDominik Witczak			}
1528387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos
1529235561df842620267f9a58552f1506ae1012133fDominik Witczak			if (!compareOk)
1530235561df842620267f9a58552f1506ae1012133fDominik Witczak				m_context.getTestContext().getLog()
1531387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos				<< tcu::TestLog::Image("Result", "Result Image", resultAccess)
1532387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos				<< tcu::TestLog::Image("ErrorMask", "Error Mask", errorAccess);
1533235561df842620267f9a58552f1506ae1012133fDominik Witczak
1534235561df842620267f9a58552f1506ae1012133fDominik Witczak			compareOkAll = compareOkAll && compareOk;
1535235561df842620267f9a58552f1506ae1012133fDominik Witczak		}
153683a6066224454de177655eb414dd3453c2059536Dae Kim	}
153783a6066224454de177655eb414dd3453c2059536Dae Kim
1538235561df842620267f9a58552f1506ae1012133fDominik Witczak	if (compareOkAll)
1539edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos	{
1540edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos		if (anyWarnings)
1541edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos			return tcu::TestStatus(QP_TEST_RESULT_QUALITY_WARNING, "Inaccurate filtering results");
1542edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos		else
1543edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos			return tcu::TestStatus::pass("Result image matches reference");
1544edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos	}
154583a6066224454de177655eb414dd3453c2059536Dae Kim	else
154683a6066224454de177655eb414dd3453c2059536Dae Kim		return tcu::TestStatus::fail("Image mismatch");
154783a6066224454de177655eb414dd3453c2059536Dae Kim}
154883a6066224454de177655eb414dd3453c2059536Dae Kim
154983a6066224454de177655eb414dd3453c2059536Dae Kim} // pipeline
155083a6066224454de177655eb414dd3453c2059536Dae Kim} // vkt
1551