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