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 { 27112b099d59111b60518c581364fd026b6cfadf7d1Boris Zanin const std::string extensionName("VK_KHR_dedicated_allocation"); 27212b099d59111b60518c581364fd026b6cfadf7d1Boris Zanin 27312b099d59111b60518c581364fd026b6cfadf7d1Boris Zanin if (!de::contains(context.getDeviceExtensions().begin(), context.getDeviceExtensions().end(), extensionName)) 27412b099d59111b60518c581364fd026b6cfadf7d1Boris Zanin TCU_THROW(NotSupportedError, std::string(extensionName + " is not supported").c_str()); 27512b099d59111b60518c581364fd026b6cfadf7d1Boris Zanin } 27612b099d59111b60518c581364fd026b6cfadf7d1Boris Zanin 277235561df842620267f9a58552f1506ae1012133fDominik Witczak // Create texture images, views and samplers 27883a6066224454de177655eb414dd3453c2059536Dae Kim { 27983a6066224454de177655eb414dd3453c2059536Dae Kim VkImageCreateFlags imageFlags = 0u; 28083a6066224454de177655eb414dd3453c2059536Dae Kim 28183a6066224454de177655eb414dd3453c2059536Dae Kim if (m_imageViewType == VK_IMAGE_VIEW_TYPE_CUBE || m_imageViewType == VK_IMAGE_VIEW_TYPE_CUBE_ARRAY) 28283a6066224454de177655eb414dd3453c2059536Dae Kim imageFlags = VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT; 28383a6066224454de177655eb414dd3453c2059536Dae Kim 28483a6066224454de177655eb414dd3453c2059536Dae Kim // Initialize texture data 28583a6066224454de177655eb414dd3453c2059536Dae Kim if (isCompressedFormat(imageFormat)) 286120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim m_texture = createTestTexture(mapVkCompressedFormat(imageFormat), imageViewType, imageSize, layerCount); 28783a6066224454de177655eb414dd3453c2059536Dae Kim else 288120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim m_texture = createTestTexture(mapVkFormat(imageFormat), imageViewType, imageSize, layerCount); 28983a6066224454de177655eb414dd3453c2059536Dae Kim 29083a6066224454de177655eb414dd3453c2059536Dae Kim const VkImageCreateInfo imageParams = 29183a6066224454de177655eb414dd3453c2059536Dae Kim { 292120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, // VkStructureType sType; 293120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim DE_NULL, // const void* pNext; 294120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim imageFlags, // VkImageCreateFlags flags; 295120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim getCompatibleImageType(m_imageViewType), // VkImageType imageType; 296120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim imageFormat, // VkFormat format; 297120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim { // VkExtent3D extent; 298689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (deUint32)m_imageSize.x(), 299689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (deUint32)m_imageSize.y(), 300689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (deUint32)m_imageSize.z() 30183a6066224454de177655eb414dd3453c2059536Dae Kim }, 302120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim (deUint32)m_texture->getNumLevels(), // deUint32 mipLevels; 303120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim (deUint32)m_layerCount, // deUint32 arrayLayers; 304120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits samples; 305120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_IMAGE_TILING_OPTIMAL, // VkImageTiling tiling; 306120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT, // VkImageUsageFlags usage; 307120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode; 308120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 1u, // deUint32 queueFamilyIndexCount; 309120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim &queueFamilyIndex, // const deUint32* pQueueFamilyIndices; 310120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_IMAGE_LAYOUT_UNDEFINED // VkImageLayout initialLayout; 31183a6066224454de177655eb414dd3453c2059536Dae Kim }; 31283a6066224454de177655eb414dd3453c2059536Dae Kim 313235561df842620267f9a58552f1506ae1012133fDominik Witczak m_images.resize(m_imageCount); 314235561df842620267f9a58552f1506ae1012133fDominik Witczak m_imageAllocs.resize(m_imageCount); 315235561df842620267f9a58552f1506ae1012133fDominik Witczak m_imageViews.resize(m_imageCount); 31683a6066224454de177655eb414dd3453c2059536Dae Kim 317235561df842620267f9a58552f1506ae1012133fDominik Witczak for (int imgNdx = 0; imgNdx < m_imageCount; ++imgNdx) 31883a6066224454de177655eb414dd3453c2059536Dae Kim { 319235561df842620267f9a58552f1506ae1012133fDominik Witczak m_images[imgNdx] = SharedImagePtr(new UniqueImage(createImage(vk, vkDevice, &imageParams))); 32012b099d59111b60518c581364fd026b6cfadf7d1Boris Zanin m_imageAllocs[imgNdx] = SharedAllocPtr(new UniqueAlloc(allocateImage(vki, vk, physDevice, vkDevice, **m_images[imgNdx], MemoryRequirement::Any, memAlloc, m_allocationKind))); 321235561df842620267f9a58552f1506ae1012133fDominik Witczak VK_CHECK(vk.bindImageMemory(vkDevice, **m_images[imgNdx], (*m_imageAllocs[imgNdx])->getMemory(), (*m_imageAllocs[imgNdx])->getOffset())); 322235561df842620267f9a58552f1506ae1012133fDominik Witczak 323235561df842620267f9a58552f1506ae1012133fDominik Witczak // Upload texture data 324235561df842620267f9a58552f1506ae1012133fDominik Witczak uploadTestTexture(vk, vkDevice, queue, queueFamilyIndex, memAlloc, *m_texture, **m_images[imgNdx]); 325235561df842620267f9a58552f1506ae1012133fDominik Witczak 326235561df842620267f9a58552f1506ae1012133fDominik Witczak // Create image view and sampler 327235561df842620267f9a58552f1506ae1012133fDominik Witczak const VkImageViewCreateInfo imageViewParams = 328235561df842620267f9a58552f1506ae1012133fDominik Witczak { 329235561df842620267f9a58552f1506ae1012133fDominik Witczak VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, // VkStructureType sType; 330235561df842620267f9a58552f1506ae1012133fDominik Witczak DE_NULL, // const void* pNext; 331235561df842620267f9a58552f1506ae1012133fDominik Witczak 0u, // VkImageViewCreateFlags flags; 332235561df842620267f9a58552f1506ae1012133fDominik Witczak **m_images[imgNdx], // VkImage image; 333235561df842620267f9a58552f1506ae1012133fDominik Witczak m_imageViewType, // VkImageViewType viewType; 334235561df842620267f9a58552f1506ae1012133fDominik Witczak imageFormat, // VkFormat format; 335235561df842620267f9a58552f1506ae1012133fDominik Witczak m_componentMapping, // VkComponentMapping components; 336235561df842620267f9a58552f1506ae1012133fDominik Witczak m_subresourceRange, // VkImageSubresourceRange subresourceRange; 337235561df842620267f9a58552f1506ae1012133fDominik Witczak }; 338235561df842620267f9a58552f1506ae1012133fDominik Witczak 339235561df842620267f9a58552f1506ae1012133fDominik Witczak m_imageViews[imgNdx] = SharedImageViewPtr(new UniqueImageView(createImageView(vk, vkDevice, &imageViewParams))); 340235561df842620267f9a58552f1506ae1012133fDominik Witczak } 34183a6066224454de177655eb414dd3453c2059536Dae Kim 34283a6066224454de177655eb414dd3453c2059536Dae Kim m_sampler = createSampler(vk, vkDevice, &m_samplerParams); 34383a6066224454de177655eb414dd3453c2059536Dae Kim } 34483a6066224454de177655eb414dd3453c2059536Dae Kim 345235561df842620267f9a58552f1506ae1012133fDominik Witczak // Create descriptor set for image and sampler 34683a6066224454de177655eb414dd3453c2059536Dae Kim { 34783a6066224454de177655eb414dd3453c2059536Dae Kim DescriptorPoolBuilder descriptorPoolBuilder; 348235561df842620267f9a58552f1506ae1012133fDominik Witczak if (m_samplingType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE) 349235561df842620267f9a58552f1506ae1012133fDominik Witczak descriptorPoolBuilder.addType(VK_DESCRIPTOR_TYPE_SAMPLER, 1u); 350235561df842620267f9a58552f1506ae1012133fDominik Witczak descriptorPoolBuilder.addType(m_samplingType, m_imageCount); 351235561df842620267f9a58552f1506ae1012133fDominik Witczak m_descriptorPool = descriptorPoolBuilder.build(vk, vkDevice, VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 352235561df842620267f9a58552f1506ae1012133fDominik Witczak m_samplingType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE ? m_imageCount + 1u : m_imageCount); 35383a6066224454de177655eb414dd3453c2059536Dae Kim 35483a6066224454de177655eb414dd3453c2059536Dae Kim DescriptorSetLayoutBuilder setLayoutBuilder; 355235561df842620267f9a58552f1506ae1012133fDominik Witczak if (m_samplingType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE) 356235561df842620267f9a58552f1506ae1012133fDominik Witczak setLayoutBuilder.addSingleBinding(VK_DESCRIPTOR_TYPE_SAMPLER, VK_SHADER_STAGE_FRAGMENT_BIT); 357235561df842620267f9a58552f1506ae1012133fDominik Witczak setLayoutBuilder.addArrayBinding(m_samplingType, m_imageCount, VK_SHADER_STAGE_FRAGMENT_BIT); 35883a6066224454de177655eb414dd3453c2059536Dae Kim m_descriptorSetLayout = setLayoutBuilder.build(vk, vkDevice); 35983a6066224454de177655eb414dd3453c2059536Dae Kim 360120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim const VkDescriptorSetAllocateInfo descriptorSetAllocateInfo = 361120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim { 362120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO, // VkStructureType sType; 363120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim DE_NULL, // const void* pNext; 364120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim *m_descriptorPool, // VkDescriptorPool descriptorPool; 365120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 1u, // deUint32 setLayoutCount; 366120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim &m_descriptorSetLayout.get() // const VkDescriptorSetLayout* pSetLayouts; 367120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim }; 368120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 369120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim m_descriptorSet = allocateDescriptorSet(vk, vkDevice, &descriptorSetAllocateInfo); 37083a6066224454de177655eb414dd3453c2059536Dae Kim 371235561df842620267f9a58552f1506ae1012133fDominik Witczak const VkSampler sampler = m_samplingType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE ? DE_NULL : *m_sampler; 372235561df842620267f9a58552f1506ae1012133fDominik Witczak std::vector<VkDescriptorImageInfo> descriptorImageInfo(m_imageCount); 373235561df842620267f9a58552f1506ae1012133fDominik Witczak for (int imgNdx = 0; imgNdx < m_imageCount; ++imgNdx) 37483a6066224454de177655eb414dd3453c2059536Dae Kim { 375235561df842620267f9a58552f1506ae1012133fDominik Witczak descriptorImageInfo[imgNdx].sampler = sampler; // VkSampler sampler; 376235561df842620267f9a58552f1506ae1012133fDominik Witczak descriptorImageInfo[imgNdx].imageView = **m_imageViews[imgNdx]; // VkImageView imageView; 377235561df842620267f9a58552f1506ae1012133fDominik Witczak descriptorImageInfo[imgNdx].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; // VkImageLayout imageLayout; 378235561df842620267f9a58552f1506ae1012133fDominik Witczak } 37983a6066224454de177655eb414dd3453c2059536Dae Kim 38083a6066224454de177655eb414dd3453c2059536Dae Kim DescriptorSetUpdateBuilder setUpdateBuilder; 381235561df842620267f9a58552f1506ae1012133fDominik Witczak if (m_samplingType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE) 382235561df842620267f9a58552f1506ae1012133fDominik Witczak { 383235561df842620267f9a58552f1506ae1012133fDominik Witczak const VkDescriptorImageInfo descriptorSamplerInfo = 384235561df842620267f9a58552f1506ae1012133fDominik Witczak { 385235561df842620267f9a58552f1506ae1012133fDominik Witczak *m_sampler, // VkSampler sampler; 386235561df842620267f9a58552f1506ae1012133fDominik Witczak DE_NULL, // VkImageView imageView; 387235561df842620267f9a58552f1506ae1012133fDominik Witczak VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL // VkImageLayout imageLayout; 388235561df842620267f9a58552f1506ae1012133fDominik Witczak }; 389235561df842620267f9a58552f1506ae1012133fDominik Witczak setUpdateBuilder.writeSingle(*m_descriptorSet, DescriptorSetUpdateBuilder::Location::binding(0), VK_DESCRIPTOR_TYPE_SAMPLER, &descriptorSamplerInfo); 390235561df842620267f9a58552f1506ae1012133fDominik Witczak } 391235561df842620267f9a58552f1506ae1012133fDominik Witczak 392235561df842620267f9a58552f1506ae1012133fDominik Witczak const deUint32 binding = m_samplingType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE ? 1u : 0u; 393235561df842620267f9a58552f1506ae1012133fDominik Witczak setUpdateBuilder.writeArray(*m_descriptorSet, DescriptorSetUpdateBuilder::Location::binding(binding), m_samplingType, m_imageCount, descriptorImageInfo.data()); 39483a6066224454de177655eb414dd3453c2059536Dae Kim setUpdateBuilder.update(vk, vkDevice); 39583a6066224454de177655eb414dd3453c2059536Dae Kim } 39683a6066224454de177655eb414dd3453c2059536Dae Kim 397235561df842620267f9a58552f1506ae1012133fDominik Witczak // Create color images and views 39883a6066224454de177655eb414dd3453c2059536Dae Kim { 39983a6066224454de177655eb414dd3453c2059536Dae Kim const VkImageCreateInfo colorImageParams = 40083a6066224454de177655eb414dd3453c2059536Dae Kim { 401120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, // VkStructureType sType; 402120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim DE_NULL, // const void* pNext; 403120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // VkImageCreateFlags flags; 404120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_IMAGE_TYPE_2D, // VkImageType imageType; 405120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim m_colorFormat, // VkFormat format; 406689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos { (deUint32)m_renderSize.x(), (deUint32)m_renderSize.y(), 1u }, // VkExtent3D extent; 407120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 1u, // deUint32 mipLevels; 408120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 1u, // deUint32 arrayLayers; 409120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits samples; 410120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_IMAGE_TILING_OPTIMAL, // VkImageTiling tiling; 411120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT, // VkImageUsageFlags usage; 412120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode; 413120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 1u, // deUint32 queueFamilyIndexCount; 414120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim &queueFamilyIndex, // const deUint32* pQueueFamilyIndices; 415120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_IMAGE_LAYOUT_UNDEFINED // VkImageLayout initialLayout; 41683a6066224454de177655eb414dd3453c2059536Dae Kim }; 41783a6066224454de177655eb414dd3453c2059536Dae Kim 418235561df842620267f9a58552f1506ae1012133fDominik Witczak m_colorImages.resize(m_imageCount); 419235561df842620267f9a58552f1506ae1012133fDominik Witczak m_colorImageAllocs.resize(m_imageCount); 420235561df842620267f9a58552f1506ae1012133fDominik Witczak m_colorAttachmentViews.resize(m_imageCount); 42183a6066224454de177655eb414dd3453c2059536Dae Kim 422235561df842620267f9a58552f1506ae1012133fDominik Witczak for (int imgNdx = 0; imgNdx < m_imageCount; ++imgNdx) 42383a6066224454de177655eb414dd3453c2059536Dae Kim { 424235561df842620267f9a58552f1506ae1012133fDominik Witczak m_colorImages[imgNdx] = SharedImagePtr(new UniqueImage(createImage(vk, vkDevice, &colorImageParams))); 42512b099d59111b60518c581364fd026b6cfadf7d1Boris Zanin m_colorImageAllocs[imgNdx] = SharedAllocPtr(new UniqueAlloc(allocateImage(vki, vk, physDevice, vkDevice, **m_colorImages[imgNdx], MemoryRequirement::Any, memAlloc, m_allocationKind))); 426235561df842620267f9a58552f1506ae1012133fDominik Witczak VK_CHECK(vk.bindImageMemory(vkDevice, **m_colorImages[imgNdx], (*m_colorImageAllocs[imgNdx])->getMemory(), (*m_colorImageAllocs[imgNdx])->getOffset())); 42783a6066224454de177655eb414dd3453c2059536Dae Kim 428235561df842620267f9a58552f1506ae1012133fDominik Witczak const VkImageViewCreateInfo colorAttachmentViewParams = 429235561df842620267f9a58552f1506ae1012133fDominik Witczak { 430235561df842620267f9a58552f1506ae1012133fDominik Witczak VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, // VkStructureType sType; 431235561df842620267f9a58552f1506ae1012133fDominik Witczak DE_NULL, // const void* pNext; 432235561df842620267f9a58552f1506ae1012133fDominik Witczak 0u, // VkImageViewCreateFlags flags; 433235561df842620267f9a58552f1506ae1012133fDominik Witczak **m_colorImages[imgNdx], // VkImage image; 434235561df842620267f9a58552f1506ae1012133fDominik Witczak VK_IMAGE_VIEW_TYPE_2D, // VkImageViewType viewType; 435235561df842620267f9a58552f1506ae1012133fDominik Witczak m_colorFormat, // VkFormat format; 436235561df842620267f9a58552f1506ae1012133fDominik Witczak componentMappingRGBA, // VkComponentMapping components; 437235561df842620267f9a58552f1506ae1012133fDominik Witczak { VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u } // VkImageSubresourceRange subresourceRange; 438235561df842620267f9a58552f1506ae1012133fDominik Witczak }; 439235561df842620267f9a58552f1506ae1012133fDominik Witczak 440235561df842620267f9a58552f1506ae1012133fDominik Witczak m_colorAttachmentViews[imgNdx] = SharedImageViewPtr(new UniqueImageView(createImageView(vk, vkDevice, &colorAttachmentViewParams))); 441235561df842620267f9a58552f1506ae1012133fDominik Witczak } 44283a6066224454de177655eb414dd3453c2059536Dae Kim } 44383a6066224454de177655eb414dd3453c2059536Dae Kim 44483a6066224454de177655eb414dd3453c2059536Dae Kim // Create render pass 44583a6066224454de177655eb414dd3453c2059536Dae Kim { 446235561df842620267f9a58552f1506ae1012133fDominik Witczak std::vector<VkAttachmentDescription> colorAttachmentDescriptions(m_imageCount); 447235561df842620267f9a58552f1506ae1012133fDominik Witczak std::vector<VkAttachmentReference> colorAttachmentReferences(m_imageCount); 44883a6066224454de177655eb414dd3453c2059536Dae Kim 449235561df842620267f9a58552f1506ae1012133fDominik Witczak for (int imgNdx = 0; imgNdx < m_imageCount; ++imgNdx) 45083a6066224454de177655eb414dd3453c2059536Dae Kim { 451235561df842620267f9a58552f1506ae1012133fDominik Witczak colorAttachmentDescriptions[imgNdx].flags = 0u; // VkAttachmentDescriptionFlags flags; 452235561df842620267f9a58552f1506ae1012133fDominik Witczak colorAttachmentDescriptions[imgNdx].format = m_colorFormat; // VkFormat format; 453235561df842620267f9a58552f1506ae1012133fDominik Witczak colorAttachmentDescriptions[imgNdx].samples = VK_SAMPLE_COUNT_1_BIT; // VkSampleCountFlagBits samples; 454235561df842620267f9a58552f1506ae1012133fDominik Witczak colorAttachmentDescriptions[imgNdx].loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR; // VkAttachmentLoadOp loadOp; 455235561df842620267f9a58552f1506ae1012133fDominik Witczak colorAttachmentDescriptions[imgNdx].storeOp = VK_ATTACHMENT_STORE_OP_STORE; // VkAttachmentStoreOp storeOp; 456235561df842620267f9a58552f1506ae1012133fDominik Witczak colorAttachmentDescriptions[imgNdx].stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; // VkAttachmentLoadOp stencilLoadOp; 457235561df842620267f9a58552f1506ae1012133fDominik Witczak colorAttachmentDescriptions[imgNdx].stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE; // VkAttachmentStoreOp stencilStoreOp; 458235561df842620267f9a58552f1506ae1012133fDominik Witczak colorAttachmentDescriptions[imgNdx].initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; // VkImageLayout initialLayout; 459235561df842620267f9a58552f1506ae1012133fDominik Witczak colorAttachmentDescriptions[imgNdx].finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; // VkImageLayout finalLayout; 460235561df842620267f9a58552f1506ae1012133fDominik Witczak 461235561df842620267f9a58552f1506ae1012133fDominik Witczak colorAttachmentReferences[imgNdx].attachment = (deUint32)imgNdx; // deUint32 attachment; 462235561df842620267f9a58552f1506ae1012133fDominik Witczak colorAttachmentReferences[imgNdx].layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; // VkImageLayout layout; 463235561df842620267f9a58552f1506ae1012133fDominik Witczak } 46483a6066224454de177655eb414dd3453c2059536Dae Kim 46583a6066224454de177655eb414dd3453c2059536Dae Kim const VkSubpassDescription subpassDescription = 46683a6066224454de177655eb414dd3453c2059536Dae Kim { 46783a6066224454de177655eb414dd3453c2059536Dae Kim 0u, // VkSubpassDescriptionFlags flags; 468120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_PIPELINE_BIND_POINT_GRAPHICS, // VkPipelineBindPoint pipelineBindPoint; 469120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // deUint32 inputAttachmentCount; 47083a6066224454de177655eb414dd3453c2059536Dae Kim DE_NULL, // const VkAttachmentReference* pInputAttachments; 471235561df842620267f9a58552f1506ae1012133fDominik Witczak (deUint32)m_imageCount, // deUint32 colorAttachmentCount; 472235561df842620267f9a58552f1506ae1012133fDominik Witczak &colorAttachmentReferences[0], // const VkAttachmentReference* pColorAttachments; 47383a6066224454de177655eb414dd3453c2059536Dae Kim DE_NULL, // const VkAttachmentReference* pResolveAttachments; 474120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim DE_NULL, // const VkAttachmentReference* pDepthStencilAttachment; 475120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // deUint32 preserveAttachmentCount; 47683a6066224454de177655eb414dd3453c2059536Dae Kim DE_NULL // const VkAttachmentReference* pPreserveAttachments; 47783a6066224454de177655eb414dd3453c2059536Dae Kim }; 47883a6066224454de177655eb414dd3453c2059536Dae Kim 47983a6066224454de177655eb414dd3453c2059536Dae Kim const VkRenderPassCreateInfo renderPassParams = 48083a6066224454de177655eb414dd3453c2059536Dae Kim { 48183a6066224454de177655eb414dd3453c2059536Dae Kim VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, // VkStructureType sType; 48283a6066224454de177655eb414dd3453c2059536Dae Kim DE_NULL, // const void* pNext; 483120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // VkRenderPassCreateFlags flags; 484235561df842620267f9a58552f1506ae1012133fDominik Witczak (deUint32)m_imageCount, // deUint32 attachmentCount; 485235561df842620267f9a58552f1506ae1012133fDominik Witczak &colorAttachmentDescriptions[0], // const VkAttachmentDescription* pAttachments; 48683a6066224454de177655eb414dd3453c2059536Dae Kim 1u, // deUint32 subpassCount; 48783a6066224454de177655eb414dd3453c2059536Dae Kim &subpassDescription, // const VkSubpassDescription* pSubpasses; 48883a6066224454de177655eb414dd3453c2059536Dae Kim 0u, // deUint32 dependencyCount; 48983a6066224454de177655eb414dd3453c2059536Dae Kim DE_NULL // const VkSubpassDependency* pDependencies; 49083a6066224454de177655eb414dd3453c2059536Dae Kim }; 49183a6066224454de177655eb414dd3453c2059536Dae Kim 49283a6066224454de177655eb414dd3453c2059536Dae Kim m_renderPass = createRenderPass(vk, vkDevice, &renderPassParams); 49383a6066224454de177655eb414dd3453c2059536Dae Kim } 49483a6066224454de177655eb414dd3453c2059536Dae Kim 49583a6066224454de177655eb414dd3453c2059536Dae Kim // Create framebuffer 49683a6066224454de177655eb414dd3453c2059536Dae Kim { 497235561df842620267f9a58552f1506ae1012133fDominik Witczak std::vector<VkImageView> pAttachments(m_imageCount); 498235561df842620267f9a58552f1506ae1012133fDominik Witczak for (int imgNdx = 0; imgNdx < m_imageCount; ++imgNdx) 499235561df842620267f9a58552f1506ae1012133fDominik Witczak pAttachments[imgNdx] = m_colorAttachmentViews[imgNdx]->get(); 500235561df842620267f9a58552f1506ae1012133fDominik Witczak 50183a6066224454de177655eb414dd3453c2059536Dae Kim const VkFramebufferCreateInfo framebufferParams = 50283a6066224454de177655eb414dd3453c2059536Dae Kim { 503120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, // VkStructureType sType; 504120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim DE_NULL, // const void* pNext; 505120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // VkFramebufferCreateFlags flags; 506120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim *m_renderPass, // VkRenderPass renderPass; 507235561df842620267f9a58552f1506ae1012133fDominik Witczak (deUint32)m_imageCount, // deUint32 attachmentCount; 508235561df842620267f9a58552f1506ae1012133fDominik Witczak &pAttachments[0], // const VkImageView* pAttachments; 509120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim (deUint32)m_renderSize.x(), // deUint32 width; 510120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim (deUint32)m_renderSize.y(), // deUint32 height; 511120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 1u // deUint32 layers; 51283a6066224454de177655eb414dd3453c2059536Dae Kim }; 51383a6066224454de177655eb414dd3453c2059536Dae Kim 51483a6066224454de177655eb414dd3453c2059536Dae Kim m_framebuffer = createFramebuffer(vk, vkDevice, &framebufferParams); 51583a6066224454de177655eb414dd3453c2059536Dae Kim } 51683a6066224454de177655eb414dd3453c2059536Dae Kim 51783a6066224454de177655eb414dd3453c2059536Dae Kim // Create pipeline layout 51883a6066224454de177655eb414dd3453c2059536Dae Kim { 51983a6066224454de177655eb414dd3453c2059536Dae Kim const VkPipelineLayoutCreateInfo pipelineLayoutParams = 52083a6066224454de177655eb414dd3453c2059536Dae Kim { 52183a6066224454de177655eb414dd3453c2059536Dae Kim VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, // VkStructureType sType; 52283a6066224454de177655eb414dd3453c2059536Dae Kim DE_NULL, // const void* pNext; 523120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // VkPipelineLayoutCreateFlags flags; 524120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 1u, // deUint32 setLayoutCount; 52583a6066224454de177655eb414dd3453c2059536Dae Kim &m_descriptorSetLayout.get(), // const VkDescriptorSetLayout* pSetLayouts; 52683a6066224454de177655eb414dd3453c2059536Dae Kim 0u, // deUint32 pushConstantRangeCount; 52783a6066224454de177655eb414dd3453c2059536Dae Kim DE_NULL // const VkPushConstantRange* pPushConstantRanges; 52883a6066224454de177655eb414dd3453c2059536Dae Kim }; 52983a6066224454de177655eb414dd3453c2059536Dae Kim 53083a6066224454de177655eb414dd3453c2059536Dae Kim m_pipelineLayout = createPipelineLayout(vk, vkDevice, &pipelineLayoutParams); 53183a6066224454de177655eb414dd3453c2059536Dae Kim } 53283a6066224454de177655eb414dd3453c2059536Dae Kim 533120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim m_vertexShaderModule = createShaderModule(vk, vkDevice, m_context.getBinaryCollection().get("tex_vert"), 0); 534120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim m_fragmentShaderModule = createShaderModule(vk, vkDevice, m_context.getBinaryCollection().get("tex_frag"), 0); 53583a6066224454de177655eb414dd3453c2059536Dae Kim 53683a6066224454de177655eb414dd3453c2059536Dae Kim // Create pipeline 53783a6066224454de177655eb414dd3453c2059536Dae Kim { 538120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim const VkPipelineShaderStageCreateInfo shaderStages[2] = 53983a6066224454de177655eb414dd3453c2059536Dae Kim { 54083a6066224454de177655eb414dd3453c2059536Dae Kim { 541120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, // VkStructureType sType; 542120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim DE_NULL, // const void* pNext; 543120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // VkPipelineShaderStageCreateFlags flags; 544120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_SHADER_STAGE_VERTEX_BIT, // VkShaderStageFlagBits stage; 545120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim *m_vertexShaderModule, // VkShaderModule module; 546120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim "main", // const char* pName; 547120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim DE_NULL // const VkSpecializationInfo* pSpecializationInfo; 54883a6066224454de177655eb414dd3453c2059536Dae Kim }, 54983a6066224454de177655eb414dd3453c2059536Dae Kim { 550120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, // VkStructureType sType; 551120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim DE_NULL, // const void* pNext; 552120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // VkPipelineShaderStageCreateFlags flags; 553120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_SHADER_STAGE_FRAGMENT_BIT, // VkShaderStageFlagBits stage; 554120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim *m_fragmentShaderModule, // VkShaderModule module; 555120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim "main", // const char* pName; 556120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim DE_NULL // const VkSpecializationInfo* pSpecializationInfo; 55783a6066224454de177655eb414dd3453c2059536Dae Kim } 55883a6066224454de177655eb414dd3453c2059536Dae Kim }; 55983a6066224454de177655eb414dd3453c2059536Dae Kim 56083a6066224454de177655eb414dd3453c2059536Dae Kim const VkVertexInputBindingDescription vertexInputBindingDescription = 56183a6066224454de177655eb414dd3453c2059536Dae Kim { 562120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // deUint32 binding; 563120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim sizeof(Vertex4Tex4), // deUint32 strideInBytes; 564120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_VERTEX_INPUT_RATE_VERTEX // VkVertexInputStepRate inputRate; 56583a6066224454de177655eb414dd3453c2059536Dae Kim }; 56683a6066224454de177655eb414dd3453c2059536Dae Kim 56783a6066224454de177655eb414dd3453c2059536Dae Kim const VkVertexInputAttributeDescription vertexInputAttributeDescriptions[2] = 56883a6066224454de177655eb414dd3453c2059536Dae Kim { 56983a6066224454de177655eb414dd3453c2059536Dae Kim { 57083a6066224454de177655eb414dd3453c2059536Dae Kim 0u, // deUint32 location; 57183a6066224454de177655eb414dd3453c2059536Dae Kim 0u, // deUint32 binding; 57283a6066224454de177655eb414dd3453c2059536Dae Kim VK_FORMAT_R32G32B32A32_SFLOAT, // VkFormat format; 573120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u // deUint32 offset; 57483a6066224454de177655eb414dd3453c2059536Dae Kim }, 57583a6066224454de177655eb414dd3453c2059536Dae Kim { 57683a6066224454de177655eb414dd3453c2059536Dae Kim 1u, // deUint32 location; 57783a6066224454de177655eb414dd3453c2059536Dae Kim 0u, // deUint32 binding; 57883a6066224454de177655eb414dd3453c2059536Dae Kim VK_FORMAT_R32G32B32A32_SFLOAT, // VkFormat format; 579120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim DE_OFFSET_OF(Vertex4Tex4, texCoord), // deUint32 offset; 58083a6066224454de177655eb414dd3453c2059536Dae Kim } 58183a6066224454de177655eb414dd3453c2059536Dae Kim }; 58283a6066224454de177655eb414dd3453c2059536Dae Kim 58383a6066224454de177655eb414dd3453c2059536Dae Kim const VkPipelineVertexInputStateCreateInfo vertexInputStateParams = 58483a6066224454de177655eb414dd3453c2059536Dae Kim { 58583a6066224454de177655eb414dd3453c2059536Dae Kim VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO, // VkStructureType sType; 58683a6066224454de177655eb414dd3453c2059536Dae Kim DE_NULL, // const void* pNext; 587120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // VkPipelineVertexInputStateCreateFlags flags; 588120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 1u, // deUint32 vertexBindingDescriptionCount; 58983a6066224454de177655eb414dd3453c2059536Dae Kim &vertexInputBindingDescription, // const VkVertexInputBindingDescription* pVertexBindingDescriptions; 590120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 2u, // deUint32 vertexAttributeDescriptionCount; 59183a6066224454de177655eb414dd3453c2059536Dae Kim vertexInputAttributeDescriptions // const VkVertexInputAttributeDescription* pVertexAttributeDescriptions; 59283a6066224454de177655eb414dd3453c2059536Dae Kim }; 59383a6066224454de177655eb414dd3453c2059536Dae Kim 59483a6066224454de177655eb414dd3453c2059536Dae Kim const VkPipelineInputAssemblyStateCreateInfo inputAssemblyStateParams = 59583a6066224454de177655eb414dd3453c2059536Dae Kim { 596120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, // VkStructureType sType; 597120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim DE_NULL, // const void* pNext; 598120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // VkPipelineInputAssemblyStateCreateFlags flags; 599120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, // VkPrimitiveTopology topology; 600120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim false // VkBool32 primitiveRestartEnable; 60183a6066224454de177655eb414dd3453c2059536Dae Kim }; 60283a6066224454de177655eb414dd3453c2059536Dae Kim 60383a6066224454de177655eb414dd3453c2059536Dae Kim const VkViewport viewport = 60483a6066224454de177655eb414dd3453c2059536Dae Kim { 605120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0.0f, // float x; 606120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0.0f, // float y; 60783a6066224454de177655eb414dd3453c2059536Dae Kim (float)m_renderSize.x(), // float width; 60883a6066224454de177655eb414dd3453c2059536Dae Kim (float)m_renderSize.y(), // float height; 60983a6066224454de177655eb414dd3453c2059536Dae Kim 0.0f, // float minDepth; 61083a6066224454de177655eb414dd3453c2059536Dae Kim 1.0f // float maxDepth; 61183a6066224454de177655eb414dd3453c2059536Dae Kim }; 61283a6066224454de177655eb414dd3453c2059536Dae Kim 613689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos const VkRect2D scissor = { { 0, 0 }, { (deUint32)m_renderSize.x(), (deUint32)m_renderSize.y() } }; 61483a6066224454de177655eb414dd3453c2059536Dae Kim 61583a6066224454de177655eb414dd3453c2059536Dae Kim const VkPipelineViewportStateCreateInfo viewportStateParams = 61683a6066224454de177655eb414dd3453c2059536Dae Kim { 617120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO, // VkStructureType sType; 618120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim DE_NULL, // const void* pNext; 619120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // VkPipelineViewportStateCreateFlags flags; 620120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 1u, // deUint32 viewportCount; 621120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim &viewport, // const VkViewport* pViewports; 622120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 1u, // deUint32 scissorCount; 623120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim &scissor // const VkRect2D* pScissors; 62483a6066224454de177655eb414dd3453c2059536Dae Kim }; 62583a6066224454de177655eb414dd3453c2059536Dae Kim 626120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim const VkPipelineRasterizationStateCreateInfo rasterStateParams = 62783a6066224454de177655eb414dd3453c2059536Dae Kim { 628120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO, // VkStructureType sType; 629120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim DE_NULL, // const void* pNext; 630120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // VkPipelineRasterizationStateCreateFlags flags; 631120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim false, // VkBool32 depthClampEnable; 632120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim false, // VkBool32 rasterizerDiscardEnable; 633120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_POLYGON_MODE_FILL, // VkPolygonMode polygonMode; 634120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_CULL_MODE_NONE, // VkCullModeFlags cullMode; 635120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_FRONT_FACE_COUNTER_CLOCKWISE, // VkFrontFace frontFace; 636120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim false, // VkBool32 depthBiasEnable; 637120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0.0f, // float depthBiasConstantFactor; 638120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0.0f, // float depthBiasClamp; 639120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0.0f, // float depthBiasSlopeFactor; 640120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 1.0f // float lineWidth; 64183a6066224454de177655eb414dd3453c2059536Dae Kim }; 64283a6066224454de177655eb414dd3453c2059536Dae Kim 643235561df842620267f9a58552f1506ae1012133fDominik Witczak std::vector<VkPipelineColorBlendAttachmentState> colorBlendAttachmentStates(m_imageCount); 644235561df842620267f9a58552f1506ae1012133fDominik Witczak 645235561df842620267f9a58552f1506ae1012133fDominik Witczak for (int imgNdx = 0; imgNdx < m_imageCount; ++imgNdx) 64683a6066224454de177655eb414dd3453c2059536Dae Kim { 647235561df842620267f9a58552f1506ae1012133fDominik Witczak colorBlendAttachmentStates[imgNdx].blendEnable = false; // VkBool32 blendEnable; 648235561df842620267f9a58552f1506ae1012133fDominik Witczak colorBlendAttachmentStates[imgNdx].srcColorBlendFactor = VK_BLEND_FACTOR_ONE; // VkBlendFactor srcColorBlendFactor; 649235561df842620267f9a58552f1506ae1012133fDominik Witczak colorBlendAttachmentStates[imgNdx].dstColorBlendFactor = VK_BLEND_FACTOR_ZERO; // VkBlendFactor dstColorBlendFactor; 650235561df842620267f9a58552f1506ae1012133fDominik Witczak colorBlendAttachmentStates[imgNdx].colorBlendOp = VK_BLEND_OP_ADD; // VkBlendOp colorBlendOp; 651235561df842620267f9a58552f1506ae1012133fDominik Witczak colorBlendAttachmentStates[imgNdx].srcAlphaBlendFactor = VK_BLEND_FACTOR_ONE; // VkBlendFactor srcAlphaBlendFactor; 652235561df842620267f9a58552f1506ae1012133fDominik Witczak colorBlendAttachmentStates[imgNdx].dstAlphaBlendFactor = VK_BLEND_FACTOR_ZERO; // VkBlendFactor dstAlphaBlendFactor; 653235561df842620267f9a58552f1506ae1012133fDominik Witczak colorBlendAttachmentStates[imgNdx].alphaBlendOp = VK_BLEND_OP_ADD; // VkBlendOp alphaBlendOp; 654235561df842620267f9a58552f1506ae1012133fDominik Witczak colorBlendAttachmentStates[imgNdx].colorWriteMask = VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | // VkColorComponentFlags colorWriteMask; 655235561df842620267f9a58552f1506ae1012133fDominik Witczak VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT; 656235561df842620267f9a58552f1506ae1012133fDominik Witczak } 65783a6066224454de177655eb414dd3453c2059536Dae Kim 65883a6066224454de177655eb414dd3453c2059536Dae Kim const VkPipelineColorBlendStateCreateInfo colorBlendStateParams = 65983a6066224454de177655eb414dd3453c2059536Dae Kim { 66083a6066224454de177655eb414dd3453c2059536Dae Kim VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO, // VkStructureType sType; 66183a6066224454de177655eb414dd3453c2059536Dae Kim DE_NULL, // const void* pNext; 662120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // VkPipelineColorBlendStateCreateFlags flags; 66383a6066224454de177655eb414dd3453c2059536Dae Kim false, // VkBool32 logicOpEnable; 66483a6066224454de177655eb414dd3453c2059536Dae Kim VK_LOGIC_OP_COPY, // VkLogicOp logicOp; 665235561df842620267f9a58552f1506ae1012133fDominik Witczak (deUint32)m_imageCount, // deUint32 attachmentCount; 666235561df842620267f9a58552f1506ae1012133fDominik Witczak &colorBlendAttachmentStates[0], // const VkPipelineColorBlendAttachmentState* pAttachments; 667120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim { 0.0f, 0.0f, 0.0f, 0.0f } // float blendConstants[4]; 66883a6066224454de177655eb414dd3453c2059536Dae Kim }; 66983a6066224454de177655eb414dd3453c2059536Dae Kim 67083a6066224454de177655eb414dd3453c2059536Dae Kim const VkPipelineMultisampleStateCreateInfo multisampleStateParams = 67183a6066224454de177655eb414dd3453c2059536Dae Kim { 672120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO, // VkStructureType sType; 673120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim DE_NULL, // const void* pNext; 674120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // VkPipelineMultisampleStateCreateFlags flags; 675120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits rasterizationSamples; 676120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim false, // VkBool32 sampleShadingEnable; 677120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0.0f, // float minSampleShading; 678120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim DE_NULL, // const VkSampleMask* pSampleMask; 679120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim false, // VkBool32 alphaToCoverageEnable; 680120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim false // VkBool32 alphaToOneEnable; 68183a6066224454de177655eb414dd3453c2059536Dae Kim }; 68283a6066224454de177655eb414dd3453c2059536Dae Kim 68383a6066224454de177655eb414dd3453c2059536Dae Kim VkPipelineDepthStencilStateCreateInfo depthStencilStateParams = 68483a6066224454de177655eb414dd3453c2059536Dae Kim { 685120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO, // VkStructureType sType; 686120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim DE_NULL, // const void* pNext; 687120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // VkPipelineDepthStencilStateCreateFlags flags; 688120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim false, // VkBool32 depthTestEnable; 689120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim false, // VkBool32 depthWriteEnable; 690120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_COMPARE_OP_LESS, // VkCompareOp depthCompareOp; 691120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim false, // VkBool32 depthBoundsTestEnable; 692120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim false, // VkBool32 stencilTestEnable; 693120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim { // VkStencilOpState front; 694120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_STENCIL_OP_ZERO, // VkStencilOp failOp; 695120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_STENCIL_OP_ZERO, // VkStencilOp passOp; 696120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_STENCIL_OP_ZERO, // VkStencilOp depthFailOp; 697120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_COMPARE_OP_NEVER, // VkCompareOp compareOp; 698120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // deUint32 compareMask; 699120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // deUint32 writeMask; 700120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u // deUint32 reference; 70183a6066224454de177655eb414dd3453c2059536Dae Kim }, 70283a6066224454de177655eb414dd3453c2059536Dae Kim { // VkStencilOpState back; 703120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_STENCIL_OP_ZERO, // VkStencilOp failOp; 704120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_STENCIL_OP_ZERO, // VkStencilOp passOp; 705120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_STENCIL_OP_ZERO, // VkStencilOp depthFailOp; 706120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_COMPARE_OP_NEVER, // VkCompareOp compareOp; 707120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // deUint32 compareMask; 708120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // deUint32 writeMask; 709120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u // deUint32 reference; 71083a6066224454de177655eb414dd3453c2059536Dae Kim }, 7111d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski 0.0f, // float minDepthBounds; 7121d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski 1.0f // float maxDepthBounds; 71383a6066224454de177655eb414dd3453c2059536Dae Kim }; 71483a6066224454de177655eb414dd3453c2059536Dae Kim 71583a6066224454de177655eb414dd3453c2059536Dae Kim const VkGraphicsPipelineCreateInfo graphicsPipelineParams = 71683a6066224454de177655eb414dd3453c2059536Dae Kim { 71783a6066224454de177655eb414dd3453c2059536Dae Kim VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO, // VkStructureType sType; 71883a6066224454de177655eb414dd3453c2059536Dae Kim DE_NULL, // const void* pNext; 719120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // VkPipelineCreateFlags flags; 72083a6066224454de177655eb414dd3453c2059536Dae Kim 2u, // deUint32 stageCount; 721120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim shaderStages, // const VkPipelineShaderStageCreateInfo* pStages; 72283a6066224454de177655eb414dd3453c2059536Dae Kim &vertexInputStateParams, // const VkPipelineVertexInputStateCreateInfo* pVertexInputState; 72383a6066224454de177655eb414dd3453c2059536Dae Kim &inputAssemblyStateParams, // const VkPipelineInputAssemblyStateCreateInfo* pInputAssemblyState; 72483a6066224454de177655eb414dd3453c2059536Dae Kim DE_NULL, // const VkPipelineTessellationStateCreateInfo* pTessellationState; 72583a6066224454de177655eb414dd3453c2059536Dae Kim &viewportStateParams, // const VkPipelineViewportStateCreateInfo* pViewportState; 726120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim &rasterStateParams, // const VkPipelineRasterizationStateCreateInfo* pRasterizationState; 72783a6066224454de177655eb414dd3453c2059536Dae Kim &multisampleStateParams, // const VkPipelineMultisampleStateCreateInfo* pMultisampleState; 72883a6066224454de177655eb414dd3453c2059536Dae Kim &depthStencilStateParams, // const VkPipelineDepthStencilStateCreateInfo* pDepthStencilState; 72983a6066224454de177655eb414dd3453c2059536Dae Kim &colorBlendStateParams, // const VkPipelineColorBlendStateCreateInfo* pColorBlendState; 73086a8ae9e0d61bbfe1f1e273fdbb026369bdb5f29Pyry Haulos (const VkPipelineDynamicStateCreateInfo*)DE_NULL, // const VkPipelineDynamicStateCreateInfo* pDynamicState; 73183a6066224454de177655eb414dd3453c2059536Dae Kim *m_pipelineLayout, // VkPipelineLayout layout; 73283a6066224454de177655eb414dd3453c2059536Dae Kim *m_renderPass, // VkRenderPass renderPass; 73383a6066224454de177655eb414dd3453c2059536Dae Kim 0u, // deUint32 subpass; 73483a6066224454de177655eb414dd3453c2059536Dae Kim 0u, // VkPipeline basePipelineHandle; 73583a6066224454de177655eb414dd3453c2059536Dae Kim 0u // deInt32 basePipelineIndex; 73683a6066224454de177655eb414dd3453c2059536Dae Kim }; 73783a6066224454de177655eb414dd3453c2059536Dae Kim 73883a6066224454de177655eb414dd3453c2059536Dae Kim m_graphicsPipeline = createGraphicsPipeline(vk, vkDevice, DE_NULL, &graphicsPipelineParams); 73983a6066224454de177655eb414dd3453c2059536Dae Kim } 74083a6066224454de177655eb414dd3453c2059536Dae Kim 74183a6066224454de177655eb414dd3453c2059536Dae Kim // Create vertex buffer 74283a6066224454de177655eb414dd3453c2059536Dae Kim { 743120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim const VkDeviceSize vertexBufferSize = (VkDeviceSize)(m_vertices.size() * sizeof(Vertex4Tex4)); 744120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim const VkBufferCreateInfo vertexBufferParams = 74583a6066224454de177655eb414dd3453c2059536Dae Kim { 74683a6066224454de177655eb414dd3453c2059536Dae Kim VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, // VkStructureType sType; 74783a6066224454de177655eb414dd3453c2059536Dae Kim DE_NULL, // const void* pNext; 74883a6066224454de177655eb414dd3453c2059536Dae Kim 0u, // VkBufferCreateFlags flags; 749120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim vertexBufferSize, // VkDeviceSize size; 750120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, // VkBufferUsageFlags usage; 75183a6066224454de177655eb414dd3453c2059536Dae Kim VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode; 752120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 1u, // deUint32 queueFamilyIndexCount; 75383a6066224454de177655eb414dd3453c2059536Dae Kim &queueFamilyIndex // const deUint32* pQueueFamilyIndices; 75483a6066224454de177655eb414dd3453c2059536Dae Kim }; 75583a6066224454de177655eb414dd3453c2059536Dae Kim 756120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim DE_ASSERT(vertexBufferSize > 0); 757120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 75883a6066224454de177655eb414dd3453c2059536Dae Kim m_vertexBuffer = createBuffer(vk, vkDevice, &vertexBufferParams); 75912b099d59111b60518c581364fd026b6cfadf7d1Boris Zanin m_vertexBufferAlloc = allocateBuffer(vki, vk, physDevice, vkDevice, *m_vertexBuffer, MemoryRequirement::HostVisible, memAlloc, m_allocationKind); 76083a6066224454de177655eb414dd3453c2059536Dae Kim VK_CHECK(vk.bindBufferMemory(vkDevice, *m_vertexBuffer, m_vertexBufferAlloc->getMemory(), m_vertexBufferAlloc->getOffset())); 76183a6066224454de177655eb414dd3453c2059536Dae Kim 76283a6066224454de177655eb414dd3453c2059536Dae Kim // Load vertices into vertex buffer 763c898c7d8e107a11ad4268ffc74d0c4d0a96877d3Pyry Haulos deMemcpy(m_vertexBufferAlloc->getHostPtr(), &m_vertices[0], (size_t)vertexBufferSize); 76483a6066224454de177655eb414dd3453c2059536Dae Kim flushMappedMemoryRange(vk, vkDevice, m_vertexBufferAlloc->getMemory(), m_vertexBufferAlloc->getOffset(), vertexBufferParams.size); 76583a6066224454de177655eb414dd3453c2059536Dae Kim } 76683a6066224454de177655eb414dd3453c2059536Dae Kim 76783a6066224454de177655eb414dd3453c2059536Dae Kim // Create command pool 76855dd4426673bd260dde56addcfea802f21c31304Mika Isojärvi m_cmdPool = createCommandPool(vk, vkDevice, VK_COMMAND_POOL_CREATE_TRANSIENT_BIT, queueFamilyIndex); 76983a6066224454de177655eb414dd3453c2059536Dae Kim 77083a6066224454de177655eb414dd3453c2059536Dae Kim // Create command buffer 77183a6066224454de177655eb414dd3453c2059536Dae Kim { 772120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim const VkCommandBufferBeginInfo cmdBufferBeginInfo = 77383a6066224454de177655eb414dd3453c2059536Dae Kim { 774120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // VkStructureType sType; 775120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim DE_NULL, // const void* pNext; 776120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // VkCommandBufferUsageFlags flags; 777689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (const VkCommandBufferInheritanceInfo*)DE_NULL, 77883a6066224454de177655eb414dd3453c2059536Dae Kim }; 77983a6066224454de177655eb414dd3453c2059536Dae Kim 780f6fec4bb68bf60b1625d3bd9571aac0081f41107Maciej Jesionowski const std::vector<VkClearValue> attachmentClearValues (m_imageCount, defaultClearValue(m_colorFormat)); 78183a6066224454de177655eb414dd3453c2059536Dae Kim 78283a6066224454de177655eb414dd3453c2059536Dae Kim const VkRenderPassBeginInfo renderPassBeginInfo = 78383a6066224454de177655eb414dd3453c2059536Dae Kim { 78483a6066224454de177655eb414dd3453c2059536Dae Kim VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, // VkStructureType sType; 78583a6066224454de177655eb414dd3453c2059536Dae Kim DE_NULL, // const void* pNext; 78683a6066224454de177655eb414dd3453c2059536Dae Kim *m_renderPass, // VkRenderPass renderPass; 78783a6066224454de177655eb414dd3453c2059536Dae Kim *m_framebuffer, // VkFramebuffer framebuffer; 788689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos { 789689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos { 0, 0 }, 790689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos { (deUint32)m_renderSize.x(), (deUint32)m_renderSize.y() } 791689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos }, // VkRect2D renderArea; 792f6fec4bb68bf60b1625d3bd9571aac0081f41107Maciej Jesionowski static_cast<deUint32>(attachmentClearValues.size()), // deUint32 clearValueCount; 793f6fec4bb68bf60b1625d3bd9571aac0081f41107Maciej Jesionowski &attachmentClearValues[0] // const VkClearValue* pClearValues; 79483a6066224454de177655eb414dd3453c2059536Dae Kim }; 79583a6066224454de177655eb414dd3453c2059536Dae Kim 796235561df842620267f9a58552f1506ae1012133fDominik Witczak std::vector<VkImageMemoryBarrier> preAttachmentBarriers(m_imageCount); 797235561df842620267f9a58552f1506ae1012133fDominik Witczak 798235561df842620267f9a58552f1506ae1012133fDominik Witczak for (int imgNdx = 0; imgNdx < m_imageCount; ++imgNdx) 7991d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski { 800235561df842620267f9a58552f1506ae1012133fDominik Witczak preAttachmentBarriers[imgNdx].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER; // VkStructureType sType; 801235561df842620267f9a58552f1506ae1012133fDominik Witczak preAttachmentBarriers[imgNdx].pNext = DE_NULL; // const void* pNext; 802235561df842620267f9a58552f1506ae1012133fDominik Witczak preAttachmentBarriers[imgNdx].srcAccessMask = 0u; // VkAccessFlags srcAccessMask; 803235561df842620267f9a58552f1506ae1012133fDominik Witczak preAttachmentBarriers[imgNdx].dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; // VkAccessFlags dstAccessMask; 804235561df842620267f9a58552f1506ae1012133fDominik Witczak preAttachmentBarriers[imgNdx].oldLayout = VK_IMAGE_LAYOUT_UNDEFINED; // VkImageLayout oldLayout; 805235561df842620267f9a58552f1506ae1012133fDominik Witczak preAttachmentBarriers[imgNdx].newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; // VkImageLayout newLayout; 806235561df842620267f9a58552f1506ae1012133fDominik Witczak preAttachmentBarriers[imgNdx].srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; // deUint32 srcQueueFamilyIndex; 807235561df842620267f9a58552f1506ae1012133fDominik Witczak preAttachmentBarriers[imgNdx].dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; // deUint32 dstQueueFamilyIndex; 808235561df842620267f9a58552f1506ae1012133fDominik Witczak preAttachmentBarriers[imgNdx].image = **m_colorImages[imgNdx]; // VkImage image; 809235561df842620267f9a58552f1506ae1012133fDominik Witczak preAttachmentBarriers[imgNdx].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; // VkImageSubresourceRange subresourceRange; 810235561df842620267f9a58552f1506ae1012133fDominik Witczak preAttachmentBarriers[imgNdx].subresourceRange.baseMipLevel = 0u; 811235561df842620267f9a58552f1506ae1012133fDominik Witczak preAttachmentBarriers[imgNdx].subresourceRange.levelCount = 1u; 812235561df842620267f9a58552f1506ae1012133fDominik Witczak preAttachmentBarriers[imgNdx].subresourceRange.baseArrayLayer = 0u; 813235561df842620267f9a58552f1506ae1012133fDominik Witczak preAttachmentBarriers[imgNdx].subresourceRange.layerCount = 1u; 814235561df842620267f9a58552f1506ae1012133fDominik Witczak } 8151d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski 81655dd4426673bd260dde56addcfea802f21c31304Mika Isojärvi m_cmdBuffer = allocateCommandBuffer(vk, vkDevice, *m_cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY); 81783a6066224454de177655eb414dd3453c2059536Dae Kim 81883a6066224454de177655eb414dd3453c2059536Dae Kim VK_CHECK(vk.beginCommandBuffer(*m_cmdBuffer, &cmdBufferBeginInfo)); 8191d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski 8201d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski vk.cmdPipelineBarrier(*m_cmdBuffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, (VkDependencyFlags)0, 821235561df842620267f9a58552f1506ae1012133fDominik Witczak 0u, DE_NULL, 0u, DE_NULL, (deUint32)m_imageCount, &preAttachmentBarriers[0]); 8221d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski 823120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim vk.cmdBeginRenderPass(*m_cmdBuffer, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE); 82483a6066224454de177655eb414dd3453c2059536Dae Kim 82583a6066224454de177655eb414dd3453c2059536Dae Kim vk.cmdBindPipeline(*m_cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *m_graphicsPipeline); 82683a6066224454de177655eb414dd3453c2059536Dae Kim 82783a6066224454de177655eb414dd3453c2059536Dae Kim vk.cmdBindDescriptorSets(*m_cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *m_pipelineLayout, 0, 1, &m_descriptorSet.get(), 0, DE_NULL); 82883a6066224454de177655eb414dd3453c2059536Dae Kim 82983a6066224454de177655eb414dd3453c2059536Dae Kim const VkDeviceSize vertexBufferOffset = 0; 83083a6066224454de177655eb414dd3453c2059536Dae Kim vk.cmdBindVertexBuffers(*m_cmdBuffer, 0, 1, &m_vertexBuffer.get(), &vertexBufferOffset); 83183a6066224454de177655eb414dd3453c2059536Dae Kim vk.cmdDraw(*m_cmdBuffer, (deUint32)m_vertices.size(), 1, 0, 0); 83283a6066224454de177655eb414dd3453c2059536Dae Kim 83383a6066224454de177655eb414dd3453c2059536Dae Kim vk.cmdEndRenderPass(*m_cmdBuffer); 83483a6066224454de177655eb414dd3453c2059536Dae Kim VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer)); 83583a6066224454de177655eb414dd3453c2059536Dae Kim } 83683a6066224454de177655eb414dd3453c2059536Dae Kim 83783a6066224454de177655eb414dd3453c2059536Dae Kim // Create fence 83855dd4426673bd260dde56addcfea802f21c31304Mika Isojärvi m_fence = createFence(vk, vkDevice); 83983a6066224454de177655eb414dd3453c2059536Dae Kim} 84083a6066224454de177655eb414dd3453c2059536Dae Kim 84183a6066224454de177655eb414dd3453c2059536Dae KimImageSamplingInstance::~ImageSamplingInstance (void) 84283a6066224454de177655eb414dd3453c2059536Dae Kim{ 84383a6066224454de177655eb414dd3453c2059536Dae Kim} 84483a6066224454de177655eb414dd3453c2059536Dae Kim 84583a6066224454de177655eb414dd3453c2059536Dae Kimtcu::TestStatus ImageSamplingInstance::iterate (void) 84683a6066224454de177655eb414dd3453c2059536Dae Kim{ 84783a6066224454de177655eb414dd3453c2059536Dae Kim const DeviceInterface& vk = m_context.getDeviceInterface(); 84883a6066224454de177655eb414dd3453c2059536Dae Kim const VkDevice vkDevice = m_context.getDevice(); 84983a6066224454de177655eb414dd3453c2059536Dae Kim const VkQueue queue = m_context.getUniversalQueue(); 850120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim const VkSubmitInfo submitInfo = 851120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim { 852120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_STRUCTURE_TYPE_SUBMIT_INFO, // VkStructureType sType; 853120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim DE_NULL, // const void* pNext; 854120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // deUint32 waitSemaphoreCount; 855120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim DE_NULL, // const VkSemaphore* pWaitSemaphores; 856689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos DE_NULL, 857120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 1u, // deUint32 commandBufferCount; 858120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim &m_cmdBuffer.get(), // const VkCommandBuffer* pCommandBuffers; 859120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // deUint32 signalSemaphoreCount; 860120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim DE_NULL // const VkSemaphore* pSignalSemaphores; 861120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim }; 86283a6066224454de177655eb414dd3453c2059536Dae Kim 86383a6066224454de177655eb414dd3453c2059536Dae Kim VK_CHECK(vk.resetFences(vkDevice, 1, &m_fence.get())); 864120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_CHECK(vk.queueSubmit(queue, 1, &submitInfo, *m_fence)); 86583a6066224454de177655eb414dd3453c2059536Dae Kim VK_CHECK(vk.waitForFences(vkDevice, 1, &m_fence.get(), true, ~(0ull) /* infinity */)); 86683a6066224454de177655eb414dd3453c2059536Dae Kim 86783a6066224454de177655eb414dd3453c2059536Dae Kim return verifyImage(); 86883a6066224454de177655eb414dd3453c2059536Dae Kim} 86983a6066224454de177655eb414dd3453c2059536Dae Kim 870387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulosnamespace 871387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos{ 872387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 873387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulosbool isLookupResultValid (const tcu::Texture1DView& texture, 874387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos const tcu::Sampler& sampler, 875387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos const tcu::LookupPrecision& precision, 876387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos const tcu::Vec4& coords, 877387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos const tcu::Vec2& lodBounds, 878387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos const tcu::Vec4& result) 879387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos{ 880387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos return tcu::isLookupResultValid(texture, sampler, precision, coords.x(), lodBounds, result); 881387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos} 882387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 883387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulosbool isLookupResultValid (const tcu::Texture1DArrayView& texture, 884387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos const tcu::Sampler& sampler, 885387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos const tcu::LookupPrecision& precision, 886387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos const tcu::Vec4& coords, 887387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos const tcu::Vec2& lodBounds, 888387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos const tcu::Vec4& result) 889387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos{ 890387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos return tcu::isLookupResultValid(texture, sampler, precision, coords.swizzle(0,1), lodBounds, result); 891387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos} 892387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 893387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulosbool isLookupResultValid (const tcu::Texture2DView& texture, 894387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos const tcu::Sampler& sampler, 895387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos const tcu::LookupPrecision& precision, 896387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos const tcu::Vec4& coords, 897387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos const tcu::Vec2& lodBounds, 898387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos const tcu::Vec4& result) 899387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos{ 900387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos return tcu::isLookupResultValid(texture, sampler, precision, coords.swizzle(0,1), lodBounds, result); 901387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos} 902387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 903387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulosbool isLookupResultValid (const tcu::Texture2DArrayView& texture, 904387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos const tcu::Sampler& sampler, 905387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos const tcu::LookupPrecision& precision, 906387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos const tcu::Vec4& coords, 907387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos const tcu::Vec2& lodBounds, 908387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos const tcu::Vec4& result) 909387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos{ 910387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos return tcu::isLookupResultValid(texture, sampler, precision, coords.swizzle(0,1,2), lodBounds, result); 911387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos} 912387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 913387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulosbool isLookupResultValid (const tcu::TextureCubeView& texture, 914387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos const tcu::Sampler& sampler, 915387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos const tcu::LookupPrecision& precision, 916387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos const tcu::Vec4& coords, 917387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos const tcu::Vec2& lodBounds, 918387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos const tcu::Vec4& result) 919387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos{ 920387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos return tcu::isLookupResultValid(texture, sampler, precision, coords.swizzle(0,1,2), lodBounds, result); 921387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos} 922387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 923387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulosbool isLookupResultValid (const tcu::TextureCubeArrayView& texture, 924387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos const tcu::Sampler& sampler, 925387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos const tcu::LookupPrecision& precision, 926387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos const tcu::Vec4& coords, 927387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos const tcu::Vec2& lodBounds, 928387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos const tcu::Vec4& result) 929387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos{ 930387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos return tcu::isLookupResultValid(texture, sampler, precision, tcu::IVec4(precision.coordBits.x()), coords, lodBounds, result); 931387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos} 932387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 933387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulosbool isLookupResultValid(const tcu::Texture3DView& texture, 934387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos const tcu::Sampler& sampler, 935387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos const tcu::LookupPrecision& precision, 936387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos const tcu::Vec4& coords, 937387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos const tcu::Vec2& lodBounds, 938387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos const tcu::Vec4& result) 939387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos{ 940387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos return tcu::isLookupResultValid(texture, sampler, precision, coords.swizzle(0,1,2), lodBounds, result); 941387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos} 942387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 943387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulostemplate<typename TextureViewType> 944387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulosbool validateResultImage (const TextureViewType& texture, 945387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos const tcu::Sampler& sampler, 946387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos const tcu::ConstPixelBufferAccess& texCoords, 947387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos const tcu::Vec2& lodBounds, 948387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos const tcu::LookupPrecision& lookupPrecision, 949387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos const tcu::Vec4& lookupScale, 950387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos const tcu::Vec4& lookupBias, 951387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos const tcu::ConstPixelBufferAccess& result, 952387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos const tcu::PixelBufferAccess& errorMask) 953387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos{ 954387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos const int w = result.getWidth(); 955387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos const int h = result.getHeight(); 956387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos bool allOk = true; 957387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 958387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos for (int y = 0; y < h; ++y) 959387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos { 960387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos for (int x = 0; x < w; ++x) 961387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos { 962387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos const tcu::Vec4 resultPixel = result.getPixel(x, y); 963387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos const tcu::Vec4 resultColor = (resultPixel - lookupBias) / lookupScale; 964387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos const tcu::Vec4 texCoord = texCoords.getPixel(x, y); 965387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos const bool pixelOk = isLookupResultValid(texture, sampler, lookupPrecision, texCoord, lodBounds, resultColor); 966387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 967387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos errorMask.setPixel(tcu::Vec4(pixelOk?0.0f:1.0f, pixelOk?1.0f:0.0f, 0.0f, 1.0f), x, y); 968387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 969387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos if (!pixelOk) 970387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos allOk = false; 971387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos } 972387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos } 973387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 974387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos return allOk; 975387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos} 976387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 977387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulostemplate<typename ScalarType> 978387999c58e55306e26ea6a8abd371174d35ee640Pyry HaulosScalarType getSwizzledComp (const tcu::Vector<ScalarType, 4>& vec, vk::VkComponentSwizzle comp, int identityNdx) 979387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos{ 980387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos if (comp == vk::VK_COMPONENT_SWIZZLE_IDENTITY) 981387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos return vec[identityNdx]; 982387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos else if (comp == vk::VK_COMPONENT_SWIZZLE_ZERO) 983387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos return ScalarType(0); 984387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos else if (comp == vk::VK_COMPONENT_SWIZZLE_ONE) 985387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos return ScalarType(1); 986387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos else 987387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos return vec[comp - vk::VK_COMPONENT_SWIZZLE_R]; 988387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos} 989387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 990387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulostemplate<typename ScalarType> 991387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulostcu::Vector<ScalarType, 4> swizzle (const tcu::Vector<ScalarType, 4>& vec, const vk::VkComponentMapping& swz) 992387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos{ 993387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos return tcu::Vector<ScalarType, 4>(getSwizzledComp(vec, swz.r, 0), 994387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos getSwizzledComp(vec, swz.g, 1), 995387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos getSwizzledComp(vec, swz.b, 2), 996387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos getSwizzledComp(vec, swz.a, 3)); 997387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos} 998387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 999387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulostcu::Vec4 swizzleScaleBias (const tcu::Vec4& vec, const vk::VkComponentMapping& swz) 1000387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos{ 1001387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos const float channelValues[] = 1002387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos { 1003387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 1.0f, // -1 1004387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 1.0f, // 0 1005387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 1.0f, 1006387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos vec.x(), 1007387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos vec.y(), 1008387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos vec.z(), 1009387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos vec.w() 1010387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos }; 1011387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 1012387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos return tcu::Vec4(channelValues[swz.r], channelValues[swz.g], channelValues[swz.b], channelValues[swz.a]); 1013387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos} 1014387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 1015387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulostemplate<typename ScalarType> 1016387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulosvoid swizzleT (const tcu::ConstPixelBufferAccess& src, const tcu::PixelBufferAccess& dst, const vk::VkComponentMapping& swz) 1017387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos{ 1018387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos for (int z = 0; z < dst.getDepth(); ++z) 1019387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos for (int y = 0; y < dst.getHeight(); ++y) 1020387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos for (int x = 0; x < dst.getWidth(); ++x) 1021387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos dst.setPixel(swizzle(src.getPixelT<ScalarType>(x, y, z), swz), x, y, z); 1022387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos} 1023387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 1024387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulosvoid swizzleFromSRGB (const tcu::ConstPixelBufferAccess& src, const tcu::PixelBufferAccess& dst, const vk::VkComponentMapping& swz) 1025387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos{ 1026387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos for (int z = 0; z < dst.getDepth(); ++z) 1027387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos for (int y = 0; y < dst.getHeight(); ++y) 1028387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos for (int x = 0; x < dst.getWidth(); ++x) 1029387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos dst.setPixel(swizzle(tcu::sRGBToLinear(src.getPixelT<float>(x, y, z)), swz), x, y, z); 1030387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos} 1031387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 1032387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulosvoid swizzle (const tcu::ConstPixelBufferAccess& src, const tcu::PixelBufferAccess& dst, const vk::VkComponentMapping& swz) 1033387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos{ 1034387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos const tcu::TextureChannelClass chnClass = tcu::getTextureChannelClass(dst.getFormat().type); 1035387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 1036387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos DE_ASSERT(src.getWidth() == dst.getWidth() && 1037387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos src.getHeight() == dst.getHeight() && 1038387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos src.getDepth() == dst.getDepth()); 1039387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 1040387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos if (chnClass == tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER) 1041387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos swizzleT<deInt32>(src, dst, swz); 1042387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos else if (chnClass == tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER) 1043387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos swizzleT<deUint32>(src, dst, swz); 1044387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos else if (tcu::isSRGB(src.getFormat()) && !tcu::isSRGB(dst.getFormat())) 1045387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos swizzleFromSRGB(src, dst, swz); 1046387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos else 1047387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos swizzleT<float>(src, dst, swz); 1048387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos} 1049387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 1050387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulosbool isIdentitySwizzle (const vk::VkComponentMapping& swz) 1051387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos{ 1052387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos return (swz.r == vk::VK_COMPONENT_SWIZZLE_IDENTITY || swz.r == vk::VK_COMPONENT_SWIZZLE_R) && 1053387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos (swz.g == vk::VK_COMPONENT_SWIZZLE_IDENTITY || swz.g == vk::VK_COMPONENT_SWIZZLE_G) && 1054387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos (swz.b == vk::VK_COMPONENT_SWIZZLE_IDENTITY || swz.b == vk::VK_COMPONENT_SWIZZLE_B) && 1055387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos (swz.a == vk::VK_COMPONENT_SWIZZLE_IDENTITY || swz.a == vk::VK_COMPONENT_SWIZZLE_A); 1056387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos} 1057387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 1058387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulostemplate<typename TextureViewType> struct TexViewTraits; 1059387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 1060387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulostemplate<> struct TexViewTraits<tcu::Texture1DView> { typedef tcu::Texture1D TextureType; }; 1061387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulostemplate<> struct TexViewTraits<tcu::Texture1DArrayView> { typedef tcu::Texture1DArray TextureType; }; 1062387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulostemplate<> struct TexViewTraits<tcu::Texture2DView> { typedef tcu::Texture2D TextureType; }; 1063387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulostemplate<> struct TexViewTraits<tcu::Texture2DArrayView> { typedef tcu::Texture2DArray TextureType; }; 1064387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulostemplate<> struct TexViewTraits<tcu::TextureCubeView> { typedef tcu::TextureCube TextureType; }; 1065387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulostemplate<> struct TexViewTraits<tcu::TextureCubeArrayView> { typedef tcu::TextureCubeArray TextureType; }; 1066387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulostemplate<> struct TexViewTraits<tcu::Texture3DView> { typedef tcu::Texture3D TextureType; }; 1067387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 1068387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulostemplate<typename TextureViewType> 1069387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulostypename TexViewTraits<TextureViewType>::TextureType* createSkeletonClone (tcu::TextureFormat format, const tcu::ConstPixelBufferAccess& level0); 1070387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 1071387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulostcu::TextureFormat getSwizzleTargetFormat (tcu::TextureFormat format) 1072387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos{ 1073387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos // Swizzled texture needs to hold all four channels 1074387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos // \todo [2016-09-21 pyry] We could save some memory by using smaller formats 1075387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos // when possible (for example U8). 1076387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 1077387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos const tcu::TextureChannelClass chnClass = tcu::getTextureChannelClass(format.type); 1078387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 1079387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos if (chnClass == tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER) 1080387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos return tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::SIGNED_INT32); 1081387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos else if (chnClass == tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER) 1082387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos return tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNSIGNED_INT32); 1083387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos else 1084387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos return tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::FLOAT); 1085387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos} 1086387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 1087387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulostemplate<> 1088387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulostcu::Texture1D* createSkeletonClone<tcu::Texture1DView> (tcu::TextureFormat format, const tcu::ConstPixelBufferAccess& level0) 1089387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos{ 1090387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos return new tcu::Texture1D(format, level0.getWidth()); 1091387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos} 1092387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 1093387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulostemplate<> 1094387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulostcu::Texture1DArray* createSkeletonClone<tcu::Texture1DArrayView> (tcu::TextureFormat format, const tcu::ConstPixelBufferAccess& level0) 1095387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos{ 1096387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos return new tcu::Texture1DArray(format, level0.getWidth(), level0.getHeight()); 1097387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos} 1098387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 1099387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulostemplate<> 1100387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulostcu::Texture2D* createSkeletonClone<tcu::Texture2DView> (tcu::TextureFormat format, const tcu::ConstPixelBufferAccess& level0) 1101387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos{ 1102387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos return new tcu::Texture2D(format, level0.getWidth(), level0.getHeight()); 1103387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos} 1104387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 1105387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulostemplate<> 1106387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulostcu::Texture2DArray* createSkeletonClone<tcu::Texture2DArrayView> (tcu::TextureFormat format, const tcu::ConstPixelBufferAccess& level0) 1107387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos{ 1108387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos return new tcu::Texture2DArray(format, level0.getWidth(), level0.getHeight(), level0.getDepth()); 1109387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos} 1110387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 1111387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulostemplate<> 1112387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulostcu::Texture3D* createSkeletonClone<tcu::Texture3DView> (tcu::TextureFormat format, const tcu::ConstPixelBufferAccess& level0) 1113387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos{ 1114387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos return new tcu::Texture3D(format, level0.getWidth(), level0.getHeight(), level0.getDepth()); 1115387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos} 1116387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 1117387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulostemplate<> 1118387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulostcu::TextureCubeArray* createSkeletonClone<tcu::TextureCubeArrayView> (tcu::TextureFormat format, const tcu::ConstPixelBufferAccess& level0) 1119387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos{ 1120387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos return new tcu::TextureCubeArray(format, level0.getWidth(), level0.getDepth()); 1121387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos} 1122387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 1123387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulostemplate<typename TextureViewType> 1124387999c58e55306e26ea6a8abd371174d35ee640Pyry HaulosMovePtr<typename TexViewTraits<TextureViewType>::TextureType> createSwizzledCopy (const TextureViewType& texture, const vk::VkComponentMapping& swz) 1125387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos{ 1126387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos MovePtr<typename TexViewTraits<TextureViewType>::TextureType> copy (createSkeletonClone<TextureViewType>(getSwizzleTargetFormat(texture.getLevel(0).getFormat()), texture.getLevel(0))); 1127387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 1128387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos for (int levelNdx = 0; levelNdx < texture.getNumLevels(); ++levelNdx) 1129387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos { 1130387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos copy->allocLevel(levelNdx); 1131387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos swizzle(texture.getLevel(levelNdx), copy->getLevel(levelNdx), swz); 1132387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos } 1133387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 1134387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos return copy; 1135387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos} 1136387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 1137387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulostemplate<> 1138387999c58e55306e26ea6a8abd371174d35ee640Pyry HaulosMovePtr<tcu::TextureCube> createSwizzledCopy (const tcu::TextureCubeView& texture, const vk::VkComponentMapping& swz) 1139387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos{ 1140387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos MovePtr<tcu::TextureCube> copy (new tcu::TextureCube(getSwizzleTargetFormat(texture.getLevelFace(0, tcu::CUBEFACE_NEGATIVE_X).getFormat()), texture.getSize())); 1141387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 1142387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos for (int faceNdx = 0; faceNdx < tcu::CUBEFACE_LAST; ++faceNdx) 1143387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos { 1144387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos for (int levelNdx = 0; levelNdx < texture.getNumLevels(); ++levelNdx) 1145387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos { 1146387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos copy->allocLevel((tcu::CubeFace)faceNdx, levelNdx); 1147387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos swizzle(texture.getLevelFace(levelNdx, (tcu::CubeFace)faceNdx), copy->getLevelFace(levelNdx, (tcu::CubeFace)faceNdx), swz); 1148387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos } 1149387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos } 1150387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 1151387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos return copy; 1152387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos} 1153387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 1154387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulostemplate<typename TextureViewType> 1155387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulosbool validateResultImage (const TextureViewType& texture, 1156387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos const tcu::Sampler& sampler, 1157387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos const vk::VkComponentMapping& swz, 1158387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos const tcu::ConstPixelBufferAccess& texCoords, 1159387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos const tcu::Vec2& lodBounds, 1160387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos const tcu::LookupPrecision& lookupPrecision, 1161387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos const tcu::Vec4& lookupScale, 1162387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos const tcu::Vec4& lookupBias, 1163387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos const tcu::ConstPixelBufferAccess& result, 1164387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos const tcu::PixelBufferAccess& errorMask) 1165387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos{ 1166387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos if (isIdentitySwizzle(swz)) 1167387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos return validateResultImage(texture, sampler, texCoords, lodBounds, lookupPrecision, lookupScale, lookupBias, result, errorMask); 1168387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos else 1169387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos { 1170387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos // There is (currently) no way to handle swizzling inside validation loop 1171387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos // and thus we need to pre-swizzle the texture. 1172387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos UniquePtr<typename TexViewTraits<TextureViewType>::TextureType> swizzledTex (createSwizzledCopy(texture, swz)); 1173387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 1174387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos return validateResultImage(*swizzledTex, sampler, texCoords, lodBounds, lookupPrecision, swizzleScaleBias(lookupScale, swz), swizzleScaleBias(lookupBias, swz), result, errorMask); 1175387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos } 1176387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos} 1177387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 1178387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulosvk::VkImageSubresourceRange resolveSubresourceRange (const TestTexture& testTexture, const vk::VkImageSubresourceRange& subresource) 1179387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos{ 1180387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos vk::VkImageSubresourceRange resolved = subresource; 1181387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 1182387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos if (subresource.levelCount == VK_REMAINING_MIP_LEVELS) 1183387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos resolved.levelCount = testTexture.getNumLevels()-subresource.baseMipLevel; 1184387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 1185387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos if (subresource.layerCount == VK_REMAINING_ARRAY_LAYERS) 1186387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos resolved.layerCount = testTexture.getArraySize()-subresource.baseArrayLayer; 1187387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 1188387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos return resolved; 1189387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos} 1190387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 1191387999c58e55306e26ea6a8abd371174d35ee640Pyry HaulosMovePtr<tcu::Texture1DView> getTexture1DView (const TestTexture& testTexture, const vk::VkImageSubresourceRange& subresource, std::vector<tcu::ConstPixelBufferAccess>& levels) 1192387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos{ 1193387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos DE_ASSERT(subresource.layerCount == 1); 1194387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 1195387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos levels.resize(subresource.levelCount); 1196387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 1197387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos for (int levelNdx = 0; levelNdx < (int)levels.size(); ++levelNdx) 1198387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos { 1199387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos const tcu::ConstPixelBufferAccess& srcLevel = testTexture.getLevel((int)subresource.baseMipLevel+levelNdx, subresource.baseArrayLayer); 1200387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 1201387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos levels[levelNdx] = tcu::getSubregion(srcLevel, 0, 0, 0, srcLevel.getWidth(), 1, 1); 1202387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos } 1203387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 1204387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos return MovePtr<tcu::Texture1DView>(new tcu::Texture1DView((int)levels.size(), &levels[0])); 1205387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos} 1206387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 1207387999c58e55306e26ea6a8abd371174d35ee640Pyry HaulosMovePtr<tcu::Texture1DArrayView> getTexture1DArrayView (const TestTexture& testTexture, const vk::VkImageSubresourceRange& subresource, std::vector<tcu::ConstPixelBufferAccess>& levels) 1208387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos{ 1209387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos const TestTexture1D* tex1D = dynamic_cast<const TestTexture1D*>(&testTexture); 1210387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos const TestTexture1DArray* tex1DArray = dynamic_cast<const TestTexture1DArray*>(&testTexture); 1211387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 1212387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos DE_ASSERT(!!tex1D != !!tex1DArray); 1213387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos DE_ASSERT(tex1DArray || subresource.baseArrayLayer == 0); 1214387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 1215387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos levels.resize(subresource.levelCount); 1216387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 1217387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos for (int levelNdx = 0; levelNdx < (int)levels.size(); ++levelNdx) 1218387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos { 1219387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos const tcu::ConstPixelBufferAccess& srcLevel = tex1D ? tex1D->getTexture().getLevel((int)subresource.baseMipLevel+levelNdx) 1220387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos : tex1DArray->getTexture().getLevel((int)subresource.baseMipLevel+levelNdx); 1221387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 1222387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos levels[levelNdx] = tcu::getSubregion(srcLevel, 0, (int)subresource.baseArrayLayer, 0, srcLevel.getWidth(), (int)subresource.layerCount, 1); 1223387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos } 1224387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 1225387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos return MovePtr<tcu::Texture1DArrayView>(new tcu::Texture1DArrayView((int)levels.size(), &levels[0])); 1226387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos} 1227387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 1228387999c58e55306e26ea6a8abd371174d35ee640Pyry HaulosMovePtr<tcu::Texture2DView> getTexture2DView (const TestTexture& testTexture, const vk::VkImageSubresourceRange& subresource, std::vector<tcu::ConstPixelBufferAccess>& levels) 1229387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos{ 1230387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos const TestTexture2D* tex2D = dynamic_cast<const TestTexture2D*>(&testTexture); 1231387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos const TestTexture2DArray* tex2DArray = dynamic_cast<const TestTexture2DArray*>(&testTexture); 1232387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 1233387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos DE_ASSERT(subresource.layerCount == 1); 1234387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos DE_ASSERT(!!tex2D != !!tex2DArray); 1235387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos DE_ASSERT(tex2DArray || subresource.baseArrayLayer == 0); 1236387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 1237387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos levels.resize(subresource.levelCount); 1238387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 1239387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos for (int levelNdx = 0; levelNdx < (int)levels.size(); ++levelNdx) 1240387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos { 1241387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos const tcu::ConstPixelBufferAccess& srcLevel = tex2D ? tex2D->getTexture().getLevel((int)subresource.baseMipLevel+levelNdx) 1242387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos : tex2DArray->getTexture().getLevel((int)subresource.baseMipLevel+levelNdx); 1243387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 1244387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos levels[levelNdx] = tcu::getSubregion(srcLevel, 0, 0, (int)subresource.baseArrayLayer, srcLevel.getWidth(), srcLevel.getHeight(), 1); 1245387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos } 1246387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 1247387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos return MovePtr<tcu::Texture2DView>(new tcu::Texture2DView((int)levels.size(), &levels[0])); 1248387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos} 1249387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 1250387999c58e55306e26ea6a8abd371174d35ee640Pyry HaulosMovePtr<tcu::Texture2DArrayView> getTexture2DArrayView (const TestTexture& testTexture, const vk::VkImageSubresourceRange& subresource, std::vector<tcu::ConstPixelBufferAccess>& levels) 1251387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos{ 1252387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos const TestTexture2D* tex2D = dynamic_cast<const TestTexture2D*>(&testTexture); 1253387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos const TestTexture2DArray* tex2DArray = dynamic_cast<const TestTexture2DArray*>(&testTexture); 1254387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 1255387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos DE_ASSERT(!!tex2D != !!tex2DArray); 1256387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos DE_ASSERT(tex2DArray || subresource.baseArrayLayer == 0); 1257387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 1258387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos levels.resize(subresource.levelCount); 1259387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 1260387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos for (int levelNdx = 0; levelNdx < (int)levels.size(); ++levelNdx) 1261387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos { 1262387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos const tcu::ConstPixelBufferAccess& srcLevel = tex2D ? tex2D->getTexture().getLevel((int)subresource.baseMipLevel+levelNdx) 1263387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos : tex2DArray->getTexture().getLevel((int)subresource.baseMipLevel+levelNdx); 1264387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 1265387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos levels[levelNdx] = tcu::getSubregion(srcLevel, 0, 0, (int)subresource.baseArrayLayer, srcLevel.getWidth(), srcLevel.getHeight(), (int)subresource.layerCount); 1266387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos } 1267387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 1268387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos return MovePtr<tcu::Texture2DArrayView>(new tcu::Texture2DArrayView((int)levels.size(), &levels[0])); 1269387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos} 1270387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 1271387999c58e55306e26ea6a8abd371174d35ee640Pyry HaulosMovePtr<tcu::TextureCubeView> getTextureCubeView (const TestTexture& testTexture, const vk::VkImageSubresourceRange& subresource, std::vector<tcu::ConstPixelBufferAccess>& levels) 1272387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos{ 1273387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos const static tcu::CubeFace s_faceMap[tcu::CUBEFACE_LAST] = 1274387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos { 1275387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos tcu::CUBEFACE_POSITIVE_X, 1276387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos tcu::CUBEFACE_NEGATIVE_X, 1277387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos tcu::CUBEFACE_POSITIVE_Y, 1278387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos tcu::CUBEFACE_NEGATIVE_Y, 1279387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos tcu::CUBEFACE_POSITIVE_Z, 1280387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos tcu::CUBEFACE_NEGATIVE_Z 1281387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos }; 1282387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 1283387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos const TestTextureCube* texCube = dynamic_cast<const TestTextureCube*>(&testTexture); 1284387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos const TestTextureCubeArray* texCubeArray = dynamic_cast<const TestTextureCubeArray*>(&testTexture); 1285387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 1286387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos DE_ASSERT(!!texCube != !!texCubeArray); 1287387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos DE_ASSERT(subresource.layerCount == 6); 1288387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos DE_ASSERT(texCubeArray || subresource.baseArrayLayer == 0); 1289387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 1290387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos levels.resize(subresource.levelCount*tcu::CUBEFACE_LAST); 1291387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 1292387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos for (int faceNdx = 0; faceNdx < tcu::CUBEFACE_LAST; ++faceNdx) 1293387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos { 1294387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos for (int levelNdx = 0; levelNdx < (int)subresource.levelCount; ++levelNdx) 1295387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos { 1296387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos const tcu::ConstPixelBufferAccess& srcLevel = texCubeArray ? texCubeArray->getTexture().getLevel((int)subresource.baseMipLevel+levelNdx) 1297387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos : texCube->getTexture().getLevelFace(levelNdx, s_faceMap[faceNdx]); 1298387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 1299387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos levels[faceNdx*subresource.levelCount + levelNdx] = tcu::getSubregion(srcLevel, 0, 0, (int)subresource.baseArrayLayer + (texCubeArray ? faceNdx : 0), srcLevel.getWidth(), srcLevel.getHeight(), 1); 1300387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos } 1301387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos } 1302387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 1303387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos { 1304387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos const tcu::ConstPixelBufferAccess* reordered[tcu::CUBEFACE_LAST]; 1305387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 1306387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos for (int faceNdx = 0; faceNdx < tcu::CUBEFACE_LAST; ++faceNdx) 1307387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos reordered[s_faceMap[faceNdx]] = &levels[faceNdx*subresource.levelCount]; 1308387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 1309387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos return MovePtr<tcu::TextureCubeView>(new tcu::TextureCubeView((int)subresource.levelCount, reordered)); 1310387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos } 1311387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos} 1312387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 1313387999c58e55306e26ea6a8abd371174d35ee640Pyry HaulosMovePtr<tcu::TextureCubeArrayView> getTextureCubeArrayView (const TestTexture& testTexture, const vk::VkImageSubresourceRange& subresource, std::vector<tcu::ConstPixelBufferAccess>& levels) 1314387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos{ 1315387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos const TestTextureCubeArray* texCubeArray = dynamic_cast<const TestTextureCubeArray*>(&testTexture); 1316387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 1317387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos DE_ASSERT(texCubeArray); 1318387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos DE_ASSERT(subresource.layerCount%6 == 0); 1319387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 1320387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos levels.resize(subresource.levelCount); 1321387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 1322387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos for (int levelNdx = 0; levelNdx < (int)subresource.levelCount; ++levelNdx) 1323387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos { 1324387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos const tcu::ConstPixelBufferAccess& srcLevel = texCubeArray->getTexture().getLevel((int)subresource.baseMipLevel+levelNdx); 1325387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 1326387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos levels[levelNdx] = tcu::getSubregion(srcLevel, 0, 0, (int)subresource.baseArrayLayer, srcLevel.getWidth(), srcLevel.getHeight(), (int)subresource.layerCount); 1327387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos } 1328387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 1329387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos return MovePtr<tcu::TextureCubeArrayView>(new tcu::TextureCubeArrayView((int)levels.size(), &levels[0])); 1330387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos} 1331387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 1332387999c58e55306e26ea6a8abd371174d35ee640Pyry HaulosMovePtr<tcu::Texture3DView> getTexture3DView (const TestTexture& testTexture, const vk::VkImageSubresourceRange& subresource, std::vector<tcu::ConstPixelBufferAccess>& levels) 1333387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos{ 1334387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos DE_ASSERT(subresource.baseArrayLayer == 0 && subresource.layerCount == 1); 1335387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 1336387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos levels.resize(subresource.levelCount); 1337387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 1338387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos for (int levelNdx = 0; levelNdx < (int)levels.size(); ++levelNdx) 1339387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos levels[levelNdx] = testTexture.getLevel((int)subresource.baseMipLevel+levelNdx, subresource.baseArrayLayer); 1340387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 1341387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos return MovePtr<tcu::Texture3DView>(new tcu::Texture3DView((int)levels.size(), &levels[0])); 1342387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos} 1343387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 1344edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulosbool validateResultImage (const TestTexture& texture, 1345edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos const VkImageViewType imageViewType, 1346edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos const VkImageSubresourceRange& subresource, 1347edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos const tcu::Sampler& sampler, 1348edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos const vk::VkComponentMapping& componentMapping, 1349edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos const tcu::ConstPixelBufferAccess& coordAccess, 1350edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos const tcu::Vec2& lodBounds, 1351edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos const tcu::LookupPrecision& lookupPrecision, 1352edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos const tcu::Vec4& lookupScale, 1353edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos const tcu::Vec4& lookupBias, 1354edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos const tcu::ConstPixelBufferAccess& resultAccess, 1355edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos const tcu::PixelBufferAccess& errorAccess) 1356edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos{ 1357edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos std::vector<tcu::ConstPixelBufferAccess> levels; 1358edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos 1359edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos switch (imageViewType) 1360edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos { 1361edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos case VK_IMAGE_VIEW_TYPE_1D: 1362edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos { 1363edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos UniquePtr<tcu::Texture1DView> texView(getTexture1DView(texture, subresource, levels)); 1364edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos 1365edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos return validateResultImage(*texView, sampler, componentMapping, coordAccess, lodBounds, lookupPrecision, lookupScale, lookupBias, resultAccess, errorAccess); 1366edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos } 1367edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos 1368edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos case VK_IMAGE_VIEW_TYPE_1D_ARRAY: 1369edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos { 1370edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos UniquePtr<tcu::Texture1DArrayView> texView(getTexture1DArrayView(texture, subresource, levels)); 1371edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos 1372edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos return validateResultImage(*texView, sampler, componentMapping, coordAccess, lodBounds, lookupPrecision, lookupScale, lookupBias, resultAccess, errorAccess); 1373edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos } 1374edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos 1375edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos case VK_IMAGE_VIEW_TYPE_2D: 1376edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos { 1377edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos UniquePtr<tcu::Texture2DView> texView(getTexture2DView(texture, subresource, levels)); 1378edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos 1379edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos return validateResultImage(*texView, sampler, componentMapping, coordAccess, lodBounds, lookupPrecision, lookupScale, lookupBias, resultAccess, errorAccess); 1380edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos } 1381edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos 1382edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos case VK_IMAGE_VIEW_TYPE_2D_ARRAY: 1383edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos { 1384edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos UniquePtr<tcu::Texture2DArrayView> texView(getTexture2DArrayView(texture, subresource, levels)); 1385edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos 1386edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos return validateResultImage(*texView, sampler, componentMapping, coordAccess, lodBounds, lookupPrecision, lookupScale, lookupBias, resultAccess, errorAccess); 1387edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos } 1388edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos 1389edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos case VK_IMAGE_VIEW_TYPE_CUBE: 1390edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos { 1391edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos UniquePtr<tcu::TextureCubeView> texView(getTextureCubeView(texture, subresource, levels)); 1392edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos 1393edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos return validateResultImage(*texView, sampler, componentMapping, coordAccess, lodBounds, lookupPrecision, lookupScale, lookupBias, resultAccess, errorAccess); 1394edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos } 1395edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos 1396edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY: 1397edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos { 1398edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos UniquePtr<tcu::TextureCubeArrayView> texView(getTextureCubeArrayView(texture, subresource, levels)); 1399edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos 1400edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos return validateResultImage(*texView, sampler, componentMapping, coordAccess, lodBounds, lookupPrecision, lookupScale, lookupBias, resultAccess, errorAccess); 1401edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos break; 1402edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos } 1403edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos 1404edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos case VK_IMAGE_VIEW_TYPE_3D: 1405edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos { 1406edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos UniquePtr<tcu::Texture3DView> texView(getTexture3DView(texture, subresource, levels)); 1407edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos 1408edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos return validateResultImage(*texView, sampler, componentMapping, coordAccess, lodBounds, lookupPrecision, lookupScale, lookupBias, resultAccess, errorAccess); 1409edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos } 1410edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos 1411edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos default: 1412edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos DE_ASSERT(false); 1413edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos return false; 1414edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos } 1415edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos} 1416edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos 1417387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos} // anonymous 1418387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 141983a6066224454de177655eb414dd3453c2059536Dae Kimtcu::TestStatus ImageSamplingInstance::verifyImage (void) 142083a6066224454de177655eb414dd3453c2059536Dae Kim{ 1421813ed770e033537e3e3a68c425c1e6ab4a67e852Maciej Jesionowski const VkPhysicalDeviceLimits& limits = m_context.getDeviceProperties().limits; 1422387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos // \note Color buffer is used to capture coordinates - not sampled texture values 1423387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos const tcu::TextureFormat colorFormat (tcu::TextureFormat::RGBA, tcu::TextureFormat::FLOAT); 1424387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos const tcu::TextureFormat depthStencilFormat; // Undefined depth/stencil format. 1425387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos const CoordinateCaptureProgram coordCaptureProgram; 1426387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos const rr::Program rrProgram = coordCaptureProgram.getReferenceProgram(); 1427387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos ReferenceRenderer refRenderer (m_renderSize.x(), m_renderSize.y(), 1, colorFormat, depthStencilFormat, &rrProgram); 1428387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 1429235561df842620267f9a58552f1506ae1012133fDominik Witczak bool compareOkAll = true; 1430edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos bool anyWarnings = false; 1431387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 1432387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos tcu::Vec4 lookupScale (1.0f); 1433387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos tcu::Vec4 lookupBias (0.0f); 1434387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 1435387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos getLookupScaleBias(m_imageFormat, lookupScale, lookupBias); 1436387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 1437387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos // Render out coordinates 1438387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos { 1439387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos const rr::RenderState renderState(refRenderer.getViewportState()); 1440387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos refRenderer.draw(renderState, rr::PRIMITIVETYPE_TRIANGLES, m_vertices); 1441387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos } 1442387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 1443387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos // Verify results 144483a6066224454de177655eb414dd3453c2059536Dae Kim { 1445387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos const tcu::Sampler sampler = mapVkSampler(m_samplerParams); 1446387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos const float referenceLod = de::clamp(m_samplerParams.mipLodBias + m_samplerLod, m_samplerParams.minLod, m_samplerParams.maxLod); 1447813ed770e033537e3e3a68c425c1e6ab4a67e852Maciej Jesionowski const float lodError = 1.0f / static_cast<float>((1u << limits.mipmapPrecisionBits) - 1u); 1448235561df842620267f9a58552f1506ae1012133fDominik Witczak const tcu::Vec2 lodBounds (referenceLod - lodError, referenceLod + lodError); 1449387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos const vk::VkImageSubresourceRange subresource = resolveSubresourceRange(*m_texture, m_subresourceRange); 1450387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 1451387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos const tcu::ConstPixelBufferAccess coordAccess = refRenderer.getAccess(); 1452387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos tcu::TextureLevel errorMask (tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8), (int)m_renderSize.x(), (int)m_renderSize.y()); 1453387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos const tcu::PixelBufferAccess errorAccess = errorMask.getAccess(); 1454387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 1455edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos const bool allowSnorm8Bug = m_texture->getTextureFormat().type == tcu::TextureFormat::SNORM_INT8 && 1456edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos (m_samplerParams.minFilter == VK_FILTER_LINEAR || m_samplerParams.magFilter == VK_FILTER_LINEAR); 14571bea8d8112a20b1380cca52b401ac035642afe3cYanjun Zhang const bool isNearestOnly = (m_samplerParams.minFilter == VK_FILTER_NEAREST && m_samplerParams.magFilter == VK_FILTER_NEAREST); 1458edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos 1459387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos tcu::LookupPrecision lookupPrecision; 1460387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 1461387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos // Set precision requirements - very low for these tests as 1462387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos // the point of the test is not to validate accuracy. 1463387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos lookupPrecision.coordBits = tcu::IVec3(17, 17, 17); 1464387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos lookupPrecision.uvwBits = tcu::IVec3(5, 5, 5); 1465387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos lookupPrecision.colorMask = tcu::BVec4(true); 14661bea8d8112a20b1380cca52b401ac035642afe3cYanjun Zhang lookupPrecision.colorThreshold = tcu::computeFixedPointThreshold(max((tcu::IVec4(8, 8, 8, 8) - (isNearestOnly ? 1 : 2)), tcu::IVec4(0))) / swizzleScaleBias(lookupScale, m_componentMapping); 1467387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 1468387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos if (tcu::isSRGB(m_texture->getTextureFormat())) 1469387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos lookupPrecision.colorThreshold += tcu::Vec4(4.f / 255.f); 1470387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 1471235561df842620267f9a58552f1506ae1012133fDominik Witczak for (int imgNdx = 0; imgNdx < m_imageCount; ++imgNdx) 1472387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos { 1473235561df842620267f9a58552f1506ae1012133fDominik Witczak // Read back result image 14745c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos UniquePtr<tcu::TextureLevel> result (readColorAttachment(m_context.getDeviceInterface(), 14755c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos m_context.getDevice(), 14765c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos m_context.getUniversalQueue(), 14775c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos m_context.getUniversalQueueFamilyIndex(), 14785c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos m_context.getDefaultAllocator(), 14795c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos **m_colorImages[imgNdx], 14805c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos m_colorFormat, 14815c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos m_renderSize)); 14825c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos const tcu::ConstPixelBufferAccess resultAccess = result->getAccess(); 14835c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos bool compareOk = validateResultImage(*m_texture, 14845c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos m_imageViewType, 14855c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos subresource, 14865c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos sampler, 14875c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos m_componentMapping, 14885c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos coordAccess, 14895c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos lodBounds, 14905c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos lookupPrecision, 14915c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos lookupScale, 14925c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos lookupBias, 14935c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos resultAccess, 14945c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos errorAccess); 14955c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos 14965c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos if (!compareOk && allowSnorm8Bug) 1497387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos { 14985c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos // HW waiver (VK-GL-CTS issue: 229) 14995c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos // 15005c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos // Due to an error in bit replication of the fixed point SNORM values, linear filtered 15015c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos // negative SNORM values will differ slightly from ideal precision in the last bit, moving 15025c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos // the values towards 0. 15035c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos // 15045c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos // This occurs on all members of the PowerVR Rogue family of GPUs 15055c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos tcu::LookupPrecision relaxedPrecision; 1506387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 15075c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos relaxedPrecision.colorThreshold += tcu::Vec4(4.f / 255.f); 1508387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 15095c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos m_context.getTestContext().getLog() 15105c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos << tcu::TestLog::Message 15115c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos << "Warning: Strict validation failed, re-trying with lower precision for SNORM8 format" 15125c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos << tcu::TestLog::EndMessage; 15135c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos anyWarnings = true; 15145c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos 15155c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos compareOk = validateResultImage(*m_texture, 15165c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos m_imageViewType, 15175c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos subresource, 15185c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos sampler, 15195c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos m_componentMapping, 15205c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos coordAccess, 15215c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos lodBounds, 15225c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos relaxedPrecision, 15235c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos lookupScale, 15245c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos lookupBias, 15255c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos resultAccess, 15265c62a113271e1127af8dc8ec9e5691b76076b9e1Pyry Haulos errorAccess); 1527235561df842620267f9a58552f1506ae1012133fDominik Witczak } 1528387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos 1529235561df842620267f9a58552f1506ae1012133fDominik Witczak if (!compareOk) 1530235561df842620267f9a58552f1506ae1012133fDominik Witczak m_context.getTestContext().getLog() 1531387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos << tcu::TestLog::Image("Result", "Result Image", resultAccess) 1532387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos << tcu::TestLog::Image("ErrorMask", "Error Mask", errorAccess); 1533235561df842620267f9a58552f1506ae1012133fDominik Witczak 1534235561df842620267f9a58552f1506ae1012133fDominik Witczak compareOkAll = compareOkAll && compareOk; 1535235561df842620267f9a58552f1506ae1012133fDominik Witczak } 153683a6066224454de177655eb414dd3453c2059536Dae Kim } 153783a6066224454de177655eb414dd3453c2059536Dae Kim 1538235561df842620267f9a58552f1506ae1012133fDominik Witczak if (compareOkAll) 1539edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos { 1540edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos if (anyWarnings) 1541edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos return tcu::TestStatus(QP_TEST_RESULT_QUALITY_WARNING, "Inaccurate filtering results"); 1542edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos else 1543edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos return tcu::TestStatus::pass("Result image matches reference"); 1544edfe7ab18f129f6d20df35dd26399dfcde8d9fb5Pyry Haulos } 154583a6066224454de177655eb414dd3453c2059536Dae Kim else 154683a6066224454de177655eb414dd3453c2059536Dae Kim return tcu::TestStatus::fail("Image mismatch"); 154783a6066224454de177655eb414dd3453c2059536Dae Kim} 154883a6066224454de177655eb414dd3453c2059536Dae Kim 154983a6066224454de177655eb414dd3453c2059536Dae Kim} // pipeline 155083a6066224454de177655eb414dd3453c2059536Dae Kim} // vkt 1551