• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*------------------------------------------------------------------------
2  * Vulkan Conformance Tests
3  * ------------------------
4  *
5  * Copyright (c) 2016 The Khronos Group Inc.
6  * Copyright (c) 2016 The Android Open Source Project
7  *
8  * Licensed under the Apache License, Version 2.0 (the "License");
9  * you may not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  *
12  *      http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  *
20  *//*!
21  * \file
22  * \brief Image load/store utilities
23  *//*--------------------------------------------------------------------*/
24 
25 #include "vktImageLoadStoreUtil.hpp"
26 #include "vkQueryUtil.hpp"
27 
28 using namespace vk;
29 
30 namespace vkt
31 {
32 namespace image
33 {
34 
computeStoreColorScale(const vk::VkFormat format,const tcu::IVec3 imageSize)35 float computeStoreColorScale (const vk::VkFormat format, const tcu::IVec3 imageSize)
36 {
37 	const int maxImageDimension = de::max(imageSize.x(), de::max(imageSize.y(), imageSize.z()));
38 	const float div = static_cast<float>(maxImageDimension - 1);
39 
40 	if (isUnormFormat(format))
41 		return 1.0f / div;
42 	else if (isSnormFormat(format))
43 		return 2.0f / div;
44 	else
45 		return 1.0f;
46 }
47 
getImageTypeForSingleLayer(const ImageType imageType)48 ImageType getImageTypeForSingleLayer (const ImageType imageType)
49 {
50 	switch (imageType)
51 	{
52 		case IMAGE_TYPE_1D:
53 		case IMAGE_TYPE_1D_ARRAY:
54 			return IMAGE_TYPE_1D;
55 
56 		case IMAGE_TYPE_2D:
57 		case IMAGE_TYPE_2D_ARRAY:
58 		case IMAGE_TYPE_CUBE:
59 		case IMAGE_TYPE_CUBE_ARRAY:
60 			// A single layer for cube is a 2d face
61 			return IMAGE_TYPE_2D;
62 
63 		case IMAGE_TYPE_3D:
64 			return IMAGE_TYPE_3D;
65 
66 		case IMAGE_TYPE_BUFFER:
67 			return IMAGE_TYPE_BUFFER;
68 
69 		default:
70 			DE_FATAL("Internal test error");
71 			return IMAGE_TYPE_LAST;
72 	}
73 }
74 
makeImageCreateInfo(const Texture & texture,const VkFormat format,const VkImageUsageFlags usage,const VkImageCreateFlags flags)75 VkImageCreateInfo makeImageCreateInfo (const Texture& texture, const VkFormat format, const VkImageUsageFlags usage, const VkImageCreateFlags flags)
76 {
77 	const VkSampleCountFlagBits samples = static_cast<VkSampleCountFlagBits>(texture.numSamples());	// integer and bit mask are aligned, so we can cast like this
78 
79 	const VkImageCreateInfo imageParams =
80 	{
81 		VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,														// VkStructureType			sType;
82 		DE_NULL,																					// const void*				pNext;
83 		(isCube(texture) ? (VkImageCreateFlags)VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT : 0u) | flags,	// VkImageCreateFlags		flags;
84 		mapImageType(texture.type()),																// VkImageType				imageType;
85 		format,																						// VkFormat					format;
86 		makeExtent3D(texture.layerSize()),															// VkExtent3D				extent;
87 		1u,																							// deUint32					mipLevels;
88 		(deUint32)texture.numLayers(),																// deUint32					arrayLayers;
89 		samples,																					// VkSampleCountFlagBits	samples;
90 		VK_IMAGE_TILING_OPTIMAL,																	// VkImageTiling			tiling;
91 		usage,																						// VkImageUsageFlags		usage;
92 		VK_SHARING_MODE_EXCLUSIVE,																	// VkSharingMode			sharingMode;
93 		0u,																							// deUint32					queueFamilyIndexCount;
94 		DE_NULL,																					// const deUint32*			pQueueFamilyIndices;
95 		VK_IMAGE_LAYOUT_UNDEFINED,																	// VkImageLayout			initialLayout;
96 	};
97 	return imageParams;
98 }
99 
100 
101 //! Minimum chunk size is determined by the offset alignment requirements.
getOptimalUniformBufferChunkSize(const InstanceInterface & vki,const VkPhysicalDevice physDevice,VkDeviceSize minimumRequiredChunkSizeBytes)102 VkDeviceSize getOptimalUniformBufferChunkSize (const InstanceInterface& vki, const VkPhysicalDevice physDevice, VkDeviceSize minimumRequiredChunkSizeBytes)
103 {
104 	const VkPhysicalDeviceProperties properties = getPhysicalDeviceProperties(vki, physDevice);
105 	const VkDeviceSize alignment = properties.limits.minUniformBufferOffsetAlignment;
106 
107 	if (minimumRequiredChunkSizeBytes > alignment)
108 		return alignment + (minimumRequiredChunkSizeBytes / alignment) * alignment;
109 	else
110 		return alignment;
111 }
112 
113 } // image
114 } // vkt
115