xref: /aosp_15_r20/external/deqp/external/vulkancts/modules/vulkan/pipeline/vktPipelineMultisampleBase.hpp (revision 35238bce31c2a825756842865a792f8cf7f89930)
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