1e5c31af7Sopenharmony_ci#ifndef _VKTYCBCRUTIL_HPP 2e5c31af7Sopenharmony_ci#define _VKTYCBCRUTIL_HPP 3e5c31af7Sopenharmony_ci/*------------------------------------------------------------------------- 4e5c31af7Sopenharmony_ci * Vulkan Conformance Tests 5e5c31af7Sopenharmony_ci * ------------------------ 6e5c31af7Sopenharmony_ci * 7e5c31af7Sopenharmony_ci * Copyright (c) 2017 Google Inc. 8e5c31af7Sopenharmony_ci * 9e5c31af7Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 10e5c31af7Sopenharmony_ci * you may not use this file except in compliance with the License. 11e5c31af7Sopenharmony_ci * You may obtain a copy of the License at 12e5c31af7Sopenharmony_ci * 13e5c31af7Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 14e5c31af7Sopenharmony_ci * 15e5c31af7Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 16e5c31af7Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 17e5c31af7Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 18e5c31af7Sopenharmony_ci * See the License for the specific language governing permissions and 19e5c31af7Sopenharmony_ci * limitations under the License. 20e5c31af7Sopenharmony_ci * 21e5c31af7Sopenharmony_ci *//*! 22e5c31af7Sopenharmony_ci * \file 23e5c31af7Sopenharmony_ci * \brief YCbCr Test Utilities 24e5c31af7Sopenharmony_ci *//*--------------------------------------------------------------------*/ 25e5c31af7Sopenharmony_ci 26e5c31af7Sopenharmony_ci#include "tcuDefs.hpp" 27e5c31af7Sopenharmony_ci 28e5c31af7Sopenharmony_ci#include "vktTestCase.hpp" 29e5c31af7Sopenharmony_ci 30e5c31af7Sopenharmony_ci#include "vkImageUtil.hpp" 31e5c31af7Sopenharmony_ci#include "vkMemUtil.hpp" 32e5c31af7Sopenharmony_ci#include "vkRef.hpp" 33e5c31af7Sopenharmony_ci 34e5c31af7Sopenharmony_ci#include "deSharedPtr.hpp" 35e5c31af7Sopenharmony_ci#include "deRandom.hpp" 36e5c31af7Sopenharmony_ci 37e5c31af7Sopenharmony_ci#include "tcuTextureUtil.hpp" 38e5c31af7Sopenharmony_ci#include "tcuFloatFormat.hpp" 39e5c31af7Sopenharmony_ci#include "tcuFloat.hpp" 40e5c31af7Sopenharmony_ci#include "tcuInterval.hpp" 41e5c31af7Sopenharmony_ci#include "tcuFloatFormat.hpp" 42e5c31af7Sopenharmony_ci#include "tcuFloat.hpp" 43e5c31af7Sopenharmony_ci 44e5c31af7Sopenharmony_ci#include <vector> 45e5c31af7Sopenharmony_ci 46e5c31af7Sopenharmony_cinamespace vkt 47e5c31af7Sopenharmony_ci{ 48e5c31af7Sopenharmony_cinamespace ycbcr 49e5c31af7Sopenharmony_ci{ 50e5c31af7Sopenharmony_ci 51e5c31af7Sopenharmony_ci#define VK_YCBCR_FORMAT_FIRST VK_FORMAT_G8B8G8R8_422_UNORM 52e5c31af7Sopenharmony_ci#define VK_YCBCR_FORMAT_LAST ((vk::VkFormat)(VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM+1)) 53e5c31af7Sopenharmony_ci 54e5c31af7Sopenharmony_citypedef de::SharedPtr<vk::Allocation> AllocationSp; 55e5c31af7Sopenharmony_citypedef de::SharedPtr<vk::Unique<vk::VkBuffer> > VkBufferSp; 56e5c31af7Sopenharmony_ci 57e5c31af7Sopenharmony_ciclass MultiPlaneImageData 58e5c31af7Sopenharmony_ci{ 59e5c31af7Sopenharmony_cipublic: 60e5c31af7Sopenharmony_ci MultiPlaneImageData (vk::VkFormat format, const tcu::UVec2& size); 61e5c31af7Sopenharmony_ci MultiPlaneImageData (const MultiPlaneImageData&); 62e5c31af7Sopenharmony_ci ~MultiPlaneImageData (void); 63e5c31af7Sopenharmony_ci 64e5c31af7Sopenharmony_ci vk::VkFormat getFormat (void) const { return m_format; } 65e5c31af7Sopenharmony_ci const vk::PlanarFormatDescription& getDescription (void) const { return m_description; } 66e5c31af7Sopenharmony_ci const tcu::UVec2& getSize (void) const { return m_size; } 67e5c31af7Sopenharmony_ci 68e5c31af7Sopenharmony_ci size_t getPlaneSize (deUint32 planeNdx) const { return m_planeData[planeNdx].size(); } 69e5c31af7Sopenharmony_ci void* getPlanePtr (deUint32 planeNdx) { return &m_planeData[planeNdx][0]; } 70e5c31af7Sopenharmony_ci const void* getPlanePtr (deUint32 planeNdx) const { return &m_planeData[planeNdx][0]; } 71e5c31af7Sopenharmony_ci 72e5c31af7Sopenharmony_ci tcu::PixelBufferAccess getChannelAccess (deUint32 channelNdx); 73e5c31af7Sopenharmony_ci tcu::ConstPixelBufferAccess getChannelAccess (deUint32 channelNdx) const; 74e5c31af7Sopenharmony_ci 75e5c31af7Sopenharmony_ciprivate: 76e5c31af7Sopenharmony_ci MultiPlaneImageData& operator= (const MultiPlaneImageData&); 77e5c31af7Sopenharmony_ci 78e5c31af7Sopenharmony_ci const vk::VkFormat m_format; 79e5c31af7Sopenharmony_ci const vk::PlanarFormatDescription m_description; 80e5c31af7Sopenharmony_ci const tcu::UVec2 m_size; 81e5c31af7Sopenharmony_ci 82e5c31af7Sopenharmony_ci std::vector<deUint8> m_planeData[vk::PlanarFormatDescription::MAX_PLANES]; 83e5c31af7Sopenharmony_ci}; 84e5c31af7Sopenharmony_ci 85e5c31af7Sopenharmony_civoid checkImageSupport (Context& context, vk::VkFormat format, vk::VkImageCreateFlags createFlags, vk::VkImageTiling tiling = vk::VK_IMAGE_TILING_OPTIMAL); 86e5c31af7Sopenharmony_ci 87e5c31af7Sopenharmony_civoid fillRandomNoNaN (de::Random* randomGen, deUint8* const data, deUint32 size, const vk::VkFormat format); 88e5c31af7Sopenharmony_civoid fillRandom (de::Random* randomGen, MultiPlaneImageData* imageData, const vk::VkFormat format = vk::VK_FORMAT_UNDEFINED, bool noNan = false); 89e5c31af7Sopenharmony_civoid fillGradient (MultiPlaneImageData* imageData, const tcu::Vec4& minVal, const tcu::Vec4& maxVal); 90e5c31af7Sopenharmony_civoid fillZero (MultiPlaneImageData* imageData); 91e5c31af7Sopenharmony_ci 92e5c31af7Sopenharmony_cistd::vector<de::SharedPtr<vk::Allocation> > allocateAndBindImageMemory (const vk::DeviceInterface& vkd, 93e5c31af7Sopenharmony_ci vk::VkDevice device, 94e5c31af7Sopenharmony_ci vk::Allocator& allocator, 95e5c31af7Sopenharmony_ci vk::VkImage image, 96e5c31af7Sopenharmony_ci vk::VkFormat format, 97e5c31af7Sopenharmony_ci vk::VkImageCreateFlags createFlags, 98e5c31af7Sopenharmony_ci vk::MemoryRequirement requirement = vk::MemoryRequirement::Any); 99e5c31af7Sopenharmony_ci 100e5c31af7Sopenharmony_civoid uploadImage (const vk::DeviceInterface& vkd, 101e5c31af7Sopenharmony_ci vk::VkDevice device, 102e5c31af7Sopenharmony_ci deUint32 queueFamilyNdx, 103e5c31af7Sopenharmony_ci vk::Allocator& allocator, 104e5c31af7Sopenharmony_ci vk::VkImage image, 105e5c31af7Sopenharmony_ci const MultiPlaneImageData& imageData, 106e5c31af7Sopenharmony_ci vk::VkAccessFlags nextAccess, 107e5c31af7Sopenharmony_ci vk::VkImageLayout finalLayout, 108e5c31af7Sopenharmony_ci deUint32 arrayLayer = 0u); 109e5c31af7Sopenharmony_ci 110e5c31af7Sopenharmony_civoid fillImageMemory (const vk::DeviceInterface& vkd, 111e5c31af7Sopenharmony_ci vk::VkDevice device, 112e5c31af7Sopenharmony_ci deUint32 queueFamilyNdx, 113e5c31af7Sopenharmony_ci vk::VkImage image, 114e5c31af7Sopenharmony_ci const std::vector<de::SharedPtr<vk::Allocation> >& memory, 115e5c31af7Sopenharmony_ci const MultiPlaneImageData& imageData, 116e5c31af7Sopenharmony_ci vk::VkAccessFlags nextAccess, 117e5c31af7Sopenharmony_ci vk::VkImageLayout finalLayout, 118e5c31af7Sopenharmony_ci deUint32 arrayLayer = 0u); 119e5c31af7Sopenharmony_ci 120e5c31af7Sopenharmony_civoid downloadImage (const vk::DeviceInterface& vkd, 121e5c31af7Sopenharmony_ci vk::VkDevice device, 122e5c31af7Sopenharmony_ci deUint32 queueFamilyNdx, 123e5c31af7Sopenharmony_ci vk::Allocator& allocator, 124e5c31af7Sopenharmony_ci vk::VkImage image, 125e5c31af7Sopenharmony_ci MultiPlaneImageData* imageData, 126e5c31af7Sopenharmony_ci vk::VkAccessFlags prevAccess, 127e5c31af7Sopenharmony_ci vk::VkImageLayout initialLayout, 128e5c31af7Sopenharmony_ci uint32_t baseArrayLayer = 0); 129e5c31af7Sopenharmony_ci 130e5c31af7Sopenharmony_civoid readImageMemory (const vk::DeviceInterface& vkd, 131e5c31af7Sopenharmony_ci vk::VkDevice device, 132e5c31af7Sopenharmony_ci deUint32 queueFamilyNdx, 133e5c31af7Sopenharmony_ci vk::VkImage image, 134e5c31af7Sopenharmony_ci const std::vector<de::SharedPtr<vk::Allocation> >& memory, 135e5c31af7Sopenharmony_ci MultiPlaneImageData* imageData, 136e5c31af7Sopenharmony_ci vk::VkAccessFlags prevAccess, 137e5c31af7Sopenharmony_ci vk::VkImageLayout initialLayout); 138e5c31af7Sopenharmony_ci 139e5c31af7Sopenharmony_ciclass ChannelAccess 140e5c31af7Sopenharmony_ci{ 141e5c31af7Sopenharmony_cipublic: 142e5c31af7Sopenharmony_ci ChannelAccess (tcu::TextureChannelClass channelClass, 143e5c31af7Sopenharmony_ci deUint8 channelSize, 144e5c31af7Sopenharmony_ci const tcu::IVec3& size, 145e5c31af7Sopenharmony_ci const tcu::IVec3& bitPitch, 146e5c31af7Sopenharmony_ci void* data, 147e5c31af7Sopenharmony_ci deUint32 bitOffset); 148e5c31af7Sopenharmony_ci 149e5c31af7Sopenharmony_ci const tcu::IVec3& getSize (void) const { return m_size; } 150e5c31af7Sopenharmony_ci const tcu::IVec3& getBitPitch (void) const { return m_bitPitch; } 151e5c31af7Sopenharmony_ci void* getDataPtr (void) const { return m_data; } 152e5c31af7Sopenharmony_ci 153e5c31af7Sopenharmony_ci tcu::Interval getChannel (const tcu::FloatFormat& conversionFormat, 154e5c31af7Sopenharmony_ci const tcu::IVec3& pos) const; 155e5c31af7Sopenharmony_ci deUint32 getChannelUint (const tcu::IVec3& pos) const; 156e5c31af7Sopenharmony_ci float getChannel (const tcu::IVec3& pos) const; 157e5c31af7Sopenharmony_ci void setChannel (const tcu::IVec3& pos, 158e5c31af7Sopenharmony_ci deUint32 x); 159e5c31af7Sopenharmony_ci void setChannel (const tcu::IVec3& pos, 160e5c31af7Sopenharmony_ci float x); 161e5c31af7Sopenharmony_ci 162e5c31af7Sopenharmony_ciprivate: 163e5c31af7Sopenharmony_ci const tcu::TextureChannelClass m_channelClass; 164e5c31af7Sopenharmony_ci const deUint8 m_channelSize; 165e5c31af7Sopenharmony_ci const tcu::IVec3 m_size; 166e5c31af7Sopenharmony_ci const tcu::IVec3 m_bitPitch; 167e5c31af7Sopenharmony_ci void* const m_data; 168e5c31af7Sopenharmony_ci const deInt32 m_bitOffset; 169e5c31af7Sopenharmony_ci}; 170e5c31af7Sopenharmony_ci 171e5c31af7Sopenharmony_ciChannelAccess getChannelAccess (ycbcr::MultiPlaneImageData& data, 172e5c31af7Sopenharmony_ci const vk::PlanarFormatDescription& formatInfo, 173e5c31af7Sopenharmony_ci const tcu::UVec2& size, 174e5c31af7Sopenharmony_ci int channelNdx); 175e5c31af7Sopenharmony_ci 176e5c31af7Sopenharmony_cibool isYChromaSubsampled (vk::VkFormat format); 177e5c31af7Sopenharmony_ci 178e5c31af7Sopenharmony_cibool isXChromaSubsampled (vk::VkFormat format); 179e5c31af7Sopenharmony_ci 180e5c31af7Sopenharmony_cibool areLsb6BitsDontCare (vk::VkFormat srcFormat, 181e5c31af7Sopenharmony_ci vk::VkFormat dstFormat); 182e5c31af7Sopenharmony_ci 183e5c31af7Sopenharmony_cibool areLsb4BitsDontCare (vk::VkFormat srcFormat, 184e5c31af7Sopenharmony_ci vk::VkFormat dstFormat); 185e5c31af7Sopenharmony_ci 186e5c31af7Sopenharmony_citcu::UVec4 getYCbCrBitDepth (vk::VkFormat format); 187e5c31af7Sopenharmony_ci 188e5c31af7Sopenharmony_cistd::vector<tcu::FloatFormat> getPrecision (vk::VkFormat format); 189e5c31af7Sopenharmony_ci 190e5c31af7Sopenharmony_cideUint32 getYCbCrFormatChannelCount (vk::VkFormat format); 191e5c31af7Sopenharmony_ci 192e5c31af7Sopenharmony_ciint wrap (vk::VkSamplerAddressMode addressMode, 193e5c31af7Sopenharmony_ci int coord, 194e5c31af7Sopenharmony_ci int size); 195e5c31af7Sopenharmony_ci 196e5c31af7Sopenharmony_ciint divFloor (int a, 197e5c31af7Sopenharmony_ci int b); 198e5c31af7Sopenharmony_ci 199e5c31af7Sopenharmony_civoid calculateBounds (const ChannelAccess& rPlane, 200e5c31af7Sopenharmony_ci const ChannelAccess& gPlane, 201e5c31af7Sopenharmony_ci const ChannelAccess& bPlane, 202e5c31af7Sopenharmony_ci const ChannelAccess& aPlane, 203e5c31af7Sopenharmony_ci const tcu::UVec4& bitDepth, 204e5c31af7Sopenharmony_ci const std::vector<tcu::Vec2>& sts, 205e5c31af7Sopenharmony_ci const std::vector<tcu::FloatFormat>& filteringFormat, 206e5c31af7Sopenharmony_ci const std::vector<tcu::FloatFormat>& conversionFormat, 207e5c31af7Sopenharmony_ci const deUint32 subTexelPrecisionBits, 208e5c31af7Sopenharmony_ci vk::VkFilter filter, 209e5c31af7Sopenharmony_ci vk::VkSamplerYcbcrModelConversion colorModel, 210e5c31af7Sopenharmony_ci vk::VkSamplerYcbcrRange range, 211e5c31af7Sopenharmony_ci vk::VkFilter chromaFilter, 212e5c31af7Sopenharmony_ci vk::VkChromaLocation xChromaOffset, 213e5c31af7Sopenharmony_ci vk::VkChromaLocation yChromaOffset, 214e5c31af7Sopenharmony_ci const vk::VkComponentMapping& componentMapping, 215e5c31af7Sopenharmony_ci bool explicitReconstruction, 216e5c31af7Sopenharmony_ci vk::VkSamplerAddressMode addressModeU, 217e5c31af7Sopenharmony_ci vk::VkSamplerAddressMode addressModeV, 218e5c31af7Sopenharmony_ci std::vector<tcu::Vec4>& minBounds, 219e5c31af7Sopenharmony_ci std::vector<tcu::Vec4>& maxBounds, 220e5c31af7Sopenharmony_ci std::vector<tcu::Vec4>& uvBounds, 221e5c31af7Sopenharmony_ci std::vector<tcu::IVec4>& ijBounds); 222e5c31af7Sopenharmony_ci 223e5c31af7Sopenharmony_ci} // ycbcr 224e5c31af7Sopenharmony_ci} // vkt 225e5c31af7Sopenharmony_ci 226e5c31af7Sopenharmony_ci#endif // _VKTYCBCRUTIL_HPP 227