Add getAbi new interface am: 16fd5275d6
[platform/upstream/VK-GL-CTS.git] / external / vulkancts / modules / vulkan / pipeline / vktPipelineMultisampleBase.cpp
1 /*------------------------------------------------------------------------
2 * Vulkan Conformance Tests
3 * ------------------------
4 *
5 * Copyright (c) 2016 The Khronos Group Inc.
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 *      http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 *
19 *//*
20 * \file vktPipelineMultisampleBase.cpp
21 * \brief Multisample Tests Base Classes
22 *//*--------------------------------------------------------------------*/
23
24 #include "vktPipelineMultisampleBase.hpp"
25 #include "vkQueryUtil.hpp"
26
27 namespace vkt
28 {
29 namespace pipeline
30 {
31 namespace multisample
32 {
33
34 using namespace vk;
35
36 void MultisampleInstanceBase::validateImageSize (const InstanceInterface&       instance,
37                                                                                                  const VkPhysicalDevice         physicalDevice,
38                                                                                                  const ImageType                        imageType,
39                                                                                                  const tcu::UVec3&                      imageSize) const
40 {
41         const VkPhysicalDeviceProperties deviceProperties = getPhysicalDeviceProperties(instance, physicalDevice);
42
43         bool isImageSizeValid = true;
44
45         switch (imageType)
46         {
47                 case IMAGE_TYPE_1D:
48                         isImageSizeValid =      imageSize.x() <= deviceProperties.limits.maxImageDimension1D;
49                         break;
50                 case IMAGE_TYPE_1D_ARRAY:
51                         isImageSizeValid =      imageSize.x() <= deviceProperties.limits.maxImageDimension1D &&
52                                                                 imageSize.z() <= deviceProperties.limits.maxImageArrayLayers;
53                         break;
54                 case IMAGE_TYPE_2D:
55                         isImageSizeValid =      imageSize.x() <= deviceProperties.limits.maxImageDimension2D &&
56                                                                 imageSize.y() <= deviceProperties.limits.maxImageDimension2D;
57                         break;
58                 case IMAGE_TYPE_2D_ARRAY:
59                         isImageSizeValid =      imageSize.x() <= deviceProperties.limits.maxImageDimension2D &&
60                                                                 imageSize.y() <= deviceProperties.limits.maxImageDimension2D &&
61                                                                 imageSize.z() <= deviceProperties.limits.maxImageArrayLayers;
62                         break;
63                 case IMAGE_TYPE_CUBE:
64                         isImageSizeValid =      imageSize.x() <= deviceProperties.limits.maxImageDimensionCube &&
65                                                                 imageSize.y() <= deviceProperties.limits.maxImageDimensionCube;
66                         break;
67                 case IMAGE_TYPE_CUBE_ARRAY:
68                         isImageSizeValid =      imageSize.x() <= deviceProperties.limits.maxImageDimensionCube &&
69                                                                 imageSize.y() <= deviceProperties.limits.maxImageDimensionCube &&
70                                                                 imageSize.z() <= deviceProperties.limits.maxImageArrayLayers;
71                         break;
72                 case IMAGE_TYPE_3D:
73                         isImageSizeValid =      imageSize.x() <= deviceProperties.limits.maxImageDimension3D &&
74                                                                 imageSize.y() <= deviceProperties.limits.maxImageDimension3D &&
75                                                                 imageSize.z() <= deviceProperties.limits.maxImageDimension3D;
76                         break;
77                 default:
78                         DE_FATAL("Unknown image type");
79         }
80
81         if (!isImageSizeValid)
82         {
83                 std::ostringstream      notSupportedStream;
84
85                 notSupportedStream << "Image type (" << getImageTypeName(imageType) << ") with size (" << imageSize.x() << ", " << imageSize.y() << ", " << imageSize.z() << ") not supported by device" << std::endl;
86
87                 const std::string notSupportedString = notSupportedStream.str();
88
89                 TCU_THROW(NotSupportedError, notSupportedString.c_str());
90         }
91 }
92
93 void MultisampleInstanceBase::validateImageFeatureFlags (const InstanceInterface&       instance,
94                                                                                                                  const VkPhysicalDevice         physicalDevice,
95                                                                                                                  const VkFormat                         format,
96                                                                                                                  const VkFormatFeatureFlags     featureFlags) const
97 {
98         const VkFormatProperties formatProperties = getPhysicalDeviceFormatProperties(instance, physicalDevice, format);
99
100         if ((formatProperties.optimalTilingFeatures & featureFlags) != featureFlags)
101         {
102                 std::ostringstream      notSupportedStream;
103
104                 notSupportedStream << "Device does not support image format " << format << " for feature flags " << featureFlags << std::endl;
105
106                 const std::string notSupportedString = notSupportedStream.str();
107
108                 TCU_THROW(NotSupportedError, notSupportedString.c_str());
109         }
110 }
111
112 void MultisampleInstanceBase::validateImageInfo (const InstanceInterface&       instance,
113                                                                                                  const VkPhysicalDevice         physicalDevice,
114                                                                                                  const VkImageCreateInfo&       imageInfo) const
115 {
116         VkImageFormatProperties imageFormatProps;
117         instance.getPhysicalDeviceImageFormatProperties(physicalDevice, imageInfo.format, imageInfo.imageType, imageInfo.tiling, imageInfo.usage, imageInfo.flags, &imageFormatProps);
118
119         if (imageFormatProps.maxExtent.width  < imageInfo.extent.width  ||
120                 imageFormatProps.maxExtent.height < imageInfo.extent.height ||
121                 imageFormatProps.maxExtent.depth  < imageInfo.extent.depth)
122         {
123                 std::ostringstream      notSupportedStream;
124
125                 notSupportedStream      << "Image extent ("
126                                                         << imageInfo.extent.width  << ", "
127                                                         << imageInfo.extent.height << ", "
128                                                         << imageInfo.extent.depth
129                                                         << ") exceeds allowed maximum ("
130                                                         << imageFormatProps.maxExtent.width <<  ", "
131                                                         << imageFormatProps.maxExtent.height << ", "
132                                                         << imageFormatProps.maxExtent.depth
133                                                         << ")"
134                                                         << std::endl;
135
136                 const std::string notSupportedString = notSupportedStream.str();
137
138                 TCU_THROW(NotSupportedError, notSupportedString.c_str());
139         }
140
141         if (imageFormatProps.maxArrayLayers < imageInfo.arrayLayers)
142         {
143                 std::ostringstream      notSupportedStream;
144
145                 notSupportedStream << "Image layers count of " << imageInfo.arrayLayers << " exceeds allowed maximum which is " << imageFormatProps.maxArrayLayers << std::endl;
146
147                 const std::string notSupportedString = notSupportedStream.str();
148
149                 TCU_THROW(NotSupportedError, notSupportedString.c_str());
150         }
151
152         if (!(imageFormatProps.sampleCounts & imageInfo.samples))
153         {
154                 std::ostringstream      notSupportedStream;
155
156                 notSupportedStream << "Samples count of " << imageInfo.samples << " not supported for image" << std::endl;
157
158                 const std::string notSupportedString = notSupportedStream.str();
159
160                 TCU_THROW(NotSupportedError, notSupportedString.c_str());
161         }
162 }
163
164 } // multisample
165 } // pipeline
166 } // vkt