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