vktPipelineStencilTests.cpp revision 689c095f881a410da6a315795452a8e00ad95a9d
19091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim/*------------------------------------------------------------------------
29091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim * Vulkan Conformance Tests
39091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim * ------------------------
49091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim *
59091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim * Copyright (c) 2015 The Khronos Group Inc.
69091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim * Copyright (c) 2015 Imagination Technologies Ltd.
79091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim *
89091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim * Permission is hereby granted, free of charge, to any person obtaining a
99091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim * copy of this software and/or associated documentation files (the
109091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim * "Materials"), to deal in the Materials without restriction, including
119091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim * without limitation the rights to use, copy, modify, merge, publish,
129091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim * distribute, sublicense, and/or sell copies of the Materials, and to
139091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim * permit persons to whom the Materials are furnished to do so, subject to
149091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim * the following conditions:
159091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim *
169091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim * The above copyright notice(s) and this permission notice shall be included
179091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim * in all copies or substantial portions of the Materials.
189091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim *
199091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim * The Materials are Confidential Information as defined by the
209091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim * Khronos Membership Agreement until designated non-confidential by Khronos,
219091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim * at which point this condition clause shall be removed.
229091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim *
239091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
249091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
259091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
269091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
279091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
289091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
299091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim * MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
309091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim *
319091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim *//*!
329091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim * \file
339091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim * \brief Stencil Tests
349091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim *//*--------------------------------------------------------------------*/
359091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
369091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim#include "vktPipelineStencilTests.hpp"
379091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim#include "vktPipelineClearUtil.hpp"
389091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim#include "vktPipelineImageUtil.hpp"
399091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim#include "vktPipelineVertexUtil.hpp"
409091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim#include "vktPipelineReferenceRenderer.hpp"
419091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim#include "vktPipelineUniqueRandomIterator.hpp"
429091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim#include "vktTestCase.hpp"
439091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim#include "vkImageUtil.hpp"
449091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim#include "vkMemUtil.hpp"
459091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim#include "vkPrograms.hpp"
469091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim#include "vkQueryUtil.hpp"
479091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim#include "vkRef.hpp"
489091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim#include "vkRefUtil.hpp"
499091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim#include "tcuImageCompare.hpp"
509091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim#include "deMemory.h"
519091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim#include "deRandom.hpp"
529091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim#include "deStringUtil.hpp"
539091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim#include "deUniquePtr.hpp"
549091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
559091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim#include <algorithm>
569091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim#include <sstream>
579091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim#include <vector>
589091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
599091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimnamespace vkt
609091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{
619091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimnamespace pipeline
629091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{
639091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
649091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimusing namespace vk;
659091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
669091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimnamespace
679091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{
689091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
699091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimbool isSupportedDepthStencilFormat (const InstanceInterface& instanceInterface, VkPhysicalDevice device, VkFormat format)
709091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{
719091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	VkFormatProperties formatProps;
729091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
73120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	instanceInterface.getPhysicalDeviceFormatProperties(device, format, &formatProps);
749091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
75682d882fdacf7d4711d23a5ba006f7fb377cf0e3Pyry Haulos	return (formatProps.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) != 0;
769091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim}
779091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
789091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimclass StencilOpStateUniqueRandomIterator : public UniqueRandomIterator<VkStencilOpState>
799091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{
809091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimpublic:
819091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim								StencilOpStateUniqueRandomIterator	(int seed);
829091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	virtual						~StencilOpStateUniqueRandomIterator	(void) {}
839091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	virtual VkStencilOpState	getIndexedValue (deUint32 index);
849091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
859091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimprivate:
869091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	const static VkStencilOp	m_stencilOps[];
879091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	const static VkCompareOp	m_compareOps[];
889091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
899091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	// Pre-calculated constants
909091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	const static deUint32		m_stencilOpsLength;
919091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	const static deUint32		m_stencilOpsLength2;
929091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	const static deUint32		m_stencilOpsLength3;
939091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	const static deUint32		m_compareOpsLength;
949091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
959091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	// Total number of cross-combinations of (stencilFailOp x stencilPassOp x stencilDepthFailOp x stencilCompareOp)
969091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	const static deUint32		m_totalStencilOpStates;
979091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim};
989091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
999091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
1009091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimclass StencilTest : public vkt::TestCase
1019091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{
1029091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimpublic:
1039091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	enum
1049091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	{
1059091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		QUAD_COUNT = 4
1069091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	};
1079091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
1089091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	struct StencilStateConfig
1099091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	{
1109091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		deUint32	frontReadMask;
1119091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		deUint32	frontWriteMask;
1129091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		deUint32	frontRef;
1139091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
1149091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		deUint32	backReadMask;
1159091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		deUint32	backWriteMask;
1169091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		deUint32	backRef;
1179091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	};
1189091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
1199091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	const static StencilStateConfig			s_stencilStateConfigs[QUAD_COUNT];
1209091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	const static float						s_quadDepths[QUAD_COUNT];
1219091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
1229091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
1239091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim											StencilTest				(tcu::TestContext&			testContext,
1249091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim																	 const std::string&			name,
1259091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim																	 const std::string&			description,
1269091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim																	 VkFormat					stencilFormat,
1279091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim																	 const VkStencilOpState&	stencilOpStateFront,
1289091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim																	 const VkStencilOpState&	stencilOpStateBack);
1299091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	virtual									~StencilTest			(void);
1309091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	virtual void							initPrograms			(SourceCollections& sourceCollections) const;
1319091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	virtual TestInstance*					createInstance			(Context& context) const;
1329091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
1339091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimprivate:
1349091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	VkFormat								m_stencilFormat;
1359091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	const VkStencilOpState					m_stencilOpStateFront;
1369091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	const VkStencilOpState					m_stencilOpStateBack;
1379091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim};
1389091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
1399091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimclass StencilTestInstance : public vkt::TestInstance
1409091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{
1419091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimpublic:
1429091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim										StencilTestInstance		(Context&					context,
1439091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim																 VkFormat					stencilFormat,
1449091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim																 const VkStencilOpState&	stencilOpStatesFront,
1459091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim																 const VkStencilOpState&	stencilOpStatesBack);
1469091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	virtual								~StencilTestInstance	(void);
1479091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	virtual tcu::TestStatus				iterate					(void);
1489091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
1499091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimprivate:
1509091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	tcu::TestStatus						verifyImage				(void);
1519091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
1529091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	VkStencilOpState					m_stencilOpStateFront;
1539091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	VkStencilOpState					m_stencilOpStateBack;
154689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos	const tcu::UVec2					m_renderSize;
1559091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	const VkFormat						m_colorFormat;
1569091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	const VkFormat						m_stencilFormat;
1579091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
1589091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	VkImageCreateInfo					m_colorImageCreateInfo;
1599091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	Move<VkImage>						m_colorImage;
1609091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	de::MovePtr<Allocation>				m_colorImageAlloc;
1619091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	Move<VkImage>						m_stencilImage;
1629091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	de::MovePtr<Allocation>				m_stencilImageAlloc;
1639091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	Move<VkImageView>					m_colorAttachmentView;
1649091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	Move<VkImageView>					m_stencilAttachmentView;
1659091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	Move<VkRenderPass>					m_renderPass;
1669091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	Move<VkFramebuffer>					m_framebuffer;
1679091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
1689091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	Move<VkShaderModule>				m_vertexShaderModule;
1699091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	Move<VkShaderModule>				m_fragmentShaderModule;
1709091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
1719091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	Move<VkBuffer>						m_vertexBuffer;
1729091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	std::vector<Vertex4RGBA>			m_vertices;
1739091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	de::MovePtr<Allocation>				m_vertexBufferAlloc;
1749091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
1759091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	Move<VkPipelineLayout>				m_pipelineLayout;
1769091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	Move<VkPipeline>					m_graphicsPipelines[StencilTest::QUAD_COUNT];
1779091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
178120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	Move<VkCommandPool>					m_cmdPool;
179120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	Move<VkCommandBuffer>				m_cmdBuffer;
1809091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
1819091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	Move<VkFence>						m_fence;
1829091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim};
1839091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
1849091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
1859091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim// StencilOpStateUniqueRandomIterator
1869091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
1879091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimconst VkStencilOp StencilOpStateUniqueRandomIterator::m_stencilOps[] =
1889091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{
1899091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	VK_STENCIL_OP_KEEP,
1909091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	VK_STENCIL_OP_ZERO,
1919091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	VK_STENCIL_OP_REPLACE,
192120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	VK_STENCIL_OP_INCREMENT_AND_CLAMP,
193120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	VK_STENCIL_OP_DECREMENT_AND_CLAMP,
1949091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	VK_STENCIL_OP_INVERT,
195120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	VK_STENCIL_OP_INCREMENT_AND_WRAP,
196120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	VK_STENCIL_OP_DECREMENT_AND_WRAP
1979091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim};
1989091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
1999091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimconst VkCompareOp StencilOpStateUniqueRandomIterator::m_compareOps[] =
2009091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{
2019091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	VK_COMPARE_OP_NEVER,
2029091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	VK_COMPARE_OP_LESS,
2039091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	VK_COMPARE_OP_EQUAL,
204120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	VK_COMPARE_OP_LESS_OR_EQUAL,
2059091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	VK_COMPARE_OP_GREATER,
2069091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	VK_COMPARE_OP_NOT_EQUAL,
207120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	VK_COMPARE_OP_GREATER_OR_EQUAL,
2089091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	VK_COMPARE_OP_ALWAYS
2099091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim};
2109091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
2119091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimconst deUint32 StencilOpStateUniqueRandomIterator::m_stencilOpsLength		= DE_LENGTH_OF_ARRAY(m_stencilOps);
2129091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimconst deUint32 StencilOpStateUniqueRandomIterator::m_stencilOpsLength2		= m_stencilOpsLength * m_stencilOpsLength;
2139091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimconst deUint32 StencilOpStateUniqueRandomIterator::m_stencilOpsLength3		= m_stencilOpsLength2 * m_stencilOpsLength;
2149091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimconst deUint32 StencilOpStateUniqueRandomIterator::m_compareOpsLength		= DE_LENGTH_OF_ARRAY(m_compareOps);
2159091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimconst deUint32 StencilOpStateUniqueRandomIterator::m_totalStencilOpStates	= m_stencilOpsLength3 * m_compareOpsLength;
2169091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
2179091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae KimStencilOpStateUniqueRandomIterator::StencilOpStateUniqueRandomIterator (int seed)
2189091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	: UniqueRandomIterator<VkStencilOpState>(m_totalStencilOpStates, m_totalStencilOpStates, seed)
2199091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{
2209091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim}
2219091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
2229091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae KimVkStencilOpState StencilOpStateUniqueRandomIterator::getIndexedValue (deUint32 index)
2239091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{
2249091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	const deUint32 stencilCompareOpIndex = index / m_stencilOpsLength3;
2259091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	const deUint32 stencilCompareOpSeqIndex = stencilCompareOpIndex * m_stencilOpsLength3;
2269091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
2279091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	const deUint32 stencilDepthFailOpIndex = (index - stencilCompareOpSeqIndex) / m_stencilOpsLength2;
2289091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	const deUint32 stencilDepthFailOpSeqIndex = stencilDepthFailOpIndex * m_stencilOpsLength2;
2299091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
2309091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	const deUint32 stencilPassOpIndex = (index - stencilCompareOpSeqIndex - stencilDepthFailOpSeqIndex) / m_stencilOpsLength;
2319091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	const deUint32 stencilPassOpSeqIndex = stencilPassOpIndex * m_stencilOpsLength;
2329091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
2339091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	const deUint32 stencilFailOpIndex = index - stencilCompareOpSeqIndex - stencilDepthFailOpSeqIndex - stencilPassOpSeqIndex;
2349091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
2359091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	const VkStencilOpState stencilOpState =
2369091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	{
237120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		m_stencilOps[stencilFailOpIndex],		// VkStencilOp	failOp;
238120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		m_stencilOps[stencilPassOpIndex],		// VkStencilOp	passOp;
239120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		m_stencilOps[stencilDepthFailOpIndex],	// VkStencilOp	depthFailOp;
240120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		m_compareOps[stencilCompareOpIndex],	// VkCompareOp	compareOp;
241120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		0x0,									// deUint32		compareMask;
242120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		0x0,									// deUint32		writeMask;
243120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		0x0										// deUint32		reference;
2449091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	};
2459091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
2469091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	return stencilOpState;
2479091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim}
2489091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
2499091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
2509091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim// StencilTest
2519091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
2529091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimconst StencilTest::StencilStateConfig StencilTest::s_stencilStateConfigs[QUAD_COUNT] =
2539091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{
2549091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	//	frontReadMask	frontWriteMask		frontRef		backReadMask	backWriteMask	backRef
2559091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	{	0xFF,			0xFF,				0xAB,			0xF0,			0xFF,			0xFF	},
2569091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	{	0xFF,			0xF0,				0xCD,			0xF0,			0xF0,			0xEF	},
2579091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	{	0xF0,			0x0F,				0xEF,			0xFF,			0x0F,			0xCD	},
2589091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	{	0xF0,			0x01,				0xFF,			0xFF,			0x01,			0xAB	}
2599091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim};
2609091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
2619091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimconst float StencilTest::s_quadDepths[QUAD_COUNT] =
2629091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{
2639091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	0.1f,
2649091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	0.0f,
2659091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	0.3f,
2669091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	0.2f
2679091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim};
2689091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
2699091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae KimStencilTest::StencilTest (tcu::TestContext&			testContext,
2709091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim						  const std::string&		name,
2719091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim						  const std::string&		description,
2729091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim						  VkFormat					stencilFormat,
2739091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim						  const VkStencilOpState&	stencilOpStateFront,
2749091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim						  const VkStencilOpState&	stencilOpStateBack)
2759091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	: vkt::TestCase			(testContext, name, description)
2769091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	, m_stencilFormat		(stencilFormat)
2779091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	, m_stencilOpStateFront	(stencilOpStateFront)
2789091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	, m_stencilOpStateBack	(stencilOpStateBack)
2799091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{
2809091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim}
2819091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
2829091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae KimStencilTest::~StencilTest (void)
2839091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{
2849091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim}
2859091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
2869091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae KimTestInstance* StencilTest::createInstance (Context& context) const
2879091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{
2889091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	return new StencilTestInstance(context, m_stencilFormat, m_stencilOpStateFront, m_stencilOpStateBack);
2899091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim}
2909091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
2919091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimvoid StencilTest::initPrograms (SourceCollections& sourceCollections) const
2929091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{
2939091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	sourceCollections.glslSources.add("color_vert") << glu::VertexSource(
2949091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		"#version 310 es\n"
2959091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		"layout(location = 0) in vec4 position;\n"
2969091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		"layout(location = 1) in vec4 color;\n"
2979091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		"layout(location = 0) out highp vec4 vtxColor;\n"
2989091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		"void main (void)\n"
2999091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		"{\n"
3009091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		"	gl_Position = position;\n"
3019091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		"	vtxColor = color;\n"
3029091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		"}\n");
3039091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
3049091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	sourceCollections.glslSources.add("color_frag") << glu::FragmentSource(
3059091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		"#version 310 es\n"
3069091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		"layout(location = 0) in highp vec4 vtxColor;\n"
3079091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		"layout(location = 0) out highp vec4 fragColor;\n"
3089091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		"void main (void)\n"
3099091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		"{\n"
3109091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		"	fragColor = vtxColor;\n"
3119091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		"}\n");
3129091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim}
3139091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
3149091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
3159091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim// StencilTestInstance
3169091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
3179091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae KimStencilTestInstance::StencilTestInstance (Context&					context,
3189091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim										  VkFormat					stencilFormat,
3199091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim										  const VkStencilOpState&	stencilOpStateFront,
3209091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim										  const VkStencilOpState&	stencilOpStateBack)
3219091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	: vkt::TestInstance		(context)
3229091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	, m_stencilOpStateFront	(stencilOpStateFront)
3239091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	, m_stencilOpStateBack	(stencilOpStateBack)
3249091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	, m_renderSize			(32, 32)
3259091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	, m_colorFormat			(VK_FORMAT_R8G8B8A8_UNORM)
3269091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	, m_stencilFormat		(stencilFormat)
3279091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{
328120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	const DeviceInterface&		vk						= context.getDeviceInterface();
329120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	const VkDevice				vkDevice				= context.getDevice();
330120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	const deUint32				queueFamilyIndex		= context.getUniversalQueueFamilyIndex();
331120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	SimpleAllocator				memAlloc				(vk, vkDevice, getPhysicalDeviceMemoryProperties(context.getInstanceInterface(), context.getPhysicalDevice()));
332120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	const VkComponentMapping	componentMappingRGBA	= { VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A };
3339091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
3349091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	// Create color image
3359091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	{
3369091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkImageCreateInfo colorImageParams =
3379091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
338120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,										// VkStructureType			sType;
339120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			DE_NULL,																	// const void*				pNext;
340120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,																			// VkImageCreateFlags		flags;
341120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_IMAGE_TYPE_2D,															// VkImageType				imageType;
342120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			m_colorFormat,																// VkFormat					format;
343120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			{ m_renderSize.x(), m_renderSize.y(), 1u },									// VkExtent3D				extent;
344120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			1u,																			// deUint32					mipLevels;
345120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			1u,																			// deUint32					arrayLayers;
346120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_SAMPLE_COUNT_1_BIT,														// VkSampleCountFlagBits	samples;
347120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_IMAGE_TILING_OPTIMAL,													// VkImageTiling			tiling;
348120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT,		// VkImageUsageFlags		usage;
349120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_SHARING_MODE_EXCLUSIVE,													// VkSharingMode			sharingMode;
350120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			1u,																			// deUint32					queueFamilyIndexCount;
351120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			&queueFamilyIndex,															// const deUint32*			pQueueFamilyIndices;
352120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_IMAGE_LAYOUT_UNDEFINED													// VkImageLayout			initialLayout;
3539091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
3549091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
3559091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		m_colorImageCreateInfo	= colorImageParams;
3569091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		m_colorImage			= createImage(vk, vkDevice, &m_colorImageCreateInfo);
3579091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
3589091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		// Allocate and bind color image memory
3599091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		m_colorImageAlloc		= memAlloc.allocate(getImageMemoryRequirements(vk, vkDevice, *m_colorImage), MemoryRequirement::Any);
3609091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		VK_CHECK(vk.bindImageMemory(vkDevice, *m_colorImage, m_colorImageAlloc->getMemory(), m_colorImageAlloc->getOffset()));
3619091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	}
3629091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
3639091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	// Create stencil image
3649091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	{
3659091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		// Check format support
3669091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		if (!isSupportedDepthStencilFormat(context.getInstanceInterface(), context.getPhysicalDevice(), m_stencilFormat))
3679091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			throw tcu::NotSupportedError(std::string("Unsupported depth/stencil format: ") + getFormatName(m_stencilFormat));
3689091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
3699091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkImageCreateInfo stencilImageParams =
3709091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
371120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,			// VkStructureType			sType;
372120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			DE_NULL,										// const void*				pNext;
373120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,												// VkImageCreateFlags		flags;
374120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_IMAGE_TYPE_2D,								// VkImageType				imageType;
375120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			m_stencilFormat,								// VkFormat					format;
376120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			{ m_renderSize.x(), m_renderSize.y(), 1u },		// VkExtent3D				extent;
377120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			1u,												// deUint32					mipLevels;
378120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			1u,												// deUint32					arrayLayers;
379120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_SAMPLE_COUNT_1_BIT,							// VkSampleCountFlagBits	samples;
380120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_IMAGE_TILING_OPTIMAL,						// VkImageTiling			tiling;
381120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,	// VkImageUsageFlags		usage;
382120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_SHARING_MODE_EXCLUSIVE,						// VkSharingMode			sharingMode;
383120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			1u,												// deUint32					queueFamilyIndexCount;
384120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			&queueFamilyIndex,								// const deUint32*			pQueueFamilyIndices;
385120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_IMAGE_LAYOUT_UNDEFINED						// VkImageLayout			initialLayout;
3869091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
3879091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
3889091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		m_stencilImage = createImage(vk, vkDevice, &stencilImageParams);
3899091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
3909091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		// Allocate and bind stencil image memory
3919091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		m_stencilImageAlloc = memAlloc.allocate(getImageMemoryRequirements(vk, vkDevice, *m_stencilImage), MemoryRequirement::Any);
3929091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		VK_CHECK(vk.bindImageMemory(vkDevice, *m_stencilImage, m_stencilImageAlloc->getMemory(), m_stencilImageAlloc->getOffset()));
3939091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	}
3949091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
3959091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	// Create color attachment view
3969091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	{
3979091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkImageViewCreateInfo colorAttachmentViewParams =
3989091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
399120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,			// VkStructureType			sType;
400120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			DE_NULL,											// const void*				pNext;
401120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,													// VkImageViewCreateFlags	flags;
402120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			*m_colorImage,										// VkImage					image;
403120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_IMAGE_VIEW_TYPE_2D,								// VkImageViewType			viewType;
404120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			m_colorFormat,										// VkFormat					format;
405120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			componentMappingRGBA,								// VkComponentMapping		components;
406120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			{ VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u }		// VkImageSubresourceRange	subresourceRange;
4079091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
4089091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
4099091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		m_colorAttachmentView = createImageView(vk, vkDevice, &colorAttachmentViewParams);
4109091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	}
4119091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
4129091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	// Create stencil attachment view
4139091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	{
4149091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkImageViewCreateInfo stencilAttachmentViewParams =
4159091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
416120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,			// VkStructureType			sType;
417120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			DE_NULL,											// const void*				pNext;
418120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,													// VkImageViewCreateFlags	flags;
419120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			*m_stencilImage,									// VkImage					image;
420120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_IMAGE_VIEW_TYPE_2D,								// VkImageViewType			viewType;
421120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			m_stencilFormat,									// VkFormat					format;
422120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			componentMappingRGBA,								// VkComponentMapping		components;
423120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			{ VK_IMAGE_ASPECT_STENCIL_BIT, 0u, 1u, 0u, 1u },	// VkImageSubresourceRange	subresourceRange;
4249091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
4259091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
4269091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		m_stencilAttachmentView = createImageView(vk, vkDevice, &stencilAttachmentViewParams);
4279091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	}
4289091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
4299091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	// Create render pass
4309091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	{
4319091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkAttachmentDescription colorAttachmentDescription =
4329091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
43394128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos			0u,													// VkAttachmentDescriptionFlags	flags;
4349091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			m_colorFormat,										// VkFormat						format;
435120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_SAMPLE_COUNT_1_BIT,								// VkSampleCountFlagBits		samples;
4369091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			VK_ATTACHMENT_LOAD_OP_CLEAR,						// VkAttachmentLoadOp			loadOp;
4379091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			VK_ATTACHMENT_STORE_OP_STORE,						// VkAttachmentStoreOp			storeOp;
4389091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			VK_ATTACHMENT_LOAD_OP_DONT_CARE,					// VkAttachmentLoadOp			stencilLoadOp;
4399091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			VK_ATTACHMENT_STORE_OP_DONT_CARE,					// VkAttachmentStoreOp			stencilStoreOp;
4409091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,			// VkImageLayout				initialLayout;
4419091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,			// VkImageLayout				finalLayout;
4429091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
4439091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
4449091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkAttachmentDescription stencilAttachmentDescription =
4459091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
446120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,													// VkAttachmentDescriptionFlags	flags;
4479091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			m_stencilFormat,									// VkFormat						format;
448120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_SAMPLE_COUNT_1_BIT,								// VkSampleCountFlagBits		samples;
4499091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			VK_ATTACHMENT_LOAD_OP_CLEAR,						// VkAttachmentLoadOp			loadOp;
4509091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			VK_ATTACHMENT_STORE_OP_DONT_CARE,					// VkAttachmentStoreOp			storeOp;
4519091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			VK_ATTACHMENT_LOAD_OP_CLEAR,						// VkAttachmentLoadOp			stencilLoadOp;
4529091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			VK_ATTACHMENT_STORE_OP_DONT_CARE,					// VkAttachmentStoreOp			stencilStoreOp;
4539091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,	// VkImageLayout				initialLayout;
4549091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,	// VkImageLayout				finalLayout;
4559091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
4569091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
4579091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkAttachmentDescription attachments[2] =
4589091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
4599091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			colorAttachmentDescription,
4609091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			stencilAttachmentDescription
4619091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
4629091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
4639091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkAttachmentReference colorAttachmentReference =
4649091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
4659091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			0u,													// deUint32			attachment;
4669091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL			// VkImageLayout	layout;
4679091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
4689091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
4699091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkAttachmentReference stencilAttachmentReference =
4709091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
4719091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			1u,													// deUint32			attachment;
4729091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL	// VkImageLayout	layout;
4739091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
4749091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
4759091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkSubpassDescription subpassDescription =
4769091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
4779091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			0u,													// VkSubpassDescriptionFlags	flags;
478120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_PIPELINE_BIND_POINT_GRAPHICS,					// VkPipelineBindPoint			pipelineBindPoint;
479120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,													// deUint32						inputAttachmentCount;
4809091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			DE_NULL,											// const VkAttachmentReference*	pInputAttachments;
481120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			1u,													// deUint32						colorAttachmentCount;
4829091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			&colorAttachmentReference,							// const VkAttachmentReference*	pColorAttachments;
483120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			DE_NULL,											// const VkAttachmentReference*	pResolveAttachments;
484120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			&stencilAttachmentReference,						// const VkAttachmentReference*	pDepthStencilAttachment;
485120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,													// deUint32						preserveAttachmentCount;
4869091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			DE_NULL												// const VkAttachmentReference*	pPreserveAttachments;
4879091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
4889091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
4899091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkRenderPassCreateInfo renderPassParams =
4909091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
4919091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,			// VkStructureType					sType;
4929091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			DE_NULL,											// const void*						pNext;
493120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,													// VkRenderPassCreateFlags			flags;
4949091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			2u,													// deUint32							attachmentCount;
4959091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			attachments,										// const VkAttachmentDescription*	pAttachments;
4969091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			1u,													// deUint32							subpassCount;
4979091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			&subpassDescription,								// const VkSubpassDescription*		pSubpasses;
4989091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			0u,													// deUint32							dependencyCount;
4999091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			DE_NULL												// const VkSubpassDependency*		pDependencies;
5009091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
5019091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
5029091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		m_renderPass = createRenderPass(vk, vkDevice, &renderPassParams);
5039091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	}
5049091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
5059091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	// Create framebuffer
5069091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	{
5079091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkImageView attachmentBindInfos[2] = { *m_colorAttachmentView, *m_stencilAttachmentView };
5089091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
5099091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkFramebufferCreateInfo framebufferParams =
5109091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
511120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO,			// VkStructureType			sType;
512120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			DE_NULL,											// const void*				pNext;
513120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,													// VkFramebufferCreateFlags	flags;
514120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			*m_renderPass,										// VkRenderPass				renderPass;
515120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			2u,													// deUint32					attachmentCount;
516120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			attachmentBindInfos,								// const VkImageView*		pAttachments;
517120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			(deUint32)m_renderSize.x(),							// deUint32					width;
518120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			(deUint32)m_renderSize.y(),							// deUint32					height;
519120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			1u													// deUint32					layers;
5209091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
5219091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
5229091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		m_framebuffer = createFramebuffer(vk, vkDevice, &framebufferParams);
5239091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	}
5249091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
5259091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	// Create pipeline layout
5269091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	{
5279091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkPipelineLayoutCreateInfo pipelineLayoutParams =
5289091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
5299091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,		// VkStructureType				sType;
5309091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			DE_NULL,											// const void*					pNext;
531120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,													// VkPipelineLayoutCreateFlags	flags;
532120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,													// deUint32						setLayoutCount;
5339091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			DE_NULL,											// const VkDescriptorSetLayout*	pSetLayouts;
5349091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			0u,													// deUint32						pushConstantRangeCount;
5359091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			DE_NULL												// const VkPushConstantRange*	pPushConstantRanges;
5369091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
5379091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
5389091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		m_pipelineLayout = createPipelineLayout(vk, vkDevice, &pipelineLayoutParams);
5399091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	}
5409091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
541120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	m_vertexShaderModule	= createShaderModule(vk, vkDevice, m_context.getBinaryCollection().get("color_vert"), 0);
542120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	m_fragmentShaderModule	= createShaderModule(vk, vkDevice, m_context.getBinaryCollection().get("color_frag"), 0);
5439091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
5449091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	// Create pipeline
5459091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	{
546120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		const VkPipelineShaderStageCreateInfo shaderStages[2] =
5479091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
5489091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			{
549120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,		// VkStructureType						sType;
550120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				DE_NULL,													// const void*							pNext;
551120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				0u,															// VkPipelineShaderStageCreateFlags		flags;
552120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				VK_SHADER_STAGE_VERTEX_BIT,									// VkShaderStageFlagBits				stage;
553120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				*m_vertexShaderModule,										// VkShaderModule						module;
554120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				"main",														// const char*							pName;
555120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				DE_NULL														// const VkSpecializationInfo*			pSpecializationInfo;
5569091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			},
5579091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			{
558120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,		// VkStructureType						sType;
559120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				DE_NULL,													// const void*							pNext;
560120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				0u,															// VkPipelineShaderStageCreateFlags		flags;
561120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				VK_SHADER_STAGE_FRAGMENT_BIT,								// VkShaderStageFlagBits				stage;
562120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				*m_fragmentShaderModule,									// VkShaderModule						module;
563120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				"main",														// const char*							pName;
564120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				DE_NULL														// const VkSpecializationInfo*			pSpecializationInfo;
5659091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			}
5669091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
5679091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
5689091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkVertexInputBindingDescription vertexInputBindingDescription =
5699091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
5709091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			0u,										// deUint32					binding;
5719091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			sizeof(Vertex4RGBA),					// deUint32					strideInBytes;
572120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_VERTEX_INPUT_RATE_VERTEX				// VkVertexInputStepRate	inputRate;
5739091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
5749091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
5759091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkVertexInputAttributeDescription vertexInputAttributeDescriptions[2] =
5769091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
5779091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			{
5789091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim				0u,									// deUint32	location;
5799091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim				0u,									// deUint32	binding;
5809091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim				VK_FORMAT_R32G32B32A32_SFLOAT,		// VkFormat	format;
5819091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim				0u									// deUint32	offsetInBytes;
5829091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			},
5839091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			{
5849091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim				1u,									// deUint32	location;
5859091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim				0u,									// deUint32	binding;
5869091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim				VK_FORMAT_R32G32B32A32_SFLOAT,		// VkFormat	format;
5879091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim				DE_OFFSET_OF(Vertex4RGBA, color),	// deUint32	offsetInBytes;
5889091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			}
5899091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
5909091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
5919091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkPipelineVertexInputStateCreateInfo vertexInputStateParams =
5929091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
5939091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO,		// VkStructureType							sType;
5949091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			DE_NULL,														// const void*								pNext;
595120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,																// VkPipelineVertexInputStateCreateFlags	flags;
596120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			1u,																// deUint32									vertexBindingDescriptionCount;
5979091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			&vertexInputBindingDescription,									// const VkVertexInputBindingDescription*	pVertexBindingDescriptions;
598120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			2u,																// deUint32									vertexAttributeDescriptionCount;
5999091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			vertexInputAttributeDescriptions								// const VkVertexInputAttributeDescription*	pVertexAttributeDescriptions;
6009091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
6019091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
6029091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkPipelineInputAssemblyStateCreateInfo inputAssemblyStateParams =
6039091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
604120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,	// VkStructureType							sType;
605120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			DE_NULL,														// const void*								pNext;
606120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,																// VkPipelineInputAssemblyStateCreateFlags	flags;
607120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST,							// VkPrimitiveTopology						topology;
608120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			false															// VkBool32									primitiveRestartEnable;
6099091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
6109091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
6119091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkViewport viewport =
6129091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
613120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0.0f,						// float	x;
614120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0.0f,						// float	y;
6159091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			(float)m_renderSize.x(),	// float	width;
6169091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			(float)m_renderSize.y(),	// float	height;
6179091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			0.0f,						// float	minDepth;
6189091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			1.0f						// float	maxDepth;
6199091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
6209091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
6219091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkRect2D scissor = { { 0, 0 }, { m_renderSize.x(), m_renderSize.y() } };
6229091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
6239091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkPipelineViewportStateCreateInfo viewportStateParams =
6249091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
625120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO,			// VkStructureType						sType;
626120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			DE_NULL,														// const void*							pNext;
627120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,																// VkPipelineViewportStateCreateFlags	flags;
628120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			1u,																// deUint32								viewportCount;
629120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			&viewport,														// const VkViewport*					pViewports;
630120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			1u,																// deUint32								scissorCount;
631120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			&scissor,														// const VkRect2D*						pScissors;
6329091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
6339091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
634120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		const VkPipelineRasterizationStateCreateInfo rasterStateParams =
6359091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
636120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO,		// VkStructureType							sType;
637120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			DE_NULL,														// const void*								pNext;
638120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,																// VkPipelineRasterizationStateCreateFlags	flags;
639120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			false,															// VkBool32									depthClampEnable;
640120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			false,															// VkBool32									rasterizerDiscardEnable;
641120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_POLYGON_MODE_FILL,											// VkPolygonMode							polygonMode;
642120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_CULL_MODE_NONE,												// VkCullModeFlags							cullMode;
643120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_FRONT_FACE_COUNTER_CLOCKWISE,								// VkFrontFace								frontFace;
644120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			false,															// VkBool32									depthBiasEnable;
645120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0.0f,															// float									depthBiasConstantFactor;
646120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0.0f,															// float									depthBiasClamp;
647120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0.0f,															// float									depthBiasSlopeFactor;
648120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			1.0f															// float									lineWidth;
6499091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
6509091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
6519091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkPipelineColorBlendAttachmentState colorBlendAttachmentState =
6529091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
653120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			false,															// VkBool32					blendEnable;
654120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_BLEND_FACTOR_ONE,											// VkBlendFactor			srcColorBlendFactor;
655120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_BLEND_FACTOR_ZERO,											// VkBlendFactor			dstColorBlendFactor;
656120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_BLEND_OP_ADD,												// VkBlendOp				colorBlendOp;
657120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_BLEND_FACTOR_ONE,											// VKBLENDFACTOR			SRCALPHABLENDFACTOR;
658120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_BLEND_FACTOR_ZERO,											// VkBlendFactor			dstAlphaBlendFactor;
659120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_BLEND_OP_ADD,												// VkBlendOp				alphaBlendOp;
660120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT |			// VkColorComponentFlags	colorWriteMask;
661120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT
6629091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
6639091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
6649091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkPipelineColorBlendStateCreateInfo colorBlendStateParams =
6659091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
6669091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO,	// VkStructureType								sType;
6679091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			DE_NULL,													// const void*									pNext;
668120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,															// VkPipelineColorBlendStateCreateFlags			flags;
6699091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			false,														// VkBool32										logicOpEnable;
6709091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			VK_LOGIC_OP_COPY,											// VkLogicOp									logicOp;
6719091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			1u,															// deUint32										attachmentCount;
6729091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			&colorBlendAttachmentState,									// const VkPipelineColorBlendAttachmentState*	pAttachments;
673120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			{ 0.0f, 0.0f, 0.0f, 0.0f }									// float										blendConstants[4];
6749091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
6759091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
6769091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkPipelineMultisampleStateCreateInfo multisampleStateParams =
6779091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
678120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO,	// VkStructureType							sType;
679120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			DE_NULL,													// const void*								pNext;
680120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,															// VkPipelineMultisampleStateCreateFlags	flags;
681120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_SAMPLE_COUNT_1_BIT,										// VkSampleCountFlagBits					rasterizationSamples;
682120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			false,														// VkBool32									sampleShadingEnable;
683120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0.0f,														// float									minSampleShading;
684120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			DE_NULL,													// const VkSampleMask*						pSampleMask;
685120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			false,														// VkBool32									alphaToCoverageEnable;
686120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			false														// VkBool32									alphaToOneEnable;
6879091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
6889091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
6899091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const bool isDepthEnabled = (vk::mapVkFormat(m_stencilFormat).order != tcu::TextureFormat::S);
6909091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
6919091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		VkPipelineDepthStencilStateCreateInfo depthStencilStateParams =
6929091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
693120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO,	// VkStructureType							sType;
694120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			DE_NULL,													// const void*								pNext;
695120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,															// VkPipelineDepthStencilStateCreateFlags	flags;
696120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			isDepthEnabled,												// VkBool32									depthTestEnable;
697120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			isDepthEnabled,												// VkBool32									depthWriteEnable;
698120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_COMPARE_OP_LESS,											// VkCompareOp								depthCompareOp;
699120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			false,														// VkBool32									depthBoundsTestEnable;
700120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			true,														// VkBool32									stencilTestEnable;
701120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			m_stencilOpStateFront,										// VkStencilOpState							front;
702120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			m_stencilOpStateBack,										// VkStencilOpState							back;
703120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			-1.0f,														// float									minDepthBounds;
704120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			+1.0f														// float									maxDepthBounds;
7059091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
7069091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
7079091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkPipelineDynamicStateCreateInfo dynamicStateParams =
7089091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
709120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO,		// VkStructureType						sType;
710120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			DE_NULL,													// const void*							pNext;
711120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,															// VkPipelineDynamicStateCreateFlags	flags;
712120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,															// deUint32								dynamicStateCount;
713120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			DE_NULL														// const VkDynamicState*				pDynamicStates;
7149091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
7159091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
7169091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkGraphicsPipelineCreateInfo graphicsPipelineParams =
7179091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
7189091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,	// VkStructureType									sType;
7199091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			DE_NULL,											// const void*										pNext;
720120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,													// VkPipelineCreateFlags							flags;
7219091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			2u,													// deUint32											stageCount;
722120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			shaderStages,										// const VkPipelineShaderStageCreateInfo*			pStages;
7239091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			&vertexInputStateParams,							// const VkPipelineVertexInputStateCreateInfo*		pVertexInputState;
7249091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			&inputAssemblyStateParams,							// const VkPipelineInputAssemblyStateCreateInfo*	pInputAssemblyState;
7259091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			DE_NULL,											// const VkPipelineTessellationStateCreateInfo*		pTessellationState;
7269091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			&viewportStateParams,								// const VkPipelineViewportStateCreateInfo*			pViewportState;
727120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			&rasterStateParams,									// const VkPipelineRasterizationStateCreateInfo*	pRasterizationState;
7289091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			&multisampleStateParams,							// const VkPipelineMultisampleStateCreateInfo*		pMultisampleState;
7299091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			&depthStencilStateParams,							// const VkPipelineDepthStencilStateCreateInfo*		pDepthStencilState;
7309091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			&colorBlendStateParams,								// const VkPipelineColorBlendStateCreateInfo*		pColorBlendState;
7319091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			&dynamicStateParams,								// const VkPipelineDynamicStateCreateInfo*			pDynamicState;
7329091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			*m_pipelineLayout,									// VkPipelineLayout									layout;
7339091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			*m_renderPass,										// VkRenderPass										renderPass;
7349091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			0u,													// deUint32											subpass;
7359091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			0u,													// VkPipeline										basePipelineHandle;
7369091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			0u													// deInt32											basePipelineIndex;
7379091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
7389091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
7399091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		// Setup different stencil masks and refs in each quad
7409091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		for (int quadNdx = 0; quadNdx < StencilTest::QUAD_COUNT; quadNdx++)
7419091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
7429091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			const StencilTest::StencilStateConfig&	config	= StencilTest::s_stencilStateConfigs[quadNdx];
7439091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			VkStencilOpState&						front	= depthStencilStateParams.front;
7449091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			VkStencilOpState&						back	= depthStencilStateParams.back;
7459091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
746120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			front.compareMask	= config.frontReadMask;
747120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			front.writeMask		= config.frontWriteMask;
748120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			front.reference		= config.frontRef;
7499091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
750120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			back.compareMask	= config.backReadMask;
751120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			back.writeMask		= config.backWriteMask;
752120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			back.reference		= config.backRef;
7539091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
7549091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			m_graphicsPipelines[quadNdx] = createGraphicsPipeline(vk, vkDevice, DE_NULL, &graphicsPipelineParams);
7559091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		}
7569091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	}
7579091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
7589091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
7599091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	// Create vertex buffer
7609091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	{
7619091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkBufferCreateInfo vertexBufferParams =
7629091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
7639091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,		// VkStructureType		sType;
7649091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			DE_NULL,									// const void*			pNext;
765120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,											// VkBufferCreateFlags	flags;
7669091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			1024u,										// VkDeviceSize			size;
7679091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			VK_BUFFER_USAGE_VERTEX_BUFFER_BIT,			// VkBufferUsageFlags	usage;
7689091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			VK_SHARING_MODE_EXCLUSIVE,					// VkSharingMode		sharingMode;
769120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			1u,											// deUint32				queueFamilyIndexCount;
7709091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			&queueFamilyIndex							// const deUint32*		pQueueFamilyIndices;
7719091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
7729091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
7739091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		m_vertices			= createOverlappingQuads();
7749091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		m_vertexBuffer		= createBuffer(vk, vkDevice, &vertexBufferParams);
7759091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		m_vertexBufferAlloc	= memAlloc.allocate(getBufferMemoryRequirements(vk, vkDevice, *m_vertexBuffer), MemoryRequirement::HostVisible);
7769091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
7779091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		VK_CHECK(vk.bindBufferMemory(vkDevice, *m_vertexBuffer, m_vertexBufferAlloc->getMemory(), m_vertexBufferAlloc->getOffset()));
7789091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
7799091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		// Adjust depths
7809091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		for (int quadNdx = 0; quadNdx < 4; quadNdx++)
7819091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			for (int vertexNdx = 0; vertexNdx < 6; vertexNdx++)
7829091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim				m_vertices[quadNdx * 6 + vertexNdx].position.z() = StencilTest::s_quadDepths[quadNdx];
7839091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
7849091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		// Load vertices into vertex buffer
7859091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		deMemcpy(m_vertexBufferAlloc->getHostPtr(), m_vertices.data(), m_vertices.size() * sizeof(Vertex4RGBA));
7869091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
7879091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkMappedMemoryRange flushRange =
7889091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
7899091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim				VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE,	// VkStructureType	sType;
7909091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim				DE_NULL,								// const void*		pNext;
791120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				m_vertexBufferAlloc->getMemory(),		// VkDeviceMemory	memory;
7929091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim				m_vertexBufferAlloc->getOffset(),		// VkDeviceSize		offset;
7939091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim				vertexBufferParams.size					// VkDeviceSize		size;
7949091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
7959091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
7969091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		vk.flushMappedMemoryRanges(vkDevice, 1, &flushRange);
7979091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	}
7989091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
7999091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	// Create command pool
8009091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	{
801120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		const VkCommandPoolCreateInfo cmdPoolParams =
8029091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
803120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,		// VkStructureType			sType;
804120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			DE_NULL,										// const void*				pNext;
805120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_COMMAND_POOL_CREATE_TRANSIENT_BIT,			// VkCommandPoolCreateFlags	flags;
806120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			queueFamilyIndex,								// deUint32					queueFamilyIndex;
8079091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
8089091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
8099091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		m_cmdPool = createCommandPool(vk, vkDevice, &cmdPoolParams);
8109091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	}
8119091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
8129091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	// Create command buffer
8139091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	{
814120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		const VkCommandBufferAllocateInfo cmdBufferAllocateInfo =
8159091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
81694128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos			VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,	// VkStructureType		sType;
81794128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos			DE_NULL,										// const void*			pNext;
81894128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos			*m_cmdPool,										// VkCommandPool		commandPool;
81994128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos			VK_COMMAND_BUFFER_LEVEL_PRIMARY,				// VkCommandBufferLevel	level;
82094128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos			1u												// deUint32				bufferCount;
8219091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
8229091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
823120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		const VkCommandBufferBeginInfo cmdBufferBeginInfo =
8249091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
825120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,	// VkStructureType					sType;
826120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			DE_NULL,										// const void*						pNext;
827120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,												// VkCommandBufferUsageFlags		flags;
828689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos			(const VkCommandBufferInheritanceInfo*)DE_NULL,
8299091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
8309091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
8319091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkClearValue attachmentClearValues[2] =
8329091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
8339091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			defaultClearValue(m_colorFormat),
8349091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			defaultClearValue(m_stencilFormat)
8359091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
8369091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
8379091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkRenderPassBeginInfo renderPassBeginInfo =
8389091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
8399091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,				// VkStructureType		sType;
8409091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			DE_NULL,												// const void*			pNext;
8419091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			*m_renderPass,											// VkRenderPass			renderPass;
8429091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			*m_framebuffer,											// VkFramebuffer		framebuffer;
8439091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			{ { 0, 0 } , { m_renderSize.x(), m_renderSize.y() } },	// VkRect2D				renderArea;
8449091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			2,														// deUint32				clearValueCount;
8459091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			attachmentClearValues									// const VkClearValue*	pClearValues;
8469091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
8479091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
848120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		m_cmdBuffer = allocateCommandBuffer(vk, vkDevice, &cmdBufferAllocateInfo);
8499091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
8509091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		VK_CHECK(vk.beginCommandBuffer(*m_cmdBuffer, &cmdBufferBeginInfo));
851120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		vk.cmdBeginRenderPass(*m_cmdBuffer, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
8529091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
8539091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkDeviceSize		quadOffset		= (m_vertices.size() / StencilTest::QUAD_COUNT) * sizeof(Vertex4RGBA);
8549091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
8559091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		for (int quadNdx = 0; quadNdx < StencilTest::QUAD_COUNT; quadNdx++)
8569091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
8579091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			VkDeviceSize vertexBufferOffset = quadOffset * quadNdx;
8589091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
8599091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			vk.cmdBindPipeline(*m_cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *m_graphicsPipelines[quadNdx]);
8609091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			vk.cmdBindVertexBuffers(*m_cmdBuffer, 0, 1, &m_vertexBuffer.get(), &vertexBufferOffset);
8619091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			vk.cmdDraw(*m_cmdBuffer, (deUint32)(m_vertices.size() / StencilTest::QUAD_COUNT), 1, 0, 0);
8629091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		}
8639091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
8649091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		vk.cmdEndRenderPass(*m_cmdBuffer);
8659091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
8669091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	}
8679091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
8689091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	// Create fence
8699091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	{
8709091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkFenceCreateInfo fenceParams =
8719091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
8729091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			VK_STRUCTURE_TYPE_FENCE_CREATE_INFO,	// VkStructureType		sType;
8739091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			DE_NULL,								// const void*			pNext;
8749091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			0u										// VkFenceCreateFlags	flags;
8759091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
8769091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
8779091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		m_fence = createFence(vk, vkDevice, &fenceParams);
8789091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	}
8799091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim}
8809091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
8819091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae KimStencilTestInstance::~StencilTestInstance (void)
8829091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{
8839091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim}
8849091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
8859091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimtcu::TestStatus StencilTestInstance::iterate (void)
8869091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{
8879091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	const DeviceInterface&		vk			= m_context.getDeviceInterface();
8889091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	const VkDevice				vkDevice	= m_context.getDevice();
8899091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	const VkQueue				queue		= m_context.getUniversalQueue();
890120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	const VkSubmitInfo			submitInfo	=
891120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	{
892120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		VK_STRUCTURE_TYPE_SUBMIT_INFO,	// VkStructureType			sType;
893120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		DE_NULL,						// const void*				pNext;
894120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		0u,								// deUint32					waitSemaphoreCount;
895120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		DE_NULL,						// const VkSemaphore*		pWaitSemaphores;
896689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos		(const VkPipelineStageFlags*)DE_NULL,
897120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		1u,								// deUint32					commandBufferCount;
898120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		&m_cmdBuffer.get(),				// const VkCommandBuffer*	pCommandBuffers;
899120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		0u,								// deUint32					signalSemaphoreCount;
900120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		DE_NULL							// const VkSemaphore*		pSignalSemaphores;
901120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	};
9029091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
9039091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	VK_CHECK(vk.resetFences(vkDevice, 1, &m_fence.get()));
904120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	VK_CHECK(vk.queueSubmit(queue, 1, &submitInfo, *m_fence));
9059091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	VK_CHECK(vk.waitForFences(vkDevice, 1, &m_fence.get(), true, ~(0ull) /* infinity*/));
9069091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
9079091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	return verifyImage();
9089091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim}
9099091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
9109091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimtcu::TestStatus StencilTestInstance::verifyImage (void)
9119091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{
9129091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	const tcu::TextureFormat	tcuColorFormat		= mapVkFormat(m_colorFormat);
9139091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	const tcu::TextureFormat	tcuStencilFormat	= mapVkFormat(m_stencilFormat);
9149091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	const ColorVertexShader		vertexShader;
9159091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	const ColorFragmentShader	fragmentShader		(tcuColorFormat, tcuStencilFormat);
9169091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	const rr::Program			program				(&vertexShader, &fragmentShader);
9179091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	ReferenceRenderer			refRenderer			(m_renderSize.x(), m_renderSize.y(), 1, tcuColorFormat, tcuStencilFormat, &program);
9189091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	bool						compareOk			= false;
9199091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
9209091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	// Render reference image
9219091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	{
9229091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		// Set depth state
9239091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		rr::RenderState renderState(refRenderer.getViewportState());
9249091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
9259091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		renderState.fragOps.depthTestEnabled	= true;
9269091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		renderState.fragOps.depthFunc			= mapVkCompareOp(VK_COMPARE_OP_LESS);
9279091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		renderState.fragOps.stencilTestEnabled	= true;
9289091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
9299091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		rr::StencilState& refStencilFront	= renderState.fragOps.stencilStates[rr::FACETYPE_FRONT];
9309091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		rr::StencilState& refStencilBack	= renderState.fragOps.stencilStates[rr::FACETYPE_BACK];
9319091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
932120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		refStencilFront.sFail		= mapVkStencilOp(m_stencilOpStateFront.failOp);
933120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		refStencilFront.dpFail		= mapVkStencilOp(m_stencilOpStateFront.depthFailOp);
934120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		refStencilFront.dpPass		= mapVkStencilOp(m_stencilOpStateFront.passOp);
935120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		refStencilFront.func		= mapVkCompareOp(m_stencilOpStateFront.compareOp);
9369091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
937120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		refStencilBack.sFail		= mapVkStencilOp(m_stencilOpStateBack.failOp);
938120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		refStencilBack.dpFail		= mapVkStencilOp(m_stencilOpStateBack.depthFailOp);
939120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		refStencilBack.dpPass		= mapVkStencilOp(m_stencilOpStateBack.passOp);
940120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		refStencilBack.func			= mapVkCompareOp(m_stencilOpStateBack.compareOp);
9419091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
9429091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		// Reverse winding of vertices, as Vulkan screen coordinates start at upper left
9439091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		std::vector<Vertex4RGBA> cwVertices(m_vertices);
9449091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		for (size_t vertexNdx = 0; vertexNdx < cwVertices.size() - 2; vertexNdx += 3)
9459091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
9469091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			const Vertex4RGBA cwVertex1	= cwVertices[vertexNdx + 1];
9479091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
9489091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			cwVertices[vertexNdx + 1]	= cwVertices[vertexNdx + 2];
9499091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			cwVertices[vertexNdx + 2]	= cwVertex1;
9509091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		}
9519091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
9529091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		for (int quadNdx = 0; quadNdx < StencilTest::QUAD_COUNT; quadNdx++)
9539091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
9549091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			refStencilFront.ref			= (int)StencilTest::s_stencilStateConfigs[quadNdx].frontRef;
9559091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			refStencilFront.compMask	= StencilTest::s_stencilStateConfigs[quadNdx].frontReadMask;
9569091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			refStencilFront.writeMask	= StencilTest::s_stencilStateConfigs[quadNdx].frontWriteMask;
9579091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
9589091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			refStencilBack.ref			= (int)StencilTest::s_stencilStateConfigs[quadNdx].backRef;
9599091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			refStencilBack.compMask		= StencilTest::s_stencilStateConfigs[quadNdx].backReadMask;
9609091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			refStencilBack.writeMask	= StencilTest::s_stencilStateConfigs[quadNdx].backWriteMask;
9619091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
9629091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			refRenderer.draw(renderState,
9639091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim							 rr::PRIMITIVETYPE_TRIANGLES,
9649091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim							 std::vector<Vertex4RGBA>(cwVertices.begin() + quadNdx * 6,
9659091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim													  cwVertices.begin() + (quadNdx + 1) * 6));
9669091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		}
9679091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	}
9689091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
9699091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	// Compare result with reference image
9709091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	{
9719091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const DeviceInterface&				vk					= m_context.getDeviceInterface();
9729091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkDevice						vkDevice			= m_context.getDevice();
9739091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkQueue						queue				= m_context.getUniversalQueue();
9749091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const deUint32						queueFamilyIndex	= m_context.getUniversalQueueFamilyIndex();
9759091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		SimpleAllocator						allocator			(vk, vkDevice, getPhysicalDeviceMemoryProperties(m_context.getInstanceInterface(), m_context.getPhysicalDevice()));
9769091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		de::UniquePtr<tcu::TextureLevel>	result				(readColorAttachment(vk, vkDevice, queue, queueFamilyIndex, allocator, *m_colorImage, m_colorFormat, m_renderSize).release());
9779091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
9789091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		compareOk = tcu::intThresholdPositionDeviationCompare(m_context.getTestContext().getLog(),
9799091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim															  "IntImageCompare",
9809091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim															  "Image comparison",
9819091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim															  refRenderer.getAccess(),
9829091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim															  result->getAccess(),
9839091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim															  tcu::UVec4(2, 2, 2, 2),
9849091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim															  tcu::IVec3(1, 1, 0),
9859091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim															  true,
9869091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim															  tcu::COMPARE_LOG_RESULT);
9879091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	}
9889091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
9899091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	if (compareOk)
9909091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		return tcu::TestStatus::pass("Result image matches reference");
9919091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	else
9929091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		return tcu::TestStatus::fail("Image mismatch");
9939091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim}
9949091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
9959091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
9969091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim// Utilities for test names
9979091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
9989091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimstd::string getShortName (VkCompareOp compareOp)
9999091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{
10009091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	const std::string  fullName = getCompareOpName(compareOp);
10019091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
10029091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	DE_ASSERT(de::beginsWith(fullName, "VK_COMPARE_OP_"));
10039091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
10049091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	return de::toLower(fullName.substr(14));
10059091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim}
10069091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
10079091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimconst char* getShortName (VkStencilOp stencilOp)
10089091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{
10099091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	switch (stencilOp)
10109091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	{
1011120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		case VK_STENCIL_OP_KEEP:					return "keep";
1012120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		case VK_STENCIL_OP_ZERO:					return "zero";
1013120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		case VK_STENCIL_OP_REPLACE:					return "repl";
1014120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		case VK_STENCIL_OP_INCREMENT_AND_CLAMP:		return "incc";
1015120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		case VK_STENCIL_OP_DECREMENT_AND_CLAMP:		return "decc";
1016120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		case VK_STENCIL_OP_INVERT:					return "inv";
1017120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		case VK_STENCIL_OP_INCREMENT_AND_WRAP:		return "wrap";
1018120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		case VK_STENCIL_OP_DECREMENT_AND_WRAP:		return "decw";
10199091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
10209091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		default:
10219091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			DE_FATAL("Invalid VkStencilOpState value");
10229091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	}
10239091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	return DE_NULL;
10249091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim}
10259091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
10269091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimstd::string getStencilName(const VkStencilOpState& stencilOpState)
10279091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{
10289091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	std::ostringstream name;
10299091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
1030120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	name << "fail_" << getShortName(stencilOpState.failOp)
1031120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		 << "_pass_" << getShortName(stencilOpState.passOp)
1032120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		 << "_dfail_" << getShortName(stencilOpState.depthFailOp)
1033120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		 << "_comp_" << getShortName(stencilOpState.compareOp);
10349091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
10359091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	return name.str();
10369091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim}
10379091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
10389091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimstd::string getStencilStateSetName(const VkStencilOpState& stencilOpStateFront,
10399091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim								   const VkStencilOpState& stencilOpStateBack)
10409091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{
10419091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	std::ostringstream name;
10429091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
10439091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	name << "front_" << getStencilName(stencilOpStateFront)
10449091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		 << "_back_" << getStencilName(stencilOpStateBack);
10459091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
10469091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	return name.str();
10479091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim}
10489091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
10499091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimstd::string getStencilStateSetDescription(const VkStencilOpState& stencilOpStateFront,
10509091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim										  const VkStencilOpState& stencilOpStateBack)
10519091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{
10529091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	std::ostringstream desc;
10539091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
10549091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	desc << "\nFront faces:\n" << stencilOpStateFront;
10559091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	desc << "Back faces:\n" << stencilOpStateBack;
10569091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
10579091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	return desc.str();
10589091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim}
10599091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
10609091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimstd::string getFormatCaseName (VkFormat format)
10619091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{
10629091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	const std::string fullName = getFormatName(format);
10639091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
10649091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	DE_ASSERT(de::beginsWith(fullName, "VK_FORMAT_"));
10659091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
10669091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	return de::toLower(fullName.substr(10));
10679091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim}
10689091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
10699091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim} // anonymous
10709091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
10719091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimtcu::TestCaseGroup* createStencilTests (tcu::TestContext& testCtx)
10729091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{
10739091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	const VkFormat stencilFormats[] =
10749091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	{
10759091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		VK_FORMAT_S8_UINT,
10769091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		VK_FORMAT_D16_UNORM_S8_UINT,
10779091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		VK_FORMAT_D24_UNORM_S8_UINT,
10789091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		VK_FORMAT_D32_SFLOAT_S8_UINT
10799091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	};
10809091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
10819091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	de::MovePtr<tcu::TestCaseGroup>		stencilTests	(new tcu::TestCaseGroup(testCtx, "stencil", "Stencil tests"));
10829091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	de::MovePtr<tcu::TestCaseGroup>		formatTests		(new tcu::TestCaseGroup(testCtx, "format", "Uses different stencil formats"));
10839091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	StencilOpStateUniqueRandomIterator	stencilOpItr	(123);
10849091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
10859091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	for (size_t formatNdx = 0; formatNdx < DE_LENGTH_OF_ARRAY(stencilFormats); formatNdx++)
10869091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	{
10879091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkFormat					stencilFormat	= stencilFormats[formatNdx];
10889091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		de::MovePtr<tcu::TestCaseGroup>	formatTest		(new tcu::TestCaseGroup(testCtx,
10899091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim																				getFormatCaseName(stencilFormat).c_str(),
10909091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim																				(std::string("Uses format ") + getFormatName(stencilFormat)).c_str()));
10919091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
10929091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		de::MovePtr<tcu::TestCaseGroup>	stencilStateTests;
10939091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
10949091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			std::ostringstream desc;
10959091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			desc << "Draws 4 quads with the following depths and dynamic stencil states: ";
10969091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			for (int quadNdx = 0; quadNdx < StencilTest::QUAD_COUNT; quadNdx++)
10979091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			{
10989091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim				const StencilTest::StencilStateConfig& stencilConfig = StencilTest::s_stencilStateConfigs[quadNdx];
10999091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
11009091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim				desc << "(" << quadNdx << ") "
11019091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim					 << "z = " << StencilTest::s_quadDepths[quadNdx] << ", "
11029091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim					 << "frontReadMask = " << stencilConfig.frontReadMask << ", "
11039091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim					 << "frontWriteMask = " << stencilConfig.frontWriteMask << ", "
11049091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim					 << "frontRef = " << stencilConfig.frontRef << ", "
11059091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim					 << "backReadMask = " << stencilConfig.backReadMask << ", "
11069091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim					 << "backWriteMask = " << stencilConfig.backWriteMask << ", "
11079091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim					 << "backRef = " << stencilConfig.backRef;
11089091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			}
11099091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
11109091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			stencilStateTests = de::MovePtr<tcu::TestCaseGroup>(new tcu::TestCaseGroup(testCtx, "states", desc.str().c_str()));
11119091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		}
11129091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
11139091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		stencilOpItr.reset();
11149091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
11159091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		VkStencilOpState		prevStencilState	= stencilOpItr.next();
11169091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkStencilOpState	firstStencilState	= prevStencilState;
11179091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
11189091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		while (stencilOpItr.hasNext())
11199091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
11209091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			const VkStencilOpState stencilState = stencilOpItr.next();
11219091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
11229091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			// Use current stencil state in front fraces and previous state in back faces
11239091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			stencilStateTests->addChild(new StencilTest(testCtx,
11249091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim														getStencilStateSetName(stencilState, prevStencilState),
11259091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim														getStencilStateSetDescription(stencilState, prevStencilState),
11269091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim														stencilFormat,
11279091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim														stencilState,
11289091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim														prevStencilState));
11299091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
11309091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			prevStencilState = stencilState;
11319091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		}
11329091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
11339091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		// Use first stencil state with last stencil state. This would make the test suite cover all states in front and back faces.
11349091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		stencilStateTests->addChild(new StencilTest(testCtx,
11359091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim													getStencilStateSetName(firstStencilState, prevStencilState),
11369091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim													getStencilStateSetDescription(firstStencilState, prevStencilState),
11379091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim													stencilFormat,
11389091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim													firstStencilState,
11399091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim													prevStencilState));
11409091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
11419091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		formatTest->addChild(stencilStateTests.release());
11429091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		formatTests->addChild(formatTest.release());
11439091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	}
11449091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	stencilTests->addChild(formatTests.release());
11459091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
11469091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	return stencilTests.release();
11479091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim}
11489091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
11499091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim} // pipeline
11509091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim} // vkt
1151