189deda324d50f27dfe095cbfd698956fd9972847Dae Kim#ifndef _VKIMAGEUTIL_HPP
289deda324d50f27dfe095cbfd698956fd9972847Dae Kim#define _VKIMAGEUTIL_HPP
3a8426a390a1bf56e17db7565b07f9ea4f1646d4bMika Isojärvi/*-------------------------------------------------------------------------
4a8426a390a1bf56e17db7565b07f9ea4f1646d4bMika Isojärvi * Vulkan CTS Framework
5a8426a390a1bf56e17db7565b07f9ea4f1646d4bMika Isojärvi * --------------------
689deda324d50f27dfe095cbfd698956fd9972847Dae Kim *
789deda324d50f27dfe095cbfd698956fd9972847Dae Kim * Copyright (c) 2015 The Khronos Group Inc.
889deda324d50f27dfe095cbfd698956fd9972847Dae Kim * Copyright (c) 2015 Imagination Technologies Ltd.
9a8426a390a1bf56e17db7565b07f9ea4f1646d4bMika Isojärvi * Copyright (c) 2015 Google Inc.
1089deda324d50f27dfe095cbfd698956fd9972847Dae Kim *
11978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * Licensed under the Apache License, Version 2.0 (the "License");
12978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * you may not use this file except in compliance with the License.
13978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * You may obtain a copy of the License at
1489deda324d50f27dfe095cbfd698956fd9972847Dae Kim *
15978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos *      http://www.apache.org/licenses/LICENSE-2.0
1689deda324d50f27dfe095cbfd698956fd9972847Dae Kim *
17978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * Unless required by applicable law or agreed to in writing, software
18978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * distributed under the License is distributed on an "AS IS" BASIS,
19978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
20978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * See the License for the specific language governing permissions and
21978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * limitations under the License.
2289deda324d50f27dfe095cbfd698956fd9972847Dae Kim *
2389deda324d50f27dfe095cbfd698956fd9972847Dae Kim *//*!
2489deda324d50f27dfe095cbfd698956fd9972847Dae Kim * \file
2589deda324d50f27dfe095cbfd698956fd9972847Dae Kim * \brief Utilities for images.
2689deda324d50f27dfe095cbfd698956fd9972847Dae Kim *//*--------------------------------------------------------------------*/
2789deda324d50f27dfe095cbfd698956fd9972847Dae Kim
2889deda324d50f27dfe095cbfd698956fd9972847Dae Kim#include "vkDefs.hpp"
2989deda324d50f27dfe095cbfd698956fd9972847Dae Kim#include "tcuTexture.hpp"
304698bb4451c7d984b7e070d524130deb5a775f1aDae Kim#include "tcuCompressedTexture.hpp"
3189deda324d50f27dfe095cbfd698956fd9972847Dae Kim
3289deda324d50f27dfe095cbfd698956fd9972847Dae Kimnamespace vk
3389deda324d50f27dfe095cbfd698956fd9972847Dae Kim{
3489deda324d50f27dfe095cbfd698956fd9972847Dae Kim
3568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulosbool						isFloatFormat				(VkFormat format);
3668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulosbool						isUnormFormat				(VkFormat format);
3768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulosbool						isSnormFormat				(VkFormat format);
3868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulosbool						isIntFormat					(VkFormat format);
3968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulosbool						isUintFormat				(VkFormat format);
4068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulosbool						isDepthStencilFormat		(VkFormat format);
4168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulosbool						isCompressedFormat			(VkFormat format);
428b0f318ec6cdec8e3c0cf68e16cb81bb955358a2Collin Bakerbool						isSrgbFormat				(VkFormat format);
4389deda324d50f27dfe095cbfd698956fd9972847Dae Kim
440b0c5dba7daed6439ec6352aacf3cd216d1c1dd5Pyry Haulosbool						isSupportedByFramework		(VkFormat format);
450b0c5dba7daed6439ec6352aacf3cd216d1c1dd5Pyry Haulos
4668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulostcu::TextureFormat			mapVkFormat					(VkFormat format);
4768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulostcu::CompressedTexFormat	mapVkCompressedFormat		(VkFormat format);
48bffa5385346c8425a4bfb6ed270a421e527fce8dJeff Bolztcu::TextureFormat			getDepthCopyFormat			(VkFormat combinedFormat);
49bffa5385346c8425a4bfb6ed270a421e527fce8dJeff Bolztcu::TextureFormat			getStencilCopyFormat		(VkFormat combinedFormat);
5083a6066224454de177655eb414dd3453c2059536Dae Kim
5168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulostcu::Sampler				mapVkSampler				(const VkSamplerCreateInfo& samplerCreateInfo);
5268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulostcu::Sampler::CompareMode	mapVkSamplerCompareOp		(VkCompareOp compareOp);
5368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulostcu::Sampler::WrapMode		mapVkSamplerAddressMode		(VkSamplerAddressMode addressMode);
5468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulostcu::Sampler::FilterMode	mapVkMinTexFilter			(VkFilter filter, VkSamplerMipmapMode mipMode);
5568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulostcu::Sampler::FilterMode	mapVkMagTexFilter			(VkFilter filter);
564698bb4451c7d984b7e070d524130deb5a775f1aDae Kim
5768e7282426d639b54d15c4710d97ba97e72c76efPyry HaulosVkFilter					mapFilterMode				(tcu::Sampler::FilterMode filterMode);
5868e7282426d639b54d15c4710d97ba97e72c76efPyry HaulosVkSamplerMipmapMode			mapMipmapMode				(tcu::Sampler::FilterMode filterMode);
5968e7282426d639b54d15c4710d97ba97e72c76efPyry HaulosVkSamplerAddressMode		mapWrapMode					(tcu::Sampler::WrapMode wrapMode);
6068e7282426d639b54d15c4710d97ba97e72c76efPyry HaulosVkCompareOp					mapCompareMode				(tcu::Sampler::CompareMode mode);
6168e7282426d639b54d15c4710d97ba97e72c76efPyry HaulosVkFormat					mapTextureFormat			(const tcu::TextureFormat& format);
6241702fa78437820bc601e604de6a490eb09513ddPeter SiketVkSamplerCreateInfo			mapSampler					(const tcu::Sampler& sampler, const tcu::TextureFormat& format, float minLod = 0.0f, float maxLod = 1000.0f);
6368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos
6468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulosvoid						imageUtilSelfTest			(void);
650820e8d122596ff51f723f8a4f32fa755fbbda23Pyry Haulos
6625b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos// \todo [2017-05-18 pyry] Consider moving this to tcu
6725b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulosstruct PlanarFormatDescription
6825b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos{
6925b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos	enum
7025b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos	{
7125b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos		MAX_CHANNELS	= 4,
7225b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos		MAX_PLANES		= 3
7325b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos	};
7425b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos
7525b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos	enum ChannelFlags
7625b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos	{
7725b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos		CHANNEL_R	= (1u<<0),	// Has "R" (0) channel
7825b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos		CHANNEL_G	= (1u<<1),	// Has "G" (1) channel
7925b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos		CHANNEL_B	= (1u<<2),	// Has "B" (2) channel
8025b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos		CHANNEL_A	= (1u<<3),	// Has "A" (3) channel
8125b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos	};
8225b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos
8325b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos	struct Plane
8425b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos	{
8525b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos		deUint8		elementSizeBytes;
8625b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos		deUint8		widthDivisor;
8725b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos		deUint8		heightDivisor;
8825b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos	};
8925b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos
9025b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos	struct Channel
9125b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos	{
9225b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos		deUint8		planeNdx;
9325b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos		deUint8		type;				// tcu::TextureChannelClass value
9425b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos		deUint8		offsetBits;			// Offset in element in bits
9525b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos		deUint8		sizeBits;			// Value size in bits
9625b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos		deUint8		strideBytes;		// Pixel stride (in bytes), usually plane elementSize
9725b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos	};
9825b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos
9925b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos	deUint8		numPlanes;
10025b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos	deUint8		presentChannels;
10125b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos	Plane		planes[MAX_PLANES];
10225b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos	Channel		channels[MAX_CHANNELS];
10325b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos
10425b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos	inline bool hasChannelNdx (deUint32 ndx) const
10525b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos	{
10625b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos		DE_ASSERT(de::inBounds(ndx, 0u, 4u));
10725b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos		return (presentChannels & (1u<<ndx)) != 0;
10825b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos	}
10925b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos};
11025b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos
11125b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulosbool							isYCbCrFormat					(VkFormat format);
11225b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry HaulosPlanarFormatDescription			getPlanarFormatDescription		(VkFormat format);
11325b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulosconst PlanarFormatDescription&	getYCbCrPlanarFormatDescription	(VkFormat format);
11425b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulosint								getPlaneCount					(VkFormat format);
11525b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry HaulosVkImageAspectFlagBits			getPlaneAspect					(deUint32 planeNdx);
11625b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry HaulosdeUint32						getAspectPlaneNdx				(VkImageAspectFlagBits planeAspect);
1175b4c115ff494f39261d387b12d4b539c02159169Mika Isojärvibool							isChromaSubsampled				(VkFormat format);
11825b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos
11925b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulostcu::PixelBufferAccess			getChannelAccess				(const PlanarFormatDescription&	formatInfo,
12025b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos																 const tcu::UVec2&				size,
12125b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos																 const deUint32*				planeRowPitches,
12225b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos																 void* const*					planePtrs,
12325b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos																 deUint32						channelNdx);
12425b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulostcu::ConstPixelBufferAccess		getChannelAccess				(const PlanarFormatDescription&	formatInfo,
12525b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos																 const tcu::UVec2&				size,
12625b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos																 const deUint32*				planeRowPitches,
12725b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos																 const void* const*				planePtrs,
12825b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos																 deUint32						channelNdx);
12925b25ca76377bd0e74a6dd8c72184f41ecbdebc3Pyry Haulos
13089deda324d50f27dfe095cbfd698956fd9972847Dae Kim} // vk
13189deda324d50f27dfe095cbfd698956fd9972847Dae Kim
13289deda324d50f27dfe095cbfd698956fd9972847Dae Kim#endif // _VKIMAGEUTIL_HPP
133