1 #ifndef _VKTPIPELINEMULTISAMPLEBASE_HPP
2 #define _VKTPIPELINEMULTISAMPLEBASE_HPP
3 /*------------------------------------------------------------------------
4 * Vulkan Conformance Tests
5 * ------------------------
6 *
7 * Copyright (c) 2016 The Khronos Group Inc.
8 * Copyright (c) 2023 LunarG, Inc.
9 * Copyright (c) 2023 Nintendo
10 *
11 * Licensed under the Apache License, Version 2.0 (the "License");
12 * you may not use this file except in compliance with the License.
13 * You may obtain a copy of the License at
14 *
15 * http://www.apache.org/licenses/LICENSE-2.0
16 *
17 * Unless required by applicable law or agreed to in writing, software
18 * distributed under the License is distributed on an "AS IS" BASIS,
19 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
20 * See the License for the specific language governing permissions and
21 * limitations under the License.
22 *
23 *//*!
24 * \file vktPipelineMultisampleBase.hpp
25 * \brief Multisample Tests Base Classes
26 *//*--------------------------------------------------------------------*/
27
28 #include "vktPipelineMultisampleTestsUtil.hpp"
29 #include "vkPipelineConstructionUtil.hpp"
30 #include "vktTestCase.hpp"
31 #include "tcuVector.hpp"
32
33 namespace vkt
34 {
35 namespace pipeline
36 {
37 namespace multisample
38 {
39
40 enum class ComponentSource
41 {
42 NONE = 0,
43 CONSTANT = 1,
44 PUSH_CONSTANT = 2,
45 };
46
47 struct ComponentData
48 {
ComponentDatavkt::pipeline::multisample::ComponentData49 ComponentData() : source{ComponentSource::NONE}, index{0u}
50 {
51 }
52
ComponentDatavkt::pipeline::multisample::ComponentData53 ComponentData(ComponentSource source_, uint32_t index_) : source{source_}, index{index_}
54 {
55 }
56
ComponentDatavkt::pipeline::multisample::ComponentData57 ComponentData(const ComponentData &other) : source{other.source}, index{other.index}
58 {
59 }
60
61 ComponentSource source;
62 uint32_t index;
63 };
64
65 struct ImageMSParams
66 {
ImageMSParamsvkt::pipeline::multisample::ImageMSParams67 ImageMSParams(const vk::PipelineConstructionType pipelineConstructionType_,
68 const vk::VkSampleCountFlagBits numSamples_, const tcu::UVec3 imageSize_,
69 const ComponentData componentData_, const float shadingRate_)
70 : pipelineConstructionType(pipelineConstructionType_)
71 , numSamples(numSamples_)
72 , imageSize(imageSize_)
73 , componentData(componentData_)
74 , shadingRate(shadingRate_)
75 {
76 }
77
78 vk::PipelineConstructionType pipelineConstructionType;
79 vk::VkSampleCountFlagBits numSamples;
80 tcu::UVec3 imageSize;
81 ComponentData componentData;
82 const float shadingRate;
83 };
84
85 class MultisampleCaseBase : public TestCase
86 {
87 public:
MultisampleCaseBase(tcu::TestContext & testCtx,const std::string & name,const ImageMSParams & imageMSParams)88 MultisampleCaseBase(tcu::TestContext &testCtx, const std::string &name, const ImageMSParams &imageMSParams)
89 : TestCase(testCtx, name)
90 , m_imageMSParams(imageMSParams)
91 {
92 }
checkSupport(Context & context) const93 virtual void checkSupport(Context &context) const
94 {
95 checkGraphicsPipelineLibrarySupport(context);
96 }
97
98 protected:
checkGraphicsPipelineLibrarySupport(Context & context) const99 void checkGraphicsPipelineLibrarySupport(Context &context) const
100 {
101 checkPipelineConstructionRequirements(context.getInstanceInterface(), context.getPhysicalDevice(),
102 m_imageMSParams.pipelineConstructionType);
103 }
104
105 protected:
106 const ImageMSParams m_imageMSParams;
107 };
108
109 typedef MultisampleCaseBase *(*MultisampleCaseFuncPtr)(tcu::TestContext &testCtx, const std::string &name,
110 const ImageMSParams &imageMSParams);
111
112 class MultisampleInstanceBase : public TestInstance
113 {
114 public:
MultisampleInstanceBase(Context & context,const ImageMSParams & imageMSParams)115 MultisampleInstanceBase(Context &context, const ImageMSParams &imageMSParams)
116 : TestInstance(context)
117 , m_imageMSParams(imageMSParams)
118 , m_imageType(IMAGE_TYPE_2D)
119 , m_imageFormat(tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8))
120 {
121 }
122
123 typedef std::vector<vk::VkVertexInputAttributeDescription> VertexAttribDescVec;
124
125 struct VertexDataDesc
126 {
127 vk::VkPrimitiveTopology primitiveTopology;
128 uint32_t verticesCount;
129 uint32_t dataStride;
130 vk::VkDeviceSize dataSize;
131 VertexAttribDescVec vertexAttribDescVec;
132 };
133
134 protected:
135 void validateImageSize(const vk::InstanceInterface &instance, const vk::VkPhysicalDevice physicalDevice,
136 const ImageType imageType, const tcu::UVec3 &imageSize) const;
137
138 void validateImageFeatureFlags(const vk::InstanceInterface &instance, const vk::VkPhysicalDevice physicalDevice,
139 const vk::VkFormat format, const vk::VkFormatFeatureFlags featureFlags) const;
140
141 void validateImageInfo(const vk::InstanceInterface &instance, const vk::VkPhysicalDevice physicalDevice,
142 const vk::VkImageCreateInfo &imageInfo) const;
143
144 virtual VertexDataDesc getVertexDataDescripton(void) const = 0;
145
146 virtual void uploadVertexData(const vk::Allocation &vertexBufferAllocation,
147 const VertexDataDesc &vertexDataDescripton) const = 0;
148
149 protected:
150 const ImageMSParams m_imageMSParams;
151 const ImageType m_imageType;
152 const tcu::TextureFormat m_imageFormat;
153 };
154
155 } // namespace multisample
156
157 template <class CaseClass>
makeMSGroup(tcu::TestContext & testCtx,const std::string groupName,const vk::PipelineConstructionType pipelineConstructionType,const tcu::UVec3 imageSizes[],const uint32_t imageSizesElemCount,const vk::VkSampleCountFlagBits imageSamples[],const uint32_t imageSamplesElemCount,const multisample::ComponentData & componentData=multisample::ComponentData{},const float shadingRate=1.0f)158 tcu::TestCaseGroup *makeMSGroup(tcu::TestContext &testCtx, const std::string groupName,
159 const vk::PipelineConstructionType pipelineConstructionType,
160 const tcu::UVec3 imageSizes[], const uint32_t imageSizesElemCount,
161 const vk::VkSampleCountFlagBits imageSamples[], const uint32_t imageSamplesElemCount,
162 const multisample::ComponentData &componentData = multisample::ComponentData{},
163 const float shadingRate = 1.0f)
164 {
165 de::MovePtr<tcu::TestCaseGroup> caseGroup(new tcu::TestCaseGroup(testCtx, groupName.c_str()));
166
167 for (uint32_t imageSizeNdx = 0u; imageSizeNdx < imageSizesElemCount; ++imageSizeNdx)
168 {
169 const tcu::UVec3 imageSize = imageSizes[imageSizeNdx];
170 std::ostringstream imageSizeStream;
171
172 imageSizeStream << imageSize.x() << "_" << imageSize.y() << "_" << imageSize.z();
173
174 de::MovePtr<tcu::TestCaseGroup> sizeGroup(new tcu::TestCaseGroup(testCtx, imageSizeStream.str().c_str()));
175
176 for (uint32_t imageSamplesNdx = 0u; imageSamplesNdx < imageSamplesElemCount; ++imageSamplesNdx)
177 {
178 const vk::VkSampleCountFlagBits samples = imageSamples[imageSamplesNdx];
179 const multisample::ImageMSParams imageMSParams{
180 pipelineConstructionType, samples, imageSize, componentData, shadingRate,
181 };
182
183 sizeGroup->addChild(CaseClass::createCase(testCtx, "samples_" + de::toString(samples), imageMSParams));
184 }
185
186 caseGroup->addChild(sizeGroup.release());
187 }
188 return caseGroup.release();
189 }
190
191 } // namespace pipeline
192 } // namespace vkt
193
194 #endif // _VKTPIPELINEMULTISAMPLEBASE_HPP
195