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