1819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa/*------------------------------------------------------------------------
2819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa * Vulkan Conformance Tests
3819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa * ------------------------
4819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa *
5819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa * Copyright (c) 2017 The Khronos Group Inc.
6819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa *
7819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa * Licensed under the Apache License, Version 2.0 (the "License");
8819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa * you may not use this file except in compliance with the License.
9819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa * You may obtain a copy of the License at
10819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa *
11819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa *      http://www.apache.org/licenses/LICENSE-2.0
12819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa *
13819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa * Unless required by applicable law or agreed to in writing, software
14819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa * distributed under the License is distributed on an "AS IS" BASIS,
15819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa * See the License for the specific language governing permissions and
17819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa * limitations under the License.
18819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa *
19819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa *//*!
20819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa * \file  vktImageCompressionTranscodingSupport.cpp
21819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa * \brief Compression transcoding support
22819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa *//*--------------------------------------------------------------------*/
23819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
24819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa#include "vktImageCompressionTranscodingSupport.hpp"
25819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
26819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa#include "deUniquePtr.hpp"
27819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa#include "deStringUtil.hpp"
28819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa#include "deSharedPtr.hpp"
29819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa#include "deRandom.hpp"
30819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
31819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa#include "vktTestCaseUtil.hpp"
32819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa#include "vkPrograms.hpp"
33819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa#include "vkImageUtil.hpp"
34819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa#include "vktImageTestsUtil.hpp"
35819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa#include "vkBuilderUtil.hpp"
36819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa#include "vkRef.hpp"
37819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa#include "vkRefUtil.hpp"
38819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa#include "vkTypeUtil.hpp"
39819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa#include "vkQueryUtil.hpp"
40819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
41819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa#include "tcuTextureUtil.hpp"
42819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa#include "tcuTexture.hpp"
43819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa#include "tcuCompressedTexture.hpp"
44819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa#include "tcuVectorType.hpp"
45819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa#include "tcuResource.hpp"
46819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa#include "tcuImageIO.hpp"
47819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa#include "tcuImageCompare.hpp"
48819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa#include "tcuTestLog.hpp"
49819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa#include "tcuRGBA.hpp"
50819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa#include "tcuSurface.hpp"
51819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
52819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa#include <vector>
53819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwausing namespace vk;
54819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwanamespace vkt
55819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa{
56819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwanamespace image
57819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa{
58819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwanamespace
59819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa{
60819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwausing std::string;
61819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwausing std::vector;
62819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwausing tcu::TestContext;
63819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwausing tcu::TestStatus;
64819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwausing tcu::UVec3;
658d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwausing tcu::IVec3;
66819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwausing tcu::CompressedTexFormat;
67819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwausing tcu::CompressedTexture;
68819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwausing tcu::Resource;
69819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwausing tcu::Archive;
708d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwausing tcu::ConstPixelBufferAccess;
71819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwausing de::MovePtr;
72819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwausing de::SharedPtr;
73819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwausing de::Random;
74819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
758d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwatypedef SharedPtr<MovePtr<Image> >			ImageSp;
768d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwatypedef SharedPtr<Move<VkImageView> >		ImageViewSp;
778d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwatypedef SharedPtr<Move<VkDescriptorSet> >	SharedVkDescriptorSet;
78819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
79819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwaenum ShaderType
80819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa{
81819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	SHADER_TYPE_COMPUTE,
82819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	SHADER_TYPE_FRAGMENT,
83819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	SHADER_TYPE_LAST
84819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa};
85819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
86819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwaenum Operation
87819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa{
88819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	OPERATION_IMAGE_LOAD,
89819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	OPERATION_TEXEL_FETCH,
90819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	OPERATION_TEXTURE,
91819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	OPERATION_IMAGE_STORE,
92819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	OPERATION_ATTACHMENT_READ,
93819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	OPERATION_ATTACHMENT_WRITE,
94819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	OPERATION_TEXTURE_READ,
95819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	OPERATION_TEXTURE_WRITE,
96819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	OPERATION_LAST
97819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa};
98819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
99819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwastruct TestParameters
100819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa{
101819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	Operation			operation;
102819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	ShaderType			shader;
103819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	UVec3				size;
104819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	ImageType			imageType;
105819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	VkFormat			formatCompressed;
106819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	VkFormat			formatUncompressed;
107819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	deUint32			imagesCount;
108819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	VkImageUsageFlags	compressedImageUsage;
1098d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	VkImageUsageFlags	compressedImageViewUsage;
110819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	VkImageUsageFlags	uncompressedImageUsage;
111819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	bool				useMipmaps;
112819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	VkFormat			formatForVerify;
113819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa};
114819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
115819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwatemplate<typename T>
116819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwainline SharedPtr<Move<T> > makeVkSharedPtr (Move<T> move)
117819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa{
1188d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	return SharedPtr<Move<T> >(new Move<T>(move));
119819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa}
120819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
121819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwatemplate<typename T>
122819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwainline SharedPtr<MovePtr<T> > makeVkSharedPtr (MovePtr<T> movePtr)
123819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa{
124819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	return SharedPtr<MovePtr<T> >(new MovePtr<T>(movePtr));
125819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa}
126819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
1278d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwaconst deUint32 SINGLE_LEVEL = 1u;
1288d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwaconst deUint32 SINGLE_LAYER = 1u;
1298d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
130819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwaclass BasicTranscodingTestInstance : public TestInstance
131819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa{
132819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwapublic:
1338d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa							BasicTranscodingTestInstance	(Context&						context,
1348d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa															 const TestParameters&			parameters);
135819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	virtual TestStatus		iterate							(void) = 0;
136819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwaprotected:
1378d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	void					generateData					(deUint8*						toFill,
1388d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa															 const size_t					size,
1398d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa															 const VkFormat					format,
1408d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa															 const deUint32					layer = 0u,
1418d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa															 const deUint32					level = 0u);
1428d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	deUint32				getLevelCount					();
1438d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	deUint32				getLayerCount					();
1448d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	UVec3					getLayerDims					();
1458d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	vector<UVec3>			getMipLevelSizes				(UVec3							baseSize);
1468d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	vector<UVec3>			getCompressedMipLevelSizes		(const VkFormat					compressedFormat,
1478d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa															 const vector<UVec3>&			uncompressedSizes);
1488d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
149819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	const TestParameters	m_parameters;
1508d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const deUint32			m_blockWidth;
1518d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const deUint32			m_blockHeight;
1528d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const deUint32			m_levelCount;
1538d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const UVec3				m_layerSize;
1548d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
1558d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwaprivate:
1568d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	deUint32				findMipMapLevelCount			();
157819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa};
158819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
1598d45f54852211075dabe786c6bcdd137f40133bdArkadiusz SarwadeUint32 BasicTranscodingTestInstance::findMipMapLevelCount ()
1608d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa{
1618d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	deUint32 levelCount = 1;
1628d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
1638d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	// We cannot use mipmap levels which have resolution below block size.
1648d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	// Reduce number of mipmap levels
1658d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	if (m_parameters.useMipmaps)
1668d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	{
1678d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		deUint32 w = m_parameters.size.x();
1688d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		deUint32 h = m_parameters.size.y();
1698d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
1708d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		DE_ASSERT(m_blockWidth > 0u && m_blockHeight > 0u);
1718d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
1728d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		while (w > m_blockWidth && h > m_blockHeight)
1738d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		{
1748d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			w >>= 1;
1758d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			h >>= 1;
1768d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
1778d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			if (w > m_blockWidth && h > m_blockHeight)
1788d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				levelCount++;
1798d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		}
1808d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
1818d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		DE_ASSERT((m_parameters.size.x() >> (levelCount - 1u)) >= m_blockWidth);
1828d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		DE_ASSERT((m_parameters.size.y() >> (levelCount - 1u)) >= m_blockHeight);
1838d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	}
1848d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
1858d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	return levelCount;
1868d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa}
1878d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
188819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz SarwaBasicTranscodingTestInstance::BasicTranscodingTestInstance (Context& context, const TestParameters& parameters)
189819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	: TestInstance	(context)
190819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	, m_parameters	(parameters)
1918d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	, m_blockWidth	(getBlockWidth(m_parameters.formatCompressed))
1928d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	, m_blockHeight	(getBlockHeight(m_parameters.formatCompressed))
1938d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	, m_levelCount	(findMipMapLevelCount())
1948d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	, m_layerSize	(getLayerSize(m_parameters.imageType, m_parameters.size))
1958d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa{
1968d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	DE_ASSERT(deLog2Floor32(m_parameters.size.x()) == deLog2Floor32(m_parameters.size.y()));
1978d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa}
1988d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
1998d45f54852211075dabe786c6bcdd137f40133bdArkadiusz SarwadeUint32 BasicTranscodingTestInstance::getLevelCount()
2008d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa{
2018d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	return m_levelCount;
2028d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa}
2038d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
2048d45f54852211075dabe786c6bcdd137f40133bdArkadiusz SarwadeUint32 BasicTranscodingTestInstance::getLayerCount()
205819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa{
2068d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	return m_parameters.size.z();
207819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa}
208819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
2098d45f54852211075dabe786c6bcdd137f40133bdArkadiusz SarwaUVec3 BasicTranscodingTestInstance::getLayerDims()
2108d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa{
2118d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	return m_layerSize;
2128d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa}
2138d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
2148d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwavector<UVec3> BasicTranscodingTestInstance::getMipLevelSizes (UVec3 baseSize)
2158d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa{
2168d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	vector<UVec3>	levelSizes;
2178d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const deUint32	levelCount = getLevelCount();
2188d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
2198d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	DE_ASSERT(m_parameters.imageType == IMAGE_TYPE_2D || m_parameters.imageType == IMAGE_TYPE_2D_ARRAY);
2208d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
2218d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	baseSize.z() = 1u;
2228d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
2238d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	levelSizes.push_back(baseSize);
2248d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
2258d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	while (levelSizes.size() < levelCount && (baseSize.x() != 1 || baseSize.y() != 1))
2268d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	{
2278d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		baseSize.x() = deMax32(baseSize.x() >> 1, 1);
2288d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		baseSize.y() = deMax32(baseSize.y() >> 1, 1);
2298d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		levelSizes.push_back(baseSize);
2308d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	}
2318d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
2328d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	DE_ASSERT(levelSizes.size() == getLevelCount());
2338d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
2348d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	return levelSizes;
2358d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa}
2368d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
2378d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwavector<UVec3> BasicTranscodingTestInstance::getCompressedMipLevelSizes (const VkFormat compressedFormat, const vector<UVec3>& uncompressedSizes)
2388d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa{
2398d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	vector<UVec3> levelSizes;
2408d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	vector<UVec3>::const_iterator it;
2418d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
2428d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	for (it = uncompressedSizes.begin(); it != uncompressedSizes.end(); it++)
2438d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		levelSizes.push_back(getCompressedImageResolutionInBlocks(compressedFormat, *it));
2448d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
2458d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	return levelSizes;
2468d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa}
2478d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
2488d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwavoid BasicTranscodingTestInstance::generateData (deUint8*		toFill,
2498d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa												 const size_t	size,
2508d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa												 const VkFormat format,
2518d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa												 const deUint32 layer,
2528d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa												 const deUint32 level)
253819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa{
254819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	const deUint8 pattern[] =
255819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	{
256819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		// 64-bit values
257819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		0x11, 0x11, 0x11, 0x11, 0x22, 0x22, 0x22, 0x22,
258819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
259819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
260819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,
261819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
262819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
263819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,
264819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00,
265819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00,
266819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00,
267819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		0x7F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,		// Positive infinity
268819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,		// Negative infinity
269819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		0x7F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,		// Start of a signalling NaN (NANS)
270819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		0x7F, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,		// End of a signalling NaN (NANS)
271819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,		// Start of a signalling NaN (NANS)
272819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		0xFF, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,		// End of a signalling NaN (NANS)
273819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		0x7F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,		// Start of a quiet NaN (NANQ)
274819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,		// End of of a quiet NaN (NANQ)
275819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,		// Start of a quiet NaN (NANQ)
276819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,		// End of a quiet NaN (NANQ)
277819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		// 32-bit values
278819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		0x7F, 0x80, 0x00, 0x00,								// Positive infinity
279819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		0xFF, 0x80, 0x00, 0x00,								// Negative infinity
280819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		0x7F, 0x80, 0x00, 0x01,								// Start of a signalling NaN (NANS)
281819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		0x7F, 0xBF, 0xFF, 0xFF,								// End of a signalling NaN (NANS)
282819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		0xFF, 0x80, 0x00, 0x01,								// Start of a signalling NaN (NANS)
283819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		0xFF, 0xBF, 0xFF, 0xFF,								// End of a signalling NaN (NANS)
284819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		0x7F, 0xC0, 0x00, 0x00,								// Start of a quiet NaN (NANQ)
285819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		0x7F, 0xFF, 0xFF, 0xFF,								// End of of a quiet NaN (NANQ)
286819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		0xFF, 0xC0, 0x00, 0x00,								// Start of a quiet NaN (NANQ)
287819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		0xFF, 0xFF, 0xFF, 0xFF,								// End of a quiet NaN (NANQ)
288819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		0xAA, 0xAA, 0xAA, 0xAA,
289819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		0x55, 0x55, 0x55, 0x55,
290819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	};
291819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
292819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	deUint8*	start		= toFill;
293819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	size_t		sizeToRnd	= size;
294819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
295819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	// Pattern part
2968d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	if (layer == 0 && level == 0 && size >= 2 * sizeof(pattern))
297819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	{
298819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		// Rotated pattern
299819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		for (size_t i = 0; i < sizeof(pattern); i++)
300819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			start[sizeof(pattern) - i - 1] = pattern[i];
301819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
302819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		start		+= sizeof(pattern);
303819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		sizeToRnd	-= sizeof(pattern);
304819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
305819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		// Direct pattern
306819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		deMemcpy(start, pattern, sizeof(pattern));
307819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
308819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		start		+= sizeof(pattern);
309819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		sizeToRnd	-= sizeof(pattern);
310819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	}
311819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
312819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	// Random part
313819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	{
314819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		DE_ASSERT(sizeToRnd % sizeof(deUint32) == 0);
315819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
316819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		deUint32*	start32		= reinterpret_cast<deUint32*>(start);
317819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		size_t		sizeToRnd32	= sizeToRnd / sizeof(deUint32);
3188d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		deUint32	seed		= (layer << 24) ^ (level << 16) ^ static_cast<deUint32>(format);
3198d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		Random		rnd			(seed);
320819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
321819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		for (size_t i = 0; i < sizeToRnd32; i++)
322819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			start32[i] = rnd.getUint32();
323819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	}
324819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
325819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	{
326819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		// Remove certain values that may not be preserved based on the uncompressed view format
327819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		if (isSnormFormat(m_parameters.formatUncompressed))
328819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		{
329819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			for (size_t i = 0; i < size; i += 2)
330819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			{
331819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa				// SNORM fix: due to write operation in SNORM format
332819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa				// replaces 0x00 0x80 to 0x01 0x80
333819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa				if (toFill[i] == 0x00 && toFill[i+1] == 0x80)
334819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa					toFill[i+1] = 0x81;
335819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			}
336819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		}
337819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		else if (isFloatFormat(m_parameters.formatUncompressed))
338819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		{
339819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			tcu::TextureFormat textureFormat = mapVkFormat(m_parameters.formatUncompressed);
340819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
341819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			if (textureFormat.type == tcu::TextureFormat::HALF_FLOAT)
342819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			{
343819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa				for (size_t i = 0; i < size; i += 2)
344819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa				{
345819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa					// HALF_FLOAT fix: remove INF and NaN
346819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa					if ((toFill[i+1] & 0x7C) == 0x7C)
347819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa						toFill[i+1] = 0x00;
348819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa				}
349819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			}
350819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			else if (textureFormat.type == tcu::TextureFormat::FLOAT)
351819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			{
352819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa				for (size_t i = 0; i < size; i += 4)
353819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa				{
354819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa					// HALF_FLOAT fix: remove INF and NaN
355819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa					if ((toFill[i+1] & 0x7C) == 0x7C)
356819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa						toFill[i+1] = 0x00;
357819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa				}
358819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
359819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa				for (size_t i = 0; i < size; i += 4)
360819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa				{
361819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa					// FLOAT fix: remove INF, NaN, and denorm
362819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa					// Little endian fix
363819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa					if (((toFill[i+3] & 0x7F) == 0x7F && (toFill[i+2] & 0x80) == 0x80) || ((toFill[i+3] & 0x7F) == 0x00 && (toFill[i+2] & 0x80) == 0x00))
364819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa						toFill[i+3] = 0x01;
365819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa					// Big endian fix
366819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa					if (((toFill[i+0] & 0x7F) == 0x7F && (toFill[i+1] & 0x80) == 0x80) || ((toFill[i+0] & 0x7F) == 0x00 && (toFill[i+1] & 0x80) == 0x00))
367819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa						toFill[i+0] = 0x01;
368819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa				}
369819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			}
370819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		}
371819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	}
372819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa}
373819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
374819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwaclass BasicComputeTestInstance : public BasicTranscodingTestInstance
375819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa{
376819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwapublic:
3778d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa					BasicComputeTestInstance	(Context&							context,
378819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa												const TestParameters&				parameters);
379819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	TestStatus		iterate						(void);
380819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwaprotected:
3818d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	struct ImageData
3828d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	{
3838d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		deUint32			getImagesCount		(void)									{ return static_cast<deUint32>(images.size());		}
3848d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		deUint32			getImageViewCount	(void)									{ return static_cast<deUint32>(imagesViews.size());	}
3858d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		deUint32			getImageInfoCount	(void)									{ return static_cast<deUint32>(imagesInfos.size());	}
3868d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		VkImage				getImage			(const deUint32				ndx)		{ return **images[ndx]->get();						}
3878d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		VkImageView			getImageView		(const deUint32				ndx)		{ return **imagesViews[ndx];						}
3888d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		VkImageCreateInfo	getImageInfo		(const deUint32				ndx)		{ return imagesInfos[ndx];							}
3898d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		void				addImage			(MovePtr<Image>				image)		{ images.push_back(makeVkSharedPtr(image));			}
3908d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		void				addImageView		(Move<VkImageView>			imageView)	{ imagesViews.push_back(makeVkSharedPtr(imageView));}
3918d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		void				addImageInfo		(const VkImageCreateInfo	imageInfo)	{ imagesInfos.push_back(imageInfo);					}
3928d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		void				resetViews			()										{ imagesViews.clear();								}
3938d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	private:
3948d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		vector<ImageSp>				images;
3958d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		vector<ImageViewSp>			imagesViews;
3968d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		vector<VkImageCreateInfo>	imagesInfos;
3978d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	};
398819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	void			copyDataToImage				(const VkCommandBuffer&				cmdBuffer,
3998d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa												 ImageData&							imageData,
4008d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa												 const vector<UVec3>&				mipMapSizes,
4018d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa												 const bool							isCompressed);
402819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	virtual void	executeShader				(const VkCommandBuffer&				cmdBuffer,
403819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa												 const VkDescriptorSetLayout&		descriptorSetLayout,
404819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa												 const VkDescriptorPool&			descriptorPool,
4058d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa												vector<ImageData>&					imageData);
406819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	bool			copyResultAndCompare		(const VkCommandBuffer&				cmdBuffer,
4078d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa												 const VkImage&						uncompressed,
4088d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa												 const VkDeviceSize					offset,
4098d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa												 const UVec3&						size);
410819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	void			descriptorSetUpdate			(VkDescriptorSet					descriptorSet,
411819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa												 const VkDescriptorImageInfo*		descriptorImageInfos);
4128d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	void			createImageInfos			(ImageData&							imageData,
4138d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa												 const vector<UVec3>&				mipMapSizes,
4148d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa												 const bool							isCompressed);
415819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	bool			decompressImage				(const VkCommandBuffer&				cmdBuffer,
4168d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa												 vector<ImageData>&					imageData,
4178d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa												 const vector<UVec3>&				mipMapSizes);
418819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	vector<deUint8>	m_data;
419819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa};
420819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
4218d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
422819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz SarwaBasicComputeTestInstance::BasicComputeTestInstance (Context& context, const TestParameters& parameters)
423819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	:BasicTranscodingTestInstance	(context, parameters)
424819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa{
425819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa}
426819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
427819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz SarwaTestStatus BasicComputeTestInstance::iterate (void)
428819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa{
429819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	const DeviceInterface&					vk					= m_context.getDeviceInterface();
430819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	const VkDevice							device				= m_context.getDevice();
431819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	const deUint32							queueFamilyIndex	= m_context.getUniversalQueueFamilyIndex();
432819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	Allocator&								allocator			= m_context.getDefaultAllocator();
4338d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const Unique<VkCommandPool>				cmdPool				(createCommandPool(vk, device, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, queueFamilyIndex));
4348d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const Unique<VkCommandBuffer>			cmdBuffer			(allocateCommandBuffer(vk, device, *cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY));
4358d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const vector<UVec3>						mipMapSizes			= m_parameters.useMipmaps ? getMipLevelSizes (getLayerDims()) : vector<UVec3>(1, m_parameters.size);
4368d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	vector<ImageData>						imageData			(m_parameters.imagesCount);
437819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	const deUint32							compressedNdx		= 0u;
4388d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const deUint32							resultImageNdx		= m_parameters.imagesCount -1u;
439819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
4408d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	for (deUint32 imageNdx = 0u; imageNdx < m_parameters.imagesCount; ++imageNdx)
441819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	{
4428d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		const bool isCompressed = compressedNdx == imageNdx ? true : false;
4438d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		createImageInfos(imageData[imageNdx], mipMapSizes, isCompressed);
4448d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		for (deUint32 infoNdx = 0u; infoNdx < imageData[imageNdx].getImageInfoCount(); ++infoNdx)
445819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		{
4468d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			imageData[imageNdx].addImage(MovePtr<Image>(new Image(vk, device, allocator, imageData[imageNdx].getImageInfo(infoNdx), MemoryRequirement::Any)));
4478d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			if (isCompressed)
448819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			{
4498d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				const VkImageViewUsageCreateInfoKHR	imageViewUsageKHR	=
450819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa				{
4518d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa					VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO_KHR,				//VkStructureType		sType;
4528d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa					DE_NULL,														//const void*			pNext;
4538d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa					m_parameters.compressedImageUsage,								//VkImageUsageFlags		usage;
454819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa				};
4558d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				for (deUint32 mipNdx = 0u; mipNdx < mipMapSizes.size(); ++mipNdx)
4568d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				for (deUint32 layerNdx = 0u; layerNdx < getLayerCount(); ++layerNdx)
4578d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				{
4588d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa					imageData[imageNdx].addImageView(makeImageView(vk, device, imageData[imageNdx].getImage(infoNdx),
4598d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa														mapImageViewType(m_parameters.imageType), m_parameters.formatUncompressed,
4608d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa														makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, mipNdx, 1u, layerNdx, 1u),
4618d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa														&imageViewUsageKHR));
4628d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				}
463819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			}
464819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			else
465819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			{
4668d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				imageData[imageNdx].addImageView(makeImageView(vk, device, imageData[imageNdx].getImage(infoNdx),
4678d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa													mapImageViewType(m_parameters.imageType), m_parameters.formatUncompressed,
4688d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa													makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u)));
469819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			}
470819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		}
471819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	}
472819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
4738d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	{
4748d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		size_t size = 0ull;
4758d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		for(deUint32 mipNdx = 0u; mipNdx < mipMapSizes.size(); ++mipNdx)
4768d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		{
4778d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			size += static_cast<size_t>(getCompressedImageSizeInBytes(m_parameters.formatCompressed, mipMapSizes[mipNdx]) * getLayerCount());
4788d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		}
4798d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		m_data.resize(size);
4808d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		generateData (&m_data[0], m_data.size(), m_parameters.formatCompressed);
4818d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	}
482819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
483819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	switch(m_parameters.operation)
484819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	{
485819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		case OPERATION_IMAGE_LOAD:
486819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		case OPERATION_TEXEL_FETCH:
487819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		case OPERATION_TEXTURE:
4888d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			copyDataToImage(*cmdBuffer, imageData[compressedNdx], mipMapSizes, true);
489819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			break;
490819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		case OPERATION_IMAGE_STORE:
4918d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			copyDataToImage(*cmdBuffer, imageData[1], mipMapSizes, false);
492819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			break;
493819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		default:
494819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			DE_ASSERT(false);
495819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			break;
496819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	}
497819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
498819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	{
4998d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		Move<VkDescriptorSetLayout>	descriptorSetLayout;
5008d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		Move<VkDescriptorPool>		descriptorPool;
5018d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
5028d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		DescriptorSetLayoutBuilder	descriptorSetLayoutBuilder;
5038d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		DescriptorPoolBuilder		descriptorPoolBuilder;
5048d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		for (deUint32 imageNdx = 0u; imageNdx < m_parameters.imagesCount; ++imageNdx)
5058d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		{
5068d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			switch(m_parameters.operation)
5078d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			{
5088d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				case OPERATION_IMAGE_LOAD:
5098d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				case OPERATION_IMAGE_STORE:
5108d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa					descriptorSetLayoutBuilder.addSingleBinding(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, VK_SHADER_STAGE_COMPUTE_BIT);
5118d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa					descriptorPoolBuilder.addType(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, imageData[0].getImageViewCount());
5128d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa					break;
5138d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				case OPERATION_TEXEL_FETCH:
5148d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				case OPERATION_TEXTURE:
5158d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa					descriptorSetLayoutBuilder.addSingleBinding((compressedNdx == imageNdx) ? VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER : VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, VK_SHADER_STAGE_COMPUTE_BIT);
5168d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa					descriptorPoolBuilder.addType((compressedNdx == imageNdx) ? VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER : VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, imageData[0].getImageViewCount());
5178d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa					break;
5188d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				default:
5198d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa					DE_ASSERT(false);
5208d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa					break;
5218d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			}
5228d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		}
5238d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		descriptorSetLayout	= descriptorSetLayoutBuilder.build(vk, device);
5248d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		descriptorPool		= descriptorPoolBuilder.build(vk, device, VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, imageData[0].getImageViewCount());
5258d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		executeShader(*cmdBuffer, *descriptorSetLayout, *descriptorPool, imageData);
5268d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
5278d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		{
5288d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			VkDeviceSize offset = 0ull;
5298d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			for (deUint32 mipNdx = 0u; mipNdx < mipMapSizes.size(); ++mipNdx)
5308d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			for (deUint32 layerNdx = 0u; layerNdx < getLayerCount(); ++layerNdx)
5318d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			{
5328d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				const deUint32	imageNdx	= layerNdx + mipNdx * getLayerCount();
5338d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				const UVec3		size		= UVec3(imageData[resultImageNdx].getImageInfo(imageNdx).extent.width,
5348d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa													imageData[resultImageNdx].getImageInfo(imageNdx).extent.height,
5358d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa													imageData[resultImageNdx].getImageInfo(imageNdx).extent.depth);
5368d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				if (!copyResultAndCompare(*cmdBuffer, imageData[resultImageNdx].getImage(imageNdx), offset, size))
5378d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa					return TestStatus::fail("Fail");
5388d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				offset += getCompressedImageSizeInBytes(m_parameters.formatCompressed, mipMapSizes[mipNdx]);
5398d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			}
5408d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		}
5418d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	};
5428d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	if (!decompressImage(*cmdBuffer, imageData, mipMapSizes))
5438d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			return TestStatus::fail("Fail");
5448d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	return TestStatus::pass("Pass");
545819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa}
546819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
5478d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwavoid BasicComputeTestInstance::copyDataToImage (const VkCommandBuffer&	cmdBuffer,
5488d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa												ImageData&				imageData,
5498d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa												const vector<UVec3>&	mipMapSizes,
5508d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa												const bool				isCompressed)
551819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa{
552819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	const DeviceInterface&		vk			= m_context.getDeviceInterface();
553819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	const VkDevice				device		= m_context.getDevice();
554819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	const VkQueue				queue		= m_context.getUniversalQueue();
555819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	Allocator&					allocator	= m_context.getDefaultAllocator();
556819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
557819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	Buffer						imageBuffer	(vk, device, allocator,
558819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa												makeBufferCreateInfo(m_data.size(), VK_BUFFER_USAGE_TRANSFER_SRC_BIT),
559819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa												MemoryRequirement::HostVisible);
5608d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	VkDeviceSize				offset		= 0ull;
561819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	{
562819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		const Allocation& alloc = imageBuffer.getAllocation();
563819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		deMemcpy(alloc.getHostPtr(), &m_data[0], m_data.size());
564819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		flushMappedMemoryRange(vk, device, alloc.getMemory(), alloc.getOffset(), m_data.size());
565819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	}
566819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
567819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	beginCommandBuffer(vk, cmdBuffer);
5688d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const VkImageSubresourceRange	subresourceRange		=
569819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	{
5708d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		VK_IMAGE_ASPECT_COLOR_BIT,					//VkImageAspectFlags	aspectMask
5718d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		0u,											//deUint32				baseMipLevel
5728d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		imageData.getImageInfo(0u).mipLevels,		//deUint32				levelCount
5738d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		0u,											//deUint32				baseArrayLayer
5748d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		imageData.getImageInfo(0u).arrayLayers		//deUint32				layerCount
5758d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	};
576819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
5778d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	for (deUint32 imageNdx = 0u; imageNdx < imageData.getImagesCount(); ++imageNdx)
5788d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	{
579819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		const VkImageMemoryBarrier		preCopyImageBarrier		= makeImageMemoryBarrier(
580819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa																	0u, VK_ACCESS_TRANSFER_WRITE_BIT,
581819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa																	VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
5828d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																	imageData.getImage(imageNdx), subresourceRange);
583819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
584819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		const VkBufferMemoryBarrier		FlushHostCopyBarrier	= makeBufferMemoryBarrier(
585819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa																	VK_ACCESS_HOST_WRITE_BIT, VK_ACCESS_TRANSFER_READ_BIT,
586819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa																	imageBuffer.get(), 0ull, m_data.size());
587819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
588819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		vk.cmdPipelineBarrier(cmdBuffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT,
5898d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				(VkDependencyFlags)0, 0u, (const VkMemoryBarrier*)DE_NULL, 1u, &FlushHostCopyBarrier, 1u, &preCopyImageBarrier);
590819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
5918d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		for (deUint32 mipNdx = 0u; mipNdx < imageData.getImageInfo(imageNdx).mipLevels; ++mipNdx)
592819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		{
5938d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			const VkExtent3D				imageExtent				= isCompressed ?
5948d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																		makeExtent3D(mipMapSizes[mipNdx]) :
5958d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																		imageData.getImageInfo(imageNdx).extent;
5968d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			const VkBufferImageCopy			copyRegion				=
5978d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			{
5988d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				offset,																												//VkDeviceSize				bufferOffset;
5998d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				0u,																													//deUint32					bufferRowLength;
6008d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				0u,																													//deUint32					bufferImageHeight;
6018d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				makeImageSubresourceLayers(VK_IMAGE_ASPECT_COLOR_BIT, mipNdx, 0u, imageData.getImageInfo(imageNdx).arrayLayers),	//VkImageSubresourceLayers	imageSubresource;
6028d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				makeOffset3D(0, 0, 0),																								//VkOffset3D				imageOffset;
6038d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				imageExtent,																										//VkExtent3D				imageExtent;
6048d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			};
605819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
6068d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			vk.cmdCopyBufferToImage(cmdBuffer, imageBuffer.get(), imageData.getImage(imageNdx), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1u, &copyRegion);
6078d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			offset += getCompressedImageSizeInBytes(m_parameters.formatCompressed,
6088d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa						UVec3(isCompressed ? imageExtent.width : imageExtent.width * m_blockWidth, isCompressed? imageExtent.height :imageExtent.height * m_blockHeight,imageExtent.depth)) *
6098d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa						imageData.getImageInfo(imageNdx).arrayLayers;
6108d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		}
611819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	}
612819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	endCommandBuffer(vk, cmdBuffer);
613819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	submitCommandsAndWait(vk, device, queue, cmdBuffer);
614819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa}
615819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
616819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwavoid BasicComputeTestInstance::executeShader (const VkCommandBuffer&		cmdBuffer,
617819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa											  const VkDescriptorSetLayout&	descriptorSetLayout,
618819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa											  const VkDescriptorPool&		descriptorPool,
6198d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa											  vector<ImageData>&			imageData)
620819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa{
621819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	const DeviceInterface&			vk						= m_context.getDeviceInterface();
622819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	const VkDevice					device					= m_context.getDevice();
623819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	const VkQueue					queue					= m_context.getUniversalQueue();
624819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	const Unique<VkShaderModule>	shaderModule			(createShaderModule(vk, device, m_context.getBinaryCollection().get("comp"), 0));
6258d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	vector<SharedVkDescriptorSet>	descriptorSets			(imageData[0].getImageViewCount());
626819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	const Unique<VkPipelineLayout>	pipelineLayout			(makePipelineLayout(vk, device, descriptorSetLayout));
627819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	const Unique<VkPipeline>		pipeline				(makeComputePipeline(vk, device, *pipelineLayout, *shaderModule));
628819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	Move<VkSampler>					sampler;
629819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	{
6308d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		const VkSamplerCreateInfo createInfo =
631819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		{
6328d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO,		//VkStructureType		sType;
633819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			DE_NULL,									//const void*			pNext;
634819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			0u,											//VkSamplerCreateFlags	flags;
635819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			VK_FILTER_NEAREST,							//VkFilter				magFilter;
636819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			VK_FILTER_NEAREST,							//VkFilter				minFilter;
637819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			VK_SAMPLER_MIPMAP_MODE_NEAREST,				//VkSamplerMipmapMode	mipmapMode;
638819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE,		//VkSamplerAddressMode	addressModeU;
639819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE,		//VkSamplerAddressMode	addressModeV;
640819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE,		//VkSamplerAddressMode	addressModeW;
641819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			0.0f,										//float					mipLodBias;
642819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			VK_FALSE,									//VkBool32				anisotropyEnable;
643819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			1.0f,										//float					maxAnisotropy;
6448d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			VK_FALSE,									//VkBool32				compareEnable;
645819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			VK_COMPARE_OP_EQUAL,						//VkCompareOp			compareOp;
646819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			0.0f,										//float					minLod;
647819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			0.0f,										//float					maxLod;
648819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK,	//VkBorderColor			borderColor;
6498d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			VK_FALSE,									//VkBool32				unnormalizedCoordinates;
650819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		};
6518d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		sampler = createSampler(vk, device, &createInfo);
6528d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	}
6538d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
6548d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	vector<VkDescriptorImageInfo>	descriptorImageInfos	(descriptorSets.size() * m_parameters.imagesCount);
6558d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	for (deUint32 viewNdx = 0u; viewNdx < descriptorSets.size(); ++viewNdx)
6568d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	{
6578d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		const deUint32 descriptorNdx = viewNdx * m_parameters.imagesCount;
6588d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		for (deUint32 imageNdx = 0; imageNdx < m_parameters.imagesCount; ++imageNdx)
6598d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		{
6608d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			descriptorImageInfos[descriptorNdx+imageNdx] = makeDescriptorImageInfo(*sampler,
6618d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa															imageData[imageNdx].getImageView(viewNdx), VK_IMAGE_LAYOUT_GENERAL);
6628d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		}
663819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	}
664819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
6658d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	for (deUint32 ndx = 0u; ndx < descriptorSets.size(); ++ndx)
6668d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		descriptorSets[ndx] = makeVkSharedPtr(makeDescriptorSet(vk, device, descriptorPool, descriptorSetLayout));
667819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
668819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	beginCommandBuffer(vk, cmdBuffer);
669819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	{
6708d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		const VkImageSubresourceRange	compressedRange				=
6718d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		{
6728d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			VK_IMAGE_ASPECT_COLOR_BIT,					//VkImageAspectFlags	aspectMask
6738d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			0u,											//deUint32				baseMipLevel
6748d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			imageData[0].getImageInfo(0u).mipLevels,	//deUint32				levelCount
6758d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			0u,											//deUint32				baseArrayLayer
6768d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			imageData[0].getImageInfo(0u).arrayLayers	//deUint32				layerCount
6778d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		};
6788d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		const VkImageSubresourceRange	uncompressedRange			=
679819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		{
680819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			VK_IMAGE_ASPECT_COLOR_BIT,					//VkImageAspectFlags	aspectMask
681819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			0u,											//deUint32				baseMipLevel
682819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			1u,											//deUint32				levelCount
683819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			0u,											//deUint32				baseArrayLayer
684819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			1u											//deUint32				layerCount
685819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		};
686819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
687819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		vk.cmdBindPipeline(cmdBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, *pipeline);
688819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
6898d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		vector<VkImageMemoryBarrier>		preShaderImageBarriers;
6908d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		preShaderImageBarriers.resize(descriptorSets.size() + 1u);
6918d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		for (deUint32 imageNdx = 0u; imageNdx < imageData[1].getImagesCount(); ++imageNdx)
692819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		{
6938d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			preShaderImageBarriers[imageNdx]= makeImageMemoryBarrier(
6948d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa												VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_SHADER_WRITE_BIT,
6958d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa												VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_GENERAL,
6968d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa												imageData[1].getImage(imageNdx), uncompressedRange);
6978d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		}
698819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
6998d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		preShaderImageBarriers[descriptorSets.size()] = makeImageMemoryBarrier(
7008d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa															VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_SHADER_READ_BIT,
7018d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa															VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL,
7028d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa															imageData[0].getImage(0), compressedRange);
703819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
7048d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		vk.cmdPipelineBarrier(cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT,
7058d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			(VkDependencyFlags)0, 0u, (const VkMemoryBarrier*)DE_NULL, 0u, (const VkBufferMemoryBarrier*)DE_NULL,
7068d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			static_cast<deUint32>(preShaderImageBarriers.size()), &preShaderImageBarriers[0]);
707819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
7088d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		for (deUint32 ndx = 0u; ndx <descriptorSets.size(); ++ndx)
7098d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		{
7108d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			descriptorSetUpdate (**descriptorSets[ndx], &descriptorImageInfos[ndx* m_parameters.imagesCount]);
7118d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			vk.cmdBindDescriptorSets(cmdBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, *pipelineLayout, 0u, 1u, &(**descriptorSets[ndx]), 0u, DE_NULL);
7128d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			vk.cmdDispatch(cmdBuffer,	imageData[1].getImageInfo(ndx).extent.width,
7138d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa										imageData[1].getImageInfo(ndx).extent.height,
7148d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa										imageData[1].getImageInfo(ndx).extent.depth);
7158d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		}
716819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	}
717819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	endCommandBuffer(vk, cmdBuffer);
718819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	submitCommandsAndWait(vk, device, queue, cmdBuffer);
719819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa}
720819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
7218d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwabool BasicComputeTestInstance::copyResultAndCompare (const VkCommandBuffer&	cmdBuffer,
7228d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa													 const VkImage&			uncompressed,
7238d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa													 const VkDeviceSize		offset,
7248d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa													 const UVec3&			size)
725819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa{
726819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	const DeviceInterface&	vk					= m_context.getDeviceInterface();
727819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	const VkQueue			queue				= m_context.getUniversalQueue();
728819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	const VkDevice			device				= m_context.getDevice();
729819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	Allocator&				allocator			= m_context.getDefaultAllocator();
730819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
7318d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	VkDeviceSize			imageResultSize		= getImageSizeBytes (tcu::IVec3(size.x(), size.y(), size.z()), m_parameters.formatUncompressed);
732819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	Buffer					imageBufferResult	(vk, device, allocator,
733819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa													makeBufferCreateInfo(imageResultSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT),
734819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa													MemoryRequirement::HostVisible);
735819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
736819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	beginCommandBuffer(vk, cmdBuffer);
737819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	{
738819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		const VkImageSubresourceRange	subresourceRange	=
739819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		{
740819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			VK_IMAGE_ASPECT_COLOR_BIT,											//VkImageAspectFlags	aspectMask
741819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			0u,																	//deUint32				baseMipLevel
742819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			1u,																	//deUint32				levelCount
743819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			0u,																	//deUint32				baseArrayLayer
744819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			1u																	//deUint32				layerCount
745819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		};
746819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
747819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		const VkBufferImageCopy			copyRegion			=
748819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		{
749819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			0ull,																//	VkDeviceSize				bufferOffset;
750819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			0u,																	//	deUint32					bufferRowLength;
751819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			0u,																	//	deUint32					bufferImageHeight;
752819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			makeImageSubresourceLayers(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 0u, 1u),	//	VkImageSubresourceLayers	imageSubresource;
753819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			makeOffset3D(0, 0, 0),												//	VkOffset3D					imageOffset;
7548d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			makeExtent3D(size),													//	VkExtent3D					imageExtent;
755819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		};
756819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
757819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		const VkImageMemoryBarrier prepareForTransferBarrier = makeImageMemoryBarrier(
758819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa																VK_ACCESS_SHADER_WRITE_BIT, VK_ACCESS_TRANSFER_READ_BIT,
759819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa																VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
760819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa																uncompressed, subresourceRange);
761819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
762819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		const VkBufferMemoryBarrier copyBarrier = makeBufferMemoryBarrier(
763819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa													VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_HOST_READ_BIT,
764819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa													imageBufferResult.get(), 0ull, imageResultSize);
765819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
7668d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		vk.cmdPipelineBarrier(cmdBuffer, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 0, (const VkBufferMemoryBarrier*)DE_NULL, 1u, &prepareForTransferBarrier);
767819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		vk.cmdCopyImageToBuffer(cmdBuffer, uncompressed, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, imageBufferResult.get(), 1u, &copyRegion);
7688d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		vk.cmdPipelineBarrier(cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_HOST_BIT, (VkDependencyFlags)0, 0u, (const VkMemoryBarrier*)DE_NULL, 1, &copyBarrier, 0u, (const VkImageMemoryBarrier*)DE_NULL);
769819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	}
770819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	endCommandBuffer(vk, cmdBuffer);
771819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	submitCommandsAndWait(vk, device, queue, cmdBuffer);
772819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
773819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	const Allocation& allocResult = imageBufferResult.getAllocation();
774819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	invalidateMappedMemoryRange(vk, device, allocResult.getMemory(), allocResult.getOffset(), imageResultSize);
7758d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	if (deMemCmp((const void *)allocResult.getHostPtr(), (const void *)&m_data[static_cast<size_t>(offset)], static_cast<size_t>(imageResultSize)) == 0ull)
776819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		return true;
777819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	return false;
778819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa}
779819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
780819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwavoid BasicComputeTestInstance::descriptorSetUpdate (VkDescriptorSet descriptorSet, const VkDescriptorImageInfo* descriptorImageInfos)
781819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa{
782819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	const DeviceInterface&		vk		= m_context.getDeviceInterface();
783819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	const VkDevice				device	= m_context.getDevice();
784819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	DescriptorSetUpdateBuilder	descriptorSetUpdateBuilder;
785819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
786819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	switch(m_parameters.operation)
787819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	{
788819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		case OPERATION_IMAGE_LOAD:
789819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		case OPERATION_IMAGE_STORE:
790819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		{
7918d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			for (deUint32 bindingNdx = 0u; bindingNdx < m_parameters.imagesCount; ++bindingNdx)
792819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa				descriptorSetUpdateBuilder.writeSingle(descriptorSet, DescriptorSetUpdateBuilder::Location::binding(bindingNdx), VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, &descriptorImageInfos[bindingNdx]);
793819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
794819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			break;
795819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		}
796819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
797819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		case OPERATION_TEXEL_FETCH:
798819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		case OPERATION_TEXTURE:
799819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		{
8008d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			for (deUint32 bindingNdx = 0u; bindingNdx < m_parameters.imagesCount; ++bindingNdx)
801819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			{
802819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa				descriptorSetUpdateBuilder.writeSingle(descriptorSet, DescriptorSetUpdateBuilder::Location::binding(bindingNdx),
8038d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa					bindingNdx == 0u ? VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER : VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, &descriptorImageInfos[bindingNdx]);
804819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			}
8058d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
806819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			break;
807819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		}
808819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
809819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		default:
810819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			DE_ASSERT(false);
811819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	}
812819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	descriptorSetUpdateBuilder.update(vk, device);
813819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa}
814819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
8158d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwavoid BasicComputeTestInstance::createImageInfos (ImageData& imageData, const vector<UVec3>& mipMapSizes, const bool isCompressed)
816819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa{
817819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	const VkImageType			imageType			= mapImageType(m_parameters.imageType);
818819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
8198d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	if (isCompressed)
820819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	{
8218d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		const VkExtent3D			extentCompressed	= makeExtent3D(getLayerSize(m_parameters.imageType, m_parameters.size));
8228d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		const VkImageCreateInfo compressedInfo =
8238d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		{
8248d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,					// VkStructureType			sType;
8258d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			DE_NULL,												// const void*				pNext;
8268d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT |
8278d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT_KHR |
8288d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			VK_IMAGE_CREATE_EXTENDED_USAGE_BIT_KHR,					// VkImageCreateFlags		flags;
8298d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			imageType,												// VkImageType				imageType;
8308d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			m_parameters.formatCompressed,							// VkFormat					format;
8318d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			extentCompressed,										// VkExtent3D				extent;
8328d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			static_cast<deUint32>(mipMapSizes.size()),				// deUint32					mipLevels;
8338d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			getLayerCount(),										// deUint32					arrayLayers;
8348d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			VK_SAMPLE_COUNT_1_BIT,									// VkSampleCountFlagBits	samples;
8358d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			VK_IMAGE_TILING_OPTIMAL,								// VkImageTiling			tiling;
8368d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			VK_IMAGE_USAGE_SAMPLED_BIT |
8378d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			VK_IMAGE_USAGE_STORAGE_BIT |
8388d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			VK_IMAGE_USAGE_TRANSFER_SRC_BIT |
8398d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			VK_IMAGE_USAGE_TRANSFER_DST_BIT,						// VkImageUsageFlags		usage;
8408d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			VK_SHARING_MODE_EXCLUSIVE,								// VkSharingMode			sharingMode;
8418d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			0u,														// deUint32					queueFamilyIndexCount;
8428d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			DE_NULL,												// const deUint32*			pQueueFamilyIndices;
8438d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			VK_IMAGE_LAYOUT_UNDEFINED,								// VkImageLayout			initialLayout;
8448d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		};
8458d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		imageData.addImageInfo(compressedInfo);
8468d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	}
8478d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	else
8488d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	{
8498d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		for (size_t mipNdx = 0ull; mipNdx < mipMapSizes.size(); ++mipNdx)
8508d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		for (size_t layerNdx = 0ull; layerNdx < getLayerCount(); ++layerNdx)
8518d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		{
8528d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			const VkExtent3D		extentUncompressed	= m_parameters.useMipmaps ?
8538d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa															makeExtent3D(getCompressedImageResolutionInBlocks(m_parameters.formatCompressed, mipMapSizes[mipNdx])) :
8548d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa															makeExtent3D(getCompressedImageResolutionInBlocks(m_parameters.formatCompressed, m_parameters.size));
8558d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			const VkImageCreateInfo	uncompressedInfo	=
8568d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			{
8578d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,				// VkStructureType			sType;
8588d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				DE_NULL,											// const void*				pNext;
8598d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				0u,													// VkImageCreateFlags		flags;
8608d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				imageType,											// VkImageType				imageType;
8618d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				m_parameters.formatUncompressed,					// VkFormat					format;
8628d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				extentUncompressed,									// VkExtent3D				extent;
8638d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				1u,													// deUint32					mipLevels;
8648d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				1u,													// deUint32					arrayLayers;
8658d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				VK_SAMPLE_COUNT_1_BIT,								// VkSampleCountFlagBits	samples;
8668d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				VK_IMAGE_TILING_OPTIMAL,							// VkImageTiling			tiling;
8678d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				m_parameters.uncompressedImageUsage |
8688d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				VK_IMAGE_USAGE_SAMPLED_BIT,							// VkImageUsageFlags		usage;
8698d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				VK_SHARING_MODE_EXCLUSIVE,							// VkSharingMode			sharingMode;
8708d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				0u,													// deUint32					queueFamilyIndexCount;
8718d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				DE_NULL,											// const deUint32*			pQueueFamilyIndices;
8728d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				VK_IMAGE_LAYOUT_UNDEFINED,							// VkImageLayout			initialLayout;
8738d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			};
8748d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			imageData.addImageInfo(uncompressedInfo);
8758d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		}
8768d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	}
8778d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa}
8788d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
8798d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwabool BasicComputeTestInstance::decompressImage (const VkCommandBuffer&	cmdBuffer,
8808d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa												 vector<ImageData>&		imageData,
8818d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa												 const vector<UVec3>&	mipMapSizes)
8828d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa{
8838d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const DeviceInterface&			vk						= m_context.getDeviceInterface();
8848d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const VkDevice					device					= m_context.getDevice();
8858d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const VkQueue					queue					= m_context.getUniversalQueue();
8868d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	Allocator&						allocator				= m_context.getDefaultAllocator();
8878d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const Unique<VkShaderModule>	shaderModule			(createShaderModule(vk, device, m_context.getBinaryCollection().get("decompress"), 0));
8888d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const VkImage&					compressed				= imageData[0].getImage(0);
8898d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
8908d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	for (deUint32 ndx = 0u; ndx < imageData.size(); ndx++)
8918d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		imageData[ndx].resetViews();
892819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
8938d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	for (deUint32 mipNdx = 0u; mipNdx < mipMapSizes.size(); ++mipNdx)
8948d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	for (deUint32 layerNdx = 0u; layerNdx < getLayerCount(); ++layerNdx)
895819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	{
896c291149e2803c25074f1fbea8686b3488573aa92Arkadiusz Sarwa		const bool						layoutShaderReadOnly	= (layerNdx % 2u) == 1;
8978d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		const deUint32					imageNdx				= layerNdx + mipNdx * getLayerCount();
8988d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		const VkExtent3D				extentCompressed		= makeExtent3D(mipMapSizes[mipNdx]);
8998d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		const VkImage&					uncompressed			= imageData[m_parameters.imagesCount -1].getImage(imageNdx);
9008d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		const VkExtent3D				extentUncompressed		= imageData[m_parameters.imagesCount -1].getImageInfo(imageNdx).extent;
9018d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		const VkDeviceSize				bufferSizeComp			= getCompressedImageSizeInBytes(m_parameters.formatCompressed, mipMapSizes[mipNdx]);
9028d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
9038d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		const VkImageCreateInfo			decompressedImageInfo	=
9048d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		{
9058d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,								// VkStructureType			sType;
9068d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			DE_NULL,															// const void*				pNext;
9078d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			0u,																	// VkImageCreateFlags		flags;
9088d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			VK_IMAGE_TYPE_2D,													// VkImageType				imageType;
9098d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			VK_FORMAT_R8G8B8A8_UNORM,											// VkFormat					format;
9108d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			extentCompressed,													// VkExtent3D				extent;
9118d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			1u,																	// deUint32					mipLevels;
9128d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			1u,																	// deUint32					arrayLayers;
9138d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			VK_SAMPLE_COUNT_1_BIT,												// VkSampleCountFlagBits	samples;
9148d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			VK_IMAGE_TILING_OPTIMAL,											// VkImageTiling			tiling;
9158d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			VK_IMAGE_USAGE_SAMPLED_BIT |
9168d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			VK_IMAGE_USAGE_STORAGE_BIT |
9178d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			VK_IMAGE_USAGE_TRANSFER_SRC_BIT |
9188d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			VK_IMAGE_USAGE_TRANSFER_DST_BIT,									// VkImageUsageFlags		usage;
9198d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			VK_SHARING_MODE_EXCLUSIVE,											// VkSharingMode			sharingMode;
9208d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			0u,																	// deUint32					queueFamilyIndexCount;
9218d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			DE_NULL,															// const deUint32*			pQueueFamilyIndices;
9228d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			VK_IMAGE_LAYOUT_UNDEFINED,											// VkImageLayout			initialLayout;
9238d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		};
9248d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
9258d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		const VkImageCreateInfo			compressedImageInfo		=
9268d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		{
9278d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,								// VkStructureType			sType;
9288d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			DE_NULL,															// const void*				pNext;
9298d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			0u,																	// VkImageCreateFlags		flags;
9308d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			VK_IMAGE_TYPE_2D,													// VkImageType				imageType;
9318d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			m_parameters.formatCompressed,										// VkFormat					format;
9328d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			extentCompressed,													// VkExtent3D				extent;
9338d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			1u,																	// deUint32					mipLevels;
9348d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			1u,																	// deUint32					arrayLayers;
9358d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			VK_SAMPLE_COUNT_1_BIT,												// VkSampleCountFlagBits	samples;
9368d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			VK_IMAGE_TILING_OPTIMAL,											// VkImageTiling			tiling;
9378d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			VK_IMAGE_USAGE_SAMPLED_BIT |
9388d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			VK_IMAGE_USAGE_TRANSFER_DST_BIT,									// VkImageUsageFlags		usage;
9398d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			VK_SHARING_MODE_EXCLUSIVE,											// VkSharingMode			sharingMode;
9408d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			0u,																	// deUint32					queueFamilyIndexCount;
9418d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			DE_NULL,															// const deUint32*			pQueueFamilyIndices;
9428d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			VK_IMAGE_LAYOUT_UNDEFINED,											// VkImageLayout			initialLayout;
9438d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		};
9448d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		const VkImageUsageFlags				compressedViewUsageFlags	= VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
9458d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		const VkImageViewUsageCreateInfoKHR	compressedViewUsageCI		=
9468d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		{
9478d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO_KHR,					//VkStructureType		sType;
9488d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			DE_NULL,															//const void*			pNext;
9498d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			compressedViewUsageFlags,											//VkImageUsageFlags		usage;
9508d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		};
9518d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		Image							resultImage				(vk, device, allocator, decompressedImageInfo, MemoryRequirement::Any);
9528d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		Image							referenceImage			(vk, device, allocator, decompressedImageInfo, MemoryRequirement::Any);
9538d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		Image							uncompressedImage		(vk, device, allocator, compressedImageInfo, MemoryRequirement::Any);
9548d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		Move<VkImageView>				resultView				= makeImageView(vk, device, resultImage.get(), mapImageViewType(m_parameters.imageType), decompressedImageInfo.format,
9558d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																	makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, decompressedImageInfo.extent.depth, 0u, decompressedImageInfo.arrayLayers));
9568d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		Move<VkImageView>				referenceView			= makeImageView(vk, device, referenceImage.get(), mapImageViewType(m_parameters.imageType), decompressedImageInfo.format,
9578d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																	makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, decompressedImageInfo.extent.depth, 0u, decompressedImageInfo.arrayLayers));
9588d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		Move<VkImageView>				uncompressedView		= makeImageView(vk, device, uncompressedImage.get(), mapImageViewType(m_parameters.imageType), m_parameters.formatCompressed,
9598d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																	makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, compressedImageInfo.extent.depth, 0u, compressedImageInfo.arrayLayers));
9608d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		Move<VkImageView>				compressedView			= makeImageView(vk, device, compressed, mapImageViewType(m_parameters.imageType), m_parameters.formatCompressed,
9618d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																	makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, mipNdx, 1u, layerNdx, 1u), &compressedViewUsageCI);
9628d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		Move<VkDescriptorSetLayout>		descriptorSetLayout		= DescriptorSetLayoutBuilder()
9638d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																	.addSingleBinding(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_SHADER_STAGE_COMPUTE_BIT)
9648d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																	.addSingleBinding(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_SHADER_STAGE_COMPUTE_BIT)
9658d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																	.addSingleBinding(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, VK_SHADER_STAGE_COMPUTE_BIT)
9668d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																	.addSingleBinding(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, VK_SHADER_STAGE_COMPUTE_BIT)
9678d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																	.build(vk, device);
9688d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		Move<VkDescriptorPool>			descriptorPool			= DescriptorPoolBuilder()
9698d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																	.addType(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, decompressedImageInfo.arrayLayers)
9708d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																	.addType(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, decompressedImageInfo.arrayLayers)
9718d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																	.addType(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, decompressedImageInfo.arrayLayers)
9728d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																	.addType(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, decompressedImageInfo.arrayLayers)
9738d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																	.build(vk, device, VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, decompressedImageInfo.arrayLayers);
9748d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
9758d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		Move<VkDescriptorSet>			descriptorSet			= makeDescriptorSet(vk, device, *descriptorPool, *descriptorSetLayout);
9768d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		const Unique<VkPipelineLayout>	pipelineLayout			(makePipelineLayout(vk, device, *descriptorSetLayout));
9778d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		const Unique<VkPipeline>		pipeline				(makeComputePipeline(vk, device, *pipelineLayout, *shaderModule));
9788d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		const VkDeviceSize				bufferSize				= getImageSizeBytes(IVec3((int)extentCompressed.width, (int)extentCompressed.height, (int)extentCompressed.depth), VK_FORMAT_R8G8B8A8_UNORM);
9798d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		Buffer							resultBuffer			(vk, device, allocator,
9808d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																	makeBufferCreateInfo(bufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT), MemoryRequirement::HostVisible);
9818d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		Buffer							referenceBuffer			(vk, device, allocator,
9828d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																	makeBufferCreateInfo(bufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT), MemoryRequirement::HostVisible);
9838d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		Buffer							transferBuffer			(vk, device, allocator,
9848d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																	makeBufferCreateInfo(bufferSizeComp, VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT), MemoryRequirement::HostVisible);
9858d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		Move<VkSampler>					sampler;
9868d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		{
9878d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			const VkSamplerCreateInfo createInfo	=
9888d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			{
9898d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO,							//VkStructureType		sType;
9908d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				DE_NULL,														//const void*			pNext;
9918d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				0u,																//VkSamplerCreateFlags	flags;
9928d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				VK_FILTER_NEAREST,												//VkFilter				magFilter;
9938d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				VK_FILTER_NEAREST,												//VkFilter				minFilter;
9948d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				VK_SAMPLER_MIPMAP_MODE_NEAREST,									//VkSamplerMipmapMode	mipmapMode;
9958d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE,							//VkSamplerAddressMode	addressModeU;
9968d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE,							//VkSamplerAddressMode	addressModeV;
9978d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE,							//VkSamplerAddressMode	addressModeW;
9988d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				0.0f,															//float					mipLodBias;
9998d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				VK_FALSE,														//VkBool32				anisotropyEnable;
10008d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				1.0f,															//float					maxAnisotropy;
10018d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				VK_FALSE,														//VkBool32				compareEnable;
10028d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				VK_COMPARE_OP_EQUAL,											//VkCompareOp			compareOp;
10038d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				0.0f,															//float					minLod;
10048d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				1.0f,															//float					maxLod;
10058d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK,						//VkBorderColor			borderColor;
10068d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				VK_FALSE,														//VkBool32				unnormalizedCoordinates;
10078d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			};
10088d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			sampler = createSampler(vk, device, &createInfo);
10098d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		}
10108d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
10118d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		VkDescriptorImageInfo			descriptorImageInfos[]	=
1012819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		{
1013c291149e2803c25074f1fbea8686b3488573aa92Arkadiusz Sarwa			makeDescriptorImageInfo(*sampler,	*uncompressedView,	layoutShaderReadOnly ? VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL : VK_IMAGE_LAYOUT_GENERAL),
1014c291149e2803c25074f1fbea8686b3488573aa92Arkadiusz Sarwa			makeDescriptorImageInfo(*sampler,	*compressedView,	layoutShaderReadOnly ? VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL : VK_IMAGE_LAYOUT_GENERAL),
10158d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			makeDescriptorImageInfo(DE_NULL,	*resultView,		VK_IMAGE_LAYOUT_GENERAL),
10168d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			makeDescriptorImageInfo(DE_NULL,	*referenceView,		VK_IMAGE_LAYOUT_GENERAL)
1017819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		};
10188d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		DescriptorSetUpdateBuilder()
10198d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			.writeSingle(descriptorSet.get(), DescriptorSetUpdateBuilder::Location::binding(0u), VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, &descriptorImageInfos[0])
10208d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			.writeSingle(descriptorSet.get(), DescriptorSetUpdateBuilder::Location::binding(1u), VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, &descriptorImageInfos[1])
10218d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			.writeSingle(descriptorSet.get(), DescriptorSetUpdateBuilder::Location::binding(2u), VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, &descriptorImageInfos[2])
10228d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			.writeSingle(descriptorSet.get(), DescriptorSetUpdateBuilder::Location::binding(3u), VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, &descriptorImageInfos[3])
10238d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			.update(vk, device);
10248d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
10258d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
10268d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		beginCommandBuffer(vk, cmdBuffer);
10278d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		{
10288d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			const VkImageSubresourceRange	subresourceRange		=
10298d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			{
10308d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				VK_IMAGE_ASPECT_COLOR_BIT,											//VkImageAspectFlags			aspectMask
10318d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				0u,																	//deUint32						baseMipLevel
10328d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				1u,																	//deUint32						levelCount
10338d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				0u,																	//deUint32						baseArrayLayer
10348d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				1u																	//deUint32						layerCount
10358d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			};
10368d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
1037c291149e2803c25074f1fbea8686b3488573aa92Arkadiusz Sarwa			const VkImageSubresourceRange	subresourceRangeComp	=
1038c291149e2803c25074f1fbea8686b3488573aa92Arkadiusz Sarwa			{
1039c291149e2803c25074f1fbea8686b3488573aa92Arkadiusz Sarwa				VK_IMAGE_ASPECT_COLOR_BIT,											//VkImageAspectFlags			aspectMask
1040c291149e2803c25074f1fbea8686b3488573aa92Arkadiusz Sarwa				mipNdx,																//deUint32						baseMipLevel
1041c291149e2803c25074f1fbea8686b3488573aa92Arkadiusz Sarwa				1u,																	//deUint32						levelCount
1042c291149e2803c25074f1fbea8686b3488573aa92Arkadiusz Sarwa				layerNdx,															//deUint32						baseArrayLayer
1043c291149e2803c25074f1fbea8686b3488573aa92Arkadiusz Sarwa				1u																	//deUint32						layerCount
1044c291149e2803c25074f1fbea8686b3488573aa92Arkadiusz Sarwa			};
1045c291149e2803c25074f1fbea8686b3488573aa92Arkadiusz Sarwa
10468d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			const VkBufferImageCopy			copyRegion				=
10478d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			{
10488d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				0ull,																//	VkDeviceSize				bufferOffset;
10498d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				0u,																	//	deUint32					bufferRowLength;
10508d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				0u,																	//	deUint32					bufferImageHeight;
10518d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				makeImageSubresourceLayers(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 0u, 1u),	//	VkImageSubresourceLayers	imageSubresource;
10528d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				makeOffset3D(0, 0, 0),												//	VkOffset3D					imageOffset;
10538d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				decompressedImageInfo.extent,										//	VkExtent3D					imageExtent;
10548d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			};
10558d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
10568d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			const VkBufferImageCopy			compressedCopyRegion	=
10578d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			{
10588d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				0ull,																//	VkDeviceSize				bufferOffset;
10598d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				0u,																	//	deUint32					bufferRowLength;
10608d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				0u,																	//	deUint32					bufferImageHeight;
10618d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				makeImageSubresourceLayers(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 0u, 1u),	//	VkImageSubresourceLayers	imageSubresource;
10628d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				makeOffset3D(0, 0, 0),												//	VkOffset3D					imageOffset;
10638d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				extentUncompressed,													//	VkExtent3D					imageExtent;
10648d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			};
10658d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
10668d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			{
10678d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
10688d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				const VkBufferMemoryBarrier		preCopyBufferBarriers	= makeBufferMemoryBarrier(0u, VK_ACCESS_TRANSFER_WRITE_BIT,
10698d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																			transferBuffer.get(), 0ull, bufferSizeComp);
10708d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
10718d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				vk.cmdPipelineBarrier(cmdBuffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT,
10728d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa					(VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 1u, &preCopyBufferBarriers, 0u, (const VkImageMemoryBarrier*)DE_NULL);
10738d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			}
10748d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
10758d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			vk.cmdCopyImageToBuffer(cmdBuffer, uncompressed, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, transferBuffer.get(), 1u, &compressedCopyRegion);
10768d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
10778d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			{
10788d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				const VkBufferMemoryBarrier		postCopyBufferBarriers	= makeBufferMemoryBarrier(VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_TRANSFER_READ_BIT,
10798d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																			transferBuffer.get(), 0ull, bufferSizeComp);
10808d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
10818d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				const VkImageMemoryBarrier		preCopyImageBarriers	= makeImageMemoryBarrier(0u, VK_ACCESS_TRANSFER_WRITE_BIT,
10828d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																			VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, uncompressedImage.get(), subresourceRange);
10838d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
10848d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				vk.cmdPipelineBarrier(cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT,
10858d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa					(VkDependencyFlags)0, 0u, (const VkMemoryBarrier*)DE_NULL, 1u, &postCopyBufferBarriers, 1u, &preCopyImageBarriers);
10868d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			}
10878d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
10888d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			vk.cmdCopyBufferToImage(cmdBuffer, transferBuffer.get(), uncompressedImage.get(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1u, &copyRegion);
10898d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
10908d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			vk.cmdBindPipeline(cmdBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, *pipeline);
10918d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			vk.cmdBindDescriptorSets(cmdBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, *pipelineLayout, 0u, 1u, &descriptorSet.get(), 0u, DE_NULL);
10928d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
10938d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			{
10948d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				const VkImageMemoryBarrier		preShaderImageBarriers[]	=
10958d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				{
10968d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
10978d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa					makeImageMemoryBarrier(VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_SHADER_READ_BIT,
1098c291149e2803c25074f1fbea8686b3488573aa92Arkadiusz Sarwa						VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, layoutShaderReadOnly ? VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL : VK_IMAGE_LAYOUT_GENERAL,
10998d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa						uncompressedImage.get(), subresourceRange),
11008d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
1101c291149e2803c25074f1fbea8686b3488573aa92Arkadiusz Sarwa					makeImageMemoryBarrier(0, VK_ACCESS_SHADER_READ_BIT,
1102c291149e2803c25074f1fbea8686b3488573aa92Arkadiusz Sarwa						VK_IMAGE_LAYOUT_GENERAL, layoutShaderReadOnly ? VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL : VK_IMAGE_LAYOUT_GENERAL,
1103c291149e2803c25074f1fbea8686b3488573aa92Arkadiusz Sarwa						compressed, subresourceRangeComp),
1104c291149e2803c25074f1fbea8686b3488573aa92Arkadiusz Sarwa
11058d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa					makeImageMemoryBarrier(0u, VK_ACCESS_SHADER_WRITE_BIT,
11068d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa						VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_GENERAL,
11078d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa						resultImage.get(), subresourceRange),
11088d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
11098d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa					makeImageMemoryBarrier(0u, VK_ACCESS_SHADER_WRITE_BIT,
11108d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa						VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_GENERAL,
11118d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa						referenceImage.get(), subresourceRange)
11128d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				};
11138d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
11148d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				vk.cmdPipelineBarrier(cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT,
11158d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa					(VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 0u, (const VkBufferMemoryBarrier*)DE_NULL,
11168d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa					DE_LENGTH_OF_ARRAY(preShaderImageBarriers), preShaderImageBarriers);
11178d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			}
11188d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
11198d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			vk.cmdDispatch(cmdBuffer, extentCompressed.width, extentCompressed.height, extentCompressed.depth);
11208d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
11218d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			{
11228d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				const VkImageMemoryBarrier		postShaderImageBarriers[]	=
11238d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				{
11248d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa					makeImageMemoryBarrier(VK_ACCESS_SHADER_WRITE_BIT, VK_ACCESS_TRANSFER_READ_BIT,
11258d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa					VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
11268d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa					resultImage.get(), subresourceRange),
11278d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
11288d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa					makeImageMemoryBarrier(VK_ACCESS_SHADER_WRITE_BIT, VK_ACCESS_TRANSFER_READ_BIT,
11298d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa						VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
11308d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa						referenceImage.get(), subresourceRange)
11318d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				};
11328d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
11338d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				 const VkBufferMemoryBarrier		preCopyBufferBarrier[]		=
11348d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				{
11358d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa					makeBufferMemoryBarrier( 0, VK_BUFFER_USAGE_TRANSFER_DST_BIT,
11368d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa						resultBuffer.get(), 0ull, bufferSize),
11378d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
11388d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa					makeBufferMemoryBarrier( 0, VK_BUFFER_USAGE_TRANSFER_DST_BIT,
11398d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa						referenceBuffer.get(), 0ull, bufferSize),
11408d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				};
11418d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
11428d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				vk.cmdPipelineBarrier(cmdBuffer, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT,
11438d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa					(VkDependencyFlags)0, 0u, (const VkMemoryBarrier*)DE_NULL, DE_LENGTH_OF_ARRAY(preCopyBufferBarrier), preCopyBufferBarrier,
11448d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa					DE_LENGTH_OF_ARRAY(postShaderImageBarriers), postShaderImageBarriers);
11458d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			}
11468d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			vk.cmdCopyImageToBuffer(cmdBuffer, resultImage.get(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, resultBuffer.get(), 1u, &copyRegion);
11478d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			vk.cmdCopyImageToBuffer(cmdBuffer, referenceImage.get(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, referenceBuffer.get(), 1u, &copyRegion);
11488d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		}
11498d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		endCommandBuffer(vk, cmdBuffer);
11508d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		submitCommandsAndWait(vk, device, queue, cmdBuffer);
11518d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
11528d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		const Allocation&		resultAlloc		= resultBuffer.getAllocation();
11538d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		const Allocation&		referenceAlloc	= referenceBuffer.getAllocation();
11548d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		invalidateMappedMemoryRange(vk, device, resultAlloc.getMemory(), resultAlloc.getOffset(), bufferSize);
11558d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		invalidateMappedMemoryRange(vk, device, referenceAlloc.getMemory(), referenceAlloc.getOffset(), bufferSize);
11568d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
115706b7b26cabac6e8c2634be905cc814677aea5c02Boris Zanin		if (deMemCmp(resultAlloc.getHostPtr(), referenceAlloc.getHostPtr(), (size_t)bufferSize) != 0)
11588d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		{
115906b7b26cabac6e8c2634be905cc814677aea5c02Boris Zanin			ConstPixelBufferAccess	resultPixels		(mapVkFormat(decompressedImageInfo.format), decompressedImageInfo.extent.width, decompressedImageInfo.extent.height, decompressedImageInfo.extent.depth, resultAlloc.getHostPtr());
116006b7b26cabac6e8c2634be905cc814677aea5c02Boris Zanin			ConstPixelBufferAccess	referencePixels		(mapVkFormat(decompressedImageInfo.format), decompressedImageInfo.extent.width, decompressedImageInfo.extent.height, decompressedImageInfo.extent.depth, referenceAlloc.getHostPtr());
116106b7b26cabac6e8c2634be905cc814677aea5c02Boris Zanin
11628d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			if(!fuzzyCompare(m_context.getTestContext().getLog(), "Image Comparison", "Image Comparison", resultPixels, referencePixels, 0.001f, tcu::COMPARE_LOG_EVERYTHING))
11638d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				return false;
11648d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		}
1165819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	}
116606b7b26cabac6e8c2634be905cc814677aea5c02Boris Zanin
11678d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	return true;
1168819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa}
1169819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
11708d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwaclass ImageStoreComputeTestInstance : public BasicComputeTestInstance
1171819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa{
11728d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwapublic:
11738d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa					ImageStoreComputeTestInstance	(Context&							context,
11748d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa													 const TestParameters&				parameters);
11758d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwaprotected:
11768d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	virtual void	executeShader					(const VkCommandBuffer&				cmdBuffer,
11778d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa													 const VkDescriptorSetLayout&		descriptorSetLayout,
11788d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa													 const VkDescriptorPool&			descriptorPool,
11798d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa													 vector<ImageData>&					imageData);
11808d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwaprivate:
11818d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa};
11828d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
11838d45f54852211075dabe786c6bcdd137f40133bdArkadiusz SarwaImageStoreComputeTestInstance::ImageStoreComputeTestInstance (Context& context, const TestParameters& parameters)
11848d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	:BasicComputeTestInstance	(context, parameters)
11858d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa{
11868d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa}
11878d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
11888d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwavoid ImageStoreComputeTestInstance::executeShader (const VkCommandBuffer&		cmdBuffer,
11898d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa												   const VkDescriptorSetLayout&	descriptorSetLayout,
11908d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa												   const VkDescriptorPool&		descriptorPool,
11918d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa												   vector<ImageData>&			imageData)
11928d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa{
11938d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const DeviceInterface&			vk						= m_context.getDeviceInterface();
11948d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const VkDevice					device					= m_context.getDevice();
11958d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const VkQueue					queue					= m_context.getUniversalQueue();
11968d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const Unique<VkShaderModule>	shaderModule			(createShaderModule(vk, device, m_context.getBinaryCollection().get("comp"), 0));
11978d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	vector<SharedVkDescriptorSet>	descriptorSets			(imageData[0].getImageViewCount());
11988d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const Unique<VkPipelineLayout>	pipelineLayout			(makePipelineLayout(vk, device, descriptorSetLayout));
11998d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const Unique<VkPipeline>		pipeline				(makeComputePipeline(vk, device, *pipelineLayout, *shaderModule));
12008d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	Move<VkSampler>					sampler;
1201819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	{
12028d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		const VkSamplerCreateInfo createInfo =
1203819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		{
12048d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO,		//VkStructureType		sType;
12058d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			DE_NULL,									//const void*			pNext;
12068d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			0u,											//VkSamplerCreateFlags	flags;
12078d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			VK_FILTER_NEAREST,							//VkFilter				magFilter;
12088d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			VK_FILTER_NEAREST,							//VkFilter				minFilter;
12098d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			VK_SAMPLER_MIPMAP_MODE_NEAREST,				//VkSamplerMipmapMode	mipmapMode;
12108d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE,		//VkSamplerAddressMode	addressModeU;
12118d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE,		//VkSamplerAddressMode	addressModeV;
12128d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE,		//VkSamplerAddressMode	addressModeW;
12138d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			0.0f,										//float					mipLodBias;
12148d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			VK_FALSE,									//VkBool32				anisotropyEnable;
12158d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			1.0f,										//float					maxAnisotropy;
12168d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			VK_FALSE,									//VkBool32				compareEnable;
12178d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			VK_COMPARE_OP_EQUAL,						//VkCompareOp			compareOp;
12188d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			0.0f,										//float					minLod;
12198d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			0.0f,										//float					maxLod;
12208d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK,	//VkBorderColor			borderColor;
12218d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			VK_TRUE,									//VkBool32				unnormalizedCoordinates;
1222819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		};
12238d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		sampler = createSampler(vk, device, &createInfo);
1224819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	}
1225819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
12268d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	vector<VkDescriptorImageInfo>	descriptorImageInfos	(descriptorSets.size() * m_parameters.imagesCount);
12278d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	for (deUint32 viewNdx = 0u; viewNdx < descriptorSets.size(); ++viewNdx)
1228819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	{
12298d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		const deUint32 descriptorNdx = viewNdx * m_parameters.imagesCount;
12308d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		for (deUint32 imageNdx = 0u; imageNdx < m_parameters.imagesCount; ++imageNdx)
12318d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		{
12328d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			descriptorImageInfos[descriptorNdx+imageNdx] = makeDescriptorImageInfo(*sampler,
12338d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa															imageData[imageNdx].getImageView(viewNdx), VK_IMAGE_LAYOUT_GENERAL);
12348d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		}
12358d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	}
1236819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
12378d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	for (deUint32 ndx = 0u; ndx < descriptorSets.size(); ++ndx)
12388d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		descriptorSets[ndx] = makeVkSharedPtr(makeDescriptorSet(vk, device, descriptorPool, descriptorSetLayout));
1239819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
1240819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	beginCommandBuffer(vk, cmdBuffer);
1241819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	{
12428d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		const VkImageSubresourceRange	compressedRange				=
1243819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		{
12448d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			VK_IMAGE_ASPECT_COLOR_BIT,					//VkImageAspectFlags	aspectMask
12458d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			0u,											//deUint32				baseMipLevel
12468d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			imageData[0].getImageInfo(0).mipLevels,		//deUint32				levelCount
12478d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			0u,											//deUint32				baseArrayLayer
12488d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			imageData[0].getImageInfo(0).arrayLayers	//deUint32				layerCount
1249819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		};
1250819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
12518d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		const VkImageSubresourceRange	uncompressedRange			=
1252819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		{
12538d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			VK_IMAGE_ASPECT_COLOR_BIT,					//VkImageAspectFlags	aspectMask
12548d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			0u,											//deUint32				baseMipLevel
12558d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			1u,											//deUint32				levelCount
12568d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			0u,											//deUint32				baseArrayLayer
12578d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			1u											//deUint32				layerCount
1258819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		};
1259819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
12608d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		vk.cmdBindPipeline(cmdBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, *pipeline);
1261819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
12628d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		vector<VkImageMemoryBarrier>		preShaderImageBarriers	(descriptorSets.size() * 2u + 1u);
12638d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		for (deUint32 imageNdx = 0u; imageNdx < imageData[1].getImagesCount(); ++imageNdx)
1264819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		{
12658d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			preShaderImageBarriers[imageNdx]									= makeImageMemoryBarrier(
12668d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																					VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_SHADER_WRITE_BIT,
12678d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																					VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL,
12688d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																					imageData[1].getImage(imageNdx), uncompressedRange);
12698d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
12708d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			preShaderImageBarriers[imageNdx + imageData[1].getImagesCount()]	= makeImageMemoryBarrier(
12718d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																					VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_SHADER_WRITE_BIT,
12728d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																					VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_GENERAL,
12738d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																					imageData[2].getImage(imageNdx), uncompressedRange);
1274819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		}
1275819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
12768d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		preShaderImageBarriers[preShaderImageBarriers.size()-1] = makeImageMemoryBarrier(
12778d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																	VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_SHADER_READ_BIT,
12788d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																	VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_GENERAL,
12798d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																	imageData[0].getImage(0u), compressedRange);
1280819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
12818d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		vk.cmdPipelineBarrier(cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT,
12828d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			(VkDependencyFlags)0, 0u, (const VkMemoryBarrier*)DE_NULL, 0u, (const VkBufferMemoryBarrier*)DE_NULL,
12838d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			static_cast<deUint32>(preShaderImageBarriers.size()), &preShaderImageBarriers[0]);
12848d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
12858d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		for (deUint32 ndx = 0u; ndx <descriptorSets.size(); ++ndx)
1286819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		{
12878d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			descriptorSetUpdate (**descriptorSets[ndx], &descriptorImageInfos[ndx* m_parameters.imagesCount]);
12888d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			vk.cmdBindDescriptorSets(cmdBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, *pipelineLayout, 0u, 1u, &(**descriptorSets[ndx]), 0u, DE_NULL);
12898d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			vk.cmdDispatch(cmdBuffer,	imageData[1].getImageInfo(ndx).extent.width,
12908d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa										imageData[1].getImageInfo(ndx).extent.height,
12918d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa										imageData[1].getImageInfo(ndx).extent.depth);
12928d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		}
12938d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	}
12948d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	endCommandBuffer(vk, cmdBuffer);
12958d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	submitCommandsAndWait(vk, device, queue, cmdBuffer);
12968d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa}
1297819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
12988d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwaclass GraphicsAttachmentsTestInstance : public BasicTranscodingTestInstance
12998d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa{
13008d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwapublic:
13018d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa										GraphicsAttachmentsTestInstance	(Context& context, const TestParameters& parameters);
13028d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	virtual TestStatus					iterate							(void);
1303819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
13048d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwaprotected:
13058d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	virtual bool						isWriteToCompressedOperation	();
13068d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	VkImageCreateInfo					makeCreateImageInfo				(const VkFormat					format,
13078d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																		 const ImageType				type,
13088d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																		 const UVec3&					size,
13098d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																		 const VkImageUsageFlags		usageFlags,
13108d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																		 const VkImageCreateFlags*		createFlags,
13118d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																		 const deUint32					levels,
13128d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																		 const deUint32					layers);
13138d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	VkDeviceSize						getCompressedImageData			(const VkFormat					format,
13148d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																		 const UVec3&					size,
13158d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																		 std::vector<deUint8>&			data,
13168d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																		 const deUint32					layer,
13178d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																		 const deUint32					level);
13188d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	VkDeviceSize						getUncompressedImageData		(const VkFormat					format,
13198d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																		 const UVec3&					size,
13208d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																		 std::vector<deUint8>&			data,
13218d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																		 const deUint32					layer,
13228d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																		 const deUint32					level);
13238d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	virtual void						prepareData						();
13248d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	virtual void						prepareVertexBuffer				();
13258d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	virtual void						transcodeRead					();
13268d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	virtual void						transcodeWrite					();
13278d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	bool								verifyDecompression				(const std::vector<deUint8>&	refCompressedData,
13288d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																		 const de::MovePtr<Image>&		resCompressedImage,
13298d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																		 const deUint32					layer,
13308d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																		 const deUint32					level,
13318d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																		 const UVec3&					mipmapDims);
13328d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
13338d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	typedef std::vector<deUint8>		RawDataVector;
13348d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	typedef SharedPtr<RawDataVector>	RawDataPtr;
13358d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	typedef std::vector<RawDataPtr>		LevelData;
13368d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	typedef std::vector<LevelData>		FullImageData;
13378d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
13388d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	FullImageData						m_srcData;
13398d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	FullImageData						m_dstData;
13408d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
13418d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	typedef SharedPtr<Image>			ImagePtr;
13428d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	typedef std::vector<ImagePtr>		LevelImages;
13438d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	typedef std::vector<LevelImages>	ImagesArray;
13448d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
13458d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	ImagesArray							m_uncompressedImages;
13468d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	MovePtr<Image>						m_compressedImage;
13478d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
13488d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	VkImageViewUsageCreateInfoKHR		m_imageViewUsageKHR;
13498d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	VkImageViewUsageCreateInfoKHR*		m_srcImageViewUsageKHR;
13508d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	VkImageViewUsageCreateInfoKHR*		m_dstImageViewUsageKHR;
13518d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	std::vector<tcu::UVec3>				m_compressedImageResVec;
13528d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	std::vector<tcu::UVec3>				m_uncompressedImageResVec;
13538d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	VkFormat							m_srcFormat;
13548d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	VkFormat							m_dstFormat;
13558d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	VkImageUsageFlags					m_srcImageUsageFlags;
13568d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	VkImageUsageFlags					m_dstImageUsageFlags;
13578d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	std::vector<tcu::UVec3>				m_srcImageResolutions;
13588d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	std::vector<tcu::UVec3>				m_dstImageResolutions;
13598d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
13608d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	MovePtr<Buffer>						m_vertexBuffer;
13618d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	deUint32							m_vertexCount;
13628d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	VkDeviceSize						m_vertexBufferOffset;
13638d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa};
1364819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
13658d45f54852211075dabe786c6bcdd137f40133bdArkadiusz SarwaGraphicsAttachmentsTestInstance::GraphicsAttachmentsTestInstance (Context& context, const TestParameters& parameters)
13668d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	: BasicTranscodingTestInstance(context, parameters)
13678d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	, m_srcData()
13688d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	, m_dstData()
13698d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	, m_uncompressedImages()
13708d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	, m_compressedImage()
13718d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	, m_imageViewUsageKHR()
13728d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	, m_srcImageViewUsageKHR()
13738d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	, m_dstImageViewUsageKHR()
13748d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	, m_compressedImageResVec()
13758d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	, m_uncompressedImageResVec()
13768d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	, m_srcFormat()
13778d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	, m_dstFormat()
13788d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	, m_srcImageUsageFlags()
13798d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	, m_dstImageUsageFlags()
13808d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	, m_srcImageResolutions()
13818d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	, m_dstImageResolutions()
13828d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	, m_vertexBuffer()
13838d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	, m_vertexCount(0u)
13848d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	, m_vertexBufferOffset(0ull)
13858d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa{
13868d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa}
1387819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
13888d45f54852211075dabe786c6bcdd137f40133bdArkadiusz SarwaTestStatus GraphicsAttachmentsTestInstance::iterate (void)
13898d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa{
13908d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	prepareData();
13918d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	prepareVertexBuffer();
13928d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
13938d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	for (deUint32 levelNdx = 0; levelNdx < getLevelCount(); ++levelNdx)
13948d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		for (deUint32 layerNdx = 0; layerNdx < getLayerCount(); ++layerNdx)
13958d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			DE_ASSERT(m_srcData[levelNdx][layerNdx]->size() == m_dstData[levelNdx][layerNdx]->size());
13968d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
13978d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	if (isWriteToCompressedOperation())
13988d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		transcodeWrite();
13998d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	else
14008d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		transcodeRead();
14018d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
14028d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	for (deUint32 levelNdx = 0; levelNdx < getLevelCount(); ++levelNdx)
14038d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		for (deUint32 layerNdx = 0; layerNdx < getLayerCount(); ++layerNdx)
14048d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			if (isWriteToCompressedOperation())
14058d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			{
14068d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				if (!verifyDecompression(*m_srcData[levelNdx][layerNdx], m_compressedImage, levelNdx, layerNdx, m_compressedImageResVec[levelNdx]))
14078d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa					return TestStatus::fail("Images difference detected");
14088d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			}
14098d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			else
14108d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			{
14118d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				if (!verifyDecompression(*m_dstData[levelNdx][layerNdx], m_compressedImage, levelNdx, layerNdx, m_compressedImageResVec[levelNdx]))
14128d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa					return TestStatus::fail("Images difference detected");
14138d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			}
1414819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
14158d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	return TestStatus::pass("Pass");
14168d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa}
14178d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
14188d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwavoid GraphicsAttachmentsTestInstance::prepareData ()
14198d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa{
14208d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	VkImageViewUsageCreateInfoKHR*	imageViewUsageKHRNull	= (VkImageViewUsageCreateInfoKHR*)DE_NULL;
14218d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
14228d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	m_imageViewUsageKHR			= makeImageViewUsageCreateInfo(m_parameters.compressedImageViewUsage);
14238d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
14248d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	m_srcImageViewUsageKHR		= isWriteToCompressedOperation() ? imageViewUsageKHRNull : &m_imageViewUsageKHR;
14258d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	m_dstImageViewUsageKHR		= isWriteToCompressedOperation() ? &m_imageViewUsageKHR : imageViewUsageKHRNull;
14268d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
14278d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	m_srcFormat					= isWriteToCompressedOperation() ? m_parameters.formatUncompressed : m_parameters.formatCompressed;
14288d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	m_dstFormat					= isWriteToCompressedOperation() ? m_parameters.formatCompressed : m_parameters.formatUncompressed;
14298d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
14308d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	m_srcImageUsageFlags		= isWriteToCompressedOperation() ? m_parameters.uncompressedImageUsage : m_parameters.compressedImageUsage;
14318d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	m_dstImageUsageFlags		= isWriteToCompressedOperation() ? m_parameters.compressedImageUsage : m_parameters.uncompressedImageUsage;
14328d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
14338d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	m_compressedImageResVec		= getMipLevelSizes(getLayerDims());
14348d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	m_uncompressedImageResVec	= getCompressedMipLevelSizes(m_parameters.formatCompressed, m_compressedImageResVec);
14358d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
14368d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	m_srcImageResolutions		= isWriteToCompressedOperation() ? m_uncompressedImageResVec : m_compressedImageResVec;
14378d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	m_dstImageResolutions		= isWriteToCompressedOperation() ? m_compressedImageResVec : m_uncompressedImageResVec;
14388d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
14398d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	m_srcData.resize(getLevelCount());
14408d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	m_dstData.resize(getLevelCount());
14418d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	m_uncompressedImages.resize(getLevelCount());
14428d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
14438d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	for (deUint32 levelNdx = 0; levelNdx < getLevelCount(); ++levelNdx)
14448d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	{
14458d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		m_srcData[levelNdx].resize(getLayerCount());
14468d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		m_dstData[levelNdx].resize(getLayerCount());
14478d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		m_uncompressedImages[levelNdx].resize(getLayerCount());
14488d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
14498d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		for (deUint32 layerNdx = 0; layerNdx < getLayerCount(); ++layerNdx)
1450819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		{
14518d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			m_srcData[levelNdx][layerNdx] = SharedPtr<RawDataVector>(new RawDataVector);
14528d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			m_dstData[levelNdx][layerNdx] = SharedPtr<RawDataVector>(new RawDataVector);
14538d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
14548d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			if (isWriteToCompressedOperation())
1455819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			{
14568d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				getUncompressedImageData(m_srcFormat, m_srcImageResolutions[levelNdx], *m_srcData[levelNdx][layerNdx], layerNdx, levelNdx);
1457819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
14588d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				m_dstData[levelNdx][layerNdx]->resize((size_t)getCompressedImageSizeInBytes(m_dstFormat, m_dstImageResolutions[levelNdx]));
14598d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			}
14608d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			else
14618d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			{
14628d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				getCompressedImageData(m_srcFormat, m_srcImageResolutions[levelNdx], *m_srcData[levelNdx][layerNdx], layerNdx, levelNdx);
14638d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
14648d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				m_dstData[levelNdx][layerNdx]->resize((size_t)getUncompressedImageSizeInBytes(m_dstFormat, m_dstImageResolutions[levelNdx]));
14658d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			}
14668d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
14678d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			DE_ASSERT(m_srcData[levelNdx][layerNdx]->size() == m_dstData[levelNdx][layerNdx]->size());
14688d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		}
14698d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	}
14708d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa}
14718d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
14728d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwavoid GraphicsAttachmentsTestInstance::prepareVertexBuffer ()
14738d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa{
14748d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const DeviceInterface&			vk						= m_context.getDeviceInterface();
14758d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const VkDevice					device					= m_context.getDevice();
14768d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	Allocator&						allocator				= m_context.getDefaultAllocator();
14778d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
14788d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const std::vector<tcu::Vec4>	vertexArray				= createFullscreenQuad();
14798d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const size_t					vertexBufferSizeInBytes	= vertexArray.size() * sizeof(vertexArray[0]);
14808d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
14818d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	m_vertexCount	= static_cast<deUint32>(vertexArray.size());
14828d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	m_vertexBuffer	= MovePtr<Buffer>(new Buffer(vk, device, allocator, makeBufferCreateInfo(vertexBufferSizeInBytes, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT), MemoryRequirement::HostVisible));
14838d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
14848d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	// Upload vertex data
14858d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const Allocation&	vertexBufferAlloc	= m_vertexBuffer->getAllocation();
14868d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	deMemcpy(vertexBufferAlloc.getHostPtr(), &vertexArray[0], vertexBufferSizeInBytes);
14878d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	flushMappedMemoryRange(vk, device, vertexBufferAlloc.getMemory(), vertexBufferAlloc.getOffset(), vertexBufferSizeInBytes);
14888d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa}
14898d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
14908d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwavoid GraphicsAttachmentsTestInstance::transcodeRead ()
14918d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa{
14928d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const DeviceInterface&				vk						= m_context.getDeviceInterface();
14938d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const VkDevice						device					= m_context.getDevice();
14948d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const deUint32						queueFamilyIndex		= m_context.getUniversalQueueFamilyIndex();
14958d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const VkQueue						queue					= m_context.getUniversalQueue();
14968d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	Allocator&							allocator				= m_context.getDefaultAllocator();
14978d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
14988d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const VkImageCreateFlags*			imgCreateFlagsOverride	= DE_NULL;
14998d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
15008d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const VkImageCreateInfo				srcImageCreateInfo		= makeCreateImageInfo(m_srcFormat, m_parameters.imageType, m_srcImageResolutions[0], m_srcImageUsageFlags, imgCreateFlagsOverride, getLevelCount(), getLayerCount());
15018d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	MovePtr<Image>						srcImage				(new Image(vk, device, allocator, srcImageCreateInfo, MemoryRequirement::Any));
15028d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
15038d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const Unique<VkShaderModule>		vertShaderModule		(createShaderModule(vk, device, m_context.getBinaryCollection().get("vert"), 0));
15048d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const Unique<VkShaderModule>		fragShaderModule		(createShaderModule(vk, device, m_context.getBinaryCollection().get("frag"), 0));
15058d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
15068d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const Unique<VkRenderPass>			renderPass				(makeRenderPass(vk, device, m_parameters.formatUncompressed, m_parameters.formatUncompressed));
15078d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
15088d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const Move<VkDescriptorSetLayout>	descriptorSetLayout		(DescriptorSetLayoutBuilder()
15098d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																	.addSingleBinding(VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, VK_SHADER_STAGE_FRAGMENT_BIT)
15108d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																	.build(vk, device));
15118d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const Move<VkDescriptorPool>		descriptorPool			(DescriptorPoolBuilder()
15128d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																	.addType(VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT)
15138d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																	.build(vk, device, VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 1u));
15148d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const Move<VkDescriptorSet>			descriptorSet			(makeDescriptorSet(vk, device, *descriptorPool, *descriptorSetLayout));
15158d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
15168d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const VkExtent2D					renderSizeDummy			(makeExtent2D(1u, 1u));
15178d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const Unique<VkPipelineLayout>		pipelineLayout			(makePipelineLayout(vk, device, *descriptorSetLayout));
15188d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const Unique<VkPipeline>			pipeline				(makeGraphicsPipeline(vk, device, *pipelineLayout, *renderPass, *vertShaderModule, *fragShaderModule, renderSizeDummy, 1u, true));
15198d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
15208d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const Unique<VkCommandPool>			cmdPool					(createCommandPool(vk, device, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, queueFamilyIndex));
15218d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const Unique<VkCommandBuffer>		cmdBuffer				(allocateCommandBuffer(vk, device, *cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY));
15228d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
15238d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	for (deUint32 levelNdx = 0; levelNdx < getLevelCount(); ++levelNdx)
15248d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	{
15258d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		const UVec3&				uncompressedImageRes	= m_uncompressedImageResVec[levelNdx];
15268d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		const UVec3&				srcImageResolution		= m_srcImageResolutions[levelNdx];
15278d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		const UVec3&				dstImageResolution		= m_dstImageResolutions[levelNdx];
15288d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		const size_t				srcImageSizeInBytes		= m_srcData[levelNdx][0]->size();
15298d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		const size_t				dstImageSizeInBytes		= m_dstData[levelNdx][0]->size();
15308d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		const UVec3					srcImageResBlocked		= getCompressedImageResolutionBlockCeil(m_parameters.formatCompressed, srcImageResolution);
15318d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
15328d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		const VkImageCreateInfo		dstImageCreateInfo		= makeCreateImageInfo(m_dstFormat, m_parameters.imageType, dstImageResolution, m_dstImageUsageFlags, imgCreateFlagsOverride, SINGLE_LEVEL, SINGLE_LAYER);
1533819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
15348d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		const VkBufferCreateInfo	srcImageBufferInfo		= makeBufferCreateInfo(srcImageSizeInBytes, VK_BUFFER_USAGE_TRANSFER_SRC_BIT);
15358d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		const MovePtr<Buffer>		srcImageBuffer			= MovePtr<Buffer>(new Buffer(vk, device, allocator, srcImageBufferInfo, MemoryRequirement::HostVisible));
1536819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
15378d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		const VkBufferCreateInfo	dstImageBufferInfo		= makeBufferCreateInfo(dstImageSizeInBytes, VK_BUFFER_USAGE_TRANSFER_DST_BIT);
15388d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		MovePtr<Buffer>				dstImageBuffer			= MovePtr<Buffer>(new Buffer(vk, device, allocator, dstImageBufferInfo, MemoryRequirement::HostVisible));
1539819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
15408d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		const VkExtent2D			renderSize				(makeExtent2D(uncompressedImageRes.x(), uncompressedImageRes.y()));
15418d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		const VkViewport			viewport				= makeViewport(0.0f, 0.0f, static_cast<float>(renderSize.width), static_cast<float>(renderSize.height), 0.0f, 1.0f);
15428d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		const VkRect2D				scissor					= makeScissor(renderSize.width, renderSize.height);
1543819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
15448d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		for (deUint32 layerNdx = 0; layerNdx < getLayerCount(); ++layerNdx)
1545819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		{
15468d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			const VkImageSubresourceRange	srcSubresourceRange		= makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, levelNdx, SINGLE_LEVEL, layerNdx, SINGLE_LAYER);
15478d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			const VkImageSubresourceRange	dstSubresourceRange		= makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, SINGLE_LEVEL, 0u, SINGLE_LAYER);
1548819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
15498d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			Move<VkImageView>				srcImageView			(makeImageView(vk, device, srcImage->get(), mapImageViewType(m_parameters.imageType), m_parameters.formatUncompressed, srcSubresourceRange, m_srcImageViewUsageKHR));
1550819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
15518d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			de::MovePtr<Image>				dstImage				(new Image(vk, device, allocator, dstImageCreateInfo, MemoryRequirement::Any));
15528d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			Move<VkImageView>				dstImageView			(makeImageView(vk, device, dstImage->get(), mapImageViewType(m_parameters.imageType), m_parameters.formatUncompressed, dstSubresourceRange, m_dstImageViewUsageKHR));
1553819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
15548d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			const VkBufferImageCopy			srcCopyRegion			= makeBufferImageCopy(srcImageResolution.x(), srcImageResolution.y(), levelNdx, layerNdx, srcImageResBlocked.x(), srcImageResBlocked.y());
15558d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			const VkBufferMemoryBarrier		srcCopyBufferBarrierPre	= makeBufferMemoryBarrier(VK_ACCESS_HOST_WRITE_BIT, VK_ACCESS_TRANSFER_READ_BIT, srcImageBuffer->get(), 0ull, srcImageSizeInBytes);
15568d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			const VkImageMemoryBarrier		srcCopyImageBarrierPre	= makeImageMemoryBarrier(0u, VK_ACCESS_TRANSFER_WRITE_BIT, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, srcImage->get(), srcSubresourceRange);
15578d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			const VkImageMemoryBarrier		srcCopyImageBarrierPost	= makeImageMemoryBarrier(VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_SHADER_READ_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL, srcImage->get(), srcSubresourceRange);
15588d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			const VkBufferImageCopy			dstCopyRegion			= makeBufferImageCopy(dstImageResolution.x(), dstImageResolution.y());
15598d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			const VkImageMemoryBarrier		dstInitImageBarrier		= makeImageMemoryBarrier(0u, VK_ACCESS_SHADER_READ_BIT, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, dstImage->get(), dstSubresourceRange);
1560819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
15618d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			const VkImageView				attachmentBindInfos[]	= { *srcImageView, *dstImageView };
15628d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			const VkExtent2D				framebufferSize			(makeExtent2D(dstImageResolution[0], dstImageResolution[1]));
15638d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			const Move<VkFramebuffer>		framebuffer				(makeFramebuffer(vk, device, *renderPass, DE_LENGTH_OF_ARRAY(attachmentBindInfos), attachmentBindInfos, framebufferSize, SINGLE_LAYER));
1564819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
15658d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			// Upload source image data
15668d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			const Allocation& alloc = srcImageBuffer->getAllocation();
15678d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			deMemcpy(alloc.getHostPtr(), &m_srcData[levelNdx][layerNdx]->at(0), srcImageSizeInBytes);
15688d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			flushMappedMemoryRange(vk, device, alloc.getMemory(), alloc.getOffset(), srcImageSizeInBytes);
1569819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
15708d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			beginCommandBuffer(vk, *cmdBuffer);
15718d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			vk.cmdBindPipeline(*cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *pipeline);
1572819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
15738d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			// Copy buffer to image
15748d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 1u, &srcCopyBufferBarrierPre, 1u, &srcCopyImageBarrierPre);
15758d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			vk.cmdCopyBufferToImage(*cmdBuffer, srcImageBuffer->get(), srcImage->get(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1u, &srcCopyRegion);
15768d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 0u, DE_NULL, 1u, &srcCopyImageBarrierPost);
1577819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
15788d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			// Define destination image layout
15798d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 0u, DE_NULL, 1u, &dstInitImageBarrier);
1580819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
15818d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			beginRenderPass(vk, *cmdBuffer, *renderPass, *framebuffer, renderSize);
1582819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
15838d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			const VkDescriptorImageInfo	descriptorSrcImageInfo(makeDescriptorImageInfo(DE_NULL, *srcImageView, VK_IMAGE_LAYOUT_GENERAL));
15848d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			DescriptorSetUpdateBuilder()
15858d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				.writeSingle(*descriptorSet, DescriptorSetUpdateBuilder::Location::binding(0u), VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, &descriptorSrcImageInfo)
15868d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				.update(vk, device);
1587819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
15888d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			vk.cmdBindDescriptorSets(*cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *pipelineLayout, 0u, 1u, &descriptorSet.get(), 0u, DE_NULL);
15898d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			vk.cmdBindVertexBuffers(*cmdBuffer, 0u, 1u, &m_vertexBuffer->get(), &m_vertexBufferOffset);
1590819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
15918d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			vk.cmdSetViewport(*cmdBuffer, 0u, 1u, &viewport);
15928d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			vk.cmdSetScissor(*cmdBuffer, 0u, 1u, &scissor);
1593819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
15948d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			vk.cmdDraw(*cmdBuffer, (deUint32)m_vertexCount, 1, 0, 0);
1595819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
15968d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			vk.cmdEndRenderPass(*cmdBuffer);
1597819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
15988d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			const VkImageMemoryBarrier prepareForTransferBarrier = makeImageMemoryBarrier(
15998d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, VK_ACCESS_TRANSFER_READ_BIT,
16008d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_GENERAL,
16018d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				dstImage->get(), dstSubresourceRange);
1602819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
16038d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			const VkBufferMemoryBarrier copyBarrier = makeBufferMemoryBarrier(
16048d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_HOST_READ_BIT,
16058d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				dstImageBuffer->get(), 0ull, dstImageSizeInBytes);
16068d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
16078d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 0, (const VkBufferMemoryBarrier*)DE_NULL, 1, &prepareForTransferBarrier);
16088d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			vk.cmdCopyImageToBuffer(*cmdBuffer, dstImage->get(), VK_IMAGE_LAYOUT_GENERAL, dstImageBuffer->get(), 1u, &dstCopyRegion);
16098d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_HOST_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 1, &copyBarrier, 0, (const VkImageMemoryBarrier*)DE_NULL);
16108d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
16118d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			endCommandBuffer(vk, *cmdBuffer);
1612819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
16138d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			submitCommandsAndWait(vk, device, queue, *cmdBuffer);
1614819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
16158d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			const Allocation& dstImageBufferAlloc = dstImageBuffer->getAllocation();
16168d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			invalidateMappedMemoryRange(vk, device, dstImageBufferAlloc.getMemory(), dstImageBufferAlloc.getOffset(), dstImageSizeInBytes);
16178d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			deMemcpy(&m_dstData[levelNdx][layerNdx]->at(0), dstImageBufferAlloc.getHostPtr(), dstImageSizeInBytes);
16188d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		}
1619819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	}
16208d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
16218d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	m_compressedImage = srcImage;
1622819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa}
1623819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
16248d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwavoid GraphicsAttachmentsTestInstance::transcodeWrite ()
1625819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa{
16268d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const DeviceInterface&				vk						= m_context.getDeviceInterface();
16278d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const VkDevice						device					= m_context.getDevice();
16288d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const deUint32						queueFamilyIndex		= m_context.getUniversalQueueFamilyIndex();
16298d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const VkQueue						queue					= m_context.getUniversalQueue();
16308d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	Allocator&							allocator				= m_context.getDefaultAllocator();
1631819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
16328d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const VkImageCreateFlags*			imgCreateFlagsOverride	= DE_NULL;
1633819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
16348d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const VkImageCreateInfo				dstImageCreateInfo		= makeCreateImageInfo(m_dstFormat, m_parameters.imageType, m_dstImageResolutions[0], m_dstImageUsageFlags, imgCreateFlagsOverride, getLevelCount(), getLayerCount());
16358d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	MovePtr<Image>						dstImage				(new Image(vk, device, allocator, dstImageCreateInfo, MemoryRequirement::Any));
1636819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
16378d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const Unique<VkShaderModule>		vertShaderModule		(createShaderModule(vk, device, m_context.getBinaryCollection().get("vert"), 0));
16388d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const Unique<VkShaderModule>		fragShaderModule		(createShaderModule(vk, device, m_context.getBinaryCollection().get("frag"), 0));
1639819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
16408d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const Unique<VkRenderPass>			renderPass				(makeRenderPass(vk, device, m_parameters.formatUncompressed, m_parameters.formatUncompressed));
1641819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
16428d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const Move<VkDescriptorSetLayout>	descriptorSetLayout		(DescriptorSetLayoutBuilder()
16438d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																	.addSingleBinding(VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, VK_SHADER_STAGE_FRAGMENT_BIT)
16448d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																	.build(vk, device));
16458d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const Move<VkDescriptorPool>		descriptorPool			(DescriptorPoolBuilder()
16468d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																	.addType(VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT)
16478d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																	.build(vk, device, VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 1u));
16488d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const Move<VkDescriptorSet>			descriptorSet			(makeDescriptorSet(vk, device, *descriptorPool, *descriptorSetLayout));
1649819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
16508d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const VkExtent2D					renderSizeDummy			(makeExtent2D(1u, 1u));
16518d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const Unique<VkPipelineLayout>		pipelineLayout			(makePipelineLayout(vk, device, *descriptorSetLayout));
16528d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const Unique<VkPipeline>			pipeline				(makeGraphicsPipeline(vk, device, *pipelineLayout, *renderPass, *vertShaderModule, *fragShaderModule, renderSizeDummy, 1u, true));
1653819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
16548d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const Unique<VkCommandPool>			cmdPool					(createCommandPool(vk, device, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, queueFamilyIndex));
16558d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const Unique<VkCommandBuffer>		cmdBuffer				(allocateCommandBuffer(vk, device, *cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY));
1656819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
16578d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	for (deUint32 levelNdx = 0; levelNdx < getLevelCount(); ++levelNdx)
16588d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	{
16598d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		const UVec3&				uncompressedImageRes	= m_uncompressedImageResVec[levelNdx];
16608d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		const UVec3&				srcImageResolution		= m_srcImageResolutions[levelNdx];
16618d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		const UVec3&				dstImageResolution		= m_dstImageResolutions[levelNdx];
16628d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		const UVec3					dstImageResBlocked		= getCompressedImageResolutionBlockCeil(m_parameters.formatCompressed, dstImageResolution);
16638d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		const size_t				srcImageSizeInBytes		= m_srcData[levelNdx][0]->size();
16648d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		const size_t				dstImageSizeInBytes		= m_dstData[levelNdx][0]->size();
1665819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
16668d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		const VkImageCreateInfo		srcImageCreateInfo		= makeCreateImageInfo(m_srcFormat, m_parameters.imageType, srcImageResolution, m_srcImageUsageFlags, imgCreateFlagsOverride, SINGLE_LEVEL, SINGLE_LAYER);
1667819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
16688d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		const VkExtent2D			renderSize				(makeExtent2D(uncompressedImageRes.x(), uncompressedImageRes.y()));
16698d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		const VkViewport			viewport				= makeViewport(0.0f, 0.0f, static_cast<float>(renderSize.width), static_cast<float>(renderSize.height), 0.0f, 1.0f);
16708d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		const VkRect2D				scissor					= makeScissor(renderSize.width, renderSize.height);
1671819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
16728d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		for (deUint32 layerNdx = 0; layerNdx < getLayerCount(); ++layerNdx)
16738d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		{
16748d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			const VkBufferCreateInfo		srcImageBufferInfo		= makeBufferCreateInfo(srcImageSizeInBytes, VK_BUFFER_USAGE_TRANSFER_SRC_BIT);
16758d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			const MovePtr<Buffer>			srcImageBuffer			= MovePtr<Buffer>(new Buffer(vk, device, allocator, srcImageBufferInfo, MemoryRequirement::HostVisible));
1676819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
16778d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			const VkBufferCreateInfo		dstImageBufferInfo		= makeBufferCreateInfo(dstImageSizeInBytes, VK_BUFFER_USAGE_TRANSFER_DST_BIT);
16788d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			MovePtr<Buffer>					dstImageBuffer			= MovePtr<Buffer>(new Buffer(vk, device, allocator, dstImageBufferInfo, MemoryRequirement::HostVisible));
1679819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
16808d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			const VkImageSubresourceRange	srcSubresourceRange		= makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, SINGLE_LEVEL, 0u, SINGLE_LAYER);
16818d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			const VkImageSubresourceRange	dstSubresourceRange		= makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, levelNdx, SINGLE_LEVEL, layerNdx, SINGLE_LAYER);
1682819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
16838d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			Move<VkImageView>				dstImageView			(makeImageView(vk, device, dstImage->get(), mapImageViewType(m_parameters.imageType), m_parameters.formatUncompressed, dstSubresourceRange, m_dstImageViewUsageKHR));
1684819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
16858d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			de::MovePtr<Image>				srcImage				(new Image(vk, device, allocator, srcImageCreateInfo, MemoryRequirement::Any));
16868d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			Move<VkImageView>				srcImageView			(makeImageView(vk, device, srcImage->get(), mapImageViewType(m_parameters.imageType), m_parameters.formatUncompressed, srcSubresourceRange, m_srcImageViewUsageKHR));
1687819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
16888d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			const VkBufferImageCopy			srcCopyRegion			= makeBufferImageCopy(srcImageResolution.x(), srcImageResolution.y(), 0u, 0u);
16898d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			const VkBufferMemoryBarrier		srcCopyBufferBarrierPre	= makeBufferMemoryBarrier(VK_ACCESS_HOST_WRITE_BIT, VK_ACCESS_TRANSFER_READ_BIT, srcImageBuffer->get(), 0ull, srcImageSizeInBytes);
16908d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			const VkImageMemoryBarrier		srcCopyImageBarrierPre	= makeImageMemoryBarrier(0u, VK_ACCESS_TRANSFER_WRITE_BIT, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, srcImage->get(), srcSubresourceRange);
16918d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			const VkImageMemoryBarrier		srcCopyImageBarrierPost	= makeImageMemoryBarrier(VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_INPUT_ATTACHMENT_READ_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL, srcImage->get(), srcSubresourceRange);
16928d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			const VkBufferImageCopy			dstCopyRegion			= makeBufferImageCopy(dstImageResolution.x(), dstImageResolution.y(), levelNdx, layerNdx, dstImageResBlocked.x(), dstImageResBlocked.y());
16938d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			const VkImageMemoryBarrier		dstInitImageBarrier		= makeImageMemoryBarrier(0u, VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_GENERAL, dstImage->get(), dstSubresourceRange);
1694819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
16958d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			const VkImageView				attachmentBindInfos[]	= { *srcImageView, *dstImageView };
16968d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			const VkExtent2D				framebufferSize			(renderSize);
16978d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			const Move<VkFramebuffer>		framebuffer				(makeFramebuffer(vk, device, *renderPass, DE_LENGTH_OF_ARRAY(attachmentBindInfos), attachmentBindInfos, framebufferSize, SINGLE_LAYER));
1698819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
16998d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			// Upload source image data
17008d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			const Allocation& alloc = srcImageBuffer->getAllocation();
17018d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			deMemcpy(alloc.getHostPtr(), &m_srcData[levelNdx][layerNdx]->at(0), srcImageSizeInBytes);
17028d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			flushMappedMemoryRange(vk, device, alloc.getMemory(), alloc.getOffset(), srcImageSizeInBytes);
1703819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
17048d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			beginCommandBuffer(vk, *cmdBuffer);
17058d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			vk.cmdBindPipeline(*cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *pipeline);
1706819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
17078d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			// Copy buffer to image
17088d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 1u, &srcCopyBufferBarrierPre, 1u, &srcCopyImageBarrierPre);
17098d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			vk.cmdCopyBufferToImage(*cmdBuffer, srcImageBuffer->get(), srcImage->get(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1u, &srcCopyRegion);
17108d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 0u, DE_NULL, 1u, &srcCopyImageBarrierPost);
1711819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
17128d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			// Define destination image layout
17138d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 0u, DE_NULL, 1u, &dstInitImageBarrier);
1714819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
17158d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			beginRenderPass(vk, *cmdBuffer, *renderPass, *framebuffer, renderSize);
1716819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
17178d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			const VkDescriptorImageInfo	descriptorSrcImageInfo(makeDescriptorImageInfo(DE_NULL, *srcImageView, VK_IMAGE_LAYOUT_GENERAL));
17188d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			DescriptorSetUpdateBuilder()
17198d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				.writeSingle(*descriptorSet, DescriptorSetUpdateBuilder::Location::binding(0u), VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, &descriptorSrcImageInfo)
17208d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				.update(vk, device);
1721819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
17228d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			vk.cmdBindDescriptorSets(*cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *pipelineLayout, 0u, 1u, &descriptorSet.get(), 0u, DE_NULL);
17238d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			vk.cmdBindVertexBuffers(*cmdBuffer, 0u, 1u, &m_vertexBuffer->get(), &m_vertexBufferOffset);
1724819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
17258d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			vk.cmdSetViewport(*cmdBuffer, 0u, 1u, &viewport);
17268d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			vk.cmdSetScissor(*cmdBuffer, 0u, 1u, &scissor);
1727819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
17288d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			vk.cmdDraw(*cmdBuffer, (deUint32)m_vertexCount, 1, 0, 0);
17298d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
17308d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			vk.cmdEndRenderPass(*cmdBuffer);
17318d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
17328d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			const VkImageMemoryBarrier prepareForTransferBarrier = makeImageMemoryBarrier(
17338d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, VK_ACCESS_TRANSFER_READ_BIT,
17348d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_GENERAL,
17358d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				dstImage->get(), dstSubresourceRange);
17368d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
17378d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			const VkBufferMemoryBarrier copyBarrier = makeBufferMemoryBarrier(
17388d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_HOST_READ_BIT,
17398d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				dstImageBuffer->get(), 0ull, dstImageSizeInBytes);
17408d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
17418d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 0, (const VkBufferMemoryBarrier*)DE_NULL, 1, &prepareForTransferBarrier);
17428d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			vk.cmdCopyImageToBuffer(*cmdBuffer, dstImage->get(), VK_IMAGE_LAYOUT_GENERAL, dstImageBuffer->get(), 1u, &dstCopyRegion);
17438d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_HOST_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 1, &copyBarrier, 0, (const VkImageMemoryBarrier*)DE_NULL);
1744819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
17458d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			endCommandBuffer(vk, *cmdBuffer);
1746819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
17478d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			submitCommandsAndWait(vk, device, queue, *cmdBuffer);
17488d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
17498d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			const Allocation& dstImageBufferAlloc = dstImageBuffer->getAllocation();
17508d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			invalidateMappedMemoryRange(vk, device, dstImageBufferAlloc.getMemory(), dstImageBufferAlloc.getOffset(), dstImageSizeInBytes);
17518d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			deMemcpy(&m_dstData[levelNdx][layerNdx]->at(0), dstImageBufferAlloc.getHostPtr(), dstImageSizeInBytes);
17528d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		}
17538d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	}
17548d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
17558d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	m_compressedImage = dstImage;
1756819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa}
1757819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
1758819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwabool GraphicsAttachmentsTestInstance::isWriteToCompressedOperation ()
1759819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa{
1760819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	return (m_parameters.operation == OPERATION_ATTACHMENT_WRITE);
1761819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa}
1762819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
17638d45f54852211075dabe786c6bcdd137f40133bdArkadiusz SarwaVkImageCreateInfo GraphicsAttachmentsTestInstance::makeCreateImageInfo (const VkFormat				format,
17648d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																	    const ImageType				type,
17658d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																	    const UVec3&				size,
17668d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																	    const VkImageUsageFlags		usageFlags,
17678d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																	    const VkImageCreateFlags*	createFlags,
17688d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																	    const deUint32				levels,
17698d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																	    const deUint32				layers)
1770819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa{
1771819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	const VkImageType			imageType				= mapImageType(type);
1772819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	const VkImageCreateFlags	imageCreateFlagsBase	= VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
1773819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	const VkImageCreateFlags	imageCreateFlagsAddOn	= isCompressedFormat(format) ? VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT_KHR | VK_IMAGE_CREATE_EXTENDED_USAGE_BIT_KHR : 0;
1774819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	const VkImageCreateFlags	imageCreateFlags		= (createFlags != DE_NULL) ? *createFlags : (imageCreateFlagsBase | imageCreateFlagsAddOn);
1775819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
1776819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	const VkImageCreateInfo createImageInfo =
1777819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	{
1778819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,			// VkStructureType			sType;
1779819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		DE_NULL,										// const void*				pNext;
1780819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		imageCreateFlags,								// VkImageCreateFlags		flags;
1781819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		imageType,										// VkImageType				imageType;
1782819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		format,											// VkFormat					format;
1783819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		makeExtent3D(getLayerSize(type, size)),			// VkExtent3D				extent;
17848d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		levels,											// deUint32					mipLevels;
17858d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		layers,											// deUint32					arrayLayers;
1786819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		VK_SAMPLE_COUNT_1_BIT,							// VkSampleCountFlagBits	samples;
1787819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		VK_IMAGE_TILING_OPTIMAL,						// VkImageTiling			tiling;
1788819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		usageFlags,										// VkImageUsageFlags		usage;
1789819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		VK_SHARING_MODE_EXCLUSIVE,						// VkSharingMode			sharingMode;
1790819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		0u,												// deUint32					queueFamilyIndexCount;
1791819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		DE_NULL,										// const deUint32*			pQueueFamilyIndices;
1792819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		VK_IMAGE_LAYOUT_UNDEFINED,						// VkImageLayout			initialLayout;
1793819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	};
1794819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
1795819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	return createImageInfo;
1796819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa}
1797819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
17988d45f54852211075dabe786c6bcdd137f40133bdArkadiusz SarwaVkDeviceSize GraphicsAttachmentsTestInstance::getCompressedImageData (const VkFormat			format,
17998d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																	  const UVec3&				size,
18008d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																	  std::vector<deUint8>&		data,
18018d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																	  const deUint32			layer,
18028d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																	  const deUint32			level)
1803819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa{
1804819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	VkDeviceSize	sizeBytes	= getCompressedImageSizeInBytes(format, size);
1805819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
1806819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	data.resize((size_t)sizeBytes);
18078d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	generateData(&data[0], data.size(), format, layer, level);
1808819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
1809819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	return sizeBytes;
1810819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa}
1811819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
18128d45f54852211075dabe786c6bcdd137f40133bdArkadiusz SarwaVkDeviceSize GraphicsAttachmentsTestInstance::getUncompressedImageData (const VkFormat			format,
18138d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																		const UVec3&			size,
18148d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																		std::vector<deUint8>&	data,
18158d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																		const deUint32			layer,
18168d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																		const deUint32			level)
1817819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa{
1818819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	tcu::IVec3				sizeAsIVec3	= tcu::IVec3(static_cast<int>(size[0]), static_cast<int>(size[1]), static_cast<int>(size[2]));
1819819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	VkDeviceSize			sizeBytes	= getImageSizeBytes(sizeAsIVec3, format);
1820819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
1821819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	data.resize((size_t)sizeBytes);
18228d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	generateData(&data[0], data.size(), format, layer, level);
1823819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
1824819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	return sizeBytes;
1825819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa}
1826819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
18278d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwabool GraphicsAttachmentsTestInstance::verifyDecompression (const std::vector<deUint8>&	refCompressedData,
18288d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa														   const de::MovePtr<Image>&	resCompressedImage,
18298d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa														   const deUint32				level,
18308d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa														   const deUint32				layer,
18318d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa														   const UVec3&					mipmapDims)
1832819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa{
1833819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	const DeviceInterface&				vk							= m_context.getDeviceInterface();
1834819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	const VkDevice						device						= m_context.getDevice();
1835819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	const deUint32						queueFamilyIndex			= m_context.getUniversalQueueFamilyIndex();
1836819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	const VkQueue						queue						= m_context.getUniversalQueue();
1837819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	Allocator&							allocator					= m_context.getDefaultAllocator();
1838819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
1839c291149e2803c25074f1fbea8686b3488573aa92Arkadiusz Sarwa	const bool							layoutShaderReadOnly		= (layer % 2u) == 1;
18408d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const UVec3							mipmapDimsBlocked			= getCompressedImageResolutionBlockCeil(m_parameters.formatCompressed, mipmapDims);
1841819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
18428d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const VkImageSubresourceRange		subresourceRange			= makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, SINGLE_LEVEL, 0u, SINGLE_LAYER);
18438d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const VkImageSubresourceRange		resSubresourceRange			= makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, level, SINGLE_LEVEL, layer, SINGLE_LAYER);
1844819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
18458d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const VkDeviceSize					dstBufferSize				= getUncompressedImageSizeInBytes(m_parameters.formatForVerify, mipmapDims);
18468d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const VkImageUsageFlags				refSrcImageUsageFlags		= VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
1847819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
1848819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	const VkBufferCreateInfo			refSrcImageBufferInfo		(makeBufferCreateInfo(refCompressedData.size(), VK_BUFFER_USAGE_TRANSFER_SRC_BIT));
1849819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	const MovePtr<Buffer>				refSrcImageBuffer			= MovePtr<Buffer>(new Buffer(vk, device, allocator, refSrcImageBufferInfo, MemoryRequirement::HostVisible));
1850819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
1851819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	const VkImageCreateFlags			refSrcImageCreateFlags		= 0;
18528d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const VkImageCreateInfo				refSrcImageCreateInfo		= makeCreateImageInfo(m_parameters.formatCompressed, m_parameters.imageType, mipmapDimsBlocked, refSrcImageUsageFlags, &refSrcImageCreateFlags, SINGLE_LEVEL, SINGLE_LAYER);
1853819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	const MovePtr<Image>				refSrcImage					(new Image(vk, device, allocator, refSrcImageCreateInfo, MemoryRequirement::Any));
1854819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	Move<VkImageView>					refSrcImageView				(makeImageView(vk, device, refSrcImage->get(), mapImageViewType(m_parameters.imageType), m_parameters.formatCompressed, subresourceRange));
1855819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
1856819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	const VkImageUsageFlags				resSrcImageUsageFlags		= VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
1857819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	const VkImageViewUsageCreateInfoKHR	resSrcImageViewUsageKHR		= makeImageViewUsageCreateInfo(resSrcImageUsageFlags);
18588d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	Move<VkImageView>					resSrcImageView				(makeImageView(vk, device, resCompressedImage->get(), mapImageViewType(m_parameters.imageType), m_parameters.formatCompressed, resSubresourceRange, &resSrcImageViewUsageKHR));
1859819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
1860819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	const VkImageCreateFlags			refDstImageCreateFlags		= 0;
1861819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	const VkImageUsageFlags				refDstImageUsageFlags		= VK_IMAGE_USAGE_STORAGE_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
18628d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const VkImageCreateInfo				refDstImageCreateInfo		= makeCreateImageInfo(m_parameters.formatForVerify, m_parameters.imageType, mipmapDims, refDstImageUsageFlags, &refDstImageCreateFlags, SINGLE_LEVEL, SINGLE_LAYER);
1863819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	const MovePtr<Image>				refDstImage					(new Image(vk, device, allocator, refDstImageCreateInfo, MemoryRequirement::Any));
1864819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	const Move<VkImageView>				refDstImageView				(makeImageView(vk, device, refDstImage->get(), mapImageViewType(m_parameters.imageType), m_parameters.formatForVerify, subresourceRange));
18658d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const VkImageMemoryBarrier			refDstInitImageBarrier		= makeImageMemoryBarrier(0u, VK_ACCESS_SHADER_WRITE_BIT, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_GENERAL, refDstImage->get(), subresourceRange);
1866819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	const VkBufferCreateInfo			refDstBufferInfo			(makeBufferCreateInfo(dstBufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT));
1867819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	const MovePtr<Buffer>				refDstBuffer				= MovePtr<Buffer>(new Buffer(vk, device, allocator, refDstBufferInfo, MemoryRequirement::HostVisible));
1868819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
1869819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	const VkImageCreateFlags			resDstImageCreateFlags		= 0;
1870819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	const VkImageUsageFlags				resDstImageUsageFlags		= VK_IMAGE_USAGE_STORAGE_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
18718d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const VkImageCreateInfo				resDstImageCreateInfo		= makeCreateImageInfo(m_parameters.formatForVerify, m_parameters.imageType, mipmapDims, resDstImageUsageFlags, &resDstImageCreateFlags, SINGLE_LEVEL, SINGLE_LAYER);
1872819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	const MovePtr<Image>				resDstImage					(new Image(vk, device, allocator, resDstImageCreateInfo, MemoryRequirement::Any));
1873819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	const Move<VkImageView>				resDstImageView				(makeImageView(vk, device, resDstImage->get(), mapImageViewType(m_parameters.imageType), m_parameters.formatForVerify, subresourceRange));
18748d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const VkImageMemoryBarrier			resDstInitImageBarrier		= makeImageMemoryBarrier(0u, VK_ACCESS_SHADER_WRITE_BIT, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_GENERAL, resDstImage->get(), subresourceRange);
1875819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	const VkBufferCreateInfo			resDstBufferInfo			(makeBufferCreateInfo(dstBufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT));
1876819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	const MovePtr<Buffer>				resDstBuffer				= MovePtr<Buffer>(new Buffer(vk, device, allocator, resDstBufferInfo, MemoryRequirement::HostVisible));
1877819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
1878819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	const Unique<VkShaderModule>		vertShaderModule			(createShaderModule(vk, device, m_context.getBinaryCollection().get("vert"), 0));
1879819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	const Unique<VkShaderModule>		fragShaderModule			(createShaderModule(vk, device, m_context.getBinaryCollection().get("frag_verify"), 0));
1880819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
1881819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	const Unique<VkRenderPass>			renderPass					(makeRenderPass(vk, device));
1882819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
1883819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	const Move<VkDescriptorSetLayout>	descriptorSetLayout			(DescriptorSetLayoutBuilder()
1884819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa																		.addSingleBinding(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_SHADER_STAGE_FRAGMENT_BIT)
1885819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa																		.addSingleBinding(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_SHADER_STAGE_FRAGMENT_BIT)
1886819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa																		.addSingleBinding(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, VK_SHADER_STAGE_FRAGMENT_BIT)
1887819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa																		.addSingleBinding(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, VK_SHADER_STAGE_FRAGMENT_BIT)
1888819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa																		.build(vk, device));
1889819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	const Move<VkDescriptorPool>		descriptorPool				(DescriptorPoolBuilder()
18908d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																		.addType(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER)
18918d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																		.addType(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER)
18928d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																		.addType(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE)
18938d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																		.addType(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE)
18948d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																		.build(vk, device, VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 1u));
1895819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	const Move<VkDescriptorSet>			descriptorSet				(makeDescriptorSet(vk, device, *descriptorPool, *descriptorSetLayout));
1896819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	const VkSamplerCreateInfo			refSrcSamplerInfo			(makeSamplerCreateInfo());
1897819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	const Move<VkSampler>				refSrcSampler				= vk::createSampler(vk, device, &refSrcSamplerInfo);
1898819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	const VkSamplerCreateInfo			resSrcSamplerInfo			(makeSamplerCreateInfo());
1899819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	const Move<VkSampler>				resSrcSampler				= vk::createSampler(vk, device, &resSrcSamplerInfo);
1900c291149e2803c25074f1fbea8686b3488573aa92Arkadiusz Sarwa	const VkDescriptorImageInfo			descriptorRefSrcImage		(makeDescriptorImageInfo(*refSrcSampler, *refSrcImageView, layoutShaderReadOnly ? VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL : VK_IMAGE_LAYOUT_GENERAL));
1901c291149e2803c25074f1fbea8686b3488573aa92Arkadiusz Sarwa	const VkDescriptorImageInfo			descriptorResSrcImage		(makeDescriptorImageInfo(*resSrcSampler, *resSrcImageView, layoutShaderReadOnly ? VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL : VK_IMAGE_LAYOUT_GENERAL));
1902819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	const VkDescriptorImageInfo			descriptorRefDstImage		(makeDescriptorImageInfo(DE_NULL, *refDstImageView, VK_IMAGE_LAYOUT_GENERAL));
1903819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	const VkDescriptorImageInfo			descriptorResDstImage		(makeDescriptorImageInfo(DE_NULL, *resDstImageView, VK_IMAGE_LAYOUT_GENERAL));
1904819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
19058d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const VkExtent2D					renderSize					(makeExtent2D(mipmapDims.x(), mipmapDims.y()));
1906819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	const Unique<VkPipelineLayout>		pipelineLayout				(makePipelineLayout(vk, device, *descriptorSetLayout));
1907819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	const Unique<VkPipeline>			pipeline					(makeGraphicsPipeline(vk, device, *pipelineLayout, *renderPass, *vertShaderModule, *fragShaderModule, renderSize, 0u));
1908819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	const Unique<VkCommandPool>			cmdPool						(createCommandPool(vk, device, VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT, queueFamilyIndex));
1909819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	const Unique<VkCommandBuffer>		cmdBuffer					(allocateCommandBuffer(vk, device, *cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY));
1910819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
19118d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const VkBufferImageCopy				copyBufferToImageRegion		= makeBufferImageCopy(mipmapDimsBlocked.x(), mipmapDimsBlocked.y(), 0u, 0u, mipmapDimsBlocked.x(), mipmapDimsBlocked.y());
19128d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const VkBufferImageCopy				copyRegion					= makeBufferImageCopy(mipmapDims.x(), mipmapDims.y(), 0u, 0u);
19138d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const VkBufferMemoryBarrier			refSrcCopyBufferBarrierPre	= makeBufferMemoryBarrier(VK_ACCESS_HOST_WRITE_BIT, VK_ACCESS_TRANSFER_READ_BIT, refSrcImageBuffer->get(), 0ull, refCompressedData.size());
19148d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const VkImageMemoryBarrier			refSrcCopyImageBarrierPre	= makeImageMemoryBarrier(0u, VK_ACCESS_TRANSFER_WRITE_BIT, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_GENERAL, refSrcImage->get(), subresourceRange);
1915c291149e2803c25074f1fbea8686b3488573aa92Arkadiusz Sarwa	const VkImageMemoryBarrier			refSrcCopyImageBarrierPost	= makeImageMemoryBarrier(VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_SHADER_READ_BIT, VK_IMAGE_LAYOUT_GENERAL, layoutShaderReadOnly ? VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL : VK_IMAGE_LAYOUT_GENERAL, refSrcImage->get(), subresourceRange);
1916c291149e2803c25074f1fbea8686b3488573aa92Arkadiusz Sarwa	const VkImageMemoryBarrier			resCompressedImageBarrier	= makeImageMemoryBarrier(0, VK_ACCESS_SHADER_READ_BIT, VK_IMAGE_LAYOUT_GENERAL, layoutShaderReadOnly ? VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL : VK_IMAGE_LAYOUT_GENERAL, resCompressedImage->get(), resSubresourceRange);
1917819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
19188d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const Move<VkFramebuffer>			framebuffer					(makeFramebuffer(vk, device, *renderPass, 0, DE_NULL, renderSize, getLayerCount()));
1919819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
1920819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	// Upload source image data
1921819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	{
1922819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		const Allocation& refSrcImageBufferAlloc = refSrcImageBuffer->getAllocation();
1923819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		deMemcpy(refSrcImageBufferAlloc.getHostPtr(), &refCompressedData[0], refCompressedData.size());
1924819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		flushMappedMemoryRange(vk, device, refSrcImageBufferAlloc.getMemory(), refSrcImageBufferAlloc.getOffset(), refCompressedData.size());
1925819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	}
1926819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
1927819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	beginCommandBuffer(vk, *cmdBuffer);
1928819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	vk.cmdBindPipeline(*cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *pipeline);
1929819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
19308d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	// Copy buffer to image
19318d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 1u, &refSrcCopyBufferBarrierPre, 1u, &refSrcCopyImageBarrierPre);
19328d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	vk.cmdCopyBufferToImage(*cmdBuffer, refSrcImageBuffer->get(), refSrcImage->get(), VK_IMAGE_LAYOUT_GENERAL, 1u, &copyBufferToImageRegion);
1933c291149e2803c25074f1fbea8686b3488573aa92Arkadiusz Sarwa	vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 0, DE_NULL, 1u, &refSrcCopyImageBarrierPost);
1934819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
1935819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	// Make reference and result images readable
19368d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 0u, DE_NULL, 1u, &refDstInitImageBarrier);
19378d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 0u, DE_NULL, 1u, &resDstInitImageBarrier);
1938c291149e2803c25074f1fbea8686b3488573aa92Arkadiusz Sarwa	{
1939c291149e2803c25074f1fbea8686b3488573aa92Arkadiusz Sarwa		vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 0u, DE_NULL, 1u, &resCompressedImageBarrier);
1940c291149e2803c25074f1fbea8686b3488573aa92Arkadiusz Sarwa	}
1941819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
1942819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	beginRenderPass(vk, *cmdBuffer, *renderPass, *framebuffer, renderSize);
1943819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	{
1944819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		DescriptorSetUpdateBuilder()
1945819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			.writeSingle(*descriptorSet, DescriptorSetUpdateBuilder::Location::binding(0u), VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, &descriptorRefSrcImage)
1946819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			.writeSingle(*descriptorSet, DescriptorSetUpdateBuilder::Location::binding(1u), VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, &descriptorResSrcImage)
1947819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			.writeSingle(*descriptorSet, DescriptorSetUpdateBuilder::Location::binding(2u), VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, &descriptorRefDstImage)
1948819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			.writeSingle(*descriptorSet, DescriptorSetUpdateBuilder::Location::binding(3u), VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, &descriptorResDstImage)
1949819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			.update(vk, device);
1950819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
1951819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		vk.cmdBindDescriptorSets(*cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *pipelineLayout, 0u, 1u, &descriptorSet.get(), 0u, DE_NULL);
19528d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		vk.cmdBindVertexBuffers(*cmdBuffer, 0, 1, &m_vertexBuffer->get(), &m_vertexBufferOffset);
19538d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		vk.cmdDraw(*cmdBuffer, m_vertexCount, 1, 0, 0);
1954819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	}
1955819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	vk.cmdEndRenderPass(*cmdBuffer);
1956819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
1957819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	// Decompress reference image
1958819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	{
1959819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		const VkImageMemoryBarrier refDstImageBarrier = makeImageMemoryBarrier(
1960819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			VK_ACCESS_SHADER_WRITE_BIT, VK_ACCESS_TRANSFER_READ_BIT,
1961819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_GENERAL,
1962819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			refDstImage->get(), subresourceRange);
1963819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
1964819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		const VkBufferMemoryBarrier refDstBufferBarrier = makeBufferMemoryBarrier(
1965819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_HOST_READ_BIT,
1966819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			refDstBuffer->get(), 0ull, dstBufferSize);
1967819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
1968819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 0, (const VkBufferMemoryBarrier*)DE_NULL, 1, &refDstImageBarrier);
1969819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		vk.cmdCopyImageToBuffer(*cmdBuffer, refDstImage->get(), VK_IMAGE_LAYOUT_GENERAL, refDstBuffer->get(), 1u, &copyRegion);
1970819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_HOST_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 1, &refDstBufferBarrier, 0, (const VkImageMemoryBarrier*)DE_NULL);
1971819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	}
1972819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
1973819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	// Decompress result image
1974819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	{
1975819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		const VkImageMemoryBarrier resDstImageBarrier = makeImageMemoryBarrier(
1976819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			VK_ACCESS_SHADER_WRITE_BIT, VK_ACCESS_TRANSFER_READ_BIT,
1977819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_GENERAL,
1978819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			resDstImage->get(), subresourceRange);
1979819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
1980819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		const VkBufferMemoryBarrier resDstBufferBarrier = makeBufferMemoryBarrier(
1981819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_HOST_READ_BIT,
1982819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			resDstBuffer->get(), 0ull, dstBufferSize);
1983819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
1984819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 0, (const VkBufferMemoryBarrier*)DE_NULL, 1, &resDstImageBarrier);
1985819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		vk.cmdCopyImageToBuffer(*cmdBuffer, resDstImage->get(), VK_IMAGE_LAYOUT_GENERAL, resDstBuffer->get(), 1u, &copyRegion);
1986819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_HOST_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 1, &resDstBufferBarrier, 0, (const VkImageMemoryBarrier*)DE_NULL);
1987819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	}
1988819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
1989819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	endCommandBuffer(vk, *cmdBuffer);
1990819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
1991819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	submitCommandsAndWait(vk, device, queue, *cmdBuffer);
1992819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
1993819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	// Compare decompressed pixel data in reference and result images
1994819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	{
1995819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		const Allocation&	refDstBufferAlloc	= refDstBuffer->getAllocation();
1996819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		invalidateMappedMemoryRange(vk, device, refDstBufferAlloc.getMemory(), refDstBufferAlloc.getOffset(), dstBufferSize);
1997819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
1998819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		const Allocation&	resDstBufferAlloc	= resDstBuffer->getAllocation();
1999819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		invalidateMappedMemoryRange(vk, device, resDstBufferAlloc.getMemory(), resDstBufferAlloc.getOffset(), dstBufferSize);
2000819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
20018d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		if (deMemCmp(refDstBufferAlloc.getHostPtr(), resDstBufferAlloc.getHostPtr(), (size_t)dstBufferSize) != 0)
20028d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		{
20038d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			// Do fuzzy to log error mask
20048d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			invalidateMappedMemoryRange(vk, device, resDstBufferAlloc.getMemory(), resDstBufferAlloc.getOffset(), dstBufferSize);
20058d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			invalidateMappedMemoryRange(vk, device, refDstBufferAlloc.getMemory(), refDstBufferAlloc.getOffset(), dstBufferSize);
20068d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
20078d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			tcu::ConstPixelBufferAccess	resPixels	(mapVkFormat(m_parameters.formatForVerify), renderSize.width, renderSize.height, 1u, resDstBufferAlloc.getHostPtr());
20088d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			tcu::ConstPixelBufferAccess	refPixels	(mapVkFormat(m_parameters.formatForVerify), renderSize.width, renderSize.height, 1u, refDstBufferAlloc.getHostPtr());
20098d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
20108d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			string	comment	= string("Image Comparison (level=") + de::toString(level) + string(", layer=") + de::toString(layer) + string(")");
20118d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
20128d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			if (isWriteToCompressedOperation())
20138d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				tcu::fuzzyCompare(m_context.getTestContext().getLog(), "ImageComparison", comment.c_str(), refPixels, resPixels, 0.001f, tcu::COMPARE_LOG_EVERYTHING);
20148d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			else
20158d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				tcu::fuzzyCompare(m_context.getTestContext().getLog(), "ImageComparison", comment.c_str(), resPixels, refPixels, 0.001f, tcu::COMPARE_LOG_EVERYTHING);
20168d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
20178d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			return false;
20188d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		}
2019819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	}
20208d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
20218d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	return true;
2022819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa}
2023819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
2024819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
2025819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwaclass GraphicsTextureTestInstance : public GraphicsAttachmentsTestInstance
2026819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa{
2027819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwapublic:
2028819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa						GraphicsTextureTestInstance		(Context& context, const TestParameters& parameters);
2029819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
2030819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwaprotected:
2031819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	virtual bool		isWriteToCompressedOperation	();
20328d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	virtual void		transcodeRead					();
20338d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	virtual void		transcodeWrite					();
2034819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa};
2035819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
2036819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz SarwaGraphicsTextureTestInstance::GraphicsTextureTestInstance (Context& context, const TestParameters& parameters)
2037819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	: GraphicsAttachmentsTestInstance(context, parameters)
2038819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa{
2039819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa}
2040819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
2041819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwabool GraphicsTextureTestInstance::isWriteToCompressedOperation ()
2042819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa{
2043819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	return (m_parameters.operation == OPERATION_TEXTURE_WRITE);
2044819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa}
2045819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
20468d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwavoid GraphicsTextureTestInstance::transcodeRead ()
2047819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa{
20488d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const DeviceInterface&				vk						= m_context.getDeviceInterface();
20498d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const VkDevice						device					= m_context.getDevice();
20508d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const deUint32						queueFamilyIndex		= m_context.getUniversalQueueFamilyIndex();
20518d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const VkQueue						queue					= m_context.getUniversalQueue();
20528d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	Allocator&							allocator				= m_context.getDefaultAllocator();
2053819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
20548d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const VkImageCreateFlags*			imgCreateFlagsOverride	= DE_NULL;
2055819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
20568d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const VkImageCreateInfo				srcImageCreateInfo		= makeCreateImageInfo(m_srcFormat, m_parameters.imageType, m_srcImageResolutions[0], m_srcImageUsageFlags, imgCreateFlagsOverride, getLevelCount(), getLayerCount());
20578d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	MovePtr<Image>						srcImage				(new Image(vk, device, allocator, srcImageCreateInfo, MemoryRequirement::Any));
2058819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
20598d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const Unique<VkShaderModule>		vertShaderModule		(createShaderModule(vk, device, m_context.getBinaryCollection().get("vert"), 0));
20608d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const Unique<VkShaderModule>		fragShaderModule		(createShaderModule(vk, device, m_context.getBinaryCollection().get("frag"), 0));
2061819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
20628d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const Unique<VkRenderPass>			renderPass				(makeRenderPass(vk, device));
2063819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
20648d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const Move<VkDescriptorSetLayout>	descriptorSetLayout		(DescriptorSetLayoutBuilder()
20658d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																	.addSingleBinding(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_SHADER_STAGE_FRAGMENT_BIT)
20668d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																	.addSingleBinding(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, VK_SHADER_STAGE_FRAGMENT_BIT)
20678d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																	.build(vk, device));
20688d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const Move<VkDescriptorPool>		descriptorPool			(DescriptorPoolBuilder()
20698d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																	.addType(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER)
20708d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																	.addType(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE)
20718d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																	.build(vk, device, VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 1u));
20728d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const Move<VkDescriptorSet>			descriptorSet			(makeDescriptorSet(vk, device, *descriptorPool, *descriptorSetLayout));
2073819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
20748d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const VkExtent2D					renderSizeDummy			(makeExtent2D(1u, 1u));
20758d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const Unique<VkPipelineLayout>		pipelineLayout			(makePipelineLayout(vk, device, *descriptorSetLayout));
20768d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const Unique<VkPipeline>			pipeline				(makeGraphicsPipeline(vk, device, *pipelineLayout, *renderPass, *vertShaderModule, *fragShaderModule, renderSizeDummy, 0u, true));
2077819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
20788d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const Unique<VkCommandPool>			cmdPool					(createCommandPool(vk, device, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, queueFamilyIndex));
20798d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const Unique<VkCommandBuffer>		cmdBuffer				(allocateCommandBuffer(vk, device, *cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY));
20808d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
20818d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	for (deUint32 levelNdx = 0; levelNdx < getLevelCount(); ++levelNdx)
2082819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	{
20838d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		const UVec3&				uncompressedImageRes	= m_uncompressedImageResVec[levelNdx];
20848d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		const UVec3&				srcImageResolution		= m_srcImageResolutions[levelNdx];
20858d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		const UVec3&				dstImageResolution		= m_dstImageResolutions[levelNdx];
20868d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		const size_t				srcImageSizeInBytes		= m_srcData[levelNdx][0]->size();
20878d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		const size_t				dstImageSizeInBytes		= m_dstData[levelNdx][0]->size();
20888d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		const UVec3					srcImageResBlocked		= getCompressedImageResolutionBlockCeil(m_parameters.formatCompressed, srcImageResolution);
2089819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
20908d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		const VkImageCreateInfo		dstImageCreateInfo		= makeCreateImageInfo(m_dstFormat, m_parameters.imageType, dstImageResolution, m_dstImageUsageFlags, imgCreateFlagsOverride, SINGLE_LEVEL, SINGLE_LAYER);
2091819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
20928d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		const VkBufferCreateInfo	srcImageBufferInfo		= makeBufferCreateInfo(srcImageSizeInBytes, VK_BUFFER_USAGE_TRANSFER_SRC_BIT);
20938d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		const MovePtr<Buffer>		srcImageBuffer			= MovePtr<Buffer>(new Buffer(vk, device, allocator, srcImageBufferInfo, MemoryRequirement::HostVisible));
2094819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
20958d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		const VkBufferCreateInfo	dstImageBufferInfo		= makeBufferCreateInfo(dstImageSizeInBytes, VK_BUFFER_USAGE_TRANSFER_DST_BIT);
20968d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		MovePtr<Buffer>				dstImageBuffer			= MovePtr<Buffer>(new Buffer(vk, device, allocator, dstImageBufferInfo, MemoryRequirement::HostVisible));
2097819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
20988d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		const VkExtent2D			renderSize				(makeExtent2D(uncompressedImageRes.x(), uncompressedImageRes.y()));
20998d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		const VkViewport			viewport				= makeViewport(0.0f, 0.0f, static_cast<float>(renderSize.width), static_cast<float>(renderSize.height), 0.0f, 1.0f);
21008d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		const VkRect2D				scissor					= makeScissor(renderSize.width, renderSize.height);
2101819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
21028d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		for (deUint32 layerNdx = 0; layerNdx < getLayerCount(); ++layerNdx)
21038d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		{
21048d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			const VkImageSubresourceRange	srcSubresourceRange		= makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, levelNdx, SINGLE_LEVEL, layerNdx, SINGLE_LAYER);
21058d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			const VkImageSubresourceRange	dstSubresourceRange		= makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, SINGLE_LEVEL, 0u, SINGLE_LAYER);
2106819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
21078d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			Move<VkImageView>				srcImageView			(makeImageView(vk, device, srcImage->get(), mapImageViewType(m_parameters.imageType), m_parameters.formatUncompressed, srcSubresourceRange, m_srcImageViewUsageKHR));
2108819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
21098d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			de::MovePtr<Image>				dstImage				(new Image(vk, device, allocator, dstImageCreateInfo, MemoryRequirement::Any));
21108d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			Move<VkImageView>				dstImageView			(makeImageView(vk, device, dstImage->get(), mapImageViewType(m_parameters.imageType), m_parameters.formatUncompressed, dstSubresourceRange, m_dstImageViewUsageKHR));
21118d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
21128d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			const VkSamplerCreateInfo		srcSamplerInfo			(makeSamplerCreateInfo());
21138d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			const Move<VkSampler>			srcSampler				= vk::createSampler(vk, device, &srcSamplerInfo);
21148d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			const VkDescriptorImageInfo		descriptorSrcImage		(makeDescriptorImageInfo(*srcSampler, *srcImageView, VK_IMAGE_LAYOUT_GENERAL));
21158d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			const VkDescriptorImageInfo		descriptorDstImage		(makeDescriptorImageInfo(DE_NULL, *dstImageView, VK_IMAGE_LAYOUT_GENERAL));
21168d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
21178d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			const VkBufferImageCopy			srcCopyRegion			= makeBufferImageCopy(srcImageResolution.x(), srcImageResolution.y(), levelNdx, layerNdx, srcImageResBlocked.x(), srcImageResBlocked.y());
21188d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			const VkBufferMemoryBarrier		srcCopyBufferBarrierPre	= makeBufferMemoryBarrier(VK_ACCESS_HOST_WRITE_BIT, VK_ACCESS_TRANSFER_READ_BIT, srcImageBuffer->get(), 0ull, srcImageSizeInBytes);
21198d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			const VkImageMemoryBarrier		srcCopyImageBarrierPre	= makeImageMemoryBarrier(0u, VK_ACCESS_TRANSFER_WRITE_BIT, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, srcImage->get(), srcSubresourceRange);
21208d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			const VkImageMemoryBarrier		srcCopyImageBarrierPost	= makeImageMemoryBarrier(VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_SHADER_READ_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL, srcImage->get(), srcSubresourceRange);
21218d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			const VkBufferImageCopy			dstCopyRegion			= makeBufferImageCopy(dstImageResolution.x(), dstImageResolution.y());
21228d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			const VkImageMemoryBarrier		dstInitImageBarrier		= makeImageMemoryBarrier(0u, VK_ACCESS_SHADER_READ_BIT, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_GENERAL, dstImage->get(), dstSubresourceRange);
21238d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
21248d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			const VkExtent2D				framebufferSize			(makeExtent2D(dstImageResolution[0], dstImageResolution[1]));
21258d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			const Move<VkFramebuffer>		framebuffer				(makeFramebuffer(vk, device, *renderPass, 0, DE_NULL, framebufferSize, SINGLE_LAYER));
21268d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
21278d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			// Upload source image data
21288d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			const Allocation& alloc = srcImageBuffer->getAllocation();
21298d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			deMemcpy(alloc.getHostPtr(), &m_srcData[levelNdx][layerNdx]->at(0), srcImageSizeInBytes);
21308d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			flushMappedMemoryRange(vk, device, alloc.getMemory(), alloc.getOffset(), srcImageSizeInBytes);
21318d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
21328d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			beginCommandBuffer(vk, *cmdBuffer);
21338d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			vk.cmdBindPipeline(*cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *pipeline);
2134819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
21358d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			// Copy buffer to image
21368d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 1u, &srcCopyBufferBarrierPre, 1u, &srcCopyImageBarrierPre);
21378d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			vk.cmdCopyBufferToImage(*cmdBuffer, srcImageBuffer->get(), srcImage->get(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1u, &srcCopyRegion);
21388d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 0u, DE_NULL, 1u, &srcCopyImageBarrierPost);
2139819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
21408d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			// Define destination image layout
21418d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 0u, DE_NULL, 1u, &dstInitImageBarrier);
21428d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
21438d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			beginRenderPass(vk, *cmdBuffer, *renderPass, *framebuffer, renderSize);
21448d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
21458d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			DescriptorSetUpdateBuilder()
21468d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				.writeSingle(*descriptorSet, DescriptorSetUpdateBuilder::Location::binding(0u), VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, &descriptorSrcImage)
21478d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				.writeSingle(*descriptorSet, DescriptorSetUpdateBuilder::Location::binding(1u), VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, &descriptorDstImage)
21488d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				.update(vk, device);
21498d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
21508d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			vk.cmdBindDescriptorSets(*cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *pipelineLayout, 0u, 1u, &descriptorSet.get(), 0u, DE_NULL);
21518d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			vk.cmdBindVertexBuffers(*cmdBuffer, 0u, 1u, &m_vertexBuffer->get(), &m_vertexBufferOffset);
21528d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
21538d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			vk.cmdSetViewport(*cmdBuffer, 0u, 1u, &viewport);
21548d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			vk.cmdSetScissor(*cmdBuffer, 0u, 1u, &scissor);
21558d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
21568d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			vk.cmdDraw(*cmdBuffer, (deUint32)m_vertexCount, 1, 0, 0);
21578d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
21588d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			vk.cmdEndRenderPass(*cmdBuffer);
21598d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
21608d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			const VkImageMemoryBarrier prepareForTransferBarrier = makeImageMemoryBarrier(
21618d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				VK_ACCESS_SHADER_WRITE_BIT, VK_ACCESS_TRANSFER_READ_BIT,
21628d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_GENERAL,
21638d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				dstImage->get(), dstSubresourceRange);
21648d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
21658d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			const VkBufferMemoryBarrier copyBarrier = makeBufferMemoryBarrier(
21668d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_HOST_READ_BIT,
21678d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				dstImageBuffer->get(), 0ull, dstImageSizeInBytes);
21688d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
21698d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 0, (const VkBufferMemoryBarrier*)DE_NULL, 1, &prepareForTransferBarrier);
21708d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			vk.cmdCopyImageToBuffer(*cmdBuffer, dstImage->get(), VK_IMAGE_LAYOUT_GENERAL, dstImageBuffer->get(), 1u, &dstCopyRegion);
21718d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_HOST_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 1, &copyBarrier, 0, (const VkImageMemoryBarrier*)DE_NULL);
21728d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
21738d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			endCommandBuffer(vk, *cmdBuffer);
21748d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
21758d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			submitCommandsAndWait(vk, device, queue, *cmdBuffer);
21768d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
21778d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			const Allocation& dstImageBufferAlloc = dstImageBuffer->getAllocation();
21788d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			invalidateMappedMemoryRange(vk, device, dstImageBufferAlloc.getMemory(), dstImageBufferAlloc.getOffset(), dstImageSizeInBytes);
21798d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			deMemcpy(&m_dstData[levelNdx][layerNdx]->at(0), dstImageBufferAlloc.getHostPtr(), dstImageSizeInBytes);
21808d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		}
21818d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	}
21828d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
21838d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	m_compressedImage = srcImage;
2184819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa}
2185819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
21868d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwavoid GraphicsTextureTestInstance::transcodeWrite ()
21878d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa{
21888d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const DeviceInterface&				vk						= m_context.getDeviceInterface();
21898d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const VkDevice						device					= m_context.getDevice();
21908d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const deUint32						queueFamilyIndex		= m_context.getUniversalQueueFamilyIndex();
21918d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const VkQueue						queue					= m_context.getUniversalQueue();
21928d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	Allocator&							allocator				= m_context.getDefaultAllocator();
21938d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
21948d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const VkImageCreateFlags*			imgCreateFlagsOverride	= DE_NULL;
21958d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
21968d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const VkImageCreateInfo				dstImageCreateInfo		= makeCreateImageInfo(m_dstFormat, m_parameters.imageType, m_dstImageResolutions[0], m_dstImageUsageFlags, imgCreateFlagsOverride, getLevelCount(), getLayerCount());
21978d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	MovePtr<Image>						dstImage				(new Image(vk, device, allocator, dstImageCreateInfo, MemoryRequirement::Any));
21988d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
21998d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const Unique<VkShaderModule>		vertShaderModule		(createShaderModule(vk, device, m_context.getBinaryCollection().get("vert"), 0));
22008d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const Unique<VkShaderModule>		fragShaderModule		(createShaderModule(vk, device, m_context.getBinaryCollection().get("frag"), 0));
22018d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
22028d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const Unique<VkRenderPass>			renderPass				(makeRenderPass(vk, device));
22038d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
22048d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const Move<VkDescriptorSetLayout>	descriptorSetLayout		(DescriptorSetLayoutBuilder()
22058d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																	.addSingleBinding(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_SHADER_STAGE_FRAGMENT_BIT)
22068d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																	.addSingleBinding(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, VK_SHADER_STAGE_FRAGMENT_BIT)
22078d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																	.build(vk, device));
22088d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const Move<VkDescriptorPool>		descriptorPool			(DescriptorPoolBuilder()
22098d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																	.addType(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER)
22108d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																	.addType(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE)
22118d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa																	.build(vk, device, VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 1u));
22128d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const Move<VkDescriptorSet>			descriptorSet			(makeDescriptorSet(vk, device, *descriptorPool, *descriptorSetLayout));
22138d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
22148d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const VkExtent2D					renderSizeDummy			(makeExtent2D(1u, 1u));
22158d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const Unique<VkPipelineLayout>		pipelineLayout			(makePipelineLayout(vk, device, *descriptorSetLayout));
22168d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const Unique<VkPipeline>			pipeline				(makeGraphicsPipeline(vk, device, *pipelineLayout, *renderPass, *vertShaderModule, *fragShaderModule, renderSizeDummy, 0u, true));
22178d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
22188d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const Unique<VkCommandPool>			cmdPool					(createCommandPool(vk, device, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, queueFamilyIndex));
22198d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const Unique<VkCommandBuffer>		cmdBuffer				(allocateCommandBuffer(vk, device, *cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY));
22208d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
22218d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	for (deUint32 levelNdx = 0; levelNdx < getLevelCount(); ++levelNdx)
22228d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	{
22238d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		const UVec3&				uncompressedImageRes	= m_uncompressedImageResVec[levelNdx];
22248d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		const UVec3&				srcImageResolution		= m_srcImageResolutions[levelNdx];
22258d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		const UVec3&				dstImageResolution		= m_dstImageResolutions[levelNdx];
22268d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		const size_t				srcImageSizeInBytes		= m_srcData[levelNdx][0]->size();
22278d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		const size_t				dstImageSizeInBytes		= m_dstData[levelNdx][0]->size();
22288d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		const UVec3					dstImageResBlocked		= getCompressedImageResolutionBlockCeil(m_parameters.formatCompressed, dstImageResolution);
22298d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
22308d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		const VkImageCreateInfo		srcImageCreateInfo		= makeCreateImageInfo(m_srcFormat, m_parameters.imageType, srcImageResolution, m_srcImageUsageFlags, imgCreateFlagsOverride, SINGLE_LEVEL, SINGLE_LAYER);
22318d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
22328d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		const VkExtent2D			renderSize				(makeExtent2D(uncompressedImageRes.x(), uncompressedImageRes.y()));
22338d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		const VkViewport			viewport				= makeViewport(0.0f, 0.0f, static_cast<float>(renderSize.width), static_cast<float>(renderSize.height), 0.0f, 1.0f);
22348d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		const VkRect2D				scissor					= makeScissor(renderSize.width, renderSize.height);
22358d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
22368d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		for (deUint32 layerNdx = 0; layerNdx < getLayerCount(); ++layerNdx)
22378d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		{
22388d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			const VkBufferCreateInfo		srcImageBufferInfo		= makeBufferCreateInfo(srcImageSizeInBytes, VK_BUFFER_USAGE_TRANSFER_SRC_BIT);
22398d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			const MovePtr<Buffer>			srcImageBuffer			= MovePtr<Buffer>(new Buffer(vk, device, allocator, srcImageBufferInfo, MemoryRequirement::HostVisible));
22408d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
22418d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			const VkBufferCreateInfo		dstImageBufferInfo		= makeBufferCreateInfo(dstImageSizeInBytes, VK_BUFFER_USAGE_TRANSFER_DST_BIT);
22428d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			MovePtr<Buffer>					dstImageBuffer			= MovePtr<Buffer>(new Buffer(vk, device, allocator, dstImageBufferInfo, MemoryRequirement::HostVisible));
22438d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
22448d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			const VkImageSubresourceRange	srcSubresourceRange		= makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, SINGLE_LEVEL, 0u, SINGLE_LAYER);
22458d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			const VkImageSubresourceRange	dstSubresourceRange		= makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, levelNdx, SINGLE_LEVEL, layerNdx, SINGLE_LAYER);
22468d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
22478d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			Move<VkImageView>				dstImageView			(makeImageView(vk, device, dstImage->get(), mapImageViewType(m_parameters.imageType), m_parameters.formatUncompressed, dstSubresourceRange, m_dstImageViewUsageKHR));
22488d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
22498d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			de::MovePtr<Image>				srcImage				(new Image(vk, device, allocator, srcImageCreateInfo, MemoryRequirement::Any));
22508d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			Move<VkImageView>				srcImageView			(makeImageView(vk, device, srcImage->get(), mapImageViewType(m_parameters.imageType), m_parameters.formatUncompressed, srcSubresourceRange, m_srcImageViewUsageKHR));
22518d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
22528d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			const VkSamplerCreateInfo		srcSamplerInfo			(makeSamplerCreateInfo());
22538d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			const Move<VkSampler>			srcSampler				= vk::createSampler(vk, device, &srcSamplerInfo);
22548d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			const VkDescriptorImageInfo		descriptorSrcImage		(makeDescriptorImageInfo(*srcSampler, *srcImageView, VK_IMAGE_LAYOUT_GENERAL));
22558d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			const VkDescriptorImageInfo		descriptorDstImage		(makeDescriptorImageInfo(DE_NULL, *dstImageView, VK_IMAGE_LAYOUT_GENERAL));
22568d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
22578d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			const VkBufferImageCopy			srcCopyRegion			= makeBufferImageCopy(srcImageResolution.x(), srcImageResolution.y(), 0u, 0u);
22588d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			const VkBufferMemoryBarrier		srcCopyBufferBarrierPre	= makeBufferMemoryBarrier(VK_ACCESS_HOST_WRITE_BIT, VK_ACCESS_TRANSFER_READ_BIT, srcImageBuffer->get(), 0ull, srcImageSizeInBytes);
22598d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			const VkImageMemoryBarrier		srcCopyImageBarrierPre	= makeImageMemoryBarrier(0u, VK_ACCESS_TRANSFER_WRITE_BIT, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, srcImage->get(), srcSubresourceRange);
22608d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			const VkImageMemoryBarrier		srcCopyImageBarrierPost	= makeImageMemoryBarrier(VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_SHADER_READ_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL, srcImage->get(), srcSubresourceRange);
22618d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			const VkBufferImageCopy			dstCopyRegion			= makeBufferImageCopy(dstImageResolution.x(), dstImageResolution.y(), levelNdx, layerNdx, dstImageResBlocked.x(), dstImageResBlocked.y());
22628d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			const VkImageMemoryBarrier		dstInitImageBarrier		= makeImageMemoryBarrier(0u, VK_ACCESS_SHADER_READ_BIT, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_GENERAL, dstImage->get(), dstSubresourceRange);
22638d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
22648d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			const VkExtent2D				framebufferSize			(makeExtent2D(dstImageResolution[0], dstImageResolution[1]));
22658d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			const Move<VkFramebuffer>		framebuffer				(makeFramebuffer(vk, device, *renderPass, 0, DE_NULL, framebufferSize, SINGLE_LAYER));
22668d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
22678d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			// Upload source image data
22688d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			const Allocation& alloc = srcImageBuffer->getAllocation();
22698d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			deMemcpy(alloc.getHostPtr(), &m_srcData[levelNdx][layerNdx]->at(0), srcImageSizeInBytes);
22708d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			flushMappedMemoryRange(vk, device, alloc.getMemory(), alloc.getOffset(), srcImageSizeInBytes);
22718d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
22728d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			beginCommandBuffer(vk, *cmdBuffer);
22738d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			vk.cmdBindPipeline(*cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *pipeline);
22748d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
22758d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			// Copy buffer to image
22768d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 1u, &srcCopyBufferBarrierPre, 1u, &srcCopyImageBarrierPre);
22778d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			vk.cmdCopyBufferToImage(*cmdBuffer, srcImageBuffer->get(), srcImage->get(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1u, &srcCopyRegion);
22788d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 0u, DE_NULL, 1u, &srcCopyImageBarrierPost);
22798d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
22808d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			// Define destination image layout
22818d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 0u, DE_NULL, 1u, &dstInitImageBarrier);
22828d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
22838d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			beginRenderPass(vk, *cmdBuffer, *renderPass, *framebuffer, renderSize);
22848d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
22858d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			DescriptorSetUpdateBuilder()
22868d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				.writeSingle(*descriptorSet, DescriptorSetUpdateBuilder::Location::binding(0u), VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, &descriptorSrcImage)
22878d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				.writeSingle(*descriptorSet, DescriptorSetUpdateBuilder::Location::binding(1u), VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, &descriptorDstImage)
22888d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				.update(vk, device);
22898d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
22908d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			vk.cmdBindDescriptorSets(*cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *pipelineLayout, 0u, 1u, &descriptorSet.get(), 0u, DE_NULL);
22918d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			vk.cmdBindVertexBuffers(*cmdBuffer, 0u, 1u, &m_vertexBuffer->get(), &m_vertexBufferOffset);
22928d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
22938d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			vk.cmdSetViewport(*cmdBuffer, 0u, 1u, &viewport);
22948d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			vk.cmdSetScissor(*cmdBuffer, 0u, 1u, &scissor);
22958d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
22968d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			vk.cmdDraw(*cmdBuffer, (deUint32)m_vertexCount, 1, 0, 0);
22978d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
22988d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			vk.cmdEndRenderPass(*cmdBuffer);
22998d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
23008d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			const VkImageMemoryBarrier prepareForTransferBarrier = makeImageMemoryBarrier(
23018d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				VK_ACCESS_SHADER_WRITE_BIT, VK_ACCESS_TRANSFER_READ_BIT,
23028d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_GENERAL,
23038d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				dstImage->get(), dstSubresourceRange);
23048d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
23058d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			const VkBufferMemoryBarrier copyBarrier = makeBufferMemoryBarrier(
23068d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_HOST_READ_BIT,
23078d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				dstImageBuffer->get(), 0ull, dstImageSizeInBytes);
23088d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
23098d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 0, (const VkBufferMemoryBarrier*)DE_NULL, 1, &prepareForTransferBarrier);
23108d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			vk.cmdCopyImageToBuffer(*cmdBuffer, dstImage->get(), VK_IMAGE_LAYOUT_GENERAL, dstImageBuffer->get(), 1u, &dstCopyRegion);
23118d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_HOST_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 1, &copyBarrier, 0, (const VkImageMemoryBarrier*)DE_NULL);
23128d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
23138d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			endCommandBuffer(vk, *cmdBuffer);
23148d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
23158d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			submitCommandsAndWait(vk, device, queue, *cmdBuffer);
23168d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
23178d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			const Allocation& dstImageBufferAlloc = dstImageBuffer->getAllocation();
23188d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			invalidateMappedMemoryRange(vk, device, dstImageBufferAlloc.getMemory(), dstImageBufferAlloc.getOffset(), dstImageSizeInBytes);
23198d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			deMemcpy(&m_dstData[levelNdx][layerNdx]->at(0), dstImageBufferAlloc.getHostPtr(), dstImageSizeInBytes);
23208d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		}
23218d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	}
23228d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
23238d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	m_compressedImage = dstImage;
23248d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa}
2325819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
2326819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwaclass TexelViewCompatibleCase : public TestCase
2327819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa{
2328819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwapublic:
2329819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa							TexelViewCompatibleCase		(TestContext&				testCtx,
2330819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa														 const std::string&			name,
2331819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa														 const std::string&			desc,
2332819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa														 const TestParameters&		parameters);
2333819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	void					initPrograms				(SourceCollections&			programCollection) const;
2334819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	TestInstance*			createInstance				(Context&					context) const;
2335819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwaprotected:
2336819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	const TestParameters	m_parameters;
2337819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa};
2338819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
2339819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz SarwaTexelViewCompatibleCase::TexelViewCompatibleCase (TestContext& testCtx, const std::string& name, const std::string& desc, const TestParameters& parameters)
2340819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	: TestCase				(testCtx, name, desc)
2341819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	, m_parameters			(parameters)
2342819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa{
2343819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa}
2344819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
2345819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwavoid TexelViewCompatibleCase::initPrograms (vk::SourceCollections&	programCollection) const
2346819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa{
23478d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	DE_ASSERT(m_parameters.size.x() > 0);
23488d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	DE_ASSERT(m_parameters.size.y() > 0);
23498d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
2350819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	switch (m_parameters.shader)
2351819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	{
2352819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		case SHADER_TYPE_COMPUTE:
2353819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		{
2354819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			const std::string	imageTypeStr		= getShaderImageType(mapVkFormat(m_parameters.formatUncompressed), m_parameters.imageType);
2355819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			const std::string	formatQualifierStr	= getShaderImageFormatQualifier(mapVkFormat(m_parameters.formatUncompressed));
2356819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			std::ostringstream	src;
2357819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			std::ostringstream	src_decompress;
2358819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
2359819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			src << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450) << "\n"
2360819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa				<< "layout (local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n\n";
2361819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			src_decompress << src.str();
2362819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
2363819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			switch(m_parameters.operation)
2364819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			{
2365819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa				case OPERATION_IMAGE_LOAD:
2366819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa				{
2367819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa					src << "layout (binding = 0, "<<formatQualifierStr<<") readonly uniform "<<imageTypeStr<<" u_image0;\n"
2368819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa						<< "layout (binding = 1, "<<formatQualifierStr<<") writeonly uniform "<<imageTypeStr<<" u_image1;\n\n"
2369819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa						<< "void main (void)\n"
2370819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa						<< "{\n"
2371819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa						<< "    ivec2 pos = ivec2(gl_GlobalInvocationID.xy);\n"
2372819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa						<< "    imageStore(u_image1, pos, imageLoad(u_image0, pos));\n"
2373819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa						<< "}\n";
2374819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
2375819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa					break;
2376819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa				}
2377819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
2378819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa				case OPERATION_TEXEL_FETCH:
2379819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa				{
2380819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa					src << "layout (binding = 0) uniform "<<getGlslSamplerType(mapVkFormat(m_parameters.formatUncompressed), mapImageViewType(m_parameters.imageType))<<" u_image0;\n"
2381819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa						<< "layout (binding = 1, "<<formatQualifierStr<<") writeonly uniform "<<imageTypeStr<<" u_image1;\n\n"
2382819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa						<< "void main (void)\n"
2383819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa						<< "{\n"
2384819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa						<< "    ivec3 pos = ivec3(gl_GlobalInvocationID.xyz);\n"
2385819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa						<< "    imageStore(u_image1, pos.xy, texelFetch(u_image0, pos.xy, pos.z));\n"
2386819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa						<< "}\n";
2387819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
2388819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa					break;
2389819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa				}
2390819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
2391819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa				case OPERATION_TEXTURE:
2392819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa				{
2393819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa					src << "layout (binding = 0) uniform "<<getGlslSamplerType(mapVkFormat(m_parameters.formatUncompressed), mapImageViewType(m_parameters.imageType))<<" u_image0;\n"
2394819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa						<< "layout (binding = 1, "<<formatQualifierStr<<") writeonly uniform "<<imageTypeStr<<" u_image1;\n\n"
2395819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa						<< "void main (void)\n"
2396819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa						<< "{\n"
23978d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa						<< "    const vec2 pixels_resolution = vec2(gl_NumWorkGroups.x - 1, gl_NumWorkGroups.y - 1);\n"
23988d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa						<< "    const ivec2 pos = ivec2(gl_GlobalInvocationID.xy);\n"
23998d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa						<< "    const vec2 coord = vec2(gl_GlobalInvocationID.xy) / vec2(pixels_resolution);\n"
24008d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa						<< "    imageStore(u_image1, pos, texture(u_image0, coord));\n"
2401819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa						<< "}\n";
2402819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
2403819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa					break;
2404819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa				}
2405819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
2406819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa				case OPERATION_IMAGE_STORE:
2407819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa				{
2408819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa					src << "layout (binding = 0, "<<formatQualifierStr<<") uniform "<<imageTypeStr<<"           u_image0;\n"
2409819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa						<< "layout (binding = 1, "<<formatQualifierStr<<") readonly uniform "<<imageTypeStr<<"  u_image1;\n"
2410819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa						<< "layout (binding = 2, "<<formatQualifierStr<<") writeonly uniform "<<imageTypeStr<<" u_image2;\n\n"
2411819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa						<< "void main (void)\n"
2412819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa						<< "{\n"
2413819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa						<< "    ivec2 pos = ivec2(gl_GlobalInvocationID.xy);\n"
2414819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa						<< "    imageStore(u_image0, pos, imageLoad(u_image1, pos));\n"
2415819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa						<< "    imageStore(u_image2, pos, imageLoad(u_image0, pos));\n"
2416819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa						<< "}\n";
2417819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
2418819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa					break;
2419819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa				}
2420819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
2421819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa				default:
2422819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa					DE_ASSERT(false);
2423819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			}
2424819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
2425819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			src_decompress	<< "layout (binding = 0) uniform "<<getGlslSamplerType(mapVkFormat(m_parameters.formatUncompressed), mapImageViewType(m_parameters.imageType))<<" compressed_result;\n"
2426819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa							<< "layout (binding = 1) uniform "<<getGlslSamplerType(mapVkFormat(m_parameters.formatUncompressed), mapImageViewType(m_parameters.imageType))<<" compressed_reference;\n"
2427819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa							<< "layout (binding = 2, "<<formatQualifierStr<<") writeonly uniform "<<imageTypeStr<<" decompressed_result;\n"
2428819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa							<< "layout (binding = 3, "<<formatQualifierStr<<") writeonly uniform "<<imageTypeStr<<" decompressed_reference;\n\n"
2429819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa							<< "void main (void)\n"
2430819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa							<< "{\n"
24318d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa							<< "    const vec2 pixels_resolution = vec2(gl_NumWorkGroups.xy);\n"
24328d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa							<< "    const vec2 cord = vec2(gl_GlobalInvocationID.xy) / vec2(pixels_resolution);\n"
24338d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa							<< "    const ivec2 pos = ivec2(gl_GlobalInvocationID.xy); \n"
24348d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa							<< "    imageStore(decompressed_result, pos, texture(compressed_result, cord));\n"
24358d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa							<< "    imageStore(decompressed_reference, pos, texture(compressed_reference, cord));\n"
2436819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa							<< "}\n";
2437819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			programCollection.glslSources.add("comp") << glu::ComputeSource(src.str());
2438819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			programCollection.glslSources.add("decompress") << glu::ComputeSource(src_decompress.str());
2439819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
2440819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			break;
2441819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		}
2442819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
2443819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		case SHADER_TYPE_FRAGMENT:
2444819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		{
24458d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			ImageType	imageTypeForFS = (m_parameters.imageType == IMAGE_TYPE_2D_ARRAY) ? IMAGE_TYPE_2D : m_parameters.imageType;
2446819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
2447819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			// Vertex shader
2448819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			{
2449819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa				std::ostringstream src;
2450819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa				src << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450) << "\n\n"
2451819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa					<< "layout(location = 0) in vec4 v_in_position;\n"
2452819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa					<< "\n"
2453819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa					<< "void main (void)\n"
2454819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa					<< "{\n"
2455819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa					<< "    gl_Position = v_in_position;\n"
2456819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa					<< "}\n";
2457819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
2458819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa				programCollection.glslSources.add("vert") << glu::VertexSource(src.str());
2459819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			}
2460819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
2461819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			// Fragment shader
2462819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			{
2463819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa				switch(m_parameters.operation)
2464819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa				{
2465819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa					case OPERATION_ATTACHMENT_READ:
2466819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa					case OPERATION_ATTACHMENT_WRITE:
2467819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa					{
2468819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa						std::ostringstream	src;
2469819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
2470819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa						const std::string	dstTypeStr	= getGlslFormatType(m_parameters.formatUncompressed);
2471819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa						const std::string	srcTypeStr	= getGlslInputFormatType(m_parameters.formatUncompressed);
2472819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
2473819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa						src << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450) << "\n\n"
2474819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa							<< "precision highp int;\n"
2475819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa							<< "precision highp float;\n"
2476819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa							<< "\n"
2477819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa							<< "layout (location = 0) out highp " << dstTypeStr << " o_color;\n"
2478819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa							<< "layout (input_attachment_index = 0, set = 0, binding = 0) uniform highp " << srcTypeStr << " inputImage1;\n"
2479819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa							<< "\n"
2480819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa							<< "void main (void)\n"
2481819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa							<< "{\n"
2482819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa							<< "    o_color = " << dstTypeStr << "(subpassLoad(inputImage1));\n"
2483819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa							<< "}\n";
2484819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
2485819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa						programCollection.glslSources.add("frag") << glu::FragmentSource(src.str());
2486819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
2487819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa						break;
2488819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa					}
2489819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
2490819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa					case OPERATION_TEXTURE_READ:
2491819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa					case OPERATION_TEXTURE_WRITE:
2492819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa					{
2493819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa						std::ostringstream	src;
2494819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
24958d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa						const std::string	srcSamplerTypeStr		= getGlslSamplerType(mapVkFormat(m_parameters.formatUncompressed), mapImageViewType(imageTypeForFS));
24968d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa						const std::string	dstImageTypeStr			= getShaderImageType(mapVkFormat(m_parameters.formatUncompressed), imageTypeForFS);
2497819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa						const std::string	dstFormatQualifierStr	= getShaderImageFormatQualifier(mapVkFormat(m_parameters.formatUncompressed));
2498819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
2499819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa						src << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450) << "\n\n"
2500819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa							<< "layout (binding = 0) uniform " << srcSamplerTypeStr << " u_imageIn;\n"
2501819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa							<< "layout (binding = 1, " << dstFormatQualifierStr << ") writeonly uniform " << dstImageTypeStr << " u_imageOut;\n"
2502819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa							<< "\n"
2503819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa							<< "void main (void)\n"
2504819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa							<< "{\n"
2505819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa							<< "    const ivec2 out_pos = ivec2(gl_FragCoord.xy);\n"
25068d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa							<< "    const ivec2 pixels_resolution = ivec2(textureSize(u_imageIn, 0)) - ivec2(1,1);\n"
2507819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa							<< "    const vec2 in_pos = vec2(out_pos) / vec2(pixels_resolution);\n"
2508819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa							<< "    imageStore(u_imageOut, out_pos, texture(u_imageIn, in_pos));\n"
2509819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa							<< "}\n";
2510819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
2511819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa						programCollection.glslSources.add("frag") << glu::FragmentSource(src.str());
2512819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
2513819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa						break;
2514819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa					}
2515819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
2516819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa					default:
2517819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa						DE_ASSERT(false);
2518819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa				}
2519819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			}
2520819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
2521819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			// Verification fragment shader
2522819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			{
25238d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				std::ostringstream	src;
2524819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
25258d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				const std::string	samplerType			= getGlslSamplerType(mapVkFormat(m_parameters.formatForVerify), mapImageViewType(imageTypeForFS));
25268d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				const std::string	imageTypeStr		= getShaderImageType(mapVkFormat(m_parameters.formatForVerify), imageTypeForFS);
25278d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				const std::string	formatQualifierStr	= getShaderImageFormatQualifier(mapVkFormat(m_parameters.formatForVerify));
2528819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
25298d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				src << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450) << "\n\n"
25308d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa					<< "layout (binding = 0) uniform " << samplerType << " u_imageIn0;\n"
25318d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa					<< "layout (binding = 1) uniform " << samplerType << " u_imageIn1;\n"
25328d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa					<< "layout (binding = 2, " << formatQualifierStr << ") writeonly uniform " << imageTypeStr << " u_imageOut0;\n"
25338d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa					<< "layout (binding = 3, " << formatQualifierStr << ") writeonly uniform " << imageTypeStr << " u_imageOut1;\n"
25348d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa					<< "\n"
25358d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa					<< "void main (void)\n"
25368d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa					<< "{\n"
25378d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa					<< "    const ivec2 out_pos = ivec2(gl_FragCoord.xy);\n"
25388d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa					<< "\n"
25398d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa					<< "    const ivec2 pixels_resolution0 = ivec2(textureSize(u_imageIn0, 0)) - ivec2(1,1);\n"
25408d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa					<< "    const vec2 in_pos0 = vec2(out_pos) / vec2(pixels_resolution0);\n"
25418d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa					<< "    imageStore(u_imageOut0, out_pos, texture(u_imageIn0, in_pos0));\n"
25428d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa					<< "\n"
25438d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa					<< "    const ivec2 pixels_resolution1 = ivec2(textureSize(u_imageIn1, 0)) - ivec2(1,1);\n"
25448d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa					<< "    const vec2 in_pos1 = vec2(out_pos) / vec2(pixels_resolution1);\n"
25458d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa					<< "    imageStore(u_imageOut1, out_pos, texture(u_imageIn1, in_pos1));\n"
25468d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa					<< "}\n";
2547819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
25488d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				programCollection.glslSources.add("frag_verify") << glu::FragmentSource(src.str());
2549819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			}
2550819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
2551819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			break;
2552819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		}
2553819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
2554819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		default:
2555819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			DE_ASSERT(false);
2556819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	}
2557819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa}
2558819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
2559819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz SarwaTestInstance* TexelViewCompatibleCase::createInstance (Context& context) const
2560819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa{
2561819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	const VkPhysicalDevice			physicalDevice			= context.getPhysicalDevice();
2562819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	const InstanceInterface&		vk						= context.getInstanceInterface();
2563819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
25648d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	if (!m_parameters.useMipmaps)
25658d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	{
25668d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		DE_ASSERT(getNumLayers(m_parameters.imageType, m_parameters.size)     == 1u);
25678d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		DE_ASSERT(getLayerSize(m_parameters.imageType, m_parameters.size).z() == 1u);
25688d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	}
25698d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
2570819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	DE_ASSERT(getLayerSize(m_parameters.imageType, m_parameters.size).x() >  0u);
2571819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	DE_ASSERT(getLayerSize(m_parameters.imageType, m_parameters.size).y() >  0u);
2572819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
2573819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	if (std::find(context.getDeviceExtensions().begin(), context.getDeviceExtensions().end(), "VK_KHR_maintenance2") == context.getDeviceExtensions().end())
2574819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		TCU_THROW(NotSupportedError, "Extension VK_KHR_maintenance2 not supported");
2575819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
2576819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	{
2577819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		VkImageFormatProperties imageFormatProperties;
2578819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
2579819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		if (VK_ERROR_FORMAT_NOT_SUPPORTED == vk.getPhysicalDeviceImageFormatProperties(physicalDevice, m_parameters.formatUncompressed,
2580819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa												mapImageType(m_parameters.imageType), VK_IMAGE_TILING_OPTIMAL,
2581819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa												m_parameters.uncompressedImageUsage, 0u, &imageFormatProperties))
2582819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			TCU_THROW(NotSupportedError, "Operation not supported with this image format");
2583819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
2584819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		if (VK_ERROR_FORMAT_NOT_SUPPORTED == vk.getPhysicalDeviceImageFormatProperties(physicalDevice, m_parameters.formatCompressed,
2585819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa												mapImageType(m_parameters.imageType), VK_IMAGE_TILING_OPTIMAL,
2586819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa												VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
2587819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa												VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT_KHR | VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT | VK_IMAGE_CREATE_EXTENDED_USAGE_BIT_KHR,
2588819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa												&imageFormatProperties))
2589819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			TCU_THROW(NotSupportedError, "Operation not supported with this image format");
2590819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	}
2591819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
2592819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	{
2593819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		const VkPhysicalDeviceFeatures	physicalDeviceFeatures	= getPhysicalDeviceFeatures (vk, physicalDevice);
2594819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
2595819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		if (deInRange32(m_parameters.formatCompressed, VK_FORMAT_BC1_RGB_UNORM_BLOCK, VK_FORMAT_BC7_SRGB_BLOCK) &&
2596819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			!physicalDeviceFeatures.textureCompressionBC)
2597819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			TCU_THROW(NotSupportedError, "textureCompressionBC not supported");
2598819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
2599819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		if (deInRange32(m_parameters.formatCompressed, VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK, VK_FORMAT_EAC_R11G11_SNORM_BLOCK) &&
2600819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			!physicalDeviceFeatures.textureCompressionETC2)
2601819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			TCU_THROW(NotSupportedError, "textureCompressionETC2 not supported");
2602819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
2603819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		if (deInRange32(m_parameters.formatCompressed, VK_FORMAT_ASTC_4x4_UNORM_BLOCK, VK_FORMAT_ASTC_12x12_SRGB_BLOCK) &&
2604819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			!physicalDeviceFeatures.textureCompressionASTC_LDR)
2605819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			TCU_THROW(NotSupportedError, "textureCompressionASTC_LDR not supported");
2606819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	}
2607819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
2608819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	switch (m_parameters.shader)
2609819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	{
2610819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		case SHADER_TYPE_COMPUTE:
2611819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		{
2612819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			switch (m_parameters.operation)
2613819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			{
2614819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa				case OPERATION_IMAGE_LOAD:
2615819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa				case OPERATION_TEXEL_FETCH:
2616819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa				case OPERATION_TEXTURE:
2617819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa					return new BasicComputeTestInstance(context, m_parameters);
2618819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa				case OPERATION_IMAGE_STORE:
2619819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa					return new ImageStoreComputeTestInstance(context, m_parameters);
2620819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa				default:
2621819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa					TCU_THROW(InternalError, "Impossible");
2622819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			}
2623819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		}
2624819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
2625819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		case SHADER_TYPE_FRAGMENT:
2626819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		{
2627819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			switch (m_parameters.operation)
2628819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			{
2629819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa				case OPERATION_ATTACHMENT_READ:
2630819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa				case OPERATION_ATTACHMENT_WRITE:
2631819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa					return new GraphicsAttachmentsTestInstance(context, m_parameters);
2632819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
2633819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa				case OPERATION_TEXTURE_READ:
2634819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa				case OPERATION_TEXTURE_WRITE:
2635819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa					return new GraphicsTextureTestInstance(context, m_parameters);
2636819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
2637819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa				default:
2638819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa					TCU_THROW(InternalError, "Impossible");
2639819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			}
2640819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		}
2641819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
2642819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		default:
2643819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			TCU_THROW(InternalError, "Impossible");
2644819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	}
2645819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa}
2646819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
2647819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa} // anonymous ns
2648819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
26498d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwastatic tcu::UVec3 getUnniceResolution(const VkFormat format, const deUint32 layers)
26508d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa{
26518d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const deUint32	unniceMipmapTextureSize[]	= { 1, 1, 1, 8, 22, 48, 117, 275, 604, 208, 611, 274, 1211 };
26528d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const deUint32	baseTextureWidth			= unniceMipmapTextureSize[getBlockWidth(format)];
26538d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const deUint32	baseTextureHeight			= unniceMipmapTextureSize[getBlockHeight(format)];
26548d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const deUint32	baseTextureWidthLevels		= deLog2Floor32(baseTextureWidth);
26558d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const deUint32	baseTextureHeightLevels		= deLog2Floor32(baseTextureHeight);
26568d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const deUint32	widthMultiplier				= (baseTextureHeightLevels > baseTextureWidthLevels) ? 1u << (baseTextureHeightLevels - baseTextureWidthLevels) : 1u;
26578d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const deUint32	heightMultiplier			= (baseTextureWidthLevels > baseTextureHeightLevels) ? 1u << (baseTextureWidthLevels - baseTextureHeightLevels) : 1u;
26588d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const deUint32	width						= baseTextureWidth * widthMultiplier;
26598d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const deUint32	height						= baseTextureHeight * heightMultiplier;
26608d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
26618d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	// Number of levels should be same on both axises
26628d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	DE_ASSERT(deLog2Floor32(width) == deLog2Floor32(height));
26638d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
26648d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	return tcu::UVec3(width, height, layers);
26658d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa}
2666819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
2667819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwatcu::TestCaseGroup* createImageCompressionTranscodingTests (tcu::TestContext& testCtx)
2668819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa{
2669819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	struct FormatsArray
2670819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	{
2671819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		const VkFormat*	formats;
2672819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		deUint32		count;
2673819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	};
2674819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
26758d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const bool					mipmapness[]									=
26768d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	{
26778d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		false,
26788d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		true,
26798d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	};
26808d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
2681819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	const std::string			pipelineName[SHADER_TYPE_LAST]					=
2682819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	{
2683819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		"compute",
2684819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		"graphic",
2685819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	};
2686819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
26878d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const std::string			mipmanpnessName[DE_LENGTH_OF_ARRAY(mipmapness)]	=
26888d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	{
26898d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		"basic",
26908d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		"extended",
26918d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	};
26928d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
2693819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	const std::string			operationName[OPERATION_LAST]					=
2694819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	{
2695819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		"image_load",
2696819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		"texel_fetch",
2697819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		"texture",
2698819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		"image_store",
2699819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		"attachment_read",
2700819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		"attachment_write",
2701819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		"texture_read",
2702819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		"texture_write",
2703819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	};
2704819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
2705819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	const VkImageUsageFlags		baseImageUsageFlagSet							= VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
2706819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	const VkImageUsageFlags		compressedImageUsageFlags[OPERATION_LAST]		=
2707819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	{
2708819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		baseImageUsageFlagSet | static_cast<VkImageUsageFlagBits>(VK_IMAGE_USAGE_STORAGE_BIT),											// "image_load"
2709819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		baseImageUsageFlagSet | static_cast<VkImageUsageFlagBits>(VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_STORAGE_BIT),				// "texel_fetch"
2710819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		baseImageUsageFlagSet | static_cast<VkImageUsageFlagBits>(VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_STORAGE_BIT),				// "texture"
2711819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		baseImageUsageFlagSet | static_cast<VkImageUsageFlagBits>(VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_STORAGE_BIT),				// "image_store"
2712819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		baseImageUsageFlagSet | static_cast<VkImageUsageFlagBits>(VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT),	// "attachment_read"
27138d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		baseImageUsageFlagSet | static_cast<VkImageUsageFlagBits>(VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT),	// "attachment_write"
2714819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		baseImageUsageFlagSet | static_cast<VkImageUsageFlagBits>(VK_IMAGE_USAGE_SAMPLED_BIT),											// "texture_read"
2715819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		baseImageUsageFlagSet | static_cast<VkImageUsageFlagBits>(VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_STORAGE_BIT),				// "texture_write"
2716819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	};
2717819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
27188d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const VkImageUsageFlags		compressedImageViewUsageFlags[OPERATION_LAST]	=
27198d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	{
27208d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		compressedImageUsageFlags[0],																									//"image_load"
27218d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		compressedImageUsageFlags[1],																									//"texel_fetch"
27228d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		compressedImageUsageFlags[2],																									//"texture"
27238d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		compressedImageUsageFlags[3],																									//"image_store"
27248d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		compressedImageUsageFlags[4],																									//"attachment_read"
27258d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		compressedImageUsageFlags[5] | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,																//"attachment_write"
27268d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		compressedImageUsageFlags[6],																									//"texture_read"
27278d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		compressedImageUsageFlags[7],																									//"texture_write"
27288d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	};
27298d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
2730819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	const VkImageUsageFlags		uncompressedImageUsageFlags[OPERATION_LAST]		=
2731819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	{
2732819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		baseImageUsageFlagSet | static_cast<VkImageUsageFlagBits>(VK_IMAGE_USAGE_STORAGE_BIT),											//"image_load"
2733819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		baseImageUsageFlagSet | static_cast<VkImageUsageFlagBits>(VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_STORAGE_BIT),				//"texel_fetch"
2734819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		baseImageUsageFlagSet | static_cast<VkImageUsageFlagBits>(VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_STORAGE_BIT),				//"texture"
2735819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		baseImageUsageFlagSet | static_cast<VkImageUsageFlagBits>(VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_STORAGE_BIT),				//"image_store"
2736819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		baseImageUsageFlagSet | static_cast<VkImageUsageFlagBits>(VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT),	//"attachment_read"
2737819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		baseImageUsageFlagSet | static_cast<VkImageUsageFlagBits>(VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT),									//"attachment_write"
2738819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		baseImageUsageFlagSet | static_cast<VkImageUsageFlagBits>(VK_IMAGE_USAGE_STORAGE_BIT | VK_IMAGE_USAGE_SAMPLED_BIT),				//"texture_read"
2739819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		baseImageUsageFlagSet | static_cast<VkImageUsageFlagBits>(VK_IMAGE_USAGE_SAMPLED_BIT),											//"texture_write"
2740819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	};
2741819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
2742819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	const VkFormat				compressedFormats64bit[]						=
2743819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	{
2744819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		VK_FORMAT_BC1_RGB_UNORM_BLOCK,
2745819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		VK_FORMAT_BC1_RGB_SRGB_BLOCK,
2746819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		VK_FORMAT_BC1_RGBA_UNORM_BLOCK,
2747819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		VK_FORMAT_BC1_RGBA_SRGB_BLOCK,
2748819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		VK_FORMAT_BC4_UNORM_BLOCK,
2749819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		VK_FORMAT_BC4_SNORM_BLOCK,
2750819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK,
2751819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK,
2752819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK,
2753819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK,
2754819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		VK_FORMAT_EAC_R11_UNORM_BLOCK,
2755819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		VK_FORMAT_EAC_R11_SNORM_BLOCK,
2756819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	};
2757819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
2758819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	const VkFormat				compressedFormats128bit[]						=
2759819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	{
2760819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		VK_FORMAT_BC2_UNORM_BLOCK,
2761819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		VK_FORMAT_BC2_SRGB_BLOCK,
2762819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		VK_FORMAT_BC3_UNORM_BLOCK,
2763819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		VK_FORMAT_BC3_SRGB_BLOCK,
2764819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		VK_FORMAT_BC5_UNORM_BLOCK,
2765819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		VK_FORMAT_BC5_SNORM_BLOCK,
2766819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		VK_FORMAT_BC6H_UFLOAT_BLOCK,
2767819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		VK_FORMAT_BC6H_SFLOAT_BLOCK,
2768819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		VK_FORMAT_BC7_UNORM_BLOCK,
2769819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		VK_FORMAT_BC7_SRGB_BLOCK,
2770819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK,
2771819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK,
2772819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		VK_FORMAT_EAC_R11G11_UNORM_BLOCK,
2773819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		VK_FORMAT_EAC_R11G11_SNORM_BLOCK,
2774819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		VK_FORMAT_ASTC_4x4_UNORM_BLOCK,
2775819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		VK_FORMAT_ASTC_4x4_SRGB_BLOCK,
2776819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		VK_FORMAT_ASTC_5x4_UNORM_BLOCK,
2777819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		VK_FORMAT_ASTC_5x4_SRGB_BLOCK,
2778819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		VK_FORMAT_ASTC_5x5_UNORM_BLOCK,
2779819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		VK_FORMAT_ASTC_5x5_SRGB_BLOCK,
2780819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		VK_FORMAT_ASTC_6x5_UNORM_BLOCK,
2781819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		VK_FORMAT_ASTC_6x5_SRGB_BLOCK,
2782819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		VK_FORMAT_ASTC_6x6_UNORM_BLOCK,
2783819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		VK_FORMAT_ASTC_6x6_SRGB_BLOCK,
2784819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		VK_FORMAT_ASTC_8x5_UNORM_BLOCK,
2785819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		VK_FORMAT_ASTC_8x5_SRGB_BLOCK,
2786819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		VK_FORMAT_ASTC_8x6_UNORM_BLOCK,
2787819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		VK_FORMAT_ASTC_8x6_SRGB_BLOCK,
2788819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		VK_FORMAT_ASTC_8x8_UNORM_BLOCK,
2789819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		VK_FORMAT_ASTC_8x8_SRGB_BLOCK,
2790819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		VK_FORMAT_ASTC_10x5_UNORM_BLOCK,
2791819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		VK_FORMAT_ASTC_10x5_SRGB_BLOCK,
2792819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		VK_FORMAT_ASTC_10x6_UNORM_BLOCK,
2793819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		VK_FORMAT_ASTC_10x6_SRGB_BLOCK,
2794819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		VK_FORMAT_ASTC_10x8_UNORM_BLOCK,
2795819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		VK_FORMAT_ASTC_10x8_SRGB_BLOCK,
2796819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		VK_FORMAT_ASTC_10x10_UNORM_BLOCK,
2797819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		VK_FORMAT_ASTC_10x10_SRGB_BLOCK,
2798819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		VK_FORMAT_ASTC_12x10_UNORM_BLOCK,
2799819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		VK_FORMAT_ASTC_12x10_SRGB_BLOCK,
2800819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		VK_FORMAT_ASTC_12x12_UNORM_BLOCK,
2801819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		VK_FORMAT_ASTC_12x12_SRGB_BLOCK,
2802819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	};
2803819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
2804819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	const VkFormat				uncompressedFormats64bit[]						=
2805819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	{
2806819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		VK_FORMAT_R16G16B16A16_UNORM,
2807819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		VK_FORMAT_R16G16B16A16_SNORM,
2808819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		VK_FORMAT_R16G16B16A16_USCALED,
2809819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		VK_FORMAT_R16G16B16A16_SSCALED,
2810819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		VK_FORMAT_R16G16B16A16_UINT,
2811819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		VK_FORMAT_R16G16B16A16_SINT,
2812819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		VK_FORMAT_R16G16B16A16_SFLOAT,
2813819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		VK_FORMAT_R32G32_UINT,
2814819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		VK_FORMAT_R32G32_SINT,
2815819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		VK_FORMAT_R32G32_SFLOAT,
2816819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		//VK_FORMAT_R64_UINT, remove from the test it couln'd not be use
2817819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		//VK_FORMAT_R64_SINT, remove from the test it couln'd not be use
2818819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		//VK_FORMAT_R64_SFLOAT, remove from the test it couln'd not be use
2819819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	};
2820819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
2821819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	const VkFormat				uncompressedFormats128bit[]						=
2822819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	{
2823819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		VK_FORMAT_R32G32B32A32_UINT,
2824819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		VK_FORMAT_R32G32B32A32_SINT,
2825819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		VK_FORMAT_R32G32B32A32_SFLOAT,
2826819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		//VK_FORMAT_R64G64_UINT, remove from the test it couln'd not be use
2827819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		//VK_FORMAT_R64G64_SINT, remove from the test it couln'd not be use
2828819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		//VK_FORMAT_R64G64_SFLOAT, remove from the test it couln'd not be use
2829819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	};
2830819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
28318d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const FormatsArray			formatsCompressedSets[]							=
2832819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	{
2833819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		{
2834819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			compressedFormats64bit,
2835819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			DE_LENGTH_OF_ARRAY(compressedFormats64bit)
2836819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		},
2837819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		{
2838819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			compressedFormats128bit,
2839819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			DE_LENGTH_OF_ARRAY(compressedFormats128bit)
2840819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		},
2841819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	};
2842819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
28438d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	const FormatsArray			formatsUncompressedSets[]						=
2844819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	{
2845819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		{
2846819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			uncompressedFormats64bit,
2847819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			DE_LENGTH_OF_ARRAY(uncompressedFormats64bit)
2848819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		},
2849819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		{
2850819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			uncompressedFormats128bit,
2851819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			DE_LENGTH_OF_ARRAY(uncompressedFormats128bit)
2852819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		},
2853819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	};
2854819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
28558d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	DE_ASSERT(DE_LENGTH_OF_ARRAY(formatsCompressedSets) == DE_LENGTH_OF_ARRAY(formatsUncompressedSets));
2856819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
28578d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa	MovePtr<tcu::TestCaseGroup>	texelViewCompatibleTests							(new tcu::TestCaseGroup(testCtx, "texel_view_compatible", "Texel view compatible cases"));
2858819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
2859819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	for (int shaderType = SHADER_TYPE_COMPUTE; shaderType < SHADER_TYPE_LAST; ++shaderType)
2860819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	{
2861819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		MovePtr<tcu::TestCaseGroup>	pipelineTypeGroup	(new tcu::TestCaseGroup(testCtx, pipelineName[shaderType].c_str(), ""));
2862819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
28638d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa		for (int mipmapTestNdx = 0; mipmapTestNdx < DE_LENGTH_OF_ARRAY(mipmapness); mipmapTestNdx++)
2864819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		{
28658d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			const bool mipmapTest = mipmapness[mipmapTestNdx];
2866819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
28678d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			MovePtr<tcu::TestCaseGroup>	mipmapTypeGroup	(new tcu::TestCaseGroup(testCtx, mipmanpnessName[mipmapTestNdx].c_str(), ""));
2868819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
28698d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			for (int operationNdx = OPERATION_IMAGE_LOAD; operationNdx < OPERATION_LAST; ++operationNdx)
2870819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			{
28718d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				if (shaderType != SHADER_TYPE_FRAGMENT && deInRange32(operationNdx, OPERATION_ATTACHMENT_READ, OPERATION_TEXTURE_WRITE))
28728d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa					continue;
28738d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
28748d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				if (shaderType != SHADER_TYPE_COMPUTE && deInRange32(operationNdx, OPERATION_IMAGE_LOAD, OPERATION_IMAGE_STORE))
28758d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa					continue;
28768d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
28778d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				MovePtr<tcu::TestCaseGroup>	imageOperationGroup	(new tcu::TestCaseGroup(testCtx, operationName[operationNdx].c_str(), ""));
2878819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
28798d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				// Iterate through bitness groups (64 bit, 128 bit, etc)
28808d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				for (deUint32 formatBitnessGroup = 0; formatBitnessGroup < DE_LENGTH_OF_ARRAY(formatsCompressedSets); ++formatBitnessGroup)
28818d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				{
28828d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa					for (deUint32 formatCompressedNdx = 0; formatCompressedNdx < formatsCompressedSets[formatBitnessGroup].count; ++formatCompressedNdx)
2883819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa					{
28848d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa						const VkFormat				formatCompressed			= formatsCompressedSets[formatBitnessGroup].formats[formatCompressedNdx];
28858d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa						const std::string			compressedFormatGroupName	= getFormatShortString(formatCompressed);
28868d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa						MovePtr<tcu::TestCaseGroup>	compressedFormatGroup		(new tcu::TestCaseGroup(testCtx, compressedFormatGroupName.c_str(), ""));
28878d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
28888d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa						for (deUint32 formatUncompressedNdx = 0; formatUncompressedNdx < formatsUncompressedSets[formatBitnessGroup].count; ++formatUncompressedNdx)
2889819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa						{
28908d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa							const VkFormat			formatUncompressed			= formatsUncompressedSets[formatBitnessGroup].formats[formatUncompressedNdx];
28918d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa							const std::string		uncompressedFormatGroupName	= getFormatShortString(formatUncompressed);
28928d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa							const TestParameters	parameters					=
28938d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa							{
28948d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa								static_cast<Operation>(operationNdx),
28958d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa								static_cast<ShaderType>(shaderType),
28968d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa								mipmapTest ? getUnniceResolution(formatCompressed, 3u) : UVec3(64u, 64u, 1u),
28978d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa								IMAGE_TYPE_2D,
28988d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa								formatCompressed,
28998d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa								formatUncompressed,
29008d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa								(operationNdx == OPERATION_IMAGE_STORE) ? 3u : 2u,
29018d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa								compressedImageUsageFlags[operationNdx],
29028d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa								compressedImageViewUsageFlags[operationNdx],
29038d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa								uncompressedImageUsageFlags[operationNdx],
29048d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa								mipmapTest,
29058d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa								VK_FORMAT_R8G8B8A8_UNORM
29068d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa							};
29078d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
29088d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa							compressedFormatGroup->addChild(new TexelViewCompatibleCase(testCtx, uncompressedFormatGroupName, "", parameters));
29098d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa						}
29108d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
29118d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa						imageOperationGroup->addChild(compressedFormatGroup.release());
2912819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa					}
2913819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa				}
29148d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa
29158d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa				mipmapTypeGroup->addChild(imageOperationGroup.release());
2916819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa			}
2917819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
29188d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa			pipelineTypeGroup->addChild(mipmapTypeGroup.release());
2919819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		}
2920819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
2921819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa		texelViewCompatibleTests->addChild(pipelineTypeGroup.release());
2922819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	}
2923819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
2924819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa	return texelViewCompatibleTests.release();
2925819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa}
2926819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa
2927819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa} // image
2928819404dffd0a1d570ad426198671b56bdaa0fcd6Arkadiusz Sarwa} // vkt
2929