• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*------------------------------------------------------------------------
2  * Vulkan Conformance Tests
3  * ------------------------
4  *
5  * Copyright (c) 2018 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
21  * \brief RenderPass utils
22  *//*--------------------------------------------------------------------*/
23 
24 #include "vktMultiViewRenderPassUtil.hpp"
25 #include "tcuTestCase.hpp"
26 #include "vkRefUtil.hpp"
27 
28 using namespace vk;
29 
30 namespace vkt
31 {
32 namespace MultiView
33 {
34 
AttachmentDescription1(const void * pNext_,VkAttachmentDescriptionFlags flags_,VkFormat format_,VkSampleCountFlagBits samples_,VkAttachmentLoadOp loadOp_,VkAttachmentStoreOp storeOp_,VkAttachmentLoadOp stencilLoadOp_,VkAttachmentStoreOp stencilStoreOp_,VkImageLayout initialLayout_,VkImageLayout finalLayout_)35 AttachmentDescription1::AttachmentDescription1 (const void*						pNext_,
36 												VkAttachmentDescriptionFlags	flags_,
37 												VkFormat						format_,
38 												VkSampleCountFlagBits			samples_,
39 												VkAttachmentLoadOp				loadOp_,
40 												VkAttachmentStoreOp				storeOp_,
41 												VkAttachmentLoadOp				stencilLoadOp_,
42 												VkAttachmentStoreOp				stencilStoreOp_,
43 												VkImageLayout					initialLayout_,
44 												VkImageLayout					finalLayout_)
45 {
46 	DE_ASSERT(pNext_ == DE_NULL);
47 
48 	// No sType field in this struct
49 	DE_UNREF(pNext_);
50 	flags			= flags_;
51 	format			= format_;
52 	samples			= samples_;
53 	loadOp			= loadOp_;
54 	storeOp			= storeOp_;
55 	stencilLoadOp	= stencilLoadOp_;
56 	stencilStoreOp	= stencilStoreOp_;
57 	initialLayout	= initialLayout_;
58 	finalLayout		= finalLayout_;
59 }
60 
AttachmentDescription2(const void * pNext_,VkAttachmentDescriptionFlags flags_,VkFormat format_,VkSampleCountFlagBits samples_,VkAttachmentLoadOp loadOp_,VkAttachmentStoreOp storeOp_,VkAttachmentLoadOp stencilLoadOp_,VkAttachmentStoreOp stencilStoreOp_,VkImageLayout initialLayout_,VkImageLayout finalLayout_)61 AttachmentDescription2::AttachmentDescription2 (const void*						pNext_,
62 												VkAttachmentDescriptionFlags	flags_,
63 												VkFormat						format_,
64 												VkSampleCountFlagBits			samples_,
65 												VkAttachmentLoadOp				loadOp_,
66 												VkAttachmentStoreOp				storeOp_,
67 												VkAttachmentLoadOp				stencilLoadOp_,
68 												VkAttachmentStoreOp				stencilStoreOp_,
69 												VkImageLayout					initialLayout_,
70 												VkImageLayout					finalLayout_)
71 {
72 	sType			= VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2;
73 	pNext			= pNext_;
74 	flags			= flags_;
75 	format			= format_;
76 	samples			= samples_;
77 	loadOp			= loadOp_;
78 	storeOp			= storeOp_;
79 	stencilLoadOp	= stencilLoadOp_;
80 	stencilStoreOp	= stencilStoreOp_;
81 	initialLayout	= initialLayout_;
82 	finalLayout		= finalLayout_;
83 }
84 
AttachmentReference1(const void * pNext_,deUint32 attachment_,VkImageLayout layout_,VkImageAspectFlags aspectMask_)85 AttachmentReference1::AttachmentReference1 (const void*			pNext_,
86 											deUint32			attachment_,
87 											VkImageLayout		layout_,
88 											VkImageAspectFlags	aspectMask_)
89 {
90 	DE_ASSERT(pNext_ == DE_NULL);
91 	DE_ASSERT(aspectMask_ == 0);
92 
93 	// No sType field in this struct
94 	DE_UNREF	(pNext_);
95 	attachment	= attachment_;
96 	layout		= layout_;
97 	DE_UNREF	(aspectMask_);
98 }
99 
AttachmentReference2(const void * pNext_,deUint32 attachment_,VkImageLayout layout_,VkImageAspectFlags aspectMask_)100 AttachmentReference2::AttachmentReference2 (const void*			pNext_,
101 											deUint32			attachment_,
102 											VkImageLayout		layout_,
103 											VkImageAspectFlags	aspectMask_)
104 {
105 	sType		= VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2;
106 	pNext		= pNext_;
107 	attachment	= attachment_;
108 	layout		= layout_;
109 	aspectMask	= aspectMask_;
110 }
111 
SubpassDescription1(const void * pNext_,VkSubpassDescriptionFlags flags_,VkPipelineBindPoint pipelineBindPoint_,deUint32 viewMask_,deUint32 inputAttachmentCount_,const VkAttachmentReference * pInputAttachments_,deUint32 colorAttachmentCount_,const VkAttachmentReference * pColorAttachments_,const VkAttachmentReference * pResolveAttachments_,const VkAttachmentReference * pDepthStencilAttachment_,deUint32 preserveAttachmentCount_,const deUint32 * pPreserveAttachments_)112 SubpassDescription1::SubpassDescription1 (const void*						pNext_,
113 										  VkSubpassDescriptionFlags			flags_,
114 										  VkPipelineBindPoint				pipelineBindPoint_,
115 										  deUint32							viewMask_,
116 										  deUint32							inputAttachmentCount_,
117 										  const VkAttachmentReference*		pInputAttachments_,
118 										  deUint32							colorAttachmentCount_,
119 										  const VkAttachmentReference*		pColorAttachments_,
120 										  const VkAttachmentReference*		pResolveAttachments_,
121 										  const VkAttachmentReference*		pDepthStencilAttachment_,
122 										  deUint32							preserveAttachmentCount_,
123 										  const deUint32*					pPreserveAttachments_)
124 {
125 	DE_ASSERT(pNext_ == DE_NULL);
126 	DE_ASSERT(viewMask_ == 0);
127 
128 	// No sType field in this struct
129 	DE_UNREF				(pNext_);
130 	flags					= flags_;
131 	pipelineBindPoint		= pipelineBindPoint_;
132 	DE_UNREF				(viewMask_);
133 	inputAttachmentCount	= inputAttachmentCount_;
134 	pInputAttachments		= pInputAttachments_;
135 	colorAttachmentCount	= colorAttachmentCount_;
136 	pColorAttachments		= pColorAttachments_;
137 	pResolveAttachments		= pResolveAttachments_;
138 	pDepthStencilAttachment	= pDepthStencilAttachment_;
139 	preserveAttachmentCount	= preserveAttachmentCount_;
140 	pPreserveAttachments	= pPreserveAttachments_;
141 }
142 
SubpassDescription2(const void * pNext_,VkSubpassDescriptionFlags flags_,VkPipelineBindPoint pipelineBindPoint_,deUint32 viewMask_,deUint32 inputAttachmentCount_,const VkAttachmentReference2 * pInputAttachments_,deUint32 colorAttachmentCount_,const VkAttachmentReference2 * pColorAttachments_,const VkAttachmentReference2 * pResolveAttachments_,const VkAttachmentReference2 * pDepthStencilAttachment_,deUint32 preserveAttachmentCount_,const deUint32 * pPreserveAttachments_)143 SubpassDescription2::SubpassDescription2 (const void*						pNext_,
144 										  VkSubpassDescriptionFlags			flags_,
145 										  VkPipelineBindPoint				pipelineBindPoint_,
146 										  deUint32							viewMask_,
147 										  deUint32							inputAttachmentCount_,
148 										  const VkAttachmentReference2*		pInputAttachments_,
149 										  deUint32							colorAttachmentCount_,
150 										  const VkAttachmentReference2*		pColorAttachments_,
151 										  const VkAttachmentReference2*		pResolveAttachments_,
152 										  const VkAttachmentReference2*		pDepthStencilAttachment_,
153 										  deUint32							preserveAttachmentCount_,
154 										  const deUint32*					pPreserveAttachments_)
155 {
156 	sType					= VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_2;
157 	pNext					= pNext_;
158 	flags					= flags_;
159 	pipelineBindPoint		= pipelineBindPoint_;
160 	viewMask				= viewMask_;
161 	inputAttachmentCount	= inputAttachmentCount_;
162 	pInputAttachments		= pInputAttachments_;
163 	colorAttachmentCount	= colorAttachmentCount_;
164 	pColorAttachments		= pColorAttachments_;
165 	pResolveAttachments		= pResolveAttachments_;
166 	pDepthStencilAttachment	= pDepthStencilAttachment_;
167 	preserveAttachmentCount	= preserveAttachmentCount_;
168 	pPreserveAttachments	= pPreserveAttachments_;
169 }
170 
SubpassDependency1(const void * pNext_,deUint32 srcSubpass_,deUint32 dstSubpass_,VkPipelineStageFlags srcStageMask_,VkPipelineStageFlags dstStageMask_,VkAccessFlags srcAccessMask_,VkAccessFlags dstAccessMask_,VkDependencyFlags dependencyFlags_,deInt32 viewOffset_)171 SubpassDependency1::SubpassDependency1 (const void*				pNext_,
172 										deUint32				srcSubpass_,
173 										deUint32				dstSubpass_,
174 										VkPipelineStageFlags	srcStageMask_,
175 										VkPipelineStageFlags	dstStageMask_,
176 										VkAccessFlags			srcAccessMask_,
177 										VkAccessFlags			dstAccessMask_,
178 										VkDependencyFlags		dependencyFlags_,
179 										deInt32					viewOffset_)
180 {
181 	DE_ASSERT(pNext_ == DE_NULL);
182 	DE_ASSERT(viewOffset_ == 0);
183 
184 	// No sType field in this struct
185 	DE_UNREF		(pNext_);
186 	srcSubpass		= srcSubpass_;
187 	dstSubpass		= dstSubpass_;
188 	srcStageMask	= srcStageMask_;
189 	dstStageMask	= dstStageMask_;
190 	srcAccessMask	= srcAccessMask_;
191 	dstAccessMask	= dstAccessMask_;
192 	dependencyFlags	= dependencyFlags_;
193 	DE_UNREF		(viewOffset_);
194 }
195 
SubpassDependency2(const void * pNext_,deUint32 srcSubpass_,deUint32 dstSubpass_,VkPipelineStageFlags srcStageMask_,VkPipelineStageFlags dstStageMask_,VkAccessFlags srcAccessMask_,VkAccessFlags dstAccessMask_,VkDependencyFlags dependencyFlags_,deInt32 viewOffset_)196 SubpassDependency2::SubpassDependency2 (const void*				pNext_,
197 										deUint32				srcSubpass_,
198 										deUint32				dstSubpass_,
199 										VkPipelineStageFlags	srcStageMask_,
200 										VkPipelineStageFlags	dstStageMask_,
201 										VkAccessFlags			srcAccessMask_,
202 										VkAccessFlags			dstAccessMask_,
203 										VkDependencyFlags		dependencyFlags_,
204 										deInt32					viewOffset_)
205 {
206 	sType			= VK_STRUCTURE_TYPE_SUBPASS_DEPENDENCY_2;
207 	pNext			= pNext_;
208 	srcSubpass		= srcSubpass_;
209 	dstSubpass		= dstSubpass_;
210 	srcStageMask	= srcStageMask_;
211 	dstStageMask	= dstStageMask_;
212 	srcAccessMask	= srcAccessMask_;
213 	dstAccessMask	= dstAccessMask_;
214 	dependencyFlags	= dependencyFlags_;
215 	viewOffset		= viewOffset_;
216 }
217 
RenderPassCreateInfo1(const void * pNext_,VkRenderPassCreateFlags flags_,deUint32 attachmentCount_,const VkAttachmentDescription * pAttachments_,deUint32 subpassCount_,const VkSubpassDescription * pSubpasses_,deUint32 dependencyCount_,const VkSubpassDependency * pDependencies_,deUint32 correlatedViewMaskCount_,const deUint32 * pCorrelatedViewMasks_)218 RenderPassCreateInfo1::RenderPassCreateInfo1 (const void*						pNext_,
219 											  VkRenderPassCreateFlags			flags_,
220 											  deUint32							attachmentCount_,
221 											  const VkAttachmentDescription*	pAttachments_,
222 											  deUint32							subpassCount_,
223 											  const VkSubpassDescription*		pSubpasses_,
224 											  deUint32							dependencyCount_,
225 											  const VkSubpassDependency*		pDependencies_,
226 											  deUint32							correlatedViewMaskCount_,
227 											  const deUint32*					pCorrelatedViewMasks_)
228 {
229 	DE_ASSERT(correlatedViewMaskCount_ == 0);
230 	DE_ASSERT(pCorrelatedViewMasks_ == DE_NULL);
231 
232 	sType					= VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
233 	pNext					= pNext_;
234 	flags					= flags_;
235 	attachmentCount			= attachmentCount_;
236 	pAttachments			= pAttachments_;
237 	subpassCount			= subpassCount_;
238 	pSubpasses				= pSubpasses_;
239 	dependencyCount			= dependencyCount_;
240 	pDependencies			= pDependencies_;
241 	DE_UNREF				(correlatedViewMaskCount_);
242 	DE_UNREF				(pCorrelatedViewMasks_);
243 }
244 
createRenderPass(const DeviceInterface & vk,VkDevice device) const245 Move<VkRenderPass>	RenderPassCreateInfo1::createRenderPass (const DeviceInterface& vk, VkDevice device) const
246 {
247 	return vk::createRenderPass(vk, device, this);
248 }
249 
RenderPassCreateInfo2(const void * pNext_,VkRenderPassCreateFlags flags_,deUint32 attachmentCount_,const VkAttachmentDescription2 * pAttachments_,deUint32 subpassCount_,const VkSubpassDescription2 * pSubpasses_,deUint32 dependencyCount_,const VkSubpassDependency2 * pDependencies_,deUint32 correlatedViewMaskCount_,const deUint32 * pCorrelatedViewMasks_)250 RenderPassCreateInfo2::RenderPassCreateInfo2 (const void*							pNext_,
251 											  VkRenderPassCreateFlags				flags_,
252 											  deUint32								attachmentCount_,
253 											  const VkAttachmentDescription2*		pAttachments_,
254 											  deUint32								subpassCount_,
255 											  const VkSubpassDescription2*			pSubpasses_,
256 											  deUint32								dependencyCount_,
257 											  const VkSubpassDependency2*			pDependencies_,
258 											  deUint32								correlatedViewMaskCount_,
259 											  const deUint32*						pCorrelatedViewMasks_)
260 {
261 	sType					= VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2;
262 	pNext					= pNext_;
263 	flags					= flags_;
264 	attachmentCount			= attachmentCount_;
265 	pAttachments			= pAttachments_;
266 	subpassCount			= subpassCount_;
267 	pSubpasses				= pSubpasses_;
268 	dependencyCount			= dependencyCount_;
269 	pDependencies			= pDependencies_;
270 	correlatedViewMaskCount	= correlatedViewMaskCount_;
271 	pCorrelatedViewMasks	= pCorrelatedViewMasks_;
272 }
273 
createRenderPass(const DeviceInterface & vk,VkDevice device) const274 Move<VkRenderPass>	RenderPassCreateInfo2::createRenderPass (const DeviceInterface& vk, VkDevice device) const
275 {
276 	return vk::createRenderPass2(vk, device, this);
277 }
278 
SubpassBeginInfo1(const void * pNext_,VkSubpassContents contents_)279 SubpassBeginInfo1::SubpassBeginInfo1 (const void*		pNext_,
280 									  VkSubpassContents	contents_)
281 	: contents	(contents_)
282 {
283 	DE_ASSERT(pNext_ == DE_NULL);
284 
285 	DE_UNREF(pNext_);
286 }
287 
SubpassBeginInfo2(const void * pNext_,VkSubpassContents contents_)288 SubpassBeginInfo2::SubpassBeginInfo2 (const void*		pNext_,
289 									  VkSubpassContents	contents_)
290 {
291 	sType		= VK_STRUCTURE_TYPE_SUBPASS_BEGIN_INFO;
292 	pNext		= pNext_;
293 	contents	= contents_;
294 }
295 
SubpassEndInfo1(const void * pNext_)296 SubpassEndInfo1::SubpassEndInfo1 (const void*	pNext_)
297 {
298 	DE_ASSERT(pNext_ == DE_NULL);
299 
300 	DE_UNREF(pNext_);
301 }
302 
SubpassEndInfo2(const void * pNext_)303 SubpassEndInfo2::SubpassEndInfo2 (const void*	pNext_)
304 {
305 	sType	= VK_STRUCTURE_TYPE_SUBPASS_END_INFO;
306 	pNext	= pNext_;
307 }
308 
cmdBeginRenderPass(const DeviceInterface & vk,VkCommandBuffer cmdBuffer,const VkRenderPassBeginInfo * pRenderPassBegin,const SubpassBeginInfo * pSubpassBeginInfo)309 void RenderpassSubpass1::cmdBeginRenderPass (const DeviceInterface&			vk,
310 											 VkCommandBuffer				cmdBuffer,
311 											 const VkRenderPassBeginInfo*	pRenderPassBegin,
312 											 const SubpassBeginInfo*		pSubpassBeginInfo)
313 {
314 	DE_ASSERT(pSubpassBeginInfo != DE_NULL);
315 
316 	vk.cmdBeginRenderPass(cmdBuffer, pRenderPassBegin, pSubpassBeginInfo->contents);
317 }
318 
cmdNextSubpass(const DeviceInterface & vk,VkCommandBuffer cmdBuffer,const SubpassBeginInfo * pSubpassBeginInfo,const SubpassEndInfo * pSubpassEndInfo)319 void RenderpassSubpass1::cmdNextSubpass (const DeviceInterface&		vk,
320 										 VkCommandBuffer			cmdBuffer,
321 										 const SubpassBeginInfo*	pSubpassBeginInfo,
322 										 const SubpassEndInfo*		pSubpassEndInfo)
323 {
324 	DE_UNREF(pSubpassEndInfo);
325 	DE_ASSERT(pSubpassBeginInfo != DE_NULL);
326 
327 	vk.cmdNextSubpass(cmdBuffer, pSubpassBeginInfo->contents);
328 }
329 
cmdEndRenderPass(const DeviceInterface & vk,VkCommandBuffer cmdBuffer,const SubpassEndInfo * pSubpassEndInfo)330 void RenderpassSubpass1::cmdEndRenderPass (const DeviceInterface&	vk,
331 										   VkCommandBuffer			cmdBuffer,
332 										   const SubpassEndInfo*	pSubpassEndInfo)
333 {
334 	DE_UNREF(pSubpassEndInfo);
335 
336 	vk.cmdEndRenderPass(cmdBuffer);
337 }
338 
cmdBeginRenderPass(const DeviceInterface & vk,VkCommandBuffer cmdBuffer,const VkRenderPassBeginInfo * pRenderPassBegin,const SubpassBeginInfo * pSubpassBeginInfo)339 void RenderpassSubpass2::cmdBeginRenderPass (const DeviceInterface&			vk,
340 											 VkCommandBuffer				cmdBuffer,
341 											 const VkRenderPassBeginInfo*	pRenderPassBegin,
342 											 const SubpassBeginInfo*		pSubpassBeginInfo)
343 {
344 	vk.cmdBeginRenderPass2(cmdBuffer, pRenderPassBegin, pSubpassBeginInfo);
345 }
346 
cmdNextSubpass(const DeviceInterface & vk,VkCommandBuffer cmdBuffer,const SubpassBeginInfo * pSubpassBeginInfo,const SubpassEndInfo * pSubpassEndInfo)347 void RenderpassSubpass2::cmdNextSubpass (const DeviceInterface&		vk,
348 										 VkCommandBuffer			cmdBuffer,
349 										 const SubpassBeginInfo*	pSubpassBeginInfo,
350 										 const SubpassEndInfo*		pSubpassEndInfo)
351 {
352 	DE_ASSERT(pSubpassBeginInfo != DE_NULL);
353 	DE_ASSERT(pSubpassEndInfo != DE_NULL);
354 
355 	vk.cmdNextSubpass2(cmdBuffer, pSubpassBeginInfo, pSubpassEndInfo);
356 }
357 
cmdEndRenderPass(const DeviceInterface & vk,VkCommandBuffer cmdBuffer,const SubpassEndInfo * pSubpassEndInfo)358 void RenderpassSubpass2::cmdEndRenderPass (const DeviceInterface&	vk,
359 										   VkCommandBuffer			cmdBuffer,
360 										   const SubpassEndInfo*	pSubpassEndInfo)
361 {
362 	DE_ASSERT(pSubpassEndInfo != DE_NULL);
363 
364 	vk.cmdEndRenderPass2(cmdBuffer, pSubpassEndInfo);
365 }
366 
367 } // renderpass
368 
369 } // vkt
370 
371