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