• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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