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"
3383a6066224454de177655eb414dd3453c2059536Dae Kim#include "tcuImageCompare.hpp"
3483a6066224454de177655eb414dd3453c2059536Dae Kim
3583a6066224454de177655eb414dd3453c2059536Dae Kimnamespace vkt
3683a6066224454de177655eb414dd3453c2059536Dae Kim{
3783a6066224454de177655eb414dd3453c2059536Dae Kimnamespace pipeline
3883a6066224454de177655eb414dd3453c2059536Dae Kim{
3983a6066224454de177655eb414dd3453c2059536Dae Kim
4083a6066224454de177655eb414dd3453c2059536Dae Kimusing namespace vk;
4183a6066224454de177655eb414dd3453c2059536Dae Kimusing de::MovePtr;
4283a6066224454de177655eb414dd3453c2059536Dae Kim
4383a6066224454de177655eb414dd3453c2059536Dae Kimnamespace
4483a6066224454de177655eb414dd3453c2059536Dae Kim{
4583a6066224454de177655eb414dd3453c2059536Dae Kim
4683a6066224454de177655eb414dd3453c2059536Dae Kimstatic VkImageType getCompatibleImageType (VkImageViewType viewType)
4783a6066224454de177655eb414dd3453c2059536Dae Kim{
4883a6066224454de177655eb414dd3453c2059536Dae Kim	switch (viewType)
4983a6066224454de177655eb414dd3453c2059536Dae Kim	{
5083a6066224454de177655eb414dd3453c2059536Dae Kim		case VK_IMAGE_VIEW_TYPE_1D:				return VK_IMAGE_TYPE_1D;
5183a6066224454de177655eb414dd3453c2059536Dae Kim		case VK_IMAGE_VIEW_TYPE_1D_ARRAY:		return VK_IMAGE_TYPE_1D;
5283a6066224454de177655eb414dd3453c2059536Dae Kim		case VK_IMAGE_VIEW_TYPE_2D:				return VK_IMAGE_TYPE_2D;
5383a6066224454de177655eb414dd3453c2059536Dae Kim		case VK_IMAGE_VIEW_TYPE_2D_ARRAY:		return VK_IMAGE_TYPE_2D;
5483a6066224454de177655eb414dd3453c2059536Dae Kim		case VK_IMAGE_VIEW_TYPE_3D:				return VK_IMAGE_TYPE_3D;
5583a6066224454de177655eb414dd3453c2059536Dae Kim		case VK_IMAGE_VIEW_TYPE_CUBE:			return VK_IMAGE_TYPE_2D;
5683a6066224454de177655eb414dd3453c2059536Dae Kim		case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY:		return VK_IMAGE_TYPE_2D;
5783a6066224454de177655eb414dd3453c2059536Dae Kim		default:
5883a6066224454de177655eb414dd3453c2059536Dae Kim			break;
5983a6066224454de177655eb414dd3453c2059536Dae Kim	}
6083a6066224454de177655eb414dd3453c2059536Dae Kim
6183a6066224454de177655eb414dd3453c2059536Dae Kim	DE_ASSERT(false);
6283a6066224454de177655eb414dd3453c2059536Dae Kim	return VK_IMAGE_TYPE_1D;
6383a6066224454de177655eb414dd3453c2059536Dae Kim}
6483a6066224454de177655eb414dd3453c2059536Dae Kim
6583a6066224454de177655eb414dd3453c2059536Dae Kimtemplate<typename TcuFormatType>
66120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kimstatic MovePtr<TestTexture> createTestTexture (const TcuFormatType format, VkImageViewType viewType, const tcu::IVec3& size, int layerCount)
6783a6066224454de177655eb414dd3453c2059536Dae Kim{
6883a6066224454de177655eb414dd3453c2059536Dae Kim	MovePtr<TestTexture>	texture;
6983a6066224454de177655eb414dd3453c2059536Dae Kim	const VkImageType		imageType = getCompatibleImageType(viewType);
7083a6066224454de177655eb414dd3453c2059536Dae Kim
7183a6066224454de177655eb414dd3453c2059536Dae Kim	switch (imageType)
7283a6066224454de177655eb414dd3453c2059536Dae Kim	{
7383a6066224454de177655eb414dd3453c2059536Dae Kim		case VK_IMAGE_TYPE_1D:
74120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			if (layerCount == 1)
7583a6066224454de177655eb414dd3453c2059536Dae Kim				texture = MovePtr<TestTexture>(new TestTexture1D(format, size.x()));
7683a6066224454de177655eb414dd3453c2059536Dae Kim			else
77120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				texture = MovePtr<TestTexture>(new TestTexture1DArray(format, size.x(), layerCount));
7883a6066224454de177655eb414dd3453c2059536Dae Kim
7983a6066224454de177655eb414dd3453c2059536Dae Kim			break;
8083a6066224454de177655eb414dd3453c2059536Dae Kim
8183a6066224454de177655eb414dd3453c2059536Dae Kim		case VK_IMAGE_TYPE_2D:
82120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			if (layerCount == 1)
8383a6066224454de177655eb414dd3453c2059536Dae Kim			{
8483a6066224454de177655eb414dd3453c2059536Dae Kim				texture = MovePtr<TestTexture>(new TestTexture2D(format, size.x(), size.y()));
8583a6066224454de177655eb414dd3453c2059536Dae Kim			}
8683a6066224454de177655eb414dd3453c2059536Dae Kim			else
8783a6066224454de177655eb414dd3453c2059536Dae Kim			{
8883a6066224454de177655eb414dd3453c2059536Dae Kim				if (viewType == VK_IMAGE_VIEW_TYPE_CUBE || viewType == VK_IMAGE_VIEW_TYPE_CUBE_ARRAY)
8983a6066224454de177655eb414dd3453c2059536Dae Kim				{
90120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim					if (layerCount == tcu::CUBEFACE_LAST)
9183a6066224454de177655eb414dd3453c2059536Dae Kim					{
9283a6066224454de177655eb414dd3453c2059536Dae Kim						texture = MovePtr<TestTexture>(new TestTextureCube(format, size.x()));
9383a6066224454de177655eb414dd3453c2059536Dae Kim					}
9483a6066224454de177655eb414dd3453c2059536Dae Kim					else
9583a6066224454de177655eb414dd3453c2059536Dae Kim					{
96120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim						DE_ASSERT(layerCount % tcu::CUBEFACE_LAST == 0);
9783a6066224454de177655eb414dd3453c2059536Dae Kim
98120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim						texture = MovePtr<TestTexture>(new TestTextureCubeArray(format, size.x(), layerCount));
9983a6066224454de177655eb414dd3453c2059536Dae Kim					}
10083a6066224454de177655eb414dd3453c2059536Dae Kim				}
10183a6066224454de177655eb414dd3453c2059536Dae Kim				else
10283a6066224454de177655eb414dd3453c2059536Dae Kim				{
103120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim					texture = MovePtr<TestTexture>(new TestTexture2DArray(format, size.x(), size.y(), layerCount));
10483a6066224454de177655eb414dd3453c2059536Dae Kim				}
10583a6066224454de177655eb414dd3453c2059536Dae Kim			}
10683a6066224454de177655eb414dd3453c2059536Dae Kim
10783a6066224454de177655eb414dd3453c2059536Dae Kim			break;
10883a6066224454de177655eb414dd3453c2059536Dae Kim
10983a6066224454de177655eb414dd3453c2059536Dae Kim		case VK_IMAGE_TYPE_3D:
11083a6066224454de177655eb414dd3453c2059536Dae Kim			texture = MovePtr<TestTexture>(new TestTexture3D(format, size.x(), size.y(), size.z()));
11183a6066224454de177655eb414dd3453c2059536Dae Kim			break;
11283a6066224454de177655eb414dd3453c2059536Dae Kim
11383a6066224454de177655eb414dd3453c2059536Dae Kim		default:
11483a6066224454de177655eb414dd3453c2059536Dae Kim			DE_ASSERT(false);
11583a6066224454de177655eb414dd3453c2059536Dae Kim	}
11683a6066224454de177655eb414dd3453c2059536Dae Kim
11783a6066224454de177655eb414dd3453c2059536Dae Kim	return texture;
11883a6066224454de177655eb414dd3453c2059536Dae Kim}
11983a6066224454de177655eb414dd3453c2059536Dae Kim
12083a6066224454de177655eb414dd3453c2059536Dae Kimtemplate<typename TcuTextureType>
12183a6066224454de177655eb414dd3453c2059536Dae Kimstatic void copySubresourceRange (TcuTextureType& dest, const TcuTextureType& src, const VkImageSubresourceRange& subresourceRange)
12283a6066224454de177655eb414dd3453c2059536Dae Kim{
123120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	DE_ASSERT(subresourceRange.levelCount <= (deUint32)dest.getNumLevels());
124120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	DE_ASSERT(subresourceRange.baseMipLevel + subresourceRange.levelCount <= (deUint32)src.getNumLevels());
12583a6066224454de177655eb414dd3453c2059536Dae Kim
12683a6066224454de177655eb414dd3453c2059536Dae Kim	for (int levelNdx = 0; levelNdx < dest.getNumLevels(); levelNdx++)
12783a6066224454de177655eb414dd3453c2059536Dae Kim	{
12883a6066224454de177655eb414dd3453c2059536Dae Kim		const tcu::ConstPixelBufferAccess	srcLevel		(src.getLevel(subresourceRange.baseMipLevel + levelNdx));
12983a6066224454de177655eb414dd3453c2059536Dae Kim		const deUint32						srcLayerOffset	= subresourceRange.baseArrayLayer * srcLevel.getWidth() * srcLevel.getHeight() * srcLevel.getFormat().getPixelSize();
130120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		const tcu::ConstPixelBufferAccess	srcLevelLayers	(srcLevel.getFormat(), srcLevel.getWidth(), srcLevel.getHeight(), subresourceRange.layerCount, (deUint8*)srcLevel.getDataPtr() + srcLayerOffset);
13183a6066224454de177655eb414dd3453c2059536Dae Kim
13283a6066224454de177655eb414dd3453c2059536Dae Kim		if (dest.isLevelEmpty(levelNdx))
13383a6066224454de177655eb414dd3453c2059536Dae Kim			dest.allocLevel(levelNdx);
13483a6066224454de177655eb414dd3453c2059536Dae Kim
13583a6066224454de177655eb414dd3453c2059536Dae Kim		tcu::copy(dest.getLevel(levelNdx), srcLevelLayers);
13683a6066224454de177655eb414dd3453c2059536Dae Kim	}
13783a6066224454de177655eb414dd3453c2059536Dae Kim}
13883a6066224454de177655eb414dd3453c2059536Dae Kim
13983a6066224454de177655eb414dd3453c2059536Dae Kimtemplate<>
14083a6066224454de177655eb414dd3453c2059536Dae Kimvoid copySubresourceRange<tcu::Texture1DArray> (tcu::Texture1DArray& dest, const tcu::Texture1DArray& src, const VkImageSubresourceRange& subresourceRange)
14183a6066224454de177655eb414dd3453c2059536Dae Kim{
142120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	DE_ASSERT(subresourceRange.levelCount <= (deUint32)dest.getNumLevels());
143120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	DE_ASSERT(subresourceRange.baseMipLevel + subresourceRange.levelCount <= (deUint32)src.getNumLevels());
14483a6066224454de177655eb414dd3453c2059536Dae Kim
145120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	DE_ASSERT(subresourceRange.layerCount == (deUint32)dest.getNumLayers());
146120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	DE_ASSERT(subresourceRange.baseArrayLayer + subresourceRange.layerCount <= (deUint32)src.getNumLayers());
14783a6066224454de177655eb414dd3453c2059536Dae Kim
14883a6066224454de177655eb414dd3453c2059536Dae Kim	for (int levelNdx = 0; levelNdx < dest.getNumLevels(); levelNdx++)
14983a6066224454de177655eb414dd3453c2059536Dae Kim	{
15083a6066224454de177655eb414dd3453c2059536Dae Kim		const tcu::ConstPixelBufferAccess	srcLevel		(src.getLevel(subresourceRange.baseMipLevel + levelNdx));
15183a6066224454de177655eb414dd3453c2059536Dae Kim		const deUint32						srcLayerOffset	= subresourceRange.baseArrayLayer * srcLevel.getWidth() * srcLevel.getFormat().getPixelSize();
152120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		const tcu::ConstPixelBufferAccess	srcLevelLayers	(srcLevel.getFormat(), srcLevel.getWidth(), subresourceRange.layerCount, 1, (deUint8*)srcLevel.getDataPtr() + srcLayerOffset);
15383a6066224454de177655eb414dd3453c2059536Dae Kim
15483a6066224454de177655eb414dd3453c2059536Dae Kim		if (dest.isLevelEmpty(levelNdx))
15583a6066224454de177655eb414dd3453c2059536Dae Kim			dest.allocLevel(levelNdx);
15683a6066224454de177655eb414dd3453c2059536Dae Kim
15783a6066224454de177655eb414dd3453c2059536Dae Kim		tcu::copy(dest.getLevel(levelNdx), srcLevelLayers);
15883a6066224454de177655eb414dd3453c2059536Dae Kim	}
15983a6066224454de177655eb414dd3453c2059536Dae Kim}
16083a6066224454de177655eb414dd3453c2059536Dae Kim
16166f87da98594059215d2c8b557f2bfdab83e884aJeff Bolztemplate<>
16266f87da98594059215d2c8b557f2bfdab83e884aJeff Bolzvoid copySubresourceRange<tcu::Texture3D>(tcu::Texture3D& dest, const tcu::Texture3D& src, const VkImageSubresourceRange& subresourceRange)
16366f87da98594059215d2c8b557f2bfdab83e884aJeff Bolz{
16466f87da98594059215d2c8b557f2bfdab83e884aJeff Bolz	DE_ASSERT(subresourceRange.levelCount <= (deUint32)dest.getNumLevels());
16566f87da98594059215d2c8b557f2bfdab83e884aJeff Bolz	DE_ASSERT(subresourceRange.baseMipLevel + subresourceRange.levelCount <= (deUint32)src.getNumLevels());
16666f87da98594059215d2c8b557f2bfdab83e884aJeff Bolz
16766f87da98594059215d2c8b557f2bfdab83e884aJeff Bolz	for (int levelNdx = 0; levelNdx < dest.getNumLevels(); levelNdx++)
16866f87da98594059215d2c8b557f2bfdab83e884aJeff Bolz	{
16966f87da98594059215d2c8b557f2bfdab83e884aJeff Bolz		const tcu::ConstPixelBufferAccess	srcLevel(src.getLevel(subresourceRange.baseMipLevel + levelNdx));
17066f87da98594059215d2c8b557f2bfdab83e884aJeff Bolz		const tcu::ConstPixelBufferAccess	srcLevelLayers(srcLevel.getFormat(), srcLevel.getWidth(), srcLevel.getHeight(), srcLevel.getDepth(), (deUint8*)srcLevel.getDataPtr());
17166f87da98594059215d2c8b557f2bfdab83e884aJeff Bolz
17266f87da98594059215d2c8b557f2bfdab83e884aJeff Bolz		if (dest.isLevelEmpty(levelNdx))
17366f87da98594059215d2c8b557f2bfdab83e884aJeff Bolz			dest.allocLevel(levelNdx);
17466f87da98594059215d2c8b557f2bfdab83e884aJeff Bolz
17566f87da98594059215d2c8b557f2bfdab83e884aJeff Bolz		tcu::copy(dest.getLevel(levelNdx), srcLevelLayers);
17666f87da98594059215d2c8b557f2bfdab83e884aJeff Bolz	}
17766f87da98594059215d2c8b557f2bfdab83e884aJeff Bolz}
17866f87da98594059215d2c8b557f2bfdab83e884aJeff Bolz
17966f87da98594059215d2c8b557f2bfdab83e884aJeff Bolzstatic MovePtr<Program> createRefProgram(const tcu::TextureFormat&			renderTargetFormat,
18083a6066224454de177655eb414dd3453c2059536Dae Kim										  const tcu::Sampler&				sampler,
18183a6066224454de177655eb414dd3453c2059536Dae Kim										  float								samplerLod,
182120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim										  const tcu::UVec4&					componentMapping,
18383a6066224454de177655eb414dd3453c2059536Dae Kim										  const TestTexture&				testTexture,
18483a6066224454de177655eb414dd3453c2059536Dae Kim										  VkImageViewType					viewType,
185120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim										  int								layerCount,
18683a6066224454de177655eb414dd3453c2059536Dae Kim										  const VkImageSubresourceRange&	subresource)
18783a6066224454de177655eb414dd3453c2059536Dae Kim{
18883a6066224454de177655eb414dd3453c2059536Dae Kim	MovePtr<Program>	program;
1893a40c1645672ac36c31e4275b9b00ec3effa02c8Pyry Haulos	const VkImageType	imageType		= getCompatibleImageType(viewType);
1903a40c1645672ac36c31e4275b9b00ec3effa02c8Pyry Haulos	tcu::Vec4			lookupScale		(1.0f);
1913a40c1645672ac36c31e4275b9b00ec3effa02c8Pyry Haulos	tcu::Vec4			lookupBias		(0.0f);
1923a40c1645672ac36c31e4275b9b00ec3effa02c8Pyry Haulos
1933a40c1645672ac36c31e4275b9b00ec3effa02c8Pyry Haulos	if (!testTexture.isCompressed())
1943a40c1645672ac36c31e4275b9b00ec3effa02c8Pyry Haulos	{
1953a40c1645672ac36c31e4275b9b00ec3effa02c8Pyry Haulos		const tcu::TextureFormatInfo	fmtInfo	= tcu::getTextureFormatInfo(testTexture.getLevel(0, 0).getFormat());
1963a40c1645672ac36c31e4275b9b00ec3effa02c8Pyry Haulos
1973a40c1645672ac36c31e4275b9b00ec3effa02c8Pyry Haulos		// Needed to normalize various formats to 0..1 range for writing into RT
1983a40c1645672ac36c31e4275b9b00ec3effa02c8Pyry Haulos		lookupScale	= fmtInfo.lookupScale;
1993a40c1645672ac36c31e4275b9b00ec3effa02c8Pyry Haulos		lookupBias	= fmtInfo.lookupBias;
2003a40c1645672ac36c31e4275b9b00ec3effa02c8Pyry Haulos	}
2013a40c1645672ac36c31e4275b9b00ec3effa02c8Pyry Haulos	// else: All supported compressed formats are fine with no normalization.
2023a40c1645672ac36c31e4275b9b00ec3effa02c8Pyry Haulos	//		 ASTC LDR blocks decompress to f16 so querying normalization parameters
2033a40c1645672ac36c31e4275b9b00ec3effa02c8Pyry Haulos	//		 based on uncompressed formats would actually lead to massive precision loss
2043a40c1645672ac36c31e4275b9b00ec3effa02c8Pyry Haulos	//		 and complete lack of coverage in case of R8G8B8A8_UNORM RT.
20583a6066224454de177655eb414dd3453c2059536Dae Kim
20683a6066224454de177655eb414dd3453c2059536Dae Kim	switch (imageType)
20783a6066224454de177655eb414dd3453c2059536Dae Kim	{
20883a6066224454de177655eb414dd3453c2059536Dae Kim		case VK_IMAGE_TYPE_1D:
209120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			if (layerCount == 1)
21083a6066224454de177655eb414dd3453c2059536Dae Kim			{
21183a6066224454de177655eb414dd3453c2059536Dae Kim				const tcu::Texture1D& texture = dynamic_cast<const TestTexture1D&>(testTexture).getTexture();
2123a40c1645672ac36c31e4275b9b00ec3effa02c8Pyry Haulos				program = MovePtr<Program>(new SamplerProgram<tcu::Texture1D>(renderTargetFormat, texture, sampler, samplerLod, lookupScale, lookupBias, componentMapping));
21383a6066224454de177655eb414dd3453c2059536Dae Kim			}
21483a6066224454de177655eb414dd3453c2059536Dae Kim			else
21583a6066224454de177655eb414dd3453c2059536Dae Kim			{
21683a6066224454de177655eb414dd3453c2059536Dae Kim				const tcu::Texture1DArray& texture = dynamic_cast<const TestTexture1DArray&>(testTexture).getTexture();
21783a6066224454de177655eb414dd3453c2059536Dae Kim
218120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				if (subresource.baseMipLevel > 0 || subresource.layerCount < (deUint32)texture.getNumLayers())
21983a6066224454de177655eb414dd3453c2059536Dae Kim				{
22083a6066224454de177655eb414dd3453c2059536Dae Kim					// Not all texture levels and layers are needed. Create new sub-texture.
22183a6066224454de177655eb414dd3453c2059536Dae Kim					const tcu::ConstPixelBufferAccess	baseLevel	= texture.getLevel(subresource.baseMipLevel);
222120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim					tcu::Texture1DArray					textureView	(texture.getFormat(), baseLevel.getWidth(), subresource.layerCount);
22383a6066224454de177655eb414dd3453c2059536Dae Kim
22483a6066224454de177655eb414dd3453c2059536Dae Kim					copySubresourceRange(textureView, texture, subresource);
22583a6066224454de177655eb414dd3453c2059536Dae Kim
2263a40c1645672ac36c31e4275b9b00ec3effa02c8Pyry Haulos					program = MovePtr<Program>(new SamplerProgram<tcu::Texture1DArray>(renderTargetFormat, textureView, sampler, samplerLod, lookupScale, lookupBias, componentMapping));
22783a6066224454de177655eb414dd3453c2059536Dae Kim				}
22883a6066224454de177655eb414dd3453c2059536Dae Kim				else
22983a6066224454de177655eb414dd3453c2059536Dae Kim				{
2303a40c1645672ac36c31e4275b9b00ec3effa02c8Pyry Haulos					program = MovePtr<Program>(new SamplerProgram<tcu::Texture1DArray>(renderTargetFormat, texture, sampler, samplerLod, lookupScale, lookupBias, componentMapping));
23183a6066224454de177655eb414dd3453c2059536Dae Kim				}
23283a6066224454de177655eb414dd3453c2059536Dae Kim			}
23383a6066224454de177655eb414dd3453c2059536Dae Kim			break;
23483a6066224454de177655eb414dd3453c2059536Dae Kim
23583a6066224454de177655eb414dd3453c2059536Dae Kim		case VK_IMAGE_TYPE_2D:
236120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			if (layerCount == 1)
23783a6066224454de177655eb414dd3453c2059536Dae Kim			{
23883a6066224454de177655eb414dd3453c2059536Dae Kim				const tcu::Texture2D& texture = dynamic_cast<const TestTexture2D&>(testTexture).getTexture();
2393a40c1645672ac36c31e4275b9b00ec3effa02c8Pyry Haulos				program = MovePtr<Program>(new SamplerProgram<tcu::Texture2D>(renderTargetFormat, texture, sampler, samplerLod, lookupScale, lookupBias, componentMapping));
24083a6066224454de177655eb414dd3453c2059536Dae Kim			}
24183a6066224454de177655eb414dd3453c2059536Dae Kim			else
24283a6066224454de177655eb414dd3453c2059536Dae Kim			{
24383a6066224454de177655eb414dd3453c2059536Dae Kim				if (viewType == VK_IMAGE_VIEW_TYPE_CUBE || viewType == VK_IMAGE_VIEW_TYPE_CUBE_ARRAY)
24483a6066224454de177655eb414dd3453c2059536Dae Kim				{
245120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim					if (layerCount == tcu::CUBEFACE_LAST)
24683a6066224454de177655eb414dd3453c2059536Dae Kim					{
24783a6066224454de177655eb414dd3453c2059536Dae Kim						const tcu::TextureCube& texture = dynamic_cast<const TestTextureCube&>(testTexture).getTexture();
2483a40c1645672ac36c31e4275b9b00ec3effa02c8Pyry Haulos						program = MovePtr<Program>(new SamplerProgram<tcu::TextureCube>(renderTargetFormat, texture, sampler, samplerLod, lookupScale, lookupBias, componentMapping));
24983a6066224454de177655eb414dd3453c2059536Dae Kim					}
25083a6066224454de177655eb414dd3453c2059536Dae Kim					else
25183a6066224454de177655eb414dd3453c2059536Dae Kim					{
252120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim						DE_ASSERT(layerCount % tcu::CUBEFACE_LAST == 0);
25383a6066224454de177655eb414dd3453c2059536Dae Kim
25483a6066224454de177655eb414dd3453c2059536Dae Kim						const tcu::TextureCubeArray& texture = dynamic_cast<const TestTextureCubeArray&>(testTexture).getTexture();
25583a6066224454de177655eb414dd3453c2059536Dae Kim
256120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim						if (subresource.baseMipLevel > 0 || subresource.layerCount < (deUint32)texture.getDepth())
25783a6066224454de177655eb414dd3453c2059536Dae Kim						{
258120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim							DE_ASSERT(subresource.baseArrayLayer + subresource.layerCount <= (deUint32)texture.getDepth());
25983a6066224454de177655eb414dd3453c2059536Dae Kim
26083a6066224454de177655eb414dd3453c2059536Dae Kim							// Not all texture levels and layers are needed. Create new sub-texture.
26183a6066224454de177655eb414dd3453c2059536Dae Kim							const tcu::ConstPixelBufferAccess	baseLevel		= texture.getLevel(subresource.baseMipLevel);
262120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim							tcu::TextureCubeArray				textureView		(texture.getFormat(), baseLevel.getWidth(), subresource.layerCount);
26383a6066224454de177655eb414dd3453c2059536Dae Kim
26483a6066224454de177655eb414dd3453c2059536Dae Kim							copySubresourceRange(textureView, texture, subresource);
26583a6066224454de177655eb414dd3453c2059536Dae Kim
2663a40c1645672ac36c31e4275b9b00ec3effa02c8Pyry Haulos							program = MovePtr<Program>(new SamplerProgram<tcu::TextureCubeArray>(renderTargetFormat, textureView, sampler, samplerLod, lookupScale, lookupBias, componentMapping));
26783a6066224454de177655eb414dd3453c2059536Dae Kim						}
26883a6066224454de177655eb414dd3453c2059536Dae Kim						else
26983a6066224454de177655eb414dd3453c2059536Dae Kim						{
27083a6066224454de177655eb414dd3453c2059536Dae Kim							// Use all array layers
2713a40c1645672ac36c31e4275b9b00ec3effa02c8Pyry Haulos							program = MovePtr<Program>(new SamplerProgram<tcu::TextureCubeArray>(renderTargetFormat, texture, sampler, samplerLod, lookupScale, lookupBias, componentMapping));
27283a6066224454de177655eb414dd3453c2059536Dae Kim						}
27383a6066224454de177655eb414dd3453c2059536Dae Kim					}
27483a6066224454de177655eb414dd3453c2059536Dae Kim				}
27583a6066224454de177655eb414dd3453c2059536Dae Kim				else
27683a6066224454de177655eb414dd3453c2059536Dae Kim				{
27783a6066224454de177655eb414dd3453c2059536Dae Kim					const tcu::Texture2DArray& texture = dynamic_cast<const TestTexture2DArray&>(testTexture).getTexture();
27883a6066224454de177655eb414dd3453c2059536Dae Kim
279120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim					if (subresource.baseMipLevel > 0 || subresource.layerCount < (deUint32)texture.getNumLayers())
28083a6066224454de177655eb414dd3453c2059536Dae Kim					{
281120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim						DE_ASSERT(subresource.baseArrayLayer + subresource.layerCount <= (deUint32)texture.getNumLayers());
28283a6066224454de177655eb414dd3453c2059536Dae Kim
28383a6066224454de177655eb414dd3453c2059536Dae Kim						// Not all texture levels and layers are needed. Create new sub-texture.
28483a6066224454de177655eb414dd3453c2059536Dae Kim						const tcu::ConstPixelBufferAccess	baseLevel	= texture.getLevel(subresource.baseMipLevel);
285120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim						tcu::Texture2DArray					textureView	(texture.getFormat(), baseLevel.getWidth(), baseLevel.getHeight(), subresource.layerCount);
28683a6066224454de177655eb414dd3453c2059536Dae Kim
28783a6066224454de177655eb414dd3453c2059536Dae Kim						copySubresourceRange(textureView, texture, subresource);
28883a6066224454de177655eb414dd3453c2059536Dae Kim
2893a40c1645672ac36c31e4275b9b00ec3effa02c8Pyry Haulos						program = MovePtr<Program>(new SamplerProgram<tcu::Texture2DArray>(renderTargetFormat, textureView, sampler, samplerLod, lookupScale, lookupBias, componentMapping));
29083a6066224454de177655eb414dd3453c2059536Dae Kim					}
29183a6066224454de177655eb414dd3453c2059536Dae Kim					else
29283a6066224454de177655eb414dd3453c2059536Dae Kim					{
29383a6066224454de177655eb414dd3453c2059536Dae Kim						// Use all array layers
2943a40c1645672ac36c31e4275b9b00ec3effa02c8Pyry Haulos						program = MovePtr<Program>(new SamplerProgram<tcu::Texture2DArray>(renderTargetFormat, texture, sampler, samplerLod, lookupScale, lookupBias, componentMapping));
29583a6066224454de177655eb414dd3453c2059536Dae Kim					}
29683a6066224454de177655eb414dd3453c2059536Dae Kim				}
29783a6066224454de177655eb414dd3453c2059536Dae Kim			}
29883a6066224454de177655eb414dd3453c2059536Dae Kim			break;
29983a6066224454de177655eb414dd3453c2059536Dae Kim
30083a6066224454de177655eb414dd3453c2059536Dae Kim		case VK_IMAGE_TYPE_3D:
30183a6066224454de177655eb414dd3453c2059536Dae Kim			{
30283a6066224454de177655eb414dd3453c2059536Dae Kim				const tcu::Texture3D& texture = dynamic_cast<const TestTexture3D&>(testTexture).getTexture();
30366f87da98594059215d2c8b557f2bfdab83e884aJeff Bolz
30466f87da98594059215d2c8b557f2bfdab83e884aJeff Bolz				if (subresource.baseMipLevel > 0)
30566f87da98594059215d2c8b557f2bfdab83e884aJeff Bolz				{
30666f87da98594059215d2c8b557f2bfdab83e884aJeff Bolz					// Not all texture levels are needed. Create new sub-texture.
30766f87da98594059215d2c8b557f2bfdab83e884aJeff Bolz					const tcu::ConstPixelBufferAccess	baseLevel = texture.getLevel(subresource.baseMipLevel);
30866f87da98594059215d2c8b557f2bfdab83e884aJeff Bolz					tcu::Texture3D						textureView(texture.getFormat(), baseLevel.getWidth(), baseLevel.getHeight(), baseLevel.getDepth());
30966f87da98594059215d2c8b557f2bfdab83e884aJeff Bolz
31066f87da98594059215d2c8b557f2bfdab83e884aJeff Bolz					copySubresourceRange(textureView, texture, subresource);
31166f87da98594059215d2c8b557f2bfdab83e884aJeff Bolz
3123a40c1645672ac36c31e4275b9b00ec3effa02c8Pyry Haulos					program = MovePtr<Program>(new SamplerProgram<tcu::Texture3D>(renderTargetFormat, textureView, sampler, samplerLod, lookupScale, lookupBias, componentMapping));
31366f87da98594059215d2c8b557f2bfdab83e884aJeff Bolz				}
31466f87da98594059215d2c8b557f2bfdab83e884aJeff Bolz				else
31566f87da98594059215d2c8b557f2bfdab83e884aJeff Bolz				{
3163a40c1645672ac36c31e4275b9b00ec3effa02c8Pyry Haulos					program = MovePtr<Program>(new SamplerProgram<tcu::Texture3D>(renderTargetFormat, texture, sampler, samplerLod, lookupScale, lookupBias, componentMapping));
31766f87da98594059215d2c8b557f2bfdab83e884aJeff Bolz				}
31883a6066224454de177655eb414dd3453c2059536Dae Kim			}
31983a6066224454de177655eb414dd3453c2059536Dae Kim			break;
32083a6066224454de177655eb414dd3453c2059536Dae Kim
32183a6066224454de177655eb414dd3453c2059536Dae Kim		default:
32283a6066224454de177655eb414dd3453c2059536Dae Kim			DE_ASSERT(false);
32383a6066224454de177655eb414dd3453c2059536Dae Kim	}
32483a6066224454de177655eb414dd3453c2059536Dae Kim
32583a6066224454de177655eb414dd3453c2059536Dae Kim	return program;
32683a6066224454de177655eb414dd3453c2059536Dae Kim}
32783a6066224454de177655eb414dd3453c2059536Dae Kim
32883a6066224454de177655eb414dd3453c2059536Dae Kim} // anonymous
32983a6066224454de177655eb414dd3453c2059536Dae Kim
33083a6066224454de177655eb414dd3453c2059536Dae KimImageSamplingInstance::ImageSamplingInstance (Context&							context,
331689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos											  const tcu::UVec2&					renderSize,
33283a6066224454de177655eb414dd3453c2059536Dae Kim											  VkImageViewType					imageViewType,
33383a6066224454de177655eb414dd3453c2059536Dae Kim											  VkFormat							imageFormat,
33483a6066224454de177655eb414dd3453c2059536Dae Kim											  const tcu::IVec3&					imageSize,
335120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim											  int								layerCount,
336120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim											  const VkComponentMapping&			componentMapping,
33783a6066224454de177655eb414dd3453c2059536Dae Kim											  const VkImageSubresourceRange&	subresourceRange,
33883a6066224454de177655eb414dd3453c2059536Dae Kim											  const VkSamplerCreateInfo&		samplerParams,
33983a6066224454de177655eb414dd3453c2059536Dae Kim											  float								samplerLod,
34083a6066224454de177655eb414dd3453c2059536Dae Kim											  const std::vector<Vertex4Tex4>&	vertices)
34183a6066224454de177655eb414dd3453c2059536Dae Kim	: vkt::TestInstance		(context)
34283a6066224454de177655eb414dd3453c2059536Dae Kim	, m_imageViewType		(imageViewType)
34359b191bc5c165338ac771b536cb804e7a9d3230czeppelin	, m_imageFormat			(imageFormat)
34483a6066224454de177655eb414dd3453c2059536Dae Kim	, m_imageSize			(imageSize)
345120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	, m_layerCount			(layerCount)
346120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	, m_componentMapping	(componentMapping)
34783a6066224454de177655eb414dd3453c2059536Dae Kim	, m_subresourceRange	(subresourceRange)
34883a6066224454de177655eb414dd3453c2059536Dae Kim	, m_samplerParams		(samplerParams)
34983a6066224454de177655eb414dd3453c2059536Dae Kim	, m_samplerLod			(samplerLod)
35083a6066224454de177655eb414dd3453c2059536Dae Kim	, m_renderSize			(renderSize)
35183a6066224454de177655eb414dd3453c2059536Dae Kim	, m_colorFormat			(VK_FORMAT_R8G8B8A8_UNORM)
35283a6066224454de177655eb414dd3453c2059536Dae Kim	, m_vertices			(vertices)
35383a6066224454de177655eb414dd3453c2059536Dae Kim{
354120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	const DeviceInterface&		vk						= context.getDeviceInterface();
355120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	const VkDevice				vkDevice				= context.getDevice();
356120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	const VkQueue				queue					= context.getUniversalQueue();
357120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	const deUint32				queueFamilyIndex		= context.getUniversalQueueFamilyIndex();
358120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	SimpleAllocator				memAlloc				(vk, vkDevice, getPhysicalDeviceMemoryProperties(context.getInstanceInterface(), context.getPhysicalDevice()));
359120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	const VkComponentMapping	componentMappingRGBA	= { VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A };
36083a6066224454de177655eb414dd3453c2059536Dae Kim
36183a6066224454de177655eb414dd3453c2059536Dae Kim	if (!isSupportedSamplableFormat(context.getInstanceInterface(), context.getPhysicalDevice(), imageFormat))
36283a6066224454de177655eb414dd3453c2059536Dae Kim		throw tcu::NotSupportedError(std::string("Unsupported format for sampling: ") + getFormatName(imageFormat));
36383a6066224454de177655eb414dd3453c2059536Dae Kim
364549732add51d3906362b924a946a015eef134df5Pyry Haulos	if ((samplerParams.minFilter == VK_FILTER_LINEAR ||
365549732add51d3906362b924a946a015eef134df5Pyry Haulos		 samplerParams.magFilter == VK_FILTER_LINEAR ||
366549732add51d3906362b924a946a015eef134df5Pyry Haulos		 samplerParams.mipmapMode == VK_SAMPLER_MIPMAP_MODE_LINEAR) &&
367549732add51d3906362b924a946a015eef134df5Pyry Haulos		!isLinearFilteringSupported(context.getInstanceInterface(), context.getPhysicalDevice(), imageFormat, VK_IMAGE_TILING_OPTIMAL))
368549732add51d3906362b924a946a015eef134df5Pyry Haulos		throw tcu::NotSupportedError(std::string("Unsupported format for linear filtering: ") + getFormatName(imageFormat));
369549732add51d3906362b924a946a015eef134df5Pyry Haulos
37073d1b62ab9f3fea5cf26e8d80763bf150de6319bPyry Haulos	if (isCompressedFormat(imageFormat) && imageViewType == VK_IMAGE_VIEW_TYPE_3D)
37173d1b62ab9f3fea5cf26e8d80763bf150de6319bPyry Haulos	{
37273d1b62ab9f3fea5cf26e8d80763bf150de6319bPyry Haulos		// \todo [2016-01-22 pyry] Mandate VK_ERROR_FORMAT_NOT_SUPPORTED
37373d1b62ab9f3fea5cf26e8d80763bf150de6319bPyry Haulos		try
37473d1b62ab9f3fea5cf26e8d80763bf150de6319bPyry Haulos		{
37573d1b62ab9f3fea5cf26e8d80763bf150de6319bPyry Haulos			const VkImageFormatProperties	formatProperties	= getPhysicalDeviceImageFormatProperties(context.getInstanceInterface(),
37673d1b62ab9f3fea5cf26e8d80763bf150de6319bPyry Haulos																										 context.getPhysicalDevice(),
37773d1b62ab9f3fea5cf26e8d80763bf150de6319bPyry Haulos																										 imageFormat,
37873d1b62ab9f3fea5cf26e8d80763bf150de6319bPyry Haulos																										 VK_IMAGE_TYPE_3D,
37973d1b62ab9f3fea5cf26e8d80763bf150de6319bPyry Haulos																										 VK_IMAGE_TILING_OPTIMAL,
38073d1b62ab9f3fea5cf26e8d80763bf150de6319bPyry Haulos																										 VK_IMAGE_USAGE_SAMPLED_BIT,
38173d1b62ab9f3fea5cf26e8d80763bf150de6319bPyry Haulos																										 (VkImageCreateFlags)0);
38273d1b62ab9f3fea5cf26e8d80763bf150de6319bPyry Haulos
38373d1b62ab9f3fea5cf26e8d80763bf150de6319bPyry Haulos			if (formatProperties.maxExtent.width == 0 &&
38473d1b62ab9f3fea5cf26e8d80763bf150de6319bPyry Haulos				formatProperties.maxExtent.height == 0 &&
38573d1b62ab9f3fea5cf26e8d80763bf150de6319bPyry Haulos				formatProperties.maxExtent.depth == 0)
38673d1b62ab9f3fea5cf26e8d80763bf150de6319bPyry Haulos				TCU_THROW(NotSupportedError, "3D compressed format not supported");
38773d1b62ab9f3fea5cf26e8d80763bf150de6319bPyry Haulos		}
38873d1b62ab9f3fea5cf26e8d80763bf150de6319bPyry Haulos		catch (const Error&)
38973d1b62ab9f3fea5cf26e8d80763bf150de6319bPyry Haulos		{
39073d1b62ab9f3fea5cf26e8d80763bf150de6319bPyry Haulos			TCU_THROW(NotSupportedError, "3D compressed format not supported");
39173d1b62ab9f3fea5cf26e8d80763bf150de6319bPyry Haulos		}
39273d1b62ab9f3fea5cf26e8d80763bf150de6319bPyry Haulos	}
39373d1b62ab9f3fea5cf26e8d80763bf150de6319bPyry Haulos
39483a6066224454de177655eb414dd3453c2059536Dae Kim	// Create texture image, view and sampler
39583a6066224454de177655eb414dd3453c2059536Dae Kim	{
39683a6066224454de177655eb414dd3453c2059536Dae Kim		VkImageCreateFlags			imageFlags			= 0u;
39783a6066224454de177655eb414dd3453c2059536Dae Kim
39883a6066224454de177655eb414dd3453c2059536Dae Kim		if (m_imageViewType == VK_IMAGE_VIEW_TYPE_CUBE || m_imageViewType == VK_IMAGE_VIEW_TYPE_CUBE_ARRAY)
39983a6066224454de177655eb414dd3453c2059536Dae Kim			imageFlags = VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT;
40083a6066224454de177655eb414dd3453c2059536Dae Kim
40183a6066224454de177655eb414dd3453c2059536Dae Kim		// Initialize texture data
40283a6066224454de177655eb414dd3453c2059536Dae Kim		if (isCompressedFormat(imageFormat))
403120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			m_texture = createTestTexture(mapVkCompressedFormat(imageFormat), imageViewType, imageSize, layerCount);
40483a6066224454de177655eb414dd3453c2059536Dae Kim		else
405120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			m_texture = createTestTexture(mapVkFormat(imageFormat), imageViewType, imageSize, layerCount);
40683a6066224454de177655eb414dd3453c2059536Dae Kim
40783a6066224454de177655eb414dd3453c2059536Dae Kim		const VkImageCreateInfo	imageParams =
40883a6066224454de177655eb414dd3453c2059536Dae Kim		{
409120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,							// VkStructureType			sType;
410120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			DE_NULL,														// const void*				pNext;
411120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			imageFlags,														// VkImageCreateFlags		flags;
412120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			getCompatibleImageType(m_imageViewType),						// VkImageType				imageType;
413120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			imageFormat,													// VkFormat					format;
414120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			{																// VkExtent3D				extent;
415689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos				(deUint32)m_imageSize.x(),
416689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos				(deUint32)m_imageSize.y(),
417689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos				(deUint32)m_imageSize.z()
41883a6066224454de177655eb414dd3453c2059536Dae Kim			},
419120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			(deUint32)m_texture->getNumLevels(),							// deUint32					mipLevels;
420120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			(deUint32)m_layerCount,											// deUint32					arrayLayers;
421120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_SAMPLE_COUNT_1_BIT,											// VkSampleCountFlagBits	samples;
422120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_IMAGE_TILING_OPTIMAL,										// VkImageTiling			tiling;
423120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,	// VkImageUsageFlags		usage;
424120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_SHARING_MODE_EXCLUSIVE,										// VkSharingMode			sharingMode;
425120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			1u,																// deUint32					queueFamilyIndexCount;
426120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			&queueFamilyIndex,												// const deUint32*			pQueueFamilyIndices;
427120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_IMAGE_LAYOUT_UNDEFINED										// VkImageLayout			initialLayout;
42883a6066224454de177655eb414dd3453c2059536Dae Kim		};
42983a6066224454de177655eb414dd3453c2059536Dae Kim
43083a6066224454de177655eb414dd3453c2059536Dae Kim		m_image			= createImage(vk, vkDevice, &imageParams);
43183a6066224454de177655eb414dd3453c2059536Dae Kim		m_imageAlloc	= memAlloc.allocate(getImageMemoryRequirements(vk, vkDevice, *m_image), MemoryRequirement::Any);
43283a6066224454de177655eb414dd3453c2059536Dae Kim		VK_CHECK(vk.bindImageMemory(vkDevice, *m_image, m_imageAlloc->getMemory(), m_imageAlloc->getOffset()));
43383a6066224454de177655eb414dd3453c2059536Dae Kim
43483a6066224454de177655eb414dd3453c2059536Dae Kim		// Upload texture data
43583a6066224454de177655eb414dd3453c2059536Dae Kim		uploadTestTexture(vk, vkDevice, queue, queueFamilyIndex, memAlloc, *m_texture, *m_image);
43683a6066224454de177655eb414dd3453c2059536Dae Kim
43783a6066224454de177655eb414dd3453c2059536Dae Kim		// Create image view and sampler
43883a6066224454de177655eb414dd3453c2059536Dae Kim		const VkImageViewCreateInfo imageViewParams =
43983a6066224454de177655eb414dd3453c2059536Dae Kim		{
44083a6066224454de177655eb414dd3453c2059536Dae Kim			VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,	// VkStructureType			sType;
44183a6066224454de177655eb414dd3453c2059536Dae Kim			DE_NULL,									// const void*				pNext;
442120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,											// VkImageViewCreateFlags	flags;
44383a6066224454de177655eb414dd3453c2059536Dae Kim			*m_image,									// VkImage					image;
44483a6066224454de177655eb414dd3453c2059536Dae Kim			m_imageViewType,							// VkImageViewType			viewType;
44583a6066224454de177655eb414dd3453c2059536Dae Kim			imageFormat,								// VkFormat					format;
446120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			m_componentMapping,							// VkComponentMapping		components;
44783a6066224454de177655eb414dd3453c2059536Dae Kim			m_subresourceRange,							// VkImageSubresourceRange	subresourceRange;
44883a6066224454de177655eb414dd3453c2059536Dae Kim		};
44983a6066224454de177655eb414dd3453c2059536Dae Kim
45083a6066224454de177655eb414dd3453c2059536Dae Kim		m_imageView	= createImageView(vk, vkDevice, &imageViewParams);
45183a6066224454de177655eb414dd3453c2059536Dae Kim		m_sampler	= createSampler(vk, vkDevice, &m_samplerParams);
45283a6066224454de177655eb414dd3453c2059536Dae Kim	}
45383a6066224454de177655eb414dd3453c2059536Dae Kim
45483a6066224454de177655eb414dd3453c2059536Dae Kim	// Create descriptor set for combined image and sampler
45583a6066224454de177655eb414dd3453c2059536Dae Kim	{
45683a6066224454de177655eb414dd3453c2059536Dae Kim		DescriptorPoolBuilder descriptorPoolBuilder;
45783a6066224454de177655eb414dd3453c2059536Dae Kim		descriptorPoolBuilder.addType(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1u);
458120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		m_descriptorPool = descriptorPoolBuilder.build(vk, vkDevice, VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 1u);
45983a6066224454de177655eb414dd3453c2059536Dae Kim
46083a6066224454de177655eb414dd3453c2059536Dae Kim		DescriptorSetLayoutBuilder setLayoutBuilder;
46183a6066224454de177655eb414dd3453c2059536Dae Kim		setLayoutBuilder.addSingleBinding(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_SHADER_STAGE_FRAGMENT_BIT);
46283a6066224454de177655eb414dd3453c2059536Dae Kim		m_descriptorSetLayout = setLayoutBuilder.build(vk, vkDevice);
46383a6066224454de177655eb414dd3453c2059536Dae Kim
464120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		const VkDescriptorSetAllocateInfo descriptorSetAllocateInfo =
465120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		{
466120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO,		// VkStructureType				sType;
467120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			DE_NULL,											// const void*					pNext;
468120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			*m_descriptorPool,									// VkDescriptorPool				descriptorPool;
469120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			1u,													// deUint32						setLayoutCount;
470120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			&m_descriptorSetLayout.get()						// const VkDescriptorSetLayout*	pSetLayouts;
471120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		};
472120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim
473120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		m_descriptorSet = allocateDescriptorSet(vk, vkDevice, &descriptorSetAllocateInfo);
47483a6066224454de177655eb414dd3453c2059536Dae Kim
475120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		const VkDescriptorImageInfo descriptorImageInfo =
47683a6066224454de177655eb414dd3453c2059536Dae Kim		{
477120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			*m_sampler,									// VkSampler		sampler;
478120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			*m_imageView,								// VkImageView		imageView;
479120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL	// VkImageLayout	imageLayout;
48083a6066224454de177655eb414dd3453c2059536Dae Kim		};
48183a6066224454de177655eb414dd3453c2059536Dae Kim
48283a6066224454de177655eb414dd3453c2059536Dae Kim		DescriptorSetUpdateBuilder setUpdateBuilder;
483120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		setUpdateBuilder.writeSingle(*m_descriptorSet, DescriptorSetUpdateBuilder::Location::binding(0), VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, &descriptorImageInfo);
48483a6066224454de177655eb414dd3453c2059536Dae Kim		setUpdateBuilder.update(vk, vkDevice);
48583a6066224454de177655eb414dd3453c2059536Dae Kim	}
48683a6066224454de177655eb414dd3453c2059536Dae Kim
48783a6066224454de177655eb414dd3453c2059536Dae Kim	// Create color image and view
48883a6066224454de177655eb414dd3453c2059536Dae Kim	{
48983a6066224454de177655eb414dd3453c2059536Dae Kim		const VkImageCreateInfo colorImageParams =
49083a6066224454de177655eb414dd3453c2059536Dae Kim		{
491120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,										// VkStructureType			sType;
492120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			DE_NULL,																	// const void*				pNext;
493120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,																			// VkImageCreateFlags		flags;
494120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_IMAGE_TYPE_2D,															// VkImageType				imageType;
495120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			m_colorFormat,																// VkFormat					format;
496689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos			{ (deUint32)m_renderSize.x(), (deUint32)m_renderSize.y(), 1u },				// VkExtent3D				extent;
497120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			1u,																			// deUint32					mipLevels;
498120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			1u,																			// deUint32					arrayLayers;
499120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_SAMPLE_COUNT_1_BIT,														// VkSampleCountFlagBits	samples;
500120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_IMAGE_TILING_OPTIMAL,													// VkImageTiling			tiling;
501120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT,		// VkImageUsageFlags		usage;
502120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_SHARING_MODE_EXCLUSIVE,													// VkSharingMode			sharingMode;
503120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			1u,																			// deUint32					queueFamilyIndexCount;
504120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			&queueFamilyIndex,															// const deUint32*			pQueueFamilyIndices;
505120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_IMAGE_LAYOUT_UNDEFINED													// VkImageLayout			initialLayout;
50683a6066224454de177655eb414dd3453c2059536Dae Kim		};
50783a6066224454de177655eb414dd3453c2059536Dae Kim
50883a6066224454de177655eb414dd3453c2059536Dae Kim		m_colorImage			= createImage(vk, vkDevice, &colorImageParams);
50983a6066224454de177655eb414dd3453c2059536Dae Kim		m_colorImageAlloc		= memAlloc.allocate(getImageMemoryRequirements(vk, vkDevice, *m_colorImage), MemoryRequirement::Any);
51083a6066224454de177655eb414dd3453c2059536Dae Kim		VK_CHECK(vk.bindImageMemory(vkDevice, *m_colorImage, m_colorImageAlloc->getMemory(), m_colorImageAlloc->getOffset()));
51183a6066224454de177655eb414dd3453c2059536Dae Kim
51283a6066224454de177655eb414dd3453c2059536Dae Kim		const VkImageViewCreateInfo colorAttachmentViewParams =
51383a6066224454de177655eb414dd3453c2059536Dae Kim		{
514120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,			// VkStructureType			sType;
515120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			DE_NULL,											// const void*				pNext;
516120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,													// VkImageViewCreateFlags	flags;
517120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			*m_colorImage,										// VkImage					image;
518120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_IMAGE_VIEW_TYPE_2D,								// VkImageViewType			viewType;
519120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			m_colorFormat,										// VkFormat					format;
520120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			componentMappingRGBA,								// VkComponentMapping		components;
521120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			{ VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u }		// VkImageSubresourceRange	subresourceRange;
52283a6066224454de177655eb414dd3453c2059536Dae Kim		};
52383a6066224454de177655eb414dd3453c2059536Dae Kim
52483a6066224454de177655eb414dd3453c2059536Dae Kim		m_colorAttachmentView = createImageView(vk, vkDevice, &colorAttachmentViewParams);
52583a6066224454de177655eb414dd3453c2059536Dae Kim	}
52683a6066224454de177655eb414dd3453c2059536Dae Kim
52783a6066224454de177655eb414dd3453c2059536Dae Kim	// Create render pass
52883a6066224454de177655eb414dd3453c2059536Dae Kim	{
52983a6066224454de177655eb414dd3453c2059536Dae Kim		const VkAttachmentDescription colorAttachmentDescription =
53083a6066224454de177655eb414dd3453c2059536Dae Kim		{
531120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,													// VkAttachmentDescriptionFlags		flags;
532120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			m_colorFormat,										// VkFormat							format;
533120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_SAMPLE_COUNT_1_BIT,								// VkSampleCountFlagBits			samples;
534120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_ATTACHMENT_LOAD_OP_CLEAR,						// VkAttachmentLoadOp				loadOp;
535120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_ATTACHMENT_STORE_OP_STORE,						// VkAttachmentStoreOp				storeOp;
536120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_ATTACHMENT_LOAD_OP_DONT_CARE,					// VkAttachmentLoadOp				stencilLoadOp;
537120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_ATTACHMENT_STORE_OP_DONT_CARE,					// VkAttachmentStoreOp				stencilStoreOp;
538120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,			// VkImageLayout					initialLayout;
539120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL			// VkImageLayout					finalLayout;
54083a6066224454de177655eb414dd3453c2059536Dae Kim		};
54183a6066224454de177655eb414dd3453c2059536Dae Kim
54283a6066224454de177655eb414dd3453c2059536Dae Kim		const VkAttachmentReference colorAttachmentReference =
54383a6066224454de177655eb414dd3453c2059536Dae Kim		{
54483a6066224454de177655eb414dd3453c2059536Dae Kim			0u,													// deUint32			attachment;
54583a6066224454de177655eb414dd3453c2059536Dae Kim			VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL			// VkImageLayout	layout;
54683a6066224454de177655eb414dd3453c2059536Dae Kim		};
54783a6066224454de177655eb414dd3453c2059536Dae Kim
54883a6066224454de177655eb414dd3453c2059536Dae Kim		const VkSubpassDescription subpassDescription =
54983a6066224454de177655eb414dd3453c2059536Dae Kim		{
55083a6066224454de177655eb414dd3453c2059536Dae Kim			0u,													// VkSubpassDescriptionFlags	flags;
551120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_PIPELINE_BIND_POINT_GRAPHICS,					// VkPipelineBindPoint			pipelineBindPoint;
552120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,													// deUint32						inputAttachmentCount;
55383a6066224454de177655eb414dd3453c2059536Dae Kim			DE_NULL,											// const VkAttachmentReference*	pInputAttachments;
554120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			1u,													// deUint32						colorAttachmentCount;
55583a6066224454de177655eb414dd3453c2059536Dae Kim			&colorAttachmentReference,							// const VkAttachmentReference*	pColorAttachments;
55683a6066224454de177655eb414dd3453c2059536Dae Kim			DE_NULL,											// const VkAttachmentReference*	pResolveAttachments;
557120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			DE_NULL,											// const VkAttachmentReference*	pDepthStencilAttachment;
558120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,													// deUint32						preserveAttachmentCount;
55983a6066224454de177655eb414dd3453c2059536Dae Kim			DE_NULL												// const VkAttachmentReference*	pPreserveAttachments;
56083a6066224454de177655eb414dd3453c2059536Dae Kim		};
56183a6066224454de177655eb414dd3453c2059536Dae Kim
56283a6066224454de177655eb414dd3453c2059536Dae Kim		const VkRenderPassCreateInfo renderPassParams =
56383a6066224454de177655eb414dd3453c2059536Dae Kim		{
56483a6066224454de177655eb414dd3453c2059536Dae Kim			VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,			// VkStructureType					sType;
56583a6066224454de177655eb414dd3453c2059536Dae Kim			DE_NULL,											// const void*						pNext;
566120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,													// VkRenderPassCreateFlags			flags;
56783a6066224454de177655eb414dd3453c2059536Dae Kim			1u,													// deUint32							attachmentCount;
56883a6066224454de177655eb414dd3453c2059536Dae Kim			&colorAttachmentDescription,						// const VkAttachmentDescription*	pAttachments;
56983a6066224454de177655eb414dd3453c2059536Dae Kim			1u,													// deUint32							subpassCount;
57083a6066224454de177655eb414dd3453c2059536Dae Kim			&subpassDescription,								// const VkSubpassDescription*		pSubpasses;
57183a6066224454de177655eb414dd3453c2059536Dae Kim			0u,													// deUint32							dependencyCount;
57283a6066224454de177655eb414dd3453c2059536Dae Kim			DE_NULL												// const VkSubpassDependency*		pDependencies;
57383a6066224454de177655eb414dd3453c2059536Dae Kim		};
57483a6066224454de177655eb414dd3453c2059536Dae Kim
57583a6066224454de177655eb414dd3453c2059536Dae Kim		m_renderPass = createRenderPass(vk, vkDevice, &renderPassParams);
57683a6066224454de177655eb414dd3453c2059536Dae Kim	}
57783a6066224454de177655eb414dd3453c2059536Dae Kim
57883a6066224454de177655eb414dd3453c2059536Dae Kim	// Create framebuffer
57983a6066224454de177655eb414dd3453c2059536Dae Kim	{
58083a6066224454de177655eb414dd3453c2059536Dae Kim		const VkFramebufferCreateInfo framebufferParams =
58183a6066224454de177655eb414dd3453c2059536Dae Kim		{
582120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO,			// VkStructureType			sType;
583120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			DE_NULL,											// const void*				pNext;
584120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,													// VkFramebufferCreateFlags	flags;
585120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			*m_renderPass,										// VkRenderPass				renderPass;
586120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			1u,													// deUint32					attachmentCount;
587120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			&m_colorAttachmentView.get(),						// const VkImageView*		pAttachments;
588120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			(deUint32)m_renderSize.x(),							// deUint32					width;
589120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			(deUint32)m_renderSize.y(),							// deUint32					height;
590120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			1u													// deUint32					layers;
59183a6066224454de177655eb414dd3453c2059536Dae Kim		};
59283a6066224454de177655eb414dd3453c2059536Dae Kim
59383a6066224454de177655eb414dd3453c2059536Dae Kim		m_framebuffer = createFramebuffer(vk, vkDevice, &framebufferParams);
59483a6066224454de177655eb414dd3453c2059536Dae Kim	}
59583a6066224454de177655eb414dd3453c2059536Dae Kim
59683a6066224454de177655eb414dd3453c2059536Dae Kim	// Create pipeline layout
59783a6066224454de177655eb414dd3453c2059536Dae Kim	{
59883a6066224454de177655eb414dd3453c2059536Dae Kim		const VkPipelineLayoutCreateInfo pipelineLayoutParams =
59983a6066224454de177655eb414dd3453c2059536Dae Kim		{
60083a6066224454de177655eb414dd3453c2059536Dae Kim			VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,		// VkStructureType				sType;
60183a6066224454de177655eb414dd3453c2059536Dae Kim			DE_NULL,											// const void*					pNext;
602120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,													// VkPipelineLayoutCreateFlags	flags;
603120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			1u,													// deUint32						setLayoutCount;
60483a6066224454de177655eb414dd3453c2059536Dae Kim			&m_descriptorSetLayout.get(),						// const VkDescriptorSetLayout*	pSetLayouts;
60583a6066224454de177655eb414dd3453c2059536Dae Kim			0u,													// deUint32						pushConstantRangeCount;
60683a6066224454de177655eb414dd3453c2059536Dae Kim			DE_NULL												// const VkPushConstantRange*	pPushConstantRanges;
60783a6066224454de177655eb414dd3453c2059536Dae Kim		};
60883a6066224454de177655eb414dd3453c2059536Dae Kim
60983a6066224454de177655eb414dd3453c2059536Dae Kim		m_pipelineLayout = createPipelineLayout(vk, vkDevice, &pipelineLayoutParams);
61083a6066224454de177655eb414dd3453c2059536Dae Kim	}
61183a6066224454de177655eb414dd3453c2059536Dae Kim
612120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	m_vertexShaderModule	= createShaderModule(vk, vkDevice, m_context.getBinaryCollection().get("tex_vert"), 0);
613120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	m_fragmentShaderModule	= createShaderModule(vk, vkDevice, m_context.getBinaryCollection().get("tex_frag"), 0);
61483a6066224454de177655eb414dd3453c2059536Dae Kim
61583a6066224454de177655eb414dd3453c2059536Dae Kim	// Create pipeline
61683a6066224454de177655eb414dd3453c2059536Dae Kim	{
617120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		const VkPipelineShaderStageCreateInfo shaderStages[2] =
61883a6066224454de177655eb414dd3453c2059536Dae Kim		{
61983a6066224454de177655eb414dd3453c2059536Dae Kim			{
620120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,		// VkStructureType						sType;
621120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				DE_NULL,													// const void*							pNext;
622120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				0u,															// VkPipelineShaderStageCreateFlags		flags;
623120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				VK_SHADER_STAGE_VERTEX_BIT,									// VkShaderStageFlagBits				stage;
624120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				*m_vertexShaderModule,										// VkShaderModule						module;
625120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				"main",														// const char*							pName;
626120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				DE_NULL														// const VkSpecializationInfo*			pSpecializationInfo;
62783a6066224454de177655eb414dd3453c2059536Dae Kim			},
62883a6066224454de177655eb414dd3453c2059536Dae Kim			{
629120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,		// VkStructureType						sType;
630120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				DE_NULL,													// const void*							pNext;
631120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				0u,															// VkPipelineShaderStageCreateFlags		flags;
632120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				VK_SHADER_STAGE_FRAGMENT_BIT,								// VkShaderStageFlagBits				stage;
633120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				*m_fragmentShaderModule,									// VkShaderModule						module;
634120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				"main",														// const char*							pName;
635120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				DE_NULL														// const VkSpecializationInfo*			pSpecializationInfo;
63683a6066224454de177655eb414dd3453c2059536Dae Kim			}
63783a6066224454de177655eb414dd3453c2059536Dae Kim		};
63883a6066224454de177655eb414dd3453c2059536Dae Kim
63983a6066224454de177655eb414dd3453c2059536Dae Kim		const VkVertexInputBindingDescription vertexInputBindingDescription =
64083a6066224454de177655eb414dd3453c2059536Dae Kim		{
641120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,									// deUint32					binding;
642120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			sizeof(Vertex4Tex4),				// deUint32					strideInBytes;
643120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_VERTEX_INPUT_RATE_VERTEX			// VkVertexInputStepRate	inputRate;
64483a6066224454de177655eb414dd3453c2059536Dae Kim		};
64583a6066224454de177655eb414dd3453c2059536Dae Kim
64683a6066224454de177655eb414dd3453c2059536Dae Kim		const VkVertexInputAttributeDescription vertexInputAttributeDescriptions[2] =
64783a6066224454de177655eb414dd3453c2059536Dae Kim		{
64883a6066224454de177655eb414dd3453c2059536Dae Kim			{
64983a6066224454de177655eb414dd3453c2059536Dae Kim				0u,										// deUint32	location;
65083a6066224454de177655eb414dd3453c2059536Dae Kim				0u,										// deUint32	binding;
65183a6066224454de177655eb414dd3453c2059536Dae Kim				VK_FORMAT_R32G32B32A32_SFLOAT,			// VkFormat	format;
652120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				0u										// deUint32	offset;
65383a6066224454de177655eb414dd3453c2059536Dae Kim			},
65483a6066224454de177655eb414dd3453c2059536Dae Kim			{
65583a6066224454de177655eb414dd3453c2059536Dae Kim				1u,										// deUint32	location;
65683a6066224454de177655eb414dd3453c2059536Dae Kim				0u,										// deUint32	binding;
65783a6066224454de177655eb414dd3453c2059536Dae Kim				VK_FORMAT_R32G32B32A32_SFLOAT,			// VkFormat	format;
658120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				DE_OFFSET_OF(Vertex4Tex4, texCoord),	// deUint32	offset;
65983a6066224454de177655eb414dd3453c2059536Dae Kim			}
66083a6066224454de177655eb414dd3453c2059536Dae Kim		};
66183a6066224454de177655eb414dd3453c2059536Dae Kim
66283a6066224454de177655eb414dd3453c2059536Dae Kim		const VkPipelineVertexInputStateCreateInfo vertexInputStateParams =
66383a6066224454de177655eb414dd3453c2059536Dae Kim		{
66483a6066224454de177655eb414dd3453c2059536Dae Kim			VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO,		// VkStructureType							sType;
66583a6066224454de177655eb414dd3453c2059536Dae Kim			DE_NULL,														// const void*								pNext;
666120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,																// VkPipelineVertexInputStateCreateFlags	flags;
667120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			1u,																// deUint32									vertexBindingDescriptionCount;
66883a6066224454de177655eb414dd3453c2059536Dae Kim			&vertexInputBindingDescription,									// const VkVertexInputBindingDescription*	pVertexBindingDescriptions;
669120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			2u,																// deUint32									vertexAttributeDescriptionCount;
67083a6066224454de177655eb414dd3453c2059536Dae Kim			vertexInputAttributeDescriptions								// const VkVertexInputAttributeDescription*	pVertexAttributeDescriptions;
67183a6066224454de177655eb414dd3453c2059536Dae Kim		};
67283a6066224454de177655eb414dd3453c2059536Dae Kim
67383a6066224454de177655eb414dd3453c2059536Dae Kim		const VkPipelineInputAssemblyStateCreateInfo inputAssemblyStateParams =
67483a6066224454de177655eb414dd3453c2059536Dae Kim		{
675120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,	// VkStructureType							sType;
676120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			DE_NULL,														// const void*								pNext;
677120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,																// VkPipelineInputAssemblyStateCreateFlags	flags;
678120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST,							// VkPrimitiveTopology						topology;
679120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			false															// VkBool32									primitiveRestartEnable;
68083a6066224454de177655eb414dd3453c2059536Dae Kim		};
68183a6066224454de177655eb414dd3453c2059536Dae Kim
68283a6066224454de177655eb414dd3453c2059536Dae Kim		const VkViewport viewport =
68383a6066224454de177655eb414dd3453c2059536Dae Kim		{
684120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0.0f,						// float	x;
685120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0.0f,						// float	y;
68683a6066224454de177655eb414dd3453c2059536Dae Kim			(float)m_renderSize.x(),	// float	width;
68783a6066224454de177655eb414dd3453c2059536Dae Kim			(float)m_renderSize.y(),	// float	height;
68883a6066224454de177655eb414dd3453c2059536Dae Kim			0.0f,						// float	minDepth;
68983a6066224454de177655eb414dd3453c2059536Dae Kim			1.0f						// float	maxDepth;
69083a6066224454de177655eb414dd3453c2059536Dae Kim		};
69183a6066224454de177655eb414dd3453c2059536Dae Kim
692689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos		const VkRect2D scissor = { { 0, 0 }, { (deUint32)m_renderSize.x(), (deUint32)m_renderSize.y() } };
69383a6066224454de177655eb414dd3453c2059536Dae Kim
69483a6066224454de177655eb414dd3453c2059536Dae Kim		const VkPipelineViewportStateCreateInfo viewportStateParams =
69583a6066224454de177655eb414dd3453c2059536Dae Kim		{
696120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO,			// VkStructureType						sType;
697120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			DE_NULL,														// const void*							pNext;
698120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,																// VkPipelineViewportStateCreateFlags	flags;
699120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			1u,																// deUint32								viewportCount;
700120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			&viewport,														// const VkViewport*					pViewports;
701120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			1u,																// deUint32								scissorCount;
702120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			&scissor														// const VkRect2D*						pScissors;
70383a6066224454de177655eb414dd3453c2059536Dae Kim		};
70483a6066224454de177655eb414dd3453c2059536Dae Kim
705120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		const VkPipelineRasterizationStateCreateInfo rasterStateParams =
70683a6066224454de177655eb414dd3453c2059536Dae Kim		{
707120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO,		// VkStructureType							sType;
708120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			DE_NULL,														// const void*								pNext;
709120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,																// VkPipelineRasterizationStateCreateFlags	flags;
710120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			false,															// VkBool32									depthClampEnable;
711120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			false,															// VkBool32									rasterizerDiscardEnable;
712120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_POLYGON_MODE_FILL,											// VkPolygonMode							polygonMode;
713120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_CULL_MODE_NONE,												// VkCullModeFlags							cullMode;
714120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_FRONT_FACE_COUNTER_CLOCKWISE,								// VkFrontFace								frontFace;
715120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			false,															// VkBool32									depthBiasEnable;
716120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0.0f,															// float									depthBiasConstantFactor;
717120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0.0f,															// float									depthBiasClamp;
718120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0.0f,															// float									depthBiasSlopeFactor;
719120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			1.0f															// float									lineWidth;
72083a6066224454de177655eb414dd3453c2059536Dae Kim		};
72183a6066224454de177655eb414dd3453c2059536Dae Kim
72283a6066224454de177655eb414dd3453c2059536Dae Kim		const VkPipelineColorBlendAttachmentState colorBlendAttachmentState =
72383a6066224454de177655eb414dd3453c2059536Dae Kim		{
724120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			false,														// VkBool32					blendEnable;
725120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_BLEND_FACTOR_ONE,										// VkBlendFactor			srcColorBlendFactor;
726120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_BLEND_FACTOR_ZERO,										// VkBlendFactor			dstColorBlendFactor;
727120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_BLEND_OP_ADD,											// VkBlendOp				colorBlendOp;
728120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_BLEND_FACTOR_ONE,										// VkBlendFactor			srcAlphaBlendFactor;
729120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_BLEND_FACTOR_ZERO,										// VkBlendFactor			dstAlphaBlendFactor;
730120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_BLEND_OP_ADD,											// VkBlendOp				alphaBlendOp;
731120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT |		// VkColorComponentFlags	colorWriteMask;
732120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT
73383a6066224454de177655eb414dd3453c2059536Dae Kim		};
73483a6066224454de177655eb414dd3453c2059536Dae Kim
73583a6066224454de177655eb414dd3453c2059536Dae Kim		const VkPipelineColorBlendStateCreateInfo colorBlendStateParams =
73683a6066224454de177655eb414dd3453c2059536Dae Kim		{
73783a6066224454de177655eb414dd3453c2059536Dae Kim			VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO,	// VkStructureType								sType;
73883a6066224454de177655eb414dd3453c2059536Dae Kim			DE_NULL,													// const void*									pNext;
739120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,															// VkPipelineColorBlendStateCreateFlags			flags;
74083a6066224454de177655eb414dd3453c2059536Dae Kim			false,														// VkBool32										logicOpEnable;
74183a6066224454de177655eb414dd3453c2059536Dae Kim			VK_LOGIC_OP_COPY,											// VkLogicOp									logicOp;
74283a6066224454de177655eb414dd3453c2059536Dae Kim			1u,															// deUint32										attachmentCount;
74383a6066224454de177655eb414dd3453c2059536Dae Kim			&colorBlendAttachmentState,									// const VkPipelineColorBlendAttachmentState*	pAttachments;
744120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			{ 0.0f, 0.0f, 0.0f, 0.0f }									// float										blendConstants[4];
74583a6066224454de177655eb414dd3453c2059536Dae Kim		};
74683a6066224454de177655eb414dd3453c2059536Dae Kim
74783a6066224454de177655eb414dd3453c2059536Dae Kim		const VkPipelineMultisampleStateCreateInfo multisampleStateParams =
74883a6066224454de177655eb414dd3453c2059536Dae Kim		{
749120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO,	// VkStructureType							sType;
750120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			DE_NULL,													// const void*								pNext;
751120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,															// VkPipelineMultisampleStateCreateFlags	flags;
752120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_SAMPLE_COUNT_1_BIT,										// VkSampleCountFlagBits					rasterizationSamples;
753120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			false,														// VkBool32									sampleShadingEnable;
754120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0.0f,														// float									minSampleShading;
755120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			DE_NULL,													// const VkSampleMask*						pSampleMask;
756120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			false,														// VkBool32									alphaToCoverageEnable;
757120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			false														// VkBool32									alphaToOneEnable;
75883a6066224454de177655eb414dd3453c2059536Dae Kim		};
75983a6066224454de177655eb414dd3453c2059536Dae Kim
76083a6066224454de177655eb414dd3453c2059536Dae Kim		VkPipelineDepthStencilStateCreateInfo depthStencilStateParams =
76183a6066224454de177655eb414dd3453c2059536Dae Kim		{
762120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO,	// VkStructureType							sType;
763120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			DE_NULL,													// const void*								pNext;
764120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,															// VkPipelineDepthStencilStateCreateFlags	flags;
765120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			false,														// VkBool32									depthTestEnable;
766120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			false,														// VkBool32									depthWriteEnable;
767120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_COMPARE_OP_LESS,											// VkCompareOp								depthCompareOp;
768120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			false,														// VkBool32									depthBoundsTestEnable;
769120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			false,														// VkBool32									stencilTestEnable;
770120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			{															// VkStencilOpState							front;
771120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				VK_STENCIL_OP_ZERO,		// VkStencilOp	failOp;
772120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				VK_STENCIL_OP_ZERO,		// VkStencilOp	passOp;
773120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				VK_STENCIL_OP_ZERO,		// VkStencilOp	depthFailOp;
774120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				VK_COMPARE_OP_NEVER,	// VkCompareOp	compareOp;
775120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				0u,						// deUint32		compareMask;
776120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				0u,						// deUint32		writeMask;
777120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				0u						// deUint32		reference;
77883a6066224454de177655eb414dd3453c2059536Dae Kim			},
77983a6066224454de177655eb414dd3453c2059536Dae Kim			{															// VkStencilOpState	back;
780120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				VK_STENCIL_OP_ZERO,		// VkStencilOp	failOp;
781120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				VK_STENCIL_OP_ZERO,		// VkStencilOp	passOp;
782120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				VK_STENCIL_OP_ZERO,		// VkStencilOp	depthFailOp;
783120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				VK_COMPARE_OP_NEVER,	// VkCompareOp	compareOp;
784120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				0u,						// deUint32		compareMask;
785120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				0u,						// deUint32		writeMask;
786120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				0u						// deUint32		reference;
78783a6066224454de177655eb414dd3453c2059536Dae Kim			},
7883d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos			0.0f,														// float			minDepthBounds;
7893d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos			1.0f														// float			maxDepthBounds;
79083a6066224454de177655eb414dd3453c2059536Dae Kim		};
79183a6066224454de177655eb414dd3453c2059536Dae Kim
79283a6066224454de177655eb414dd3453c2059536Dae Kim		const VkGraphicsPipelineCreateInfo graphicsPipelineParams =
79383a6066224454de177655eb414dd3453c2059536Dae Kim		{
79483a6066224454de177655eb414dd3453c2059536Dae Kim			VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,	// VkStructureType									sType;
79583a6066224454de177655eb414dd3453c2059536Dae Kim			DE_NULL,											// const void*										pNext;
796120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,													// VkPipelineCreateFlags							flags;
79783a6066224454de177655eb414dd3453c2059536Dae Kim			2u,													// deUint32											stageCount;
798120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			shaderStages,										// const VkPipelineShaderStageCreateInfo*			pStages;
79983a6066224454de177655eb414dd3453c2059536Dae Kim			&vertexInputStateParams,							// const VkPipelineVertexInputStateCreateInfo*		pVertexInputState;
80083a6066224454de177655eb414dd3453c2059536Dae Kim			&inputAssemblyStateParams,							// const VkPipelineInputAssemblyStateCreateInfo*	pInputAssemblyState;
80183a6066224454de177655eb414dd3453c2059536Dae Kim			DE_NULL,											// const VkPipelineTessellationStateCreateInfo*		pTessellationState;
80283a6066224454de177655eb414dd3453c2059536Dae Kim			&viewportStateParams,								// const VkPipelineViewportStateCreateInfo*			pViewportState;
803120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			&rasterStateParams,									// const VkPipelineRasterizationStateCreateInfo*	pRasterizationState;
80483a6066224454de177655eb414dd3453c2059536Dae Kim			&multisampleStateParams,							// const VkPipelineMultisampleStateCreateInfo*		pMultisampleState;
80583a6066224454de177655eb414dd3453c2059536Dae Kim			&depthStencilStateParams,							// const VkPipelineDepthStencilStateCreateInfo*		pDepthStencilState;
80683a6066224454de177655eb414dd3453c2059536Dae Kim			&colorBlendStateParams,								// const VkPipelineColorBlendStateCreateInfo*		pColorBlendState;
80786a8ae9e0d61bbfe1f1e273fdbb026369bdb5f29Pyry Haulos			(const VkPipelineDynamicStateCreateInfo*)DE_NULL,	// const VkPipelineDynamicStateCreateInfo*			pDynamicState;
80883a6066224454de177655eb414dd3453c2059536Dae Kim			*m_pipelineLayout,									// VkPipelineLayout									layout;
80983a6066224454de177655eb414dd3453c2059536Dae Kim			*m_renderPass,										// VkRenderPass										renderPass;
81083a6066224454de177655eb414dd3453c2059536Dae Kim			0u,													// deUint32											subpass;
81183a6066224454de177655eb414dd3453c2059536Dae Kim			0u,													// VkPipeline										basePipelineHandle;
81283a6066224454de177655eb414dd3453c2059536Dae Kim			0u													// deInt32											basePipelineIndex;
81383a6066224454de177655eb414dd3453c2059536Dae Kim		};
81483a6066224454de177655eb414dd3453c2059536Dae Kim
81583a6066224454de177655eb414dd3453c2059536Dae Kim		m_graphicsPipeline	= createGraphicsPipeline(vk, vkDevice, DE_NULL, &graphicsPipelineParams);
81683a6066224454de177655eb414dd3453c2059536Dae Kim	}
81783a6066224454de177655eb414dd3453c2059536Dae Kim
81883a6066224454de177655eb414dd3453c2059536Dae Kim	// Create vertex buffer
81983a6066224454de177655eb414dd3453c2059536Dae Kim	{
820120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		const VkDeviceSize			vertexBufferSize	= (VkDeviceSize)(m_vertices.size() * sizeof(Vertex4Tex4));
821120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		const VkBufferCreateInfo	vertexBufferParams	=
82283a6066224454de177655eb414dd3453c2059536Dae Kim		{
82383a6066224454de177655eb414dd3453c2059536Dae Kim			VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,		// VkStructureType		sType;
82483a6066224454de177655eb414dd3453c2059536Dae Kim			DE_NULL,									// const void*			pNext;
82583a6066224454de177655eb414dd3453c2059536Dae Kim			0u,											// VkBufferCreateFlags	flags;
826120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			vertexBufferSize,							// VkDeviceSize			size;
827120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_BUFFER_USAGE_VERTEX_BUFFER_BIT,			// VkBufferUsageFlags	usage;
82883a6066224454de177655eb414dd3453c2059536Dae Kim			VK_SHARING_MODE_EXCLUSIVE,					// VkSharingMode		sharingMode;
829120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			1u,											// deUint32				queueFamilyIndexCount;
83083a6066224454de177655eb414dd3453c2059536Dae Kim			&queueFamilyIndex							// const deUint32*		pQueueFamilyIndices;
83183a6066224454de177655eb414dd3453c2059536Dae Kim		};
83283a6066224454de177655eb414dd3453c2059536Dae Kim
833120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		DE_ASSERT(vertexBufferSize > 0);
834120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim
83583a6066224454de177655eb414dd3453c2059536Dae Kim		m_vertexBuffer		= createBuffer(vk, vkDevice, &vertexBufferParams);
83683a6066224454de177655eb414dd3453c2059536Dae Kim		m_vertexBufferAlloc	= memAlloc.allocate(getBufferMemoryRequirements(vk, vkDevice, *m_vertexBuffer), MemoryRequirement::HostVisible);
83783a6066224454de177655eb414dd3453c2059536Dae Kim
83883a6066224454de177655eb414dd3453c2059536Dae Kim		VK_CHECK(vk.bindBufferMemory(vkDevice, *m_vertexBuffer, m_vertexBufferAlloc->getMemory(), m_vertexBufferAlloc->getOffset()));
83983a6066224454de177655eb414dd3453c2059536Dae Kim
84083a6066224454de177655eb414dd3453c2059536Dae Kim		// Load vertices into vertex buffer
841c898c7d8e107a11ad4268ffc74d0c4d0a96877d3Pyry Haulos		deMemcpy(m_vertexBufferAlloc->getHostPtr(), &m_vertices[0], (size_t)vertexBufferSize);
84283a6066224454de177655eb414dd3453c2059536Dae Kim		flushMappedMemoryRange(vk, vkDevice, m_vertexBufferAlloc->getMemory(), m_vertexBufferAlloc->getOffset(), vertexBufferParams.size);
84383a6066224454de177655eb414dd3453c2059536Dae Kim	}
84483a6066224454de177655eb414dd3453c2059536Dae Kim
84583a6066224454de177655eb414dd3453c2059536Dae Kim	// Create command pool
84683a6066224454de177655eb414dd3453c2059536Dae Kim	{
847120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		const VkCommandPoolCreateInfo cmdPoolParams =
84883a6066224454de177655eb414dd3453c2059536Dae Kim		{
849120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,		// VkStructureType				sType;
850120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			DE_NULL,										// const void*					pNext;
851120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_COMMAND_POOL_CREATE_TRANSIENT_BIT,			// VkCommandPoolCreateFlags	flags;
852120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			queueFamilyIndex								// deUint32					queueFamilyIndex;
85383a6066224454de177655eb414dd3453c2059536Dae Kim		};
85483a6066224454de177655eb414dd3453c2059536Dae Kim
85583a6066224454de177655eb414dd3453c2059536Dae Kim		m_cmdPool = createCommandPool(vk, vkDevice, &cmdPoolParams);
85683a6066224454de177655eb414dd3453c2059536Dae Kim	}
85783a6066224454de177655eb414dd3453c2059536Dae Kim
85883a6066224454de177655eb414dd3453c2059536Dae Kim	// Create command buffer
85983a6066224454de177655eb414dd3453c2059536Dae Kim	{
860120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		const VkCommandBufferAllocateInfo cmdBufferAllocateInfo =
86183a6066224454de177655eb414dd3453c2059536Dae Kim		{
862120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,	// VkStructureType			sType;
863120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			DE_NULL,										// const void*				pNext;
864120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			*m_cmdPool,										// VkCommandPool			commandPool;
865120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_COMMAND_BUFFER_LEVEL_PRIMARY,				// VkCommandBufferLevel		level;
866120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			1u,												// deUint32					bufferCount;
86783a6066224454de177655eb414dd3453c2059536Dae Kim		};
86883a6066224454de177655eb414dd3453c2059536Dae Kim
869120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		const VkCommandBufferBeginInfo cmdBufferBeginInfo =
87083a6066224454de177655eb414dd3453c2059536Dae Kim		{
871120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,	// VkStructureType					sType;
872120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			DE_NULL,										// const void*						pNext;
873120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,												// VkCommandBufferUsageFlags		flags;
874689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos			(const VkCommandBufferInheritanceInfo*)DE_NULL,
87583a6066224454de177655eb414dd3453c2059536Dae Kim		};
87683a6066224454de177655eb414dd3453c2059536Dae Kim
87783a6066224454de177655eb414dd3453c2059536Dae Kim		const VkClearValue attachmentClearValue = defaultClearValue(m_colorFormat);
87883a6066224454de177655eb414dd3453c2059536Dae Kim
87983a6066224454de177655eb414dd3453c2059536Dae Kim		const VkRenderPassBeginInfo renderPassBeginInfo =
88083a6066224454de177655eb414dd3453c2059536Dae Kim		{
88183a6066224454de177655eb414dd3453c2059536Dae Kim			VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,				// VkStructureType		sType;
88283a6066224454de177655eb414dd3453c2059536Dae Kim			DE_NULL,												// const void*			pNext;
88383a6066224454de177655eb414dd3453c2059536Dae Kim			*m_renderPass,											// VkRenderPass			renderPass;
88483a6066224454de177655eb414dd3453c2059536Dae Kim			*m_framebuffer,											// VkFramebuffer		framebuffer;
885689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos			{
886689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos				{ 0, 0 },
887689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos				{ (deUint32)m_renderSize.x(), (deUint32)m_renderSize.y() }
888689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos			},														// VkRect2D				renderArea;
88983a6066224454de177655eb414dd3453c2059536Dae Kim			1,														// deUint32				clearValueCount;
89083a6066224454de177655eb414dd3453c2059536Dae Kim			&attachmentClearValue									// const VkClearValue*	pClearValues;
89183a6066224454de177655eb414dd3453c2059536Dae Kim		};
89283a6066224454de177655eb414dd3453c2059536Dae Kim
8933d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos		const VkImageMemoryBarrier preAttachmentBarrier =
8943d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos		{
8953d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos			VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,			// VkStructureType			sType;
8963d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos			DE_NULL,										// const void*				pNext;
8973d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos			0u,												// VkAccessFlags			srcAccessMask;
8983d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos			VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,			// VkAccessFlags			dstAccessMask;
8993d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos			VK_IMAGE_LAYOUT_UNDEFINED,						// VkImageLayout			oldLayout;
9003d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos			VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,		// VkImageLayout			newLayout;
9013d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos			VK_QUEUE_FAMILY_IGNORED,						// deUint32					srcQueueFamilyIndex;
9023d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos			VK_QUEUE_FAMILY_IGNORED,						// deUint32					dstQueueFamilyIndex;
9033d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos			*m_colorImage,									// VkImage					image;
9043d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos			{ VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u }	// VkImageSubresourceRange	subresourceRange;
9053d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos		};
9063d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos
907120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		m_cmdBuffer = allocateCommandBuffer(vk, vkDevice, &cmdBufferAllocateInfo);
90883a6066224454de177655eb414dd3453c2059536Dae Kim
90983a6066224454de177655eb414dd3453c2059536Dae Kim		VK_CHECK(vk.beginCommandBuffer(*m_cmdBuffer, &cmdBufferBeginInfo));
9103d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos
9113d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos		vk.cmdPipelineBarrier(*m_cmdBuffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, (VkDependencyFlags)0,
9123d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos			0u, DE_NULL, 0u, DE_NULL, 1u, &preAttachmentBarrier);
9133d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos
914120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		vk.cmdBeginRenderPass(*m_cmdBuffer, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
91583a6066224454de177655eb414dd3453c2059536Dae Kim
91683a6066224454de177655eb414dd3453c2059536Dae Kim		vk.cmdBindPipeline(*m_cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *m_graphicsPipeline);
91783a6066224454de177655eb414dd3453c2059536Dae Kim
91883a6066224454de177655eb414dd3453c2059536Dae Kim		vk.cmdBindDescriptorSets(*m_cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *m_pipelineLayout, 0, 1, &m_descriptorSet.get(), 0, DE_NULL);
91983a6066224454de177655eb414dd3453c2059536Dae Kim
92083a6066224454de177655eb414dd3453c2059536Dae Kim		const VkDeviceSize vertexBufferOffset = 0;
92183a6066224454de177655eb414dd3453c2059536Dae Kim		vk.cmdBindVertexBuffers(*m_cmdBuffer, 0, 1, &m_vertexBuffer.get(), &vertexBufferOffset);
92283a6066224454de177655eb414dd3453c2059536Dae Kim		vk.cmdDraw(*m_cmdBuffer, (deUint32)m_vertices.size(), 1, 0, 0);
92383a6066224454de177655eb414dd3453c2059536Dae Kim
92483a6066224454de177655eb414dd3453c2059536Dae Kim		vk.cmdEndRenderPass(*m_cmdBuffer);
92583a6066224454de177655eb414dd3453c2059536Dae Kim		VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
92683a6066224454de177655eb414dd3453c2059536Dae Kim	}
92783a6066224454de177655eb414dd3453c2059536Dae Kim
92883a6066224454de177655eb414dd3453c2059536Dae Kim	// Create fence
92983a6066224454de177655eb414dd3453c2059536Dae Kim	{
93083a6066224454de177655eb414dd3453c2059536Dae Kim		const VkFenceCreateInfo fenceParams =
93183a6066224454de177655eb414dd3453c2059536Dae Kim		{
93283a6066224454de177655eb414dd3453c2059536Dae Kim			VK_STRUCTURE_TYPE_FENCE_CREATE_INFO,	// VkStructureType		sType;
93383a6066224454de177655eb414dd3453c2059536Dae Kim			DE_NULL,								// const void*			pNext;
93483a6066224454de177655eb414dd3453c2059536Dae Kim			0u										// VkFenceCreateFlags	flags;
93583a6066224454de177655eb414dd3453c2059536Dae Kim		};
93683a6066224454de177655eb414dd3453c2059536Dae Kim
93783a6066224454de177655eb414dd3453c2059536Dae Kim		m_fence = createFence(vk, vkDevice, &fenceParams);
93883a6066224454de177655eb414dd3453c2059536Dae Kim	}
93983a6066224454de177655eb414dd3453c2059536Dae Kim}
94083a6066224454de177655eb414dd3453c2059536Dae Kim
94183a6066224454de177655eb414dd3453c2059536Dae KimImageSamplingInstance::~ImageSamplingInstance (void)
94283a6066224454de177655eb414dd3453c2059536Dae Kim{
94383a6066224454de177655eb414dd3453c2059536Dae Kim}
94483a6066224454de177655eb414dd3453c2059536Dae Kim
94583a6066224454de177655eb414dd3453c2059536Dae Kimtcu::TestStatus ImageSamplingInstance::iterate (void)
94683a6066224454de177655eb414dd3453c2059536Dae Kim{
94783a6066224454de177655eb414dd3453c2059536Dae Kim	const DeviceInterface&		vk			= m_context.getDeviceInterface();
94883a6066224454de177655eb414dd3453c2059536Dae Kim	const VkDevice				vkDevice	= m_context.getDevice();
94983a6066224454de177655eb414dd3453c2059536Dae Kim	const VkQueue				queue		= m_context.getUniversalQueue();
950120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	const VkSubmitInfo			submitInfo	=
951120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	{
952120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		VK_STRUCTURE_TYPE_SUBMIT_INFO,	// VkStructureType			sType;
953120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		DE_NULL,						// const void*				pNext;
954120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		0u,								// deUint32					waitSemaphoreCount;
955120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		DE_NULL,						// const VkSemaphore*		pWaitSemaphores;
956689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos		DE_NULL,
957120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		1u,								// deUint32					commandBufferCount;
958120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		&m_cmdBuffer.get(),				// const VkCommandBuffer*	pCommandBuffers;
959120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		0u,								// deUint32					signalSemaphoreCount;
960120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		DE_NULL							// const VkSemaphore*		pSignalSemaphores;
961120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	};
96283a6066224454de177655eb414dd3453c2059536Dae Kim
96383a6066224454de177655eb414dd3453c2059536Dae Kim	VK_CHECK(vk.resetFences(vkDevice, 1, &m_fence.get()));
964120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	VK_CHECK(vk.queueSubmit(queue, 1, &submitInfo, *m_fence));
96583a6066224454de177655eb414dd3453c2059536Dae Kim	VK_CHECK(vk.waitForFences(vkDevice, 1, &m_fence.get(), true, ~(0ull) /* infinity */));
96683a6066224454de177655eb414dd3453c2059536Dae Kim
96783a6066224454de177655eb414dd3453c2059536Dae Kim	return verifyImage();
96883a6066224454de177655eb414dd3453c2059536Dae Kim}
96983a6066224454de177655eb414dd3453c2059536Dae Kim
97083a6066224454de177655eb414dd3453c2059536Dae Kimtcu::TestStatus ImageSamplingInstance::verifyImage (void)
97183a6066224454de177655eb414dd3453c2059536Dae Kim{
97283a6066224454de177655eb414dd3453c2059536Dae Kim	const tcu::TextureFormat		colorFormat				= mapVkFormat(m_colorFormat);
97383a6066224454de177655eb414dd3453c2059536Dae Kim	const tcu::TextureFormat		depthStencilFormat		= tcu::TextureFormat(); // Undefined depth/stencil format.
97483a6066224454de177655eb414dd3453c2059536Dae Kim	const tcu::Sampler				sampler					= mapVkSampler(m_samplerParams);
975120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	const tcu::UVec4				componentMapping		= mapVkComponentMapping(m_componentMapping);
97683a6066224454de177655eb414dd3453c2059536Dae Kim	float							samplerLod;
97783a6066224454de177655eb414dd3453c2059536Dae Kim	bool							compareOk;
97883a6066224454de177655eb414dd3453c2059536Dae Kim	MovePtr<Program>				program;
97983a6066224454de177655eb414dd3453c2059536Dae Kim	MovePtr<ReferenceRenderer>		refRenderer;
98083a6066224454de177655eb414dd3453c2059536Dae Kim
98183a6066224454de177655eb414dd3453c2059536Dae Kim	// Set up LOD of reference sampler
982812054568e397caf9a7bd6b76b827f7a440610ceJeff Bolz	samplerLod = de::max(m_samplerParams.minLod, de::min(m_samplerParams.maxLod, m_samplerParams.mipLodBias + m_samplerLod));
98383a6066224454de177655eb414dd3453c2059536Dae Kim
98483a6066224454de177655eb414dd3453c2059536Dae Kim	// Create reference program that uses image subresource range
985120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	program = createRefProgram(colorFormat, sampler, samplerLod, componentMapping, *m_texture, m_imageViewType, m_layerCount, m_subresourceRange);
98683a6066224454de177655eb414dd3453c2059536Dae Kim	const rr::Program referenceProgram = program->getReferenceProgram();
98783a6066224454de177655eb414dd3453c2059536Dae Kim
98883a6066224454de177655eb414dd3453c2059536Dae Kim	// Render reference image
98983a6066224454de177655eb414dd3453c2059536Dae Kim	refRenderer = MovePtr<ReferenceRenderer>(new ReferenceRenderer(m_renderSize.x(), m_renderSize.y(), 1, colorFormat, depthStencilFormat, &referenceProgram));
99083a6066224454de177655eb414dd3453c2059536Dae Kim	const rr::RenderState renderState(refRenderer->getViewportState());
99183a6066224454de177655eb414dd3453c2059536Dae Kim	refRenderer->draw(renderState, rr::PRIMITIVETYPE_TRIANGLES, m_vertices);
99283a6066224454de177655eb414dd3453c2059536Dae Kim
99383a6066224454de177655eb414dd3453c2059536Dae Kim	// Compare result with reference image
99483a6066224454de177655eb414dd3453c2059536Dae Kim	{
99583a6066224454de177655eb414dd3453c2059536Dae Kim		const DeviceInterface&		vk							= m_context.getDeviceInterface();
99683a6066224454de177655eb414dd3453c2059536Dae Kim		const VkDevice				vkDevice					= m_context.getDevice();
99783a6066224454de177655eb414dd3453c2059536Dae Kim		const VkQueue				queue						= m_context.getUniversalQueue();
99883a6066224454de177655eb414dd3453c2059536Dae Kim		const deUint32				queueFamilyIndex			= m_context.getUniversalQueueFamilyIndex();
99983a6066224454de177655eb414dd3453c2059536Dae Kim		SimpleAllocator				memAlloc					(vk, vkDevice, getPhysicalDeviceMemoryProperties(m_context.getInstanceInterface(), m_context.getPhysicalDevice()));
100083a6066224454de177655eb414dd3453c2059536Dae Kim		MovePtr<tcu::TextureLevel>	result						= readColorAttachment(vk, vkDevice, queue, queueFamilyIndex, memAlloc, *m_colorImage, m_colorFormat, m_renderSize);
100159b191bc5c165338ac771b536cb804e7a9d3230czeppelin		tcu::UVec4					threshold					= tcu::UVec4(4, 4, 4, 4);
100259b191bc5c165338ac771b536cb804e7a9d3230czeppelin
100359b191bc5c165338ac771b536cb804e7a9d3230czeppelin		if ((m_imageFormat == vk::VK_FORMAT_EAC_R11G11_SNORM_BLOCK) || (m_imageFormat == vk::VK_FORMAT_EAC_R11_SNORM_BLOCK))
100459b191bc5c165338ac771b536cb804e7a9d3230czeppelin			threshold = tcu::UVec4(8, 8, 8, 8);
100583a6066224454de177655eb414dd3453c2059536Dae Kim
100683a6066224454de177655eb414dd3453c2059536Dae Kim		compareOk = tcu::intThresholdPositionDeviationCompare(m_context.getTestContext().getLog(),
100783a6066224454de177655eb414dd3453c2059536Dae Kim															  "IntImageCompare",
100883a6066224454de177655eb414dd3453c2059536Dae Kim															  "Image comparison",
100983a6066224454de177655eb414dd3453c2059536Dae Kim															  refRenderer->getAccess(),
101083a6066224454de177655eb414dd3453c2059536Dae Kim															  result->getAccess(),
1011f23cc02846e220d6da2442b41807c716d2804f88Pyry Haulos															  threshold,
101283a6066224454de177655eb414dd3453c2059536Dae Kim															  tcu::IVec3(1, 1, 0),
101383a6066224454de177655eb414dd3453c2059536Dae Kim															  true,
1014946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim															  tcu::COMPARE_LOG_RESULT);
101583a6066224454de177655eb414dd3453c2059536Dae Kim	}
101683a6066224454de177655eb414dd3453c2059536Dae Kim
101783a6066224454de177655eb414dd3453c2059536Dae Kim	if (compareOk)
101883a6066224454de177655eb414dd3453c2059536Dae Kim		return tcu::TestStatus::pass("Result image matches reference");
101983a6066224454de177655eb414dd3453c2059536Dae Kim	else
102083a6066224454de177655eb414dd3453c2059536Dae Kim		return tcu::TestStatus::fail("Image mismatch");
102183a6066224454de177655eb414dd3453c2059536Dae Kim}
102283a6066224454de177655eb414dd3453c2059536Dae Kim
102383a6066224454de177655eb414dd3453c2059536Dae Kim} // pipeline
102483a6066224454de177655eb414dd3453c2059536Dae Kim} // vkt
1025