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, ©Region); 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, ©Region); 7688d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa vk.cmdPipelineBarrier(cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_HOST_BIT, (VkDependencyFlags)0, 0u, (const VkMemoryBarrier*)DE_NULL, 1, ©Barrier, 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, ©Region); 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, ©Region); 11478d45f54852211075dabe786c6bcdd137f40133bdArkadiusz Sarwa vk.cmdCopyImageToBuffer(cmdBuffer, referenceImage.get(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, referenceBuffer.get(), 1u, ©Region); 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, ©Barrier, 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, ©Barrier, 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, ©BufferToImageRegion); 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, ©Region); 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, ©Region); 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, ©Barrier, 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, ©Barrier, 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