1/*------------------------------------------------------------------------
2 * Vulkan Conformance Tests
3 * ------------------------
4 *
5 * Copyright (c) 2015 The Khronos Group Inc.
6 * Copyright (c) 2015 Intel Corporation
7 *
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
11 *
12 *      http://www.apache.org/licenses/LICENSE-2.0
13 *
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
19 *
20 *//*!
21 * \file
22 * \brief CreateInfo utilities
23 *//*--------------------------------------------------------------------*/
24
25#include "vktDrawCreateInfoUtil.hpp"
26
27#include "vkImageUtil.hpp"
28
29namespace vkt
30{
31namespace Draw
32{
33
34ImageSubresourceRange::ImageSubresourceRange (vk::VkImageAspectFlags	_aspectMask,
35											  deUint32					_baseMipLevel,
36											  deUint32					_levelCount,
37											  deUint32					_baseArrayLayer,
38											  deUint32					_layerCount)
39{
40	aspectMask		= _aspectMask;
41	baseMipLevel	= _baseMipLevel;
42	levelCount		= _levelCount;
43	baseArrayLayer	= _baseArrayLayer;
44	layerCount		= _layerCount;
45}
46
47ComponentMapping::ComponentMapping (vk::VkComponentSwizzle _r,
48									vk::VkComponentSwizzle _g,
49									vk::VkComponentSwizzle _b,
50									vk::VkComponentSwizzle _a)
51{
52	r = _r;
53	g = _g;
54	b = _b;
55	a = _a;
56}
57
58ImageViewCreateInfo::ImageViewCreateInfo (vk::VkImage							_image,
59										  vk::VkImageViewType					_viewType,
60										  vk::VkFormat							_format,
61										  const vk::VkImageSubresourceRange&	_subresourceRange,
62										  const vk::VkComponentMapping&			_components,
63										  vk::VkImageViewCreateFlags			_flags)
64{
65	sType = vk::VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
66	pNext = DE_NULL;
67	flags				= 0u;
68	image				= _image;
69	viewType			= _viewType;
70	format				= _format;
71	components.r		= _components.r;
72	components.g		= _components.g;
73	components.b		= _components.b;
74	components.a		= _components.a;
75	subresourceRange	= _subresourceRange;
76	flags				= _flags;
77}
78
79ImageViewCreateInfo::ImageViewCreateInfo (vk::VkImage					_image,
80										  vk::VkImageViewType			_viewType,
81										  vk::VkFormat					_format,
82										  const vk::VkComponentMapping&	_components,
83										  vk::VkImageViewCreateFlags	_flags)
84{
85	sType = vk::VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
86	pNext = DE_NULL;
87	flags			= 0u;
88	image			= _image;
89	viewType		= _viewType;
90	format			= _format;
91	components.r	= _components.r;
92	components.g	= _components.g;
93	components.b	= _components.b;
94	components.a	= _components.a;
95
96	vk::VkImageAspectFlags aspectFlags;
97	const tcu::TextureFormat tcuFormat = vk::mapVkFormat(_format);
98
99	switch (tcuFormat.order)
100	{
101		case tcu::TextureFormat::D:
102			aspectFlags = vk::VK_IMAGE_ASPECT_DEPTH_BIT;
103			break;
104		case tcu::TextureFormat::S:
105			aspectFlags = vk::VK_IMAGE_ASPECT_STENCIL_BIT;
106			break;
107		case tcu::TextureFormat::DS:
108			aspectFlags = vk::VK_IMAGE_ASPECT_STENCIL_BIT | vk::VK_IMAGE_ASPECT_DEPTH_BIT;
109			break;
110		default:
111			aspectFlags = vk::VK_IMAGE_ASPECT_COLOR_BIT;
112			break;
113	}
114
115	subresourceRange = ImageSubresourceRange(aspectFlags);;
116	flags = _flags;
117}
118
119BufferViewCreateInfo::BufferViewCreateInfo (vk::VkBuffer	_buffer,
120											vk::VkFormat		_format,
121											vk::VkDeviceSize _offset,
122											vk::VkDeviceSize _range)
123{
124	sType = vk::VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
125	pNext = DE_NULL;
126
127	flags	= 0;
128	buffer	= _buffer;
129	format	= _format;
130	offset	= _offset;
131	range	= _range;
132}
133
134BufferCreateInfo::BufferCreateInfo (vk::VkDeviceSize		_size,
135									vk::VkBufferUsageFlags	_usage,
136									vk::VkSharingMode		_sharingMode,
137									deUint32				_queueFamilyIndexCount,
138									const deUint32*			_pQueueFamilyIndices,
139									vk::VkBufferCreateFlags _flags)
140{
141	sType = vk::VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
142	pNext = DE_NULL;
143	size					= _size;
144	usage					= _usage;
145	flags					= _flags;
146	sharingMode				= _sharingMode;
147	queueFamilyIndexCount	= _queueFamilyIndexCount;
148
149	if (_queueFamilyIndexCount)
150	{
151		m_queueFamilyIndices = std::vector<deUint32>(
152			_pQueueFamilyIndices, _pQueueFamilyIndices + _queueFamilyIndexCount);
153		pQueueFamilyIndices = &m_queueFamilyIndices[0];
154	}
155	else
156	{
157		pQueueFamilyIndices = _pQueueFamilyIndices;
158	}
159}
160
161BufferCreateInfo::BufferCreateInfo (const BufferCreateInfo &other)
162{
163	sType					= other.sType;
164	pNext					= other.pNext;
165	size					= other.size;
166	usage					= other.usage;
167	flags					= other.flags;
168	sharingMode				= other.sharingMode;
169	queueFamilyIndexCount	= other.queueFamilyIndexCount;
170
171	m_queueFamilyIndices	= other.m_queueFamilyIndices;
172	DE_ASSERT(m_queueFamilyIndices.size() == queueFamilyIndexCount);
173
174	if (m_queueFamilyIndices.size())
175	{
176		pQueueFamilyIndices = &m_queueFamilyIndices[0];
177	}
178	else
179	{
180		pQueueFamilyIndices = DE_NULL;
181	}
182}
183
184BufferCreateInfo & BufferCreateInfo::operator= (const BufferCreateInfo &other)
185{
186	sType						= other.sType;
187	pNext						= other.pNext;
188	size						= other.size;
189	usage						= other.usage;
190	flags						= other.flags;
191	sharingMode					= other.sharingMode;
192	queueFamilyIndexCount		= other.queueFamilyIndexCount;
193
194	m_queueFamilyIndices		= other.m_queueFamilyIndices;
195
196	DE_ASSERT(m_queueFamilyIndices.size() == queueFamilyIndexCount);
197
198	if (m_queueFamilyIndices.size())
199	{
200		pQueueFamilyIndices = &m_queueFamilyIndices[0];
201	}
202	else
203	{
204		pQueueFamilyIndices = DE_NULL;
205	}
206
207	return *this;
208}
209
210ImageCreateInfo::ImageCreateInfo (vk::VkImageType			_imageType,
211								  vk::VkFormat				_format,
212								  vk::VkExtent3D			_extent,
213								  deUint32					_mipLevels,
214								  deUint32					_arrayLayers,
215								  vk::VkSampleCountFlagBits	_samples,
216								  vk::VkImageTiling			_tiling,
217								  vk::VkImageUsageFlags		_usage,
218								  vk::VkSharingMode			_sharingMode,
219								  deUint32					_queueFamilyIndexCount,
220								  const deUint32*			_pQueueFamilyIndices,
221								  vk::VkImageCreateFlags	_flags,
222								  vk::VkImageLayout			_initialLayout)
223{
224	if (_queueFamilyIndexCount)
225	{
226		m_queueFamilyIndices = std::vector<deUint32>(_pQueueFamilyIndices, _pQueueFamilyIndices + _queueFamilyIndexCount);
227	}
228
229	sType = vk::VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
230	pNext = DE_NULL;
231	flags					= _flags;
232	imageType				= _imageType;
233	format					= _format;
234	extent					= _extent;
235	mipLevels				= _mipLevels;
236	arrayLayers				= _arrayLayers;
237	samples					= _samples;
238	tiling					= _tiling;
239	usage					= _usage;
240	sharingMode				= _sharingMode;
241	queueFamilyIndexCount	= _queueFamilyIndexCount;
242
243	if (m_queueFamilyIndices.size())
244	{
245		pQueueFamilyIndices = &m_queueFamilyIndices[0];
246	}
247	else
248	{
249		pQueueFamilyIndices = DE_NULL;
250	}
251	initialLayout	= _initialLayout;
252}
253
254FramebufferCreateInfo::FramebufferCreateInfo (vk::VkRenderPass						_renderPass,
255											  const std::vector<vk::VkImageView>&	atachments,
256											  deUint32								_width,
257											  deUint32								_height,
258											  deUint32								_layers)
259{
260	sType = vk::VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
261	pNext = DE_NULL;
262	flags = 0u;
263
264	renderPass		= _renderPass;
265	attachmentCount	= static_cast<deUint32>(atachments.size());
266
267	if (attachmentCount)
268	{
269		pAttachments = const_cast<vk::VkImageView *>(&atachments[0]);
270	}
271
272	width	= _width;
273	height	= _height;
274	layers	= _layers;
275}
276
277RenderPassCreateInfo::RenderPassCreateInfo (const std::vector<vk::VkAttachmentDescription>&	attachments,
278											const std::vector<vk::VkSubpassDescription>&	subpasses,
279											const std::vector<vk::VkSubpassDependency>&		dependiences)
280
281	: m_attachments			(attachments.begin(), attachments.end())
282	, m_subpasses			(subpasses.begin(), subpasses.end())
283	, m_dependiences		(dependiences.begin(), dependiences.end())
284	, m_attachmentsStructs	(m_attachments.begin(), m_attachments.end())
285	, m_subpassesStructs	(m_subpasses.begin(), m_subpasses.end())
286	, m_dependiencesStructs	(m_dependiences.begin(), m_dependiences.end())
287{
288	sType = vk::VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
289	pNext = DE_NULL;
290	flags = 0;
291
292	attachmentCount = static_cast<deUint32>(m_attachments.size());
293	pAttachments	= &m_attachmentsStructs[0];
294	subpassCount	= static_cast<deUint32>(m_subpasses.size());
295	pSubpasses		= &m_subpassesStructs[0];
296	dependencyCount = static_cast<deUint32>(m_dependiences.size());
297	pDependencies	= &m_dependiencesStructs[0];
298}
299
300RenderPassCreateInfo::RenderPassCreateInfo (deUint32							_attachmentCount,
301											const vk::VkAttachmentDescription*	_pAttachments,
302											deUint32							_subpassCount,
303											const vk::VkSubpassDescription*		_pSubpasses,
304											deUint32							_dependencyCount,
305											const vk::VkSubpassDependency*		_pDependiences)
306{
307
308	m_attachments	= std::vector<AttachmentDescription>(_pAttachments, _pAttachments + _attachmentCount);
309	m_subpasses		= std::vector<SubpassDescription>(_pSubpasses, _pSubpasses + _subpassCount);
310	m_dependiences	= std::vector<SubpassDependency>(_pDependiences, _pDependiences + _dependencyCount);
311
312	m_attachmentsStructs	= std::vector<vk::VkAttachmentDescription>	(m_attachments.begin(),		m_attachments.end());
313	m_subpassesStructs		= std::vector<vk::VkSubpassDescription>		(m_subpasses.begin(),		m_subpasses.end());
314	m_dependiencesStructs	= std::vector<vk::VkSubpassDependency>		(m_dependiences.begin(),	m_dependiences.end());
315
316	sType = vk::VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
317	pNext = DE_NULL;
318	flags = 0;
319
320	attachmentCount = static_cast<deUint32>(m_attachments.size());
321
322	if (attachmentCount) {
323		pAttachments = &m_attachmentsStructs[0];
324	}
325	else
326	{
327		pAttachments = DE_NULL;
328	}
329
330	subpassCount = static_cast<deUint32>(m_subpasses.size());
331
332	if (subpassCount) {
333		pSubpasses = &m_subpassesStructs[0];
334	}
335	else
336	{
337		pSubpasses = DE_NULL;
338	}
339
340	dependencyCount = static_cast<deUint32>(m_dependiences.size());
341
342	if (dependencyCount) {
343		pDependencies = &m_dependiencesStructs[0];
344	}
345	else
346	{
347		pDependencies = DE_NULL;
348	}
349}
350
351void
352RenderPassCreateInfo::addAttachment (vk::VkAttachmentDescription attachment)
353{
354
355	m_attachments.push_back(attachment);
356	m_attachmentsStructs	= std::vector<vk::VkAttachmentDescription>(m_attachments.begin(), m_attachments.end());
357	attachmentCount			= static_cast<deUint32>(m_attachments.size());
358	pAttachments			= &m_attachmentsStructs[0];
359}
360
361void
362RenderPassCreateInfo::addSubpass (vk::VkSubpassDescription subpass)
363{
364
365	m_subpasses.push_back(subpass);
366	m_subpassesStructs	= std::vector<vk::VkSubpassDescription>(m_subpasses.begin(), m_subpasses.end());
367	subpassCount		= static_cast<deUint32>(m_subpasses.size());
368	pSubpasses			= &m_subpassesStructs[0];
369}
370
371void
372RenderPassCreateInfo::addDependency (vk::VkSubpassDependency dependency)
373{
374
375	m_dependiences.push_back(dependency);
376	m_dependiencesStructs	= std::vector<vk::VkSubpassDependency>(m_dependiences.begin(), m_dependiences.end());
377
378	dependencyCount			= static_cast<deUint32>(m_dependiences.size());
379	pDependencies			= &m_dependiencesStructs[0];
380}
381
382RenderPassBeginInfo::RenderPassBeginInfo (vk::VkRenderPass						_renderPass,
383										  vk::VkFramebuffer						_framebuffer,
384										  vk::VkRect2D							_renderArea,
385										  const std::vector<vk::VkClearValue>&	_clearValues)
386{
387
388	m_clearValues	= _clearValues;
389
390	sType			= vk::VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
391	pNext			= DE_NULL;
392	renderPass		= _renderPass;
393	framebuffer		= _framebuffer;
394	renderArea		= _renderArea;
395	clearValueCount = static_cast<deUint32>(m_clearValues.size());
396	pClearValues	= m_clearValues.size() ? &m_clearValues[0] : DE_NULL;
397}
398
399CmdPoolCreateInfo::CmdPoolCreateInfo (deUint32 _queueFamilyIndex, unsigned int _flags)
400{
401	sType = vk::VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
402	pNext = DE_NULL;
403
404	queueFamilyIndex = _queueFamilyIndex;
405	flags				= _flags;
406}
407
408AttachmentDescription::AttachmentDescription (vk::VkFormat				_format,
409											  vk::VkSampleCountFlagBits	_samples,
410											  vk::VkAttachmentLoadOp	_loadOp,
411											  vk::VkAttachmentStoreOp	_storeOp,
412											  vk::VkAttachmentLoadOp	_stencilLoadOp,
413											  vk::VkAttachmentStoreOp	_stencilStoreOp,
414											  vk::VkImageLayout			_initialLayout,
415											  vk::VkImageLayout			_finalLayout)
416{
417	flags = 0;
418	format			= _format;
419	samples			= _samples;
420	loadOp			= _loadOp;
421	storeOp			= _storeOp;
422	stencilLoadOp	= _stencilLoadOp;
423	stencilStoreOp	= _stencilStoreOp;
424	initialLayout	= _initialLayout;
425	finalLayout		= _finalLayout;
426}
427
428AttachmentDescription::AttachmentDescription (const vk::VkAttachmentDescription& rhs)
429{
430	flags			= rhs.flags;
431	format			= rhs.format;
432	samples			= rhs.samples;
433	loadOp			= rhs.loadOp;
434	storeOp			= rhs.storeOp;
435	stencilLoadOp	= rhs.stencilLoadOp;
436	stencilStoreOp	= rhs.stencilStoreOp;
437	initialLayout	= rhs.initialLayout;
438	finalLayout		= rhs.finalLayout;
439}
440
441AttachmentReference::AttachmentReference (deUint32 _attachment, vk::VkImageLayout _layout)
442{
443	attachment	= _attachment;
444	layout		= _layout;
445}
446
447AttachmentReference::AttachmentReference (void)
448{
449	attachment = VK_ATTACHMENT_UNUSED;
450	layout = vk::VK_IMAGE_LAYOUT_UNDEFINED;
451}
452
453SubpassDescription::SubpassDescription (vk::VkPipelineBindPoint				_pipelineBindPoint,
454										vk::VkSubpassDescriptionFlags		_flags,
455										deUint32							_inputAttachmentCount,
456										const vk::VkAttachmentReference*	_inputAttachments,
457										deUint32							_colorAttachmentCount,
458										const vk::VkAttachmentReference*	_colorAttachments,
459										const vk::VkAttachmentReference*	_resolveAttachments,
460										vk::VkAttachmentReference			depthStencilAttachment,
461										deUint32							_preserveAttachmentCount,
462										const deUint32*						_preserveAttachments)
463{
464	m_inputAttachments = std::vector<vk::VkAttachmentReference>(_inputAttachments, _inputAttachments + _inputAttachmentCount);
465	m_colorAttachments = std::vector<vk::VkAttachmentReference>(_colorAttachments, _colorAttachments + _colorAttachmentCount);
466
467	if (_resolveAttachments)
468		m_resolveAttachments = std::vector<vk::VkAttachmentReference>(_resolveAttachments, _resolveAttachments + _colorAttachmentCount);
469
470	m_preserveAttachments = std::vector<deUint32>(_preserveAttachments, _preserveAttachments + _preserveAttachmentCount);
471
472	m_depthStencilAttachment = depthStencilAttachment;
473
474	flags					= _flags;
475	pipelineBindPoint		= _pipelineBindPoint;
476	inputAttachmentCount	= _inputAttachmentCount;
477	pInputAttachments		= DE_NULL;
478	colorAttachmentCount	= _colorAttachmentCount;
479	pColorAttachments		= DE_NULL;
480	pResolveAttachments		= DE_NULL;
481	pDepthStencilAttachment	= &m_depthStencilAttachment;
482	pPreserveAttachments	= DE_NULL;
483	preserveAttachmentCount	= _preserveAttachmentCount;
484
485	if (!m_inputAttachments.empty())
486		pInputAttachments = &m_inputAttachments[0];
487
488	if (!m_colorAttachments.empty())
489		pColorAttachments = &m_colorAttachments[0];
490
491	if (!m_resolveAttachments.empty())
492		pResolveAttachments = &m_resolveAttachments[0];
493
494	if (!m_preserveAttachments.empty())
495		pPreserveAttachments = &m_preserveAttachments[0];
496}
497
498SubpassDescription::SubpassDescription (const vk::VkSubpassDescription& rhs)
499{
500	*static_cast<vk::VkSubpassDescription*>(this) = rhs;
501
502	m_inputAttachments = std::vector<vk::VkAttachmentReference>(
503		rhs.pInputAttachments, rhs.pInputAttachments + rhs.inputAttachmentCount);
504
505	m_colorAttachments = std::vector<vk::VkAttachmentReference>(
506		rhs.pColorAttachments, rhs.pColorAttachments + rhs.colorAttachmentCount);
507
508	if (rhs.pResolveAttachments)
509		m_resolveAttachments = std::vector<vk::VkAttachmentReference>(
510			rhs.pResolveAttachments, rhs.pResolveAttachments + rhs.colorAttachmentCount);
511
512	m_preserveAttachments = std::vector<deUint32>(
513		rhs.pPreserveAttachments, rhs.pPreserveAttachments + rhs.preserveAttachmentCount);
514
515	if (rhs.pDepthStencilAttachment)
516		m_depthStencilAttachment = *rhs.pDepthStencilAttachment;
517
518	if (!m_inputAttachments.empty())
519		pInputAttachments = &m_inputAttachments[0];
520
521	if (!m_colorAttachments.empty())
522		pColorAttachments = &m_colorAttachments[0];
523
524	if (!m_resolveAttachments.empty())
525		pResolveAttachments = &m_resolveAttachments[0];
526
527	pDepthStencilAttachment = &m_depthStencilAttachment;
528
529	if (!m_preserveAttachments.empty())
530		pPreserveAttachments = &m_preserveAttachments[0];
531}
532
533SubpassDescription::SubpassDescription (const SubpassDescription& rhs) {
534	*this = rhs;
535}
536
537SubpassDescription& SubpassDescription::operator= (const SubpassDescription& rhs)
538{
539	*static_cast<vk::VkSubpassDescription*>(this) = rhs;
540
541	m_inputAttachments		= rhs.m_inputAttachments;
542	m_colorAttachments		= rhs.m_colorAttachments;
543	m_resolveAttachments	= rhs.m_resolveAttachments;
544	m_preserveAttachments	= rhs.m_preserveAttachments;
545	m_depthStencilAttachment = rhs.m_depthStencilAttachment;
546
547	if (!m_inputAttachments.empty())
548		pInputAttachments = &m_inputAttachments[0];
549
550	if (!m_colorAttachments.empty())
551		pColorAttachments = &m_colorAttachments[0];
552
553	if (!m_resolveAttachments.empty())
554		pResolveAttachments = &m_resolveAttachments[0];
555
556	pDepthStencilAttachment = &m_depthStencilAttachment;
557
558	if (!m_preserveAttachments.empty())
559		pPreserveAttachments = &m_preserveAttachments[0];
560
561	return *this;
562}
563
564SubpassDependency::SubpassDependency (deUint32					_srcSubpass,
565									  deUint32					_dstSubpass,
566									  vk::VkPipelineStageFlags	_srcStageMask,
567									  vk::VkPipelineStageFlags	_dstStageMask,
568									  vk::VkAccessFlags			_srcAccessMask,
569									  vk::VkAccessFlags			_dstAccessMask,
570									  vk::VkDependencyFlags		_dependencyFlags)
571{
572	srcSubpass		= _srcSubpass;
573	dstSubpass		= _dstSubpass;
574	srcStageMask	= _srcStageMask;
575	dstStageMask	= _dstStageMask;
576	srcAccessMask	= _srcAccessMask;
577	dstAccessMask	= _dstAccessMask;
578	dependencyFlags	= _dependencyFlags;
579}
580
581SubpassDependency::SubpassDependency (const vk::VkSubpassDependency& rhs)
582{
583	srcSubpass		= rhs.srcSubpass;
584	dstSubpass		= rhs.dstSubpass;
585	srcStageMask	= rhs.srcStageMask;
586	dstStageMask	= rhs.dstStageMask;
587	srcAccessMask	= rhs.srcAccessMask;
588	dstAccessMask	= rhs.dstAccessMask;
589	dependencyFlags	= rhs.dependencyFlags;
590}
591
592CmdBufferBeginInfo::CmdBufferBeginInfo (vk::VkCommandBufferUsageFlags _flags)
593{
594	sType				= vk::VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
595	pNext				= DE_NULL;
596	flags				= _flags;
597	pInheritanceInfo	= DE_NULL;
598}
599
600DescriptorPoolCreateInfo::DescriptorPoolCreateInfo (const std::vector<vk::VkDescriptorPoolSize>&	poolSizeCounts,
601													vk::VkDescriptorPoolCreateFlags					_flags,
602													deUint32										_maxSets)
603	: m_poolSizeCounts(poolSizeCounts)
604{
605	sType = vk::VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
606	pNext = DE_NULL;
607	flags			= _flags;
608	maxSets			= _maxSets;
609	poolSizeCount	= static_cast<deUint32>(m_poolSizeCounts.size());
610	pPoolSizes		= &m_poolSizeCounts[0];
611}
612
613DescriptorPoolCreateInfo& DescriptorPoolCreateInfo::addDescriptors (vk::VkDescriptorType type, deUint32 count)
614{
615	vk::VkDescriptorPoolSize descriptorTypeCount = { type, count };
616	m_poolSizeCounts.push_back(descriptorTypeCount);
617
618	poolSizeCount	= static_cast<deUint32>(m_poolSizeCounts.size());
619	pPoolSizes		= &m_poolSizeCounts[0];
620
621	return *this;
622}
623
624DescriptorSetLayoutCreateInfo::DescriptorSetLayoutCreateInfo (deUint32 _bindingCount, const vk::VkDescriptorSetLayoutBinding* _pBindings)
625{
626	sType = vk::VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
627	pNext = DE_NULL;
628	flags = 0;
629	bindingCount = _bindingCount;
630	pBindings	 = _pBindings;
631}
632
633PipelineLayoutCreateInfo::PipelineLayoutCreateInfo (deUint32							_descriptorSetCount,
634													const vk::VkDescriptorSetLayout*	_pSetLayouts,
635													deUint32							_pushConstantRangeCount,
636													const vk::VkPushConstantRange*		_pPushConstantRanges)
637	: m_pushConstantRanges(_pPushConstantRanges, _pPushConstantRanges + _pushConstantRangeCount)
638{
639	for (unsigned int i = 0; i < _descriptorSetCount; i++)
640	{
641		m_setLayouts.push_back(_pSetLayouts[i]);
642	}
643
644	sType = vk::VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
645	pNext = DE_NULL;
646	flags					= 0;
647	setLayoutCount			= static_cast<deUint32>(m_setLayouts.size());
648	pSetLayouts				= setLayoutCount > 0 ? &m_setLayouts[0] : DE_NULL;
649	pushConstantRangeCount	= static_cast<deUint32>(m_pushConstantRanges.size());
650
651	if (m_pushConstantRanges.size()) {
652		pPushConstantRanges = &m_pushConstantRanges[0];
653	}
654	else
655	{
656		pPushConstantRanges = DE_NULL;
657	}
658}
659
660PipelineLayoutCreateInfo::PipelineLayoutCreateInfo (const std::vector<vk::VkDescriptorSetLayout>&	setLayouts,
661													deUint32										_pushConstantRangeCount,
662													const vk::VkPushConstantRange*					_pPushConstantRanges)
663	: m_setLayouts			(setLayouts)
664	, m_pushConstantRanges	(_pPushConstantRanges, _pPushConstantRanges + _pushConstantRangeCount)
665{
666	sType = vk::VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
667	pNext = DE_NULL;
668
669	flags			= 0;
670	setLayoutCount	= static_cast<deUint32>(m_setLayouts.size());
671
672	if (setLayoutCount)
673	{
674		pSetLayouts = &m_setLayouts[0];
675	}
676	else
677	{
678		pSetLayouts = DE_NULL;
679	}
680
681	pushConstantRangeCount = static_cast<deUint32>(m_pushConstantRanges.size());
682	if (pushConstantRangeCount) {
683		pPushConstantRanges = &m_pushConstantRanges[0];
684	}
685	else
686	{
687		pPushConstantRanges = DE_NULL;
688	}
689}
690
691PipelineCreateInfo::PipelineShaderStage::PipelineShaderStage (vk::VkShaderModule _module, const char* _pName, vk::VkShaderStageFlagBits _stage)
692{
693	sType = vk::VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
694	pNext = DE_NULL;
695	flags = 0u;
696	stage				= _stage;
697	module				= _module;
698	pName				= _pName;
699	pSpecializationInfo = DE_NULL;
700}
701
702PipelineCreateInfo::VertexInputState::VertexInputState (deUint32										_vertexBindingDescriptionCount,
703														const vk::VkVertexInputBindingDescription*		_pVertexBindingDescriptions,
704														deUint32										_vertexAttributeDescriptionCount,
705														const vk::VkVertexInputAttributeDescription*	_pVertexAttributeDescriptions)
706{
707	sType = vk::VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
708	pNext = DE_NULL;
709	flags							= 0u;
710	vertexBindingDescriptionCount	= _vertexBindingDescriptionCount;
711	pVertexBindingDescriptions		= _pVertexBindingDescriptions;
712	vertexAttributeDescriptionCount	= _vertexAttributeDescriptionCount;
713	pVertexAttributeDescriptions	= _pVertexAttributeDescriptions;
714}
715
716PipelineCreateInfo::InputAssemblerState::InputAssemblerState (vk::VkPrimitiveTopology	_topology,
717															  vk::VkBool32				_primitiveRestartEnable)
718{
719	sType = vk::VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
720	pNext = DE_NULL;
721	flags					= 0u;
722	topology				= _topology;
723	primitiveRestartEnable	= _primitiveRestartEnable;
724}
725
726PipelineCreateInfo::TessellationState::TessellationState (deUint32 _patchControlPoints)
727{
728	sType = vk::VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
729	pNext = DE_NULL;
730	flags				= 0;
731	patchControlPoints	= _patchControlPoints;
732}
733
734PipelineCreateInfo::ViewportState::ViewportState (deUint32						_viewportCount,
735												  std::vector<vk::VkViewport>	_viewports,
736												  std::vector<vk::VkRect2D>		_scissors)
737{
738	sType = vk::VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
739	pNext = DE_NULL;
740	flags			= 0u;
741	viewportCount	= _viewportCount;
742	scissorCount	= _viewportCount;
743
744	if (!_viewports.size())
745	{
746		m_viewports.resize(viewportCount);
747		deMemset(&m_viewports[0], 0, sizeof(m_viewports[0]) * m_viewports.size());
748	}
749	else
750	{
751		m_viewports = _viewports;
752	}
753
754	if (!_scissors.size())
755	{
756		m_scissors.resize(scissorCount);
757		deMemset(&m_scissors[0], 0, sizeof(m_scissors[0]) * m_scissors.size());
758	}
759	else
760	{
761		m_scissors = _scissors;
762	}
763
764	pViewports	= &m_viewports[0];
765	pScissors	= &m_scissors[0];
766}
767
768PipelineCreateInfo::ViewportState::ViewportState (const ViewportState& other)
769{
770	sType			= other.sType;
771	pNext			= other.pNext;
772	flags			= other.flags;
773	viewportCount	= other.viewportCount;
774	scissorCount	= other.scissorCount;
775
776	m_viewports = std::vector<vk::VkViewport>(other.pViewports, other.pViewports + viewportCount);
777	m_scissors	= std::vector<vk::VkRect2D>(other.pScissors, other.pScissors + scissorCount);
778
779	pViewports	= &m_viewports[0];
780	pScissors	= &m_scissors[0];
781}
782
783PipelineCreateInfo::ViewportState& PipelineCreateInfo::ViewportState::operator= (const ViewportState& other)
784{
785	sType			= other.sType;
786	pNext			= other.pNext;
787	flags			= other.flags;
788	viewportCount	= other.viewportCount;
789	scissorCount	= other.scissorCount;
790
791	m_viewports		= std::vector<vk::VkViewport>(other.pViewports, other.pViewports + scissorCount);
792	m_scissors		= std::vector<vk::VkRect2D>(other.pScissors, other.pScissors + scissorCount);
793
794	pViewports		= &m_viewports[0];
795	pScissors		= &m_scissors[0];
796	return *this;
797}
798
799PipelineCreateInfo::RasterizerState::RasterizerState (vk::VkBool32			_depthClampEnable,
800													  vk::VkBool32			_rasterizerDiscardEnable,
801													  vk::VkPolygonMode		_polygonMode,
802													  vk::VkCullModeFlags	_cullMode,
803													  vk::VkFrontFace		_frontFace,
804													  vk::VkBool32			_depthBiasEnable,
805													  float					_depthBiasConstantFactor,
806													  float					_depthBiasClamp,
807													  float					_depthBiasSlopeFactor,
808													  float					_lineWidth)
809{
810	sType = vk::VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
811	pNext = DE_NULL;
812	flags					= 0u;
813	depthClampEnable		= _depthClampEnable;
814	rasterizerDiscardEnable = _rasterizerDiscardEnable;
815	polygonMode				= _polygonMode;
816	cullMode				= _cullMode;
817	frontFace				= _frontFace;
818
819	depthBiasEnable			= _depthBiasEnable;
820	depthBiasConstantFactor	= _depthBiasConstantFactor;
821	depthBiasClamp			= _depthBiasClamp;
822	depthBiasSlopeFactor	= _depthBiasSlopeFactor;
823	lineWidth				= _lineWidth;
824}
825
826PipelineCreateInfo::MultiSampleState::MultiSampleState (vk::VkSampleCountFlagBits				_rasterizationSamples,
827														vk::VkBool32							_sampleShadingEnable,
828														float									_minSampleShading,
829														const std::vector<vk::VkSampleMask>&	_sampleMask,
830														bool									_alphaToCoverageEnable,
831														bool									_alphaToOneEnable)
832	: m_sampleMask(_sampleMask)
833{
834	sType = vk::VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
835	pNext = DE_NULL;
836	flags					= 0u;
837	rasterizationSamples	= _rasterizationSamples;
838	sampleShadingEnable		= _sampleShadingEnable;
839	minSampleShading		= _minSampleShading;
840	pSampleMask				= &m_sampleMask[0];
841	alphaToCoverageEnable   = _alphaToCoverageEnable;
842	alphaToOneEnable		= _alphaToOneEnable;
843}
844
845PipelineCreateInfo::MultiSampleState::MultiSampleState (const MultiSampleState& other)
846{
847	sType					= other.sType;
848	pNext					= other.pNext;
849	flags					= other.flags;
850	rasterizationSamples	= other.rasterizationSamples;
851	sampleShadingEnable		= other.sampleShadingEnable;
852	minSampleShading		= other.minSampleShading;
853
854	const size_t sampleMaskArrayLen = (sizeof(vk::VkSampleMask) * 8 + other.rasterizationSamples) / (sizeof(vk::VkSampleMask) * 8);
855
856	m_sampleMask	= std::vector<vk::VkSampleMask>(other.pSampleMask, other.pSampleMask + sampleMaskArrayLen);
857	pSampleMask		= &m_sampleMask[0];
858}
859
860PipelineCreateInfo::MultiSampleState& PipelineCreateInfo::MultiSampleState::operator= (const MultiSampleState& other)
861{
862	sType = other.sType;
863	pNext = other.pNext;
864	flags					= other.flags;
865	rasterizationSamples	= other.rasterizationSamples;
866	sampleShadingEnable		= other.sampleShadingEnable;
867	minSampleShading		= other.minSampleShading;
868
869	const size_t sampleMaskArrayLen = (sizeof(vk::VkSampleMask) * 8 + other.rasterizationSamples) / (sizeof(vk::VkSampleMask) * 8);
870
871	m_sampleMask	= std::vector<vk::VkSampleMask>(other.pSampleMask, other.pSampleMask + sampleMaskArrayLen);
872	pSampleMask		= &m_sampleMask[0];
873
874	return *this;
875}
876
877PipelineCreateInfo::ColorBlendState::ColorBlendState (const std::vector<vk::VkPipelineColorBlendAttachmentState>&	_attachments,
878													  vk::VkBool32													_logicOpEnable,
879													  vk::VkLogicOp													_logicOp)
880	: m_attachments(_attachments)
881{
882	sType = vk::VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
883	pNext = DE_NULL;
884	flags					= 0u;
885	logicOpEnable			= _logicOpEnable;
886	logicOp					= _logicOp;
887	attachmentCount			= static_cast<deUint32>(m_attachments.size());
888	pAttachments			= &m_attachments[0];
889}
890
891PipelineCreateInfo::ColorBlendState::ColorBlendState (deUint32											_attachmentCount,
892													  const vk::VkPipelineColorBlendAttachmentState*	_attachments,
893													  vk::VkBool32										_logicOpEnable,
894													  vk::VkLogicOp										_logicOp)
895	: m_attachments(_attachments, _attachments + _attachmentCount)
896{
897	sType = vk::VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
898	pNext	= DE_NULL;
899	flags					= 0;
900	logicOpEnable			= _logicOpEnable;
901	logicOp					= _logicOp;
902	attachmentCount			= static_cast<deUint32>(m_attachments.size());
903	pAttachments			= &m_attachments[0];
904}
905
906PipelineCreateInfo::ColorBlendState::ColorBlendState (const vk::VkPipelineColorBlendStateCreateInfo& createInfo)
907	: m_attachments (createInfo.pAttachments, createInfo.pAttachments + createInfo.attachmentCount)
908{
909	sType = createInfo.sType;
910	pNext = createInfo.pNext;
911	flags					= createInfo.flags;
912	logicOpEnable			= createInfo.logicOpEnable;
913	logicOp					= createInfo.logicOp;
914	attachmentCount			= static_cast<deUint32>(m_attachments.size());
915	pAttachments			= &m_attachments[0];
916}
917
918PipelineCreateInfo::ColorBlendState::ColorBlendState (const ColorBlendState& createInfo, std::vector<float> _blendConstants)
919	: m_attachments (createInfo.pAttachments, createInfo.pAttachments + createInfo.attachmentCount)
920{
921	sType = createInfo.sType;
922	pNext = createInfo.pNext;
923	flags					= createInfo.flags;
924	logicOpEnable			= createInfo.logicOpEnable;
925	logicOp					= createInfo.logicOp;
926	attachmentCount			= static_cast<deUint32>(m_attachments.size());
927	pAttachments			= &m_attachments[0];
928	deMemcpy(blendConstants, &_blendConstants[0], 4 * sizeof(float));
929}
930
931PipelineCreateInfo::ColorBlendState::Attachment::Attachment (vk::VkBool32				_blendEnable,
932															 vk::VkBlendFactor			_srcColorBlendFactor,
933															 vk::VkBlendFactor			_dstColorBlendFactor,
934															 vk::VkBlendOp				_colorBlendOp,
935															 vk::VkBlendFactor			_srcAlphaBlendFactor,
936															 vk::VkBlendFactor			_dstAlphaBlendFactor,
937															 vk::VkBlendOp				_alphaBlendOp,
938															 vk::VkColorComponentFlags	_colorWriteMask)
939{
940	blendEnable			= _blendEnable;
941	srcColorBlendFactor	= _srcColorBlendFactor;
942	dstColorBlendFactor	= _dstColorBlendFactor;
943	colorBlendOp		= _colorBlendOp;
944	srcAlphaBlendFactor	= _srcAlphaBlendFactor;
945	dstAlphaBlendFactor	= _dstAlphaBlendFactor;
946	alphaBlendOp		= _alphaBlendOp;
947	colorWriteMask		= _colorWriteMask;
948}
949
950PipelineCreateInfo::DepthStencilState::StencilOpState::StencilOpState (vk::VkStencilOp	_failOp,
951																	   vk::VkStencilOp	_passOp,
952																	   vk::VkStencilOp	_depthFailOp,
953																	   vk::VkCompareOp	_compareOp,
954																	   deUint32			_compareMask,
955																	   deUint32			_writeMask,
956																	   deUint32			_reference)
957{
958	failOp		= _failOp;
959	passOp		= _passOp;
960	depthFailOp	= _depthFailOp;
961	compareOp	= _compareOp;
962
963	compareMask	= _compareMask;
964	writeMask	= _writeMask;
965	reference	= _reference;
966}
967
968PipelineCreateInfo::DepthStencilState::DepthStencilState (vk::VkBool32		_depthTestEnable,
969														  vk::VkBool32		_depthWriteEnable,
970														  vk::VkCompareOp	_depthCompareOp,
971														  vk::VkBool32		_depthBoundsTestEnable,
972														  vk::VkBool32		_stencilTestEnable,
973														  StencilOpState	_front,
974														  StencilOpState	_back,
975														  float				_minDepthBounds,
976														  float				_maxDepthBounds)
977{
978	sType = vk::VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
979	pNext = DE_NULL;
980	flags					= 0u;
981	depthTestEnable			= _depthTestEnable;
982	depthWriteEnable		= _depthWriteEnable;
983	depthCompareOp			= _depthCompareOp;
984	depthBoundsTestEnable	= _depthBoundsTestEnable;
985	stencilTestEnable		= _stencilTestEnable;
986	front	= _front;
987	back	= _back;
988
989	minDepthBounds = _minDepthBounds;
990	maxDepthBounds = _maxDepthBounds;
991}
992
993PipelineCreateInfo::DynamicState::DynamicState (const std::vector<vk::VkDynamicState>& _dynamicStates)
994{
995	sType	= vk::VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
996	pNext	= DE_NULL;
997	flags	= 0;
998
999	if (!_dynamicStates.size())
1000	{
1001		for (size_t i = 0; i < vk::VK_DYNAMIC_STATE_LAST; ++i)
1002		{
1003			m_dynamicStates.push_back(static_cast<vk::VkDynamicState>(i));
1004		}
1005	}
1006	else
1007		m_dynamicStates = _dynamicStates;
1008
1009	dynamicStateCount = static_cast<deUint32>(m_dynamicStates.size());
1010	pDynamicStates = &m_dynamicStates[0];
1011}
1012
1013PipelineCreateInfo::DynamicState::DynamicState (const DynamicState &other)
1014{
1015	sType = other.sType;
1016	pNext = other.pNext;
1017
1018	flags				= other.flags;
1019	dynamicStateCount	= other.dynamicStateCount;
1020	m_dynamicStates		= std::vector<vk::VkDynamicState>(other.pDynamicStates, other.pDynamicStates + dynamicStateCount);
1021	pDynamicStates		= &m_dynamicStates[0];
1022}
1023
1024PipelineCreateInfo::DynamicState& PipelineCreateInfo::DynamicState::operator= (const DynamicState& other)
1025{
1026	sType = other.sType;
1027	pNext = other.pNext;
1028
1029	flags				= other.flags;
1030	dynamicStateCount	= other.dynamicStateCount;
1031	m_dynamicStates		= std::vector<vk::VkDynamicState>(other.pDynamicStates, other.pDynamicStates + dynamicStateCount);
1032	pDynamicStates		= &m_dynamicStates[0];
1033
1034	return *this;
1035}
1036
1037PipelineCreateInfo::PipelineCreateInfo (vk::VkPipelineLayout		_layout,
1038										vk::VkRenderPass			_renderPass,
1039										int							_subpass,
1040										vk::VkPipelineCreateFlags	_flags)
1041{
1042	deMemset(static_cast<vk::VkGraphicsPipelineCreateInfo *>(this), 0,
1043		sizeof(vk::VkGraphicsPipelineCreateInfo));
1044
1045	sType = vk::VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
1046	pNext = DE_NULL;
1047	flags				= _flags;
1048	renderPass			= _renderPass;
1049	subpass				= _subpass;
1050	layout				= _layout;
1051	basePipelineHandle	= DE_NULL;
1052	basePipelineIndex	= 0;
1053	pDynamicState		= DE_NULL;
1054}
1055
1056PipelineCreateInfo& PipelineCreateInfo::addShader (const vk::VkPipelineShaderStageCreateInfo& shader)
1057{
1058	m_shaders.push_back(shader);
1059
1060	stageCount	= static_cast<deUint32>(m_shaders.size());
1061	pStages		= &m_shaders[0];
1062
1063	return *this;
1064}
1065
1066PipelineCreateInfo& PipelineCreateInfo::addState (const vk::VkPipelineVertexInputStateCreateInfo& state)
1067{
1068	m_vertexInputState	= state;
1069	pVertexInputState	= &m_vertexInputState;
1070
1071	return *this;
1072}
1073
1074PipelineCreateInfo& PipelineCreateInfo::addState (const vk::VkPipelineInputAssemblyStateCreateInfo& state)
1075{
1076	m_inputAssemblyState = state;
1077	pInputAssemblyState = &m_inputAssemblyState;
1078
1079	return *this;
1080}
1081
1082PipelineCreateInfo& PipelineCreateInfo::addState (const vk::VkPipelineColorBlendStateCreateInfo& state)
1083{
1084	m_colorBlendStateAttachments	= std::vector<vk::VkPipelineColorBlendAttachmentState>(state.pAttachments, state.pAttachments + state.attachmentCount);
1085	m_colorBlendState				= state;
1086	m_colorBlendState.pAttachments	= &m_colorBlendStateAttachments[0];
1087	pColorBlendState				= &m_colorBlendState;
1088
1089	return *this;
1090}
1091
1092PipelineCreateInfo& PipelineCreateInfo::addState (const vk::VkPipelineViewportStateCreateInfo& state)
1093{
1094	m_viewports					= std::vector<vk::VkViewport>(state.pViewports, state.pViewports + state.viewportCount);
1095	m_scissors					= std::vector<vk::VkRect2D>(state.pScissors, state.pScissors + state.scissorCount);
1096	m_viewportState				= state;
1097	m_viewportState.pViewports	= &m_viewports[0];
1098	m_viewportState.pScissors	= &m_scissors[0];
1099	pViewportState				= &m_viewportState;
1100
1101	return *this;
1102}
1103
1104PipelineCreateInfo& PipelineCreateInfo::addState (const vk::VkPipelineDepthStencilStateCreateInfo& state)
1105{
1106	m_dynamicDepthStencilState	= state;
1107	pDepthStencilState			= &m_dynamicDepthStencilState;
1108	return *this;
1109}
1110
1111PipelineCreateInfo& PipelineCreateInfo::addState (const vk::VkPipelineTessellationStateCreateInfo& state)
1112{
1113	m_tessState			= state;
1114	pTessellationState	= &m_tessState;
1115
1116	return *this;
1117}
1118
1119PipelineCreateInfo& PipelineCreateInfo::addState (const vk::VkPipelineRasterizationStateCreateInfo& state)
1120{
1121	m_rasterState		= state;
1122	pRasterizationState	= &m_rasterState;
1123
1124	return *this;
1125}
1126
1127PipelineCreateInfo& PipelineCreateInfo::addState (const vk::VkPipelineMultisampleStateCreateInfo& state)
1128{
1129
1130	const size_t sampleMaskArrayLen = (sizeof(vk::VkSampleMask) * 8 + state.rasterizationSamples) / ( sizeof(vk::VkSampleMask) * 8 );
1131	m_multisampleStateSampleMask	= std::vector<vk::VkSampleMask>(state.pSampleMask, state.pSampleMask + sampleMaskArrayLen);
1132	m_multisampleState				= state;
1133	m_multisampleState.pSampleMask	= &m_multisampleStateSampleMask[0];
1134	pMultisampleState				= &m_multisampleState;
1135
1136	return *this;
1137}
1138PipelineCreateInfo& PipelineCreateInfo::addState (const vk::VkPipelineDynamicStateCreateInfo& state)
1139{
1140	m_dynamicStates					= std::vector<vk::VkDynamicState>(state.pDynamicStates, state.pDynamicStates + state.dynamicStateCount);
1141	m_dynamicState					= state;
1142	m_dynamicState.pDynamicStates	= &m_dynamicStates[0];
1143	pDynamicState					= &m_dynamicState;
1144
1145	return *this;
1146}
1147
1148SamplerCreateInfo::SamplerCreateInfo (vk::VkFilter				_magFilter,
1149									  vk::VkFilter				_minFilter,
1150									  vk::VkSamplerMipmapMode	_mipmapMode,
1151									  vk::VkSamplerAddressMode	_addressModeU,
1152									  vk::VkSamplerAddressMode	_addressModeV,
1153									  vk::VkSamplerAddressMode	_addressModeW,
1154									  float						_mipLodBias,
1155									  vk::VkBool32				_anisotropyEnable,
1156									  float						_maxAnisotropy,
1157									  vk::VkBool32				_compareEnable,
1158									  vk::VkCompareOp			_compareOp,
1159									  float						_minLod,
1160									  float						_maxLod,
1161									  vk::VkBorderColor			_borderColor,
1162									  vk::VkBool32				_unnormalizedCoordinates)
1163{
1164	sType					= vk::VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
1165	pNext					= DE_NULL;
1166	flags					= 0u;
1167	magFilter				= _magFilter;
1168	minFilter				= _minFilter;
1169	mipmapMode				= _mipmapMode;
1170	addressModeU			= _addressModeU;
1171	addressModeV			= _addressModeV;
1172	addressModeW			= _addressModeW;
1173	mipLodBias				= _mipLodBias;
1174	anisotropyEnable		= _anisotropyEnable;
1175	maxAnisotropy			= _maxAnisotropy;
1176	compareEnable			= _compareEnable;
1177	compareOp				= _compareOp;
1178	minLod					= _minLod;
1179	maxLod					= _maxLod;
1180	borderColor				= _borderColor;
1181	unnormalizedCoordinates = _unnormalizedCoordinates;
1182}
1183} // Draw
1184} // vkt
1185