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 *
8978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * Licensed under the Apache License, Version 2.0 (the "License");
9978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * you may not use this file except in compliance with the License.
10978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * You may obtain a copy of the License at
119091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim *
12978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos *      http://www.apache.org/licenses/LICENSE-2.0
139091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim *
14978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * Unless required by applicable law or agreed to in writing, software
15978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * distributed under the License is distributed on an "AS IS" BASIS,
16978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * See the License for the specific language governing permissions and
18978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * limitations under the License.
199091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim *
209091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim *//*!
219091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim * \file
229091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim * \brief Stencil Tests
239091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim *//*--------------------------------------------------------------------*/
249091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
259091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim#include "vktPipelineStencilTests.hpp"
269091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim#include "vktPipelineClearUtil.hpp"
279091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim#include "vktPipelineImageUtil.hpp"
289091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim#include "vktPipelineVertexUtil.hpp"
299091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim#include "vktPipelineReferenceRenderer.hpp"
309091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim#include "vktPipelineUniqueRandomIterator.hpp"
319091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim#include "vktTestCase.hpp"
329091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim#include "vkImageUtil.hpp"
339091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim#include "vkMemUtil.hpp"
349091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim#include "vkPrograms.hpp"
359091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim#include "vkQueryUtil.hpp"
369091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim#include "vkRef.hpp"
379091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim#include "vkRefUtil.hpp"
383d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos#include "vkTypeUtil.hpp"
399091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim#include "tcuImageCompare.hpp"
409091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim#include "deMemory.h"
419091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim#include "deRandom.hpp"
429091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim#include "deStringUtil.hpp"
439091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim#include "deUniquePtr.hpp"
449091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
459091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim#include <algorithm>
469091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim#include <sstream>
479091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim#include <vector>
489091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
499091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimnamespace vkt
509091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{
519091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimnamespace pipeline
529091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{
539091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
549091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimusing namespace vk;
559091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
569091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimnamespace
579091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{
589091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
599091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimbool isSupportedDepthStencilFormat (const InstanceInterface& instanceInterface, VkPhysicalDevice device, VkFormat format)
609091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{
619091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	VkFormatProperties formatProps;
629091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
63120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	instanceInterface.getPhysicalDeviceFormatProperties(device, format, &formatProps);
649091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
65682d882fdacf7d4711d23a5ba006f7fb377cf0e3Pyry Haulos	return (formatProps.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) != 0;
669091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim}
679091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
689091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimclass StencilOpStateUniqueRandomIterator : public UniqueRandomIterator<VkStencilOpState>
699091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{
709091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimpublic:
719091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim								StencilOpStateUniqueRandomIterator	(int seed);
729091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	virtual						~StencilOpStateUniqueRandomIterator	(void) {}
739091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	virtual VkStencilOpState	getIndexedValue (deUint32 index);
749091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
759091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimprivate:
769091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	const static VkStencilOp	m_stencilOps[];
779091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	const static VkCompareOp	m_compareOps[];
789091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
799091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	// Pre-calculated constants
809091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	const static deUint32		m_stencilOpsLength;
819091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	const static deUint32		m_stencilOpsLength2;
829091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	const static deUint32		m_stencilOpsLength3;
839091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	const static deUint32		m_compareOpsLength;
849091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
859091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	// Total number of cross-combinations of (stencilFailOp x stencilPassOp x stencilDepthFailOp x stencilCompareOp)
869091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	const static deUint32		m_totalStencilOpStates;
879091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim};
889091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
899091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
909091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimclass StencilTest : public vkt::TestCase
919091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{
929091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimpublic:
939091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	enum
949091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	{
959091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		QUAD_COUNT = 4
969091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	};
979091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
989091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	struct StencilStateConfig
999091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	{
1009091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		deUint32	frontReadMask;
1019091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		deUint32	frontWriteMask;
1029091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		deUint32	frontRef;
1039091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
1049091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		deUint32	backReadMask;
1059091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		deUint32	backWriteMask;
1069091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		deUint32	backRef;
1079091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	};
1089091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
1099091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	const static StencilStateConfig			s_stencilStateConfigs[QUAD_COUNT];
1109091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	const static float						s_quadDepths[QUAD_COUNT];
1119091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
1129091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
1139091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim											StencilTest				(tcu::TestContext&			testContext,
1149091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim																	 const std::string&			name,
1159091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim																	 const std::string&			description,
1169091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim																	 VkFormat					stencilFormat,
1179091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim																	 const VkStencilOpState&	stencilOpStateFront,
1189091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim																	 const VkStencilOpState&	stencilOpStateBack);
1199091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	virtual									~StencilTest			(void);
1209091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	virtual void							initPrograms			(SourceCollections& sourceCollections) const;
1219091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	virtual TestInstance*					createInstance			(Context& context) const;
1229091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
1239091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimprivate:
1249091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	VkFormat								m_stencilFormat;
1259091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	const VkStencilOpState					m_stencilOpStateFront;
1269091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	const VkStencilOpState					m_stencilOpStateBack;
1279091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim};
1289091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
1299091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimclass StencilTestInstance : public vkt::TestInstance
1309091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{
1319091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimpublic:
1329091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim										StencilTestInstance		(Context&					context,
1339091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim																 VkFormat					stencilFormat,
1349091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim																 const VkStencilOpState&	stencilOpStatesFront,
1359091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim																 const VkStencilOpState&	stencilOpStatesBack);
1369091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	virtual								~StencilTestInstance	(void);
1379091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	virtual tcu::TestStatus				iterate					(void);
1389091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
1399091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimprivate:
1409091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	tcu::TestStatus						verifyImage				(void);
1419091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
1429091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	VkStencilOpState					m_stencilOpStateFront;
1439091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	VkStencilOpState					m_stencilOpStateBack;
144689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos	const tcu::UVec2					m_renderSize;
1459091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	const VkFormat						m_colorFormat;
1469091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	const VkFormat						m_stencilFormat;
1473d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos	VkImageSubresourceRange				m_stencilImageSubresourceRange;
1489091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
1499091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	VkImageCreateInfo					m_colorImageCreateInfo;
1509091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	Move<VkImage>						m_colorImage;
1519091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	de::MovePtr<Allocation>				m_colorImageAlloc;
1529091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	Move<VkImage>						m_stencilImage;
1539091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	de::MovePtr<Allocation>				m_stencilImageAlloc;
1549091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	Move<VkImageView>					m_colorAttachmentView;
1559091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	Move<VkImageView>					m_stencilAttachmentView;
1569091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	Move<VkRenderPass>					m_renderPass;
1579091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	Move<VkFramebuffer>					m_framebuffer;
1589091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
1599091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	Move<VkShaderModule>				m_vertexShaderModule;
1609091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	Move<VkShaderModule>				m_fragmentShaderModule;
1619091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
1629091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	Move<VkBuffer>						m_vertexBuffer;
1639091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	std::vector<Vertex4RGBA>			m_vertices;
1649091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	de::MovePtr<Allocation>				m_vertexBufferAlloc;
1659091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
1669091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	Move<VkPipelineLayout>				m_pipelineLayout;
1679091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	Move<VkPipeline>					m_graphicsPipelines[StencilTest::QUAD_COUNT];
1689091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
169120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	Move<VkCommandPool>					m_cmdPool;
170120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	Move<VkCommandBuffer>				m_cmdBuffer;
1719091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
1729091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	Move<VkFence>						m_fence;
1739091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim};
1749091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
1759091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
1769091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim// StencilOpStateUniqueRandomIterator
1779091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
1789091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimconst VkStencilOp StencilOpStateUniqueRandomIterator::m_stencilOps[] =
1799091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{
1809091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	VK_STENCIL_OP_KEEP,
1819091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	VK_STENCIL_OP_ZERO,
1829091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	VK_STENCIL_OP_REPLACE,
183120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	VK_STENCIL_OP_INCREMENT_AND_CLAMP,
184120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	VK_STENCIL_OP_DECREMENT_AND_CLAMP,
1859091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	VK_STENCIL_OP_INVERT,
186120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	VK_STENCIL_OP_INCREMENT_AND_WRAP,
187120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	VK_STENCIL_OP_DECREMENT_AND_WRAP
1889091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim};
1899091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
1909091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimconst VkCompareOp StencilOpStateUniqueRandomIterator::m_compareOps[] =
1919091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{
1929091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	VK_COMPARE_OP_NEVER,
1939091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	VK_COMPARE_OP_LESS,
1949091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	VK_COMPARE_OP_EQUAL,
195120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	VK_COMPARE_OP_LESS_OR_EQUAL,
1969091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	VK_COMPARE_OP_GREATER,
1979091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	VK_COMPARE_OP_NOT_EQUAL,
198120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	VK_COMPARE_OP_GREATER_OR_EQUAL,
1999091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	VK_COMPARE_OP_ALWAYS
2009091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim};
2019091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
2029091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimconst deUint32 StencilOpStateUniqueRandomIterator::m_stencilOpsLength		= DE_LENGTH_OF_ARRAY(m_stencilOps);
2039091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimconst deUint32 StencilOpStateUniqueRandomIterator::m_stencilOpsLength2		= m_stencilOpsLength * m_stencilOpsLength;
2049091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimconst deUint32 StencilOpStateUniqueRandomIterator::m_stencilOpsLength3		= m_stencilOpsLength2 * m_stencilOpsLength;
2059091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimconst deUint32 StencilOpStateUniqueRandomIterator::m_compareOpsLength		= DE_LENGTH_OF_ARRAY(m_compareOps);
2069091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimconst deUint32 StencilOpStateUniqueRandomIterator::m_totalStencilOpStates	= m_stencilOpsLength3 * m_compareOpsLength;
2079091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
2089091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae KimStencilOpStateUniqueRandomIterator::StencilOpStateUniqueRandomIterator (int seed)
2099091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	: UniqueRandomIterator<VkStencilOpState>(m_totalStencilOpStates, m_totalStencilOpStates, seed)
2109091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{
2119091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim}
2129091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
2139091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae KimVkStencilOpState StencilOpStateUniqueRandomIterator::getIndexedValue (deUint32 index)
2149091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{
2159091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	const deUint32 stencilCompareOpIndex = index / m_stencilOpsLength3;
2169091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	const deUint32 stencilCompareOpSeqIndex = stencilCompareOpIndex * m_stencilOpsLength3;
2179091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
2189091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	const deUint32 stencilDepthFailOpIndex = (index - stencilCompareOpSeqIndex) / m_stencilOpsLength2;
2199091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	const deUint32 stencilDepthFailOpSeqIndex = stencilDepthFailOpIndex * m_stencilOpsLength2;
2209091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
2219091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	const deUint32 stencilPassOpIndex = (index - stencilCompareOpSeqIndex - stencilDepthFailOpSeqIndex) / m_stencilOpsLength;
2229091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	const deUint32 stencilPassOpSeqIndex = stencilPassOpIndex * m_stencilOpsLength;
2239091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
2249091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	const deUint32 stencilFailOpIndex = index - stencilCompareOpSeqIndex - stencilDepthFailOpSeqIndex - stencilPassOpSeqIndex;
2259091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
2269091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	const VkStencilOpState stencilOpState =
2279091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	{
228120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		m_stencilOps[stencilFailOpIndex],		// VkStencilOp	failOp;
229120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		m_stencilOps[stencilPassOpIndex],		// VkStencilOp	passOp;
230120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		m_stencilOps[stencilDepthFailOpIndex],	// VkStencilOp	depthFailOp;
231120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		m_compareOps[stencilCompareOpIndex],	// VkCompareOp	compareOp;
232120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		0x0,									// deUint32		compareMask;
233120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		0x0,									// deUint32		writeMask;
234120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		0x0										// deUint32		reference;
2359091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	};
2369091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
2379091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	return stencilOpState;
2389091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim}
2399091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
2409091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
2419091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim// StencilTest
2429091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
2439091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimconst StencilTest::StencilStateConfig StencilTest::s_stencilStateConfigs[QUAD_COUNT] =
2449091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{
2459091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	//	frontReadMask	frontWriteMask		frontRef		backReadMask	backWriteMask	backRef
2469091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	{	0xFF,			0xFF,				0xAB,			0xF0,			0xFF,			0xFF	},
2479091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	{	0xFF,			0xF0,				0xCD,			0xF0,			0xF0,			0xEF	},
2489091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	{	0xF0,			0x0F,				0xEF,			0xFF,			0x0F,			0xCD	},
2499091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	{	0xF0,			0x01,				0xFF,			0xFF,			0x01,			0xAB	}
2509091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim};
2519091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
2529091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimconst float StencilTest::s_quadDepths[QUAD_COUNT] =
2539091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{
2549091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	0.1f,
2559091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	0.0f,
2569091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	0.3f,
2579091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	0.2f
2589091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim};
2599091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
2609091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae KimStencilTest::StencilTest (tcu::TestContext&			testContext,
2619091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim						  const std::string&		name,
2629091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim						  const std::string&		description,
2639091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim						  VkFormat					stencilFormat,
2649091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim						  const VkStencilOpState&	stencilOpStateFront,
2659091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim						  const VkStencilOpState&	stencilOpStateBack)
2669091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	: vkt::TestCase			(testContext, name, description)
2679091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	, m_stencilFormat		(stencilFormat)
2689091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	, m_stencilOpStateFront	(stencilOpStateFront)
2699091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	, m_stencilOpStateBack	(stencilOpStateBack)
2709091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{
2719091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim}
2729091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
2739091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae KimStencilTest::~StencilTest (void)
2749091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{
2759091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim}
2769091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
2779091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae KimTestInstance* StencilTest::createInstance (Context& context) const
2789091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{
2799091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	return new StencilTestInstance(context, m_stencilFormat, m_stencilOpStateFront, m_stencilOpStateBack);
2809091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim}
2819091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
2829091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimvoid StencilTest::initPrograms (SourceCollections& sourceCollections) const
2839091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{
2849091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	sourceCollections.glslSources.add("color_vert") << glu::VertexSource(
2859091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		"#version 310 es\n"
2869091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		"layout(location = 0) in vec4 position;\n"
2879091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		"layout(location = 1) in vec4 color;\n"
2889091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		"layout(location = 0) out highp vec4 vtxColor;\n"
2899091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		"void main (void)\n"
2909091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		"{\n"
2919091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		"	gl_Position = position;\n"
2929091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		"	vtxColor = color;\n"
2939091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		"}\n");
2949091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
2959091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	sourceCollections.glslSources.add("color_frag") << glu::FragmentSource(
2969091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		"#version 310 es\n"
2979091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		"layout(location = 0) in highp vec4 vtxColor;\n"
2989091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		"layout(location = 0) out highp vec4 fragColor;\n"
2999091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		"void main (void)\n"
3009091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		"{\n"
3019091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		"	fragColor = vtxColor;\n"
3029091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		"}\n");
3039091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim}
3049091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
3059091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
3069091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim// StencilTestInstance
3079091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
3089091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae KimStencilTestInstance::StencilTestInstance (Context&					context,
3099091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim										  VkFormat					stencilFormat,
3109091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim										  const VkStencilOpState&	stencilOpStateFront,
3119091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim										  const VkStencilOpState&	stencilOpStateBack)
3129091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	: vkt::TestInstance		(context)
3139091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	, m_stencilOpStateFront	(stencilOpStateFront)
3149091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	, m_stencilOpStateBack	(stencilOpStateBack)
3159091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	, m_renderSize			(32, 32)
3169091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	, m_colorFormat			(VK_FORMAT_R8G8B8A8_UNORM)
3179091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	, m_stencilFormat		(stencilFormat)
3189091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{
319120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	const DeviceInterface&		vk						= context.getDeviceInterface();
320120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	const VkDevice				vkDevice				= context.getDevice();
321120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	const deUint32				queueFamilyIndex		= context.getUniversalQueueFamilyIndex();
322120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	SimpleAllocator				memAlloc				(vk, vkDevice, getPhysicalDeviceMemoryProperties(context.getInstanceInterface(), context.getPhysicalDevice()));
323120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	const VkComponentMapping	componentMappingRGBA	= { VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A };
3249091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
3259091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	// Create color image
3269091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	{
3279091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkImageCreateInfo colorImageParams =
3289091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
329120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,										// VkStructureType			sType;
330120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			DE_NULL,																	// const void*				pNext;
331120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,																			// VkImageCreateFlags		flags;
332120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_IMAGE_TYPE_2D,															// VkImageType				imageType;
333120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			m_colorFormat,																// VkFormat					format;
334120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			{ m_renderSize.x(), m_renderSize.y(), 1u },									// VkExtent3D				extent;
335120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			1u,																			// deUint32					mipLevels;
336120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			1u,																			// deUint32					arrayLayers;
337120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_SAMPLE_COUNT_1_BIT,														// VkSampleCountFlagBits	samples;
338120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_IMAGE_TILING_OPTIMAL,													// VkImageTiling			tiling;
339120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT,		// VkImageUsageFlags		usage;
340120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_SHARING_MODE_EXCLUSIVE,													// VkSharingMode			sharingMode;
341120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			1u,																			// deUint32					queueFamilyIndexCount;
342120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			&queueFamilyIndex,															// const deUint32*			pQueueFamilyIndices;
343120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_IMAGE_LAYOUT_UNDEFINED													// VkImageLayout			initialLayout;
3449091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
3459091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
3469091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		m_colorImageCreateInfo	= colorImageParams;
3479091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		m_colorImage			= createImage(vk, vkDevice, &m_colorImageCreateInfo);
3489091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
3499091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		// Allocate and bind color image memory
3509091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		m_colorImageAlloc		= memAlloc.allocate(getImageMemoryRequirements(vk, vkDevice, *m_colorImage), MemoryRequirement::Any);
3519091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		VK_CHECK(vk.bindImageMemory(vkDevice, *m_colorImage, m_colorImageAlloc->getMemory(), m_colorImageAlloc->getOffset()));
3529091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	}
3539091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
3549091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	// Create stencil image
3559091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	{
3569091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		// Check format support
3579091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		if (!isSupportedDepthStencilFormat(context.getInstanceInterface(), context.getPhysicalDevice(), m_stencilFormat))
3589091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			throw tcu::NotSupportedError(std::string("Unsupported depth/stencil format: ") + getFormatName(m_stencilFormat));
3599091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
3609091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkImageCreateInfo stencilImageParams =
3619091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
362120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,			// VkStructureType			sType;
363120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			DE_NULL,										// const void*				pNext;
364120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,												// VkImageCreateFlags		flags;
365120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_IMAGE_TYPE_2D,								// VkImageType				imageType;
366120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			m_stencilFormat,								// VkFormat					format;
367120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			{ m_renderSize.x(), m_renderSize.y(), 1u },		// VkExtent3D				extent;
368120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			1u,												// deUint32					mipLevels;
369120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			1u,												// deUint32					arrayLayers;
370120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_SAMPLE_COUNT_1_BIT,							// VkSampleCountFlagBits	samples;
371120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_IMAGE_TILING_OPTIMAL,						// VkImageTiling			tiling;
372120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,	// VkImageUsageFlags		usage;
373120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_SHARING_MODE_EXCLUSIVE,						// VkSharingMode			sharingMode;
374120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			1u,												// deUint32					queueFamilyIndexCount;
375120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			&queueFamilyIndex,								// const deUint32*			pQueueFamilyIndices;
376120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_IMAGE_LAYOUT_UNDEFINED						// VkImageLayout			initialLayout;
3779091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
3789091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
3799091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		m_stencilImage = createImage(vk, vkDevice, &stencilImageParams);
3809091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
3819091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		// Allocate and bind stencil image memory
3829091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		m_stencilImageAlloc = memAlloc.allocate(getImageMemoryRequirements(vk, vkDevice, *m_stencilImage), MemoryRequirement::Any);
3839091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		VK_CHECK(vk.bindImageMemory(vkDevice, *m_stencilImage, m_stencilImageAlloc->getMemory(), m_stencilImageAlloc->getOffset()));
3843d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos
3853d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos		const VkImageAspectFlags aspect = (mapVkFormat(m_stencilFormat).order == tcu::TextureFormat::DS ? VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_DEPTH_BIT
3863d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos																										: VK_IMAGE_ASPECT_STENCIL_BIT);
3873d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos		m_stencilImageSubresourceRange  = makeImageSubresourceRange(aspect, 0u, stencilImageParams.mipLevels, 0u, stencilImageParams.arrayLayers);
3889091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	}
3899091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
3909091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	// Create color attachment view
3919091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	{
3929091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkImageViewCreateInfo colorAttachmentViewParams =
3939091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
394120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,			// VkStructureType			sType;
395120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			DE_NULL,											// const void*				pNext;
396120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,													// VkImageViewCreateFlags	flags;
397120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			*m_colorImage,										// VkImage					image;
398120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_IMAGE_VIEW_TYPE_2D,								// VkImageViewType			viewType;
399120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			m_colorFormat,										// VkFormat					format;
400120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			componentMappingRGBA,								// VkComponentMapping		components;
401120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			{ VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u }		// VkImageSubresourceRange	subresourceRange;
4029091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
4039091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
4049091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		m_colorAttachmentView = createImageView(vk, vkDevice, &colorAttachmentViewParams);
4059091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	}
4069091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
4079091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	// Create stencil attachment view
4089091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	{
4099091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkImageViewCreateInfo stencilAttachmentViewParams =
4109091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
411120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,			// VkStructureType			sType;
412120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			DE_NULL,											// const void*				pNext;
413120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,													// VkImageViewCreateFlags	flags;
414120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			*m_stencilImage,									// VkImage					image;
415120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_IMAGE_VIEW_TYPE_2D,								// VkImageViewType			viewType;
416120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			m_stencilFormat,									// VkFormat					format;
417120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			componentMappingRGBA,								// VkComponentMapping		components;
4183d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos			m_stencilImageSubresourceRange,						// VkImageSubresourceRange	subresourceRange;
4199091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
4209091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
4219091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		m_stencilAttachmentView = createImageView(vk, vkDevice, &stencilAttachmentViewParams);
4229091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	}
4239091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
4249091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	// Create render pass
4259091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	{
4269091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkAttachmentDescription colorAttachmentDescription =
4279091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
42894128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos			0u,													// VkAttachmentDescriptionFlags	flags;
4299091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			m_colorFormat,										// VkFormat						format;
430120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_SAMPLE_COUNT_1_BIT,								// VkSampleCountFlagBits		samples;
4319091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			VK_ATTACHMENT_LOAD_OP_CLEAR,						// VkAttachmentLoadOp			loadOp;
4329091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			VK_ATTACHMENT_STORE_OP_STORE,						// VkAttachmentStoreOp			storeOp;
4339091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			VK_ATTACHMENT_LOAD_OP_DONT_CARE,					// VkAttachmentLoadOp			stencilLoadOp;
4349091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			VK_ATTACHMENT_STORE_OP_DONT_CARE,					// VkAttachmentStoreOp			stencilStoreOp;
4359091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,			// VkImageLayout				initialLayout;
4369091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,			// VkImageLayout				finalLayout;
4379091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
4389091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
4399091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkAttachmentDescription stencilAttachmentDescription =
4409091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
441120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,													// VkAttachmentDescriptionFlags	flags;
4429091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			m_stencilFormat,									// VkFormat						format;
443120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_SAMPLE_COUNT_1_BIT,								// VkSampleCountFlagBits		samples;
4449091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			VK_ATTACHMENT_LOAD_OP_CLEAR,						// VkAttachmentLoadOp			loadOp;
4459091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			VK_ATTACHMENT_STORE_OP_DONT_CARE,					// VkAttachmentStoreOp			storeOp;
4469091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			VK_ATTACHMENT_LOAD_OP_CLEAR,						// VkAttachmentLoadOp			stencilLoadOp;
4479091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			VK_ATTACHMENT_STORE_OP_DONT_CARE,					// VkAttachmentStoreOp			stencilStoreOp;
4489091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,	// VkImageLayout				initialLayout;
4499091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,	// VkImageLayout				finalLayout;
4509091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
4519091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
4529091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkAttachmentDescription attachments[2] =
4539091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
4549091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			colorAttachmentDescription,
4559091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			stencilAttachmentDescription
4569091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
4579091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
4589091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkAttachmentReference colorAttachmentReference =
4599091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
4609091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			0u,													// deUint32			attachment;
4619091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL			// VkImageLayout	layout;
4629091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
4639091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
4649091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkAttachmentReference stencilAttachmentReference =
4659091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
4669091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			1u,													// deUint32			attachment;
4679091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL	// VkImageLayout	layout;
4689091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
4699091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
4709091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkSubpassDescription subpassDescription =
4719091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
4729091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			0u,													// VkSubpassDescriptionFlags	flags;
473120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_PIPELINE_BIND_POINT_GRAPHICS,					// VkPipelineBindPoint			pipelineBindPoint;
474120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,													// deUint32						inputAttachmentCount;
4759091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			DE_NULL,											// const VkAttachmentReference*	pInputAttachments;
476120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			1u,													// deUint32						colorAttachmentCount;
4779091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			&colorAttachmentReference,							// const VkAttachmentReference*	pColorAttachments;
478120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			DE_NULL,											// const VkAttachmentReference*	pResolveAttachments;
479120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			&stencilAttachmentReference,						// const VkAttachmentReference*	pDepthStencilAttachment;
480120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,													// deUint32						preserveAttachmentCount;
4819091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			DE_NULL												// const VkAttachmentReference*	pPreserveAttachments;
4829091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
4839091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
4849091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkRenderPassCreateInfo renderPassParams =
4859091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
4869091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,			// VkStructureType					sType;
4879091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			DE_NULL,											// const void*						pNext;
488120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,													// VkRenderPassCreateFlags			flags;
4899091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			2u,													// deUint32							attachmentCount;
4909091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			attachments,										// const VkAttachmentDescription*	pAttachments;
4919091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			1u,													// deUint32							subpassCount;
4929091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			&subpassDescription,								// const VkSubpassDescription*		pSubpasses;
4939091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			0u,													// deUint32							dependencyCount;
4949091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			DE_NULL												// const VkSubpassDependency*		pDependencies;
4959091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
4969091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
4979091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		m_renderPass = createRenderPass(vk, vkDevice, &renderPassParams);
4989091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	}
4999091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
5009091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	// Create framebuffer
5019091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	{
5029091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkImageView attachmentBindInfos[2] = { *m_colorAttachmentView, *m_stencilAttachmentView };
5039091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
5049091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkFramebufferCreateInfo framebufferParams =
5059091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
506120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO,			// VkStructureType			sType;
507120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			DE_NULL,											// const void*				pNext;
508120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,													// VkFramebufferCreateFlags	flags;
509120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			*m_renderPass,										// VkRenderPass				renderPass;
510120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			2u,													// deUint32					attachmentCount;
511120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			attachmentBindInfos,								// const VkImageView*		pAttachments;
512120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			(deUint32)m_renderSize.x(),							// deUint32					width;
513120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			(deUint32)m_renderSize.y(),							// deUint32					height;
514120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			1u													// deUint32					layers;
5159091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
5169091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
5179091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		m_framebuffer = createFramebuffer(vk, vkDevice, &framebufferParams);
5189091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	}
5199091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
5209091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	// Create pipeline layout
5219091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	{
5229091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkPipelineLayoutCreateInfo pipelineLayoutParams =
5239091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
5249091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,		// VkStructureType				sType;
5259091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			DE_NULL,											// const void*					pNext;
526120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,													// VkPipelineLayoutCreateFlags	flags;
527120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,													// deUint32						setLayoutCount;
5289091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			DE_NULL,											// const VkDescriptorSetLayout*	pSetLayouts;
5299091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			0u,													// deUint32						pushConstantRangeCount;
5309091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			DE_NULL												// const VkPushConstantRange*	pPushConstantRanges;
5319091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
5329091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
5339091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		m_pipelineLayout = createPipelineLayout(vk, vkDevice, &pipelineLayoutParams);
5349091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	}
5359091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
536120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	m_vertexShaderModule	= createShaderModule(vk, vkDevice, m_context.getBinaryCollection().get("color_vert"), 0);
537120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	m_fragmentShaderModule	= createShaderModule(vk, vkDevice, m_context.getBinaryCollection().get("color_frag"), 0);
5389091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
5399091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	// Create pipeline
5409091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	{
541120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		const VkPipelineShaderStageCreateInfo shaderStages[2] =
5429091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
5439091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			{
544120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,		// VkStructureType						sType;
545120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				DE_NULL,													// const void*							pNext;
546120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				0u,															// VkPipelineShaderStageCreateFlags		flags;
547120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				VK_SHADER_STAGE_VERTEX_BIT,									// VkShaderStageFlagBits				stage;
548120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				*m_vertexShaderModule,										// VkShaderModule						module;
549120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				"main",														// const char*							pName;
550120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				DE_NULL														// const VkSpecializationInfo*			pSpecializationInfo;
5519091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			},
5529091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			{
553120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,		// VkStructureType						sType;
554120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				DE_NULL,													// const void*							pNext;
555120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				0u,															// VkPipelineShaderStageCreateFlags		flags;
556120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				VK_SHADER_STAGE_FRAGMENT_BIT,								// VkShaderStageFlagBits				stage;
557120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				*m_fragmentShaderModule,									// VkShaderModule						module;
558120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				"main",														// const char*							pName;
559120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				DE_NULL														// const VkSpecializationInfo*			pSpecializationInfo;
5609091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			}
5619091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
5629091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
5639091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkVertexInputBindingDescription vertexInputBindingDescription =
5649091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
5659091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			0u,										// deUint32					binding;
5669091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			sizeof(Vertex4RGBA),					// deUint32					strideInBytes;
567120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_VERTEX_INPUT_RATE_VERTEX				// VkVertexInputStepRate	inputRate;
5689091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
5699091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
5709091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkVertexInputAttributeDescription vertexInputAttributeDescriptions[2] =
5719091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
5729091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			{
5739091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim				0u,									// deUint32	location;
5749091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim				0u,									// deUint32	binding;
5759091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim				VK_FORMAT_R32G32B32A32_SFLOAT,		// VkFormat	format;
5769091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim				0u									// deUint32	offsetInBytes;
5779091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			},
5789091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			{
5799091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim				1u,									// deUint32	location;
5809091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim				0u,									// deUint32	binding;
5819091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim				VK_FORMAT_R32G32B32A32_SFLOAT,		// VkFormat	format;
5829091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim				DE_OFFSET_OF(Vertex4RGBA, color),	// deUint32	offsetInBytes;
5839091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			}
5849091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
5859091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
5869091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkPipelineVertexInputStateCreateInfo vertexInputStateParams =
5879091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
5889091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO,		// VkStructureType							sType;
5899091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			DE_NULL,														// const void*								pNext;
590120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,																// VkPipelineVertexInputStateCreateFlags	flags;
591120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			1u,																// deUint32									vertexBindingDescriptionCount;
5929091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			&vertexInputBindingDescription,									// const VkVertexInputBindingDescription*	pVertexBindingDescriptions;
593120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			2u,																// deUint32									vertexAttributeDescriptionCount;
5949091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			vertexInputAttributeDescriptions								// const VkVertexInputAttributeDescription*	pVertexAttributeDescriptions;
5959091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
5969091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
5979091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkPipelineInputAssemblyStateCreateInfo inputAssemblyStateParams =
5989091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
599120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,	// VkStructureType							sType;
600120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			DE_NULL,														// const void*								pNext;
601120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,																// VkPipelineInputAssemblyStateCreateFlags	flags;
602120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST,							// VkPrimitiveTopology						topology;
603120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			false															// VkBool32									primitiveRestartEnable;
6049091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
6059091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
6069091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkViewport viewport =
6079091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
608120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0.0f,						// float	x;
609120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0.0f,						// float	y;
6109091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			(float)m_renderSize.x(),	// float	width;
6119091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			(float)m_renderSize.y(),	// float	height;
6129091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			0.0f,						// float	minDepth;
6139091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			1.0f						// float	maxDepth;
6149091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
6159091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
6169091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkRect2D scissor = { { 0, 0 }, { m_renderSize.x(), m_renderSize.y() } };
6179091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
6189091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkPipelineViewportStateCreateInfo viewportStateParams =
6199091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
620120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO,			// VkStructureType						sType;
621120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			DE_NULL,														// const void*							pNext;
622120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,																// VkPipelineViewportStateCreateFlags	flags;
623120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			1u,																// deUint32								viewportCount;
624120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			&viewport,														// const VkViewport*					pViewports;
625120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			1u,																// deUint32								scissorCount;
626120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			&scissor,														// const VkRect2D*						pScissors;
6279091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
6289091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
629120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		const VkPipelineRasterizationStateCreateInfo rasterStateParams =
6309091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
631120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO,		// VkStructureType							sType;
632120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			DE_NULL,														// const void*								pNext;
633120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,																// VkPipelineRasterizationStateCreateFlags	flags;
634120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			false,															// VkBool32									depthClampEnable;
635120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			false,															// VkBool32									rasterizerDiscardEnable;
636120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_POLYGON_MODE_FILL,											// VkPolygonMode							polygonMode;
637120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_CULL_MODE_NONE,												// VkCullModeFlags							cullMode;
638120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_FRONT_FACE_COUNTER_CLOCKWISE,								// VkFrontFace								frontFace;
639120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			false,															// VkBool32									depthBiasEnable;
640120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0.0f,															// float									depthBiasConstantFactor;
641120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0.0f,															// float									depthBiasClamp;
642120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0.0f,															// float									depthBiasSlopeFactor;
643120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			1.0f															// float									lineWidth;
6449091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
6459091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
6469091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkPipelineColorBlendAttachmentState colorBlendAttachmentState =
6479091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
648120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			false,															// VkBool32					blendEnable;
649120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_BLEND_FACTOR_ONE,											// VkBlendFactor			srcColorBlendFactor;
650120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_BLEND_FACTOR_ZERO,											// VkBlendFactor			dstColorBlendFactor;
651120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_BLEND_OP_ADD,												// VkBlendOp				colorBlendOp;
652120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_BLEND_FACTOR_ONE,											// VKBLENDFACTOR			SRCALPHABLENDFACTOR;
653120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_BLEND_FACTOR_ZERO,											// VkBlendFactor			dstAlphaBlendFactor;
654120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_BLEND_OP_ADD,												// VkBlendOp				alphaBlendOp;
655120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT |			// VkColorComponentFlags	colorWriteMask;
656120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT
6579091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
6589091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
6599091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkPipelineColorBlendStateCreateInfo colorBlendStateParams =
6609091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
6619091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO,	// VkStructureType								sType;
6629091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			DE_NULL,													// const void*									pNext;
663120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,															// VkPipelineColorBlendStateCreateFlags			flags;
6649091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			false,														// VkBool32										logicOpEnable;
6659091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			VK_LOGIC_OP_COPY,											// VkLogicOp									logicOp;
6669091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			1u,															// deUint32										attachmentCount;
6679091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			&colorBlendAttachmentState,									// const VkPipelineColorBlendAttachmentState*	pAttachments;
668120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			{ 0.0f, 0.0f, 0.0f, 0.0f }									// float										blendConstants[4];
6699091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
6709091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
6719091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkPipelineMultisampleStateCreateInfo multisampleStateParams =
6729091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
673120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO,	// VkStructureType							sType;
674120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			DE_NULL,													// const void*								pNext;
675120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,															// VkPipelineMultisampleStateCreateFlags	flags;
676120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_SAMPLE_COUNT_1_BIT,										// VkSampleCountFlagBits					rasterizationSamples;
677120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			false,														// VkBool32									sampleShadingEnable;
678120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0.0f,														// float									minSampleShading;
679120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			DE_NULL,													// const VkSampleMask*						pSampleMask;
680120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			false,														// VkBool32									alphaToCoverageEnable;
681120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			false														// VkBool32									alphaToOneEnable;
6829091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
6839091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
6849091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const bool isDepthEnabled = (vk::mapVkFormat(m_stencilFormat).order != tcu::TextureFormat::S);
6859091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
6869091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		VkPipelineDepthStencilStateCreateInfo depthStencilStateParams =
6879091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
688120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO,	// VkStructureType							sType;
689120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			DE_NULL,													// const void*								pNext;
690120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,															// VkPipelineDepthStencilStateCreateFlags	flags;
691120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			isDepthEnabled,												// VkBool32									depthTestEnable;
692120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			isDepthEnabled,												// VkBool32									depthWriteEnable;
693120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_COMPARE_OP_LESS,											// VkCompareOp								depthCompareOp;
694120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			false,														// VkBool32									depthBoundsTestEnable;
695120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			true,														// VkBool32									stencilTestEnable;
696120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			m_stencilOpStateFront,										// VkStencilOpState							front;
697120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			m_stencilOpStateBack,										// VkStencilOpState							back;
6983d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos			0.0f,														// float									minDepthBounds;
6993d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos			1.0f														// float									maxDepthBounds;
7009091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
7019091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
7029091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkGraphicsPipelineCreateInfo graphicsPipelineParams =
7039091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
7049091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,	// VkStructureType									sType;
7059091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			DE_NULL,											// const void*										pNext;
706120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,													// VkPipelineCreateFlags							flags;
7079091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			2u,													// deUint32											stageCount;
708120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			shaderStages,										// const VkPipelineShaderStageCreateInfo*			pStages;
7099091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			&vertexInputStateParams,							// const VkPipelineVertexInputStateCreateInfo*		pVertexInputState;
7109091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			&inputAssemblyStateParams,							// const VkPipelineInputAssemblyStateCreateInfo*	pInputAssemblyState;
7119091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			DE_NULL,											// const VkPipelineTessellationStateCreateInfo*		pTessellationState;
7129091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			&viewportStateParams,								// const VkPipelineViewportStateCreateInfo*			pViewportState;
713120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			&rasterStateParams,									// const VkPipelineRasterizationStateCreateInfo*	pRasterizationState;
7149091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			&multisampleStateParams,							// const VkPipelineMultisampleStateCreateInfo*		pMultisampleState;
7159091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			&depthStencilStateParams,							// const VkPipelineDepthStencilStateCreateInfo*		pDepthStencilState;
7169091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			&colorBlendStateParams,								// const VkPipelineColorBlendStateCreateInfo*		pColorBlendState;
71786a8ae9e0d61bbfe1f1e273fdbb026369bdb5f29Pyry Haulos			(const VkPipelineDynamicStateCreateInfo*)DE_NULL,	// const VkPipelineDynamicStateCreateInfo*			pDynamicState;
7189091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			*m_pipelineLayout,									// VkPipelineLayout									layout;
7199091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			*m_renderPass,										// VkRenderPass										renderPass;
7209091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			0u,													// deUint32											subpass;
7219091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			0u,													// VkPipeline										basePipelineHandle;
7229091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			0u													// deInt32											basePipelineIndex;
7239091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
7249091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
7259091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		// Setup different stencil masks and refs in each quad
7269091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		for (int quadNdx = 0; quadNdx < StencilTest::QUAD_COUNT; quadNdx++)
7279091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
7289091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			const StencilTest::StencilStateConfig&	config	= StencilTest::s_stencilStateConfigs[quadNdx];
7299091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			VkStencilOpState&						front	= depthStencilStateParams.front;
7309091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			VkStencilOpState&						back	= depthStencilStateParams.back;
7319091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
732120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			front.compareMask	= config.frontReadMask;
733120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			front.writeMask		= config.frontWriteMask;
734120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			front.reference		= config.frontRef;
7359091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
736120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			back.compareMask	= config.backReadMask;
737120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			back.writeMask		= config.backWriteMask;
738120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			back.reference		= config.backRef;
7399091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
7409091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			m_graphicsPipelines[quadNdx] = createGraphicsPipeline(vk, vkDevice, DE_NULL, &graphicsPipelineParams);
7419091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		}
7429091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	}
7439091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
7449091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
7459091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	// Create vertex buffer
7469091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	{
7479091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkBufferCreateInfo vertexBufferParams =
7489091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
7499091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,		// VkStructureType		sType;
7509091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			DE_NULL,									// const void*			pNext;
751120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,											// VkBufferCreateFlags	flags;
7529091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			1024u,										// VkDeviceSize			size;
7539091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			VK_BUFFER_USAGE_VERTEX_BUFFER_BIT,			// VkBufferUsageFlags	usage;
7549091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			VK_SHARING_MODE_EXCLUSIVE,					// VkSharingMode		sharingMode;
755120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			1u,											// deUint32				queueFamilyIndexCount;
7569091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			&queueFamilyIndex							// const deUint32*		pQueueFamilyIndices;
7579091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
7589091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
7599091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		m_vertices			= createOverlappingQuads();
7609091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		m_vertexBuffer		= createBuffer(vk, vkDevice, &vertexBufferParams);
7619091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		m_vertexBufferAlloc	= memAlloc.allocate(getBufferMemoryRequirements(vk, vkDevice, *m_vertexBuffer), MemoryRequirement::HostVisible);
7629091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
7639091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		VK_CHECK(vk.bindBufferMemory(vkDevice, *m_vertexBuffer, m_vertexBufferAlloc->getMemory(), m_vertexBufferAlloc->getOffset()));
7649091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
7659091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		// Adjust depths
7669091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		for (int quadNdx = 0; quadNdx < 4; quadNdx++)
7679091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			for (int vertexNdx = 0; vertexNdx < 6; vertexNdx++)
7689091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim				m_vertices[quadNdx * 6 + vertexNdx].position.z() = StencilTest::s_quadDepths[quadNdx];
7699091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
7709091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		// Load vertices into vertex buffer
7719091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		deMemcpy(m_vertexBufferAlloc->getHostPtr(), m_vertices.data(), m_vertices.size() * sizeof(Vertex4RGBA));
7729091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
7739091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkMappedMemoryRange flushRange =
7749091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
7759091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim				VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE,	// VkStructureType	sType;
7769091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim				DE_NULL,								// const void*		pNext;
777120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				m_vertexBufferAlloc->getMemory(),		// VkDeviceMemory	memory;
7789091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim				m_vertexBufferAlloc->getOffset(),		// VkDeviceSize		offset;
7799091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim				vertexBufferParams.size					// VkDeviceSize		size;
7809091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
7819091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
7829091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		vk.flushMappedMemoryRanges(vkDevice, 1, &flushRange);
7839091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	}
7849091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
7859091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	// Create command pool
7869091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	{
787120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		const VkCommandPoolCreateInfo cmdPoolParams =
7889091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
789120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,		// VkStructureType			sType;
790120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			DE_NULL,										// const void*				pNext;
791120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_COMMAND_POOL_CREATE_TRANSIENT_BIT,			// VkCommandPoolCreateFlags	flags;
792120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			queueFamilyIndex,								// deUint32					queueFamilyIndex;
7939091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
7949091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
7959091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		m_cmdPool = createCommandPool(vk, vkDevice, &cmdPoolParams);
7969091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	}
7979091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
7989091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	// Create command buffer
7999091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	{
800120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		const VkCommandBufferAllocateInfo cmdBufferAllocateInfo =
8019091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
80294128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos			VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,	// VkStructureType		sType;
80394128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos			DE_NULL,										// const void*			pNext;
80494128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos			*m_cmdPool,										// VkCommandPool		commandPool;
80594128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos			VK_COMMAND_BUFFER_LEVEL_PRIMARY,				// VkCommandBufferLevel	level;
80694128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos			1u												// deUint32				bufferCount;
8079091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
8089091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
809120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		const VkCommandBufferBeginInfo cmdBufferBeginInfo =
8109091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
811120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,	// VkStructureType					sType;
812120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			DE_NULL,										// const void*						pNext;
813120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,												// VkCommandBufferUsageFlags		flags;
814689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos			(const VkCommandBufferInheritanceInfo*)DE_NULL,
8159091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
8169091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
8179091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkClearValue attachmentClearValues[2] =
8189091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
8199091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			defaultClearValue(m_colorFormat),
8209091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			defaultClearValue(m_stencilFormat)
8219091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
8229091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
8239091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkRenderPassBeginInfo renderPassBeginInfo =
8249091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
8259091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,				// VkStructureType		sType;
8269091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			DE_NULL,												// const void*			pNext;
8279091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			*m_renderPass,											// VkRenderPass			renderPass;
8289091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			*m_framebuffer,											// VkFramebuffer		framebuffer;
8299091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			{ { 0, 0 } , { m_renderSize.x(), m_renderSize.y() } },	// VkRect2D				renderArea;
8309091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			2,														// deUint32				clearValueCount;
8319091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			attachmentClearValues									// const VkClearValue*	pClearValues;
8329091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
8339091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
8343d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos		const VkImageMemoryBarrier imageLayoutBarriers[] =
8353d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos		{
8363d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos			// color image layout transition
8373d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos			{
8383d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos				VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,									// VkStructureType            sType;
8393d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos				DE_NULL,																// const void*                pNext;
8403d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos				(VkAccessFlags)0,														// VkAccessFlags              srcAccessMask;
8413d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos				VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,									// VkAccessFlags              dstAccessMask;
8423d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos				VK_IMAGE_LAYOUT_UNDEFINED,												// VkImageLayout              oldLayout;
8433d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos				VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,								// VkImageLayout              newLayout;
8443d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos				VK_QUEUE_FAMILY_IGNORED,												// uint32_t                   srcQueueFamilyIndex;
8453d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos				VK_QUEUE_FAMILY_IGNORED,												// uint32_t                   dstQueueFamilyIndex;
8463d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos				*m_colorImage,															// VkImage                    image;
8473d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos				{ VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u }							// VkImageSubresourceRange    subresourceRange;
8483d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos			},
8493d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos			// stencil image layout transition
8503d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos			{
8513d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos				VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,									// VkStructureType            sType;
8523d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos				DE_NULL,																// const void*                pNext;
8533d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos				(VkAccessFlags)0,														// VkAccessFlags              srcAccessMask;
8543d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos				VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT,							// VkAccessFlags              dstAccessMask;
8553d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos				VK_IMAGE_LAYOUT_UNDEFINED,												// VkImageLayout              oldLayout;
8563d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos				VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,						// VkImageLayout              newLayout;
8573d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos				VK_QUEUE_FAMILY_IGNORED,												// uint32_t                   srcQueueFamilyIndex;
8583d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos				VK_QUEUE_FAMILY_IGNORED,												// uint32_t                   dstQueueFamilyIndex;
8593d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos				*m_stencilImage,														// VkImage                    image;
8603d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos				m_stencilImageSubresourceRange,											// VkImageSubresourceRange    subresourceRange;
8613d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos			},
8623d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos		};
8633d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos
864120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		m_cmdBuffer = allocateCommandBuffer(vk, vkDevice, &cmdBufferAllocateInfo);
8659091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
8669091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		VK_CHECK(vk.beginCommandBuffer(*m_cmdBuffer, &cmdBufferBeginInfo));
8673d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos
8683d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos		vk.cmdPipelineBarrier(*m_cmdBuffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, (VkDependencyFlags)0,
8693d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos			0u, DE_NULL, 0u, DE_NULL, DE_LENGTH_OF_ARRAY(imageLayoutBarriers), imageLayoutBarriers);
8703d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos
871120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		vk.cmdBeginRenderPass(*m_cmdBuffer, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
8729091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
8739091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkDeviceSize		quadOffset		= (m_vertices.size() / StencilTest::QUAD_COUNT) * sizeof(Vertex4RGBA);
8749091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
8759091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		for (int quadNdx = 0; quadNdx < StencilTest::QUAD_COUNT; quadNdx++)
8769091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
8779091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			VkDeviceSize vertexBufferOffset = quadOffset * quadNdx;
8789091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
8799091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			vk.cmdBindPipeline(*m_cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *m_graphicsPipelines[quadNdx]);
8809091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			vk.cmdBindVertexBuffers(*m_cmdBuffer, 0, 1, &m_vertexBuffer.get(), &vertexBufferOffset);
8819091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			vk.cmdDraw(*m_cmdBuffer, (deUint32)(m_vertices.size() / StencilTest::QUAD_COUNT), 1, 0, 0);
8829091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		}
8839091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
8849091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		vk.cmdEndRenderPass(*m_cmdBuffer);
8859091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
8869091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	}
8879091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
8889091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	// Create fence
8899091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	{
8909091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkFenceCreateInfo fenceParams =
8919091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
8929091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			VK_STRUCTURE_TYPE_FENCE_CREATE_INFO,	// VkStructureType		sType;
8939091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			DE_NULL,								// const void*			pNext;
8949091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			0u										// VkFenceCreateFlags	flags;
8959091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
8969091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
8979091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		m_fence = createFence(vk, vkDevice, &fenceParams);
8989091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	}
8999091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim}
9009091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
9019091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae KimStencilTestInstance::~StencilTestInstance (void)
9029091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{
9039091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim}
9049091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
9059091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimtcu::TestStatus StencilTestInstance::iterate (void)
9069091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{
9079091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	const DeviceInterface&		vk			= m_context.getDeviceInterface();
9089091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	const VkDevice				vkDevice	= m_context.getDevice();
9099091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	const VkQueue				queue		= m_context.getUniversalQueue();
910120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	const VkSubmitInfo			submitInfo	=
911120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	{
912120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		VK_STRUCTURE_TYPE_SUBMIT_INFO,	// VkStructureType			sType;
913120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		DE_NULL,						// const void*				pNext;
914120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		0u,								// deUint32					waitSemaphoreCount;
915120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		DE_NULL,						// const VkSemaphore*		pWaitSemaphores;
916689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos		(const VkPipelineStageFlags*)DE_NULL,
917120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		1u,								// deUint32					commandBufferCount;
918120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		&m_cmdBuffer.get(),				// const VkCommandBuffer*	pCommandBuffers;
919120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		0u,								// deUint32					signalSemaphoreCount;
920120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		DE_NULL							// const VkSemaphore*		pSignalSemaphores;
921120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	};
9229091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
9239091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	VK_CHECK(vk.resetFences(vkDevice, 1, &m_fence.get()));
924120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	VK_CHECK(vk.queueSubmit(queue, 1, &submitInfo, *m_fence));
9259091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	VK_CHECK(vk.waitForFences(vkDevice, 1, &m_fence.get(), true, ~(0ull) /* infinity*/));
9269091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
9279091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	return verifyImage();
9289091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim}
9299091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
9309091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimtcu::TestStatus StencilTestInstance::verifyImage (void)
9319091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{
9329091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	const tcu::TextureFormat	tcuColorFormat		= mapVkFormat(m_colorFormat);
9339091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	const tcu::TextureFormat	tcuStencilFormat	= mapVkFormat(m_stencilFormat);
9349091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	const ColorVertexShader		vertexShader;
9359091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	const ColorFragmentShader	fragmentShader		(tcuColorFormat, tcuStencilFormat);
9369091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	const rr::Program			program				(&vertexShader, &fragmentShader);
9379091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	ReferenceRenderer			refRenderer			(m_renderSize.x(), m_renderSize.y(), 1, tcuColorFormat, tcuStencilFormat, &program);
9389091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	bool						compareOk			= false;
9399091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
9409091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	// Render reference image
9419091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	{
9429091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		// Set depth state
9439091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		rr::RenderState renderState(refRenderer.getViewportState());
9449091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
9459091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		renderState.fragOps.depthTestEnabled	= true;
9469091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		renderState.fragOps.depthFunc			= mapVkCompareOp(VK_COMPARE_OP_LESS);
9479091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		renderState.fragOps.stencilTestEnabled	= true;
9489091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
9499091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		rr::StencilState& refStencilFront	= renderState.fragOps.stencilStates[rr::FACETYPE_FRONT];
9509091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		rr::StencilState& refStencilBack	= renderState.fragOps.stencilStates[rr::FACETYPE_BACK];
9519091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
952120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		refStencilFront.sFail		= mapVkStencilOp(m_stencilOpStateFront.failOp);
953120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		refStencilFront.dpFail		= mapVkStencilOp(m_stencilOpStateFront.depthFailOp);
954120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		refStencilFront.dpPass		= mapVkStencilOp(m_stencilOpStateFront.passOp);
955120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		refStencilFront.func		= mapVkCompareOp(m_stencilOpStateFront.compareOp);
9569091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
957120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		refStencilBack.sFail		= mapVkStencilOp(m_stencilOpStateBack.failOp);
958120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		refStencilBack.dpFail		= mapVkStencilOp(m_stencilOpStateBack.depthFailOp);
959120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		refStencilBack.dpPass		= mapVkStencilOp(m_stencilOpStateBack.passOp);
960120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		refStencilBack.func			= mapVkCompareOp(m_stencilOpStateBack.compareOp);
9619091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
9629091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		// Reverse winding of vertices, as Vulkan screen coordinates start at upper left
9639091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		std::vector<Vertex4RGBA> cwVertices(m_vertices);
9649091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		for (size_t vertexNdx = 0; vertexNdx < cwVertices.size() - 2; vertexNdx += 3)
9659091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
9669091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			const Vertex4RGBA cwVertex1	= cwVertices[vertexNdx + 1];
9679091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
9689091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			cwVertices[vertexNdx + 1]	= cwVertices[vertexNdx + 2];
9699091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			cwVertices[vertexNdx + 2]	= cwVertex1;
9709091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		}
9719091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
9729091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		for (int quadNdx = 0; quadNdx < StencilTest::QUAD_COUNT; quadNdx++)
9739091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
9749091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			refStencilFront.ref			= (int)StencilTest::s_stencilStateConfigs[quadNdx].frontRef;
9759091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			refStencilFront.compMask	= StencilTest::s_stencilStateConfigs[quadNdx].frontReadMask;
9769091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			refStencilFront.writeMask	= StencilTest::s_stencilStateConfigs[quadNdx].frontWriteMask;
9779091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
9789091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			refStencilBack.ref			= (int)StencilTest::s_stencilStateConfigs[quadNdx].backRef;
9799091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			refStencilBack.compMask		= StencilTest::s_stencilStateConfigs[quadNdx].backReadMask;
9809091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			refStencilBack.writeMask	= StencilTest::s_stencilStateConfigs[quadNdx].backWriteMask;
9819091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
9829091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			refRenderer.draw(renderState,
9839091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim							 rr::PRIMITIVETYPE_TRIANGLES,
9849091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim							 std::vector<Vertex4RGBA>(cwVertices.begin() + quadNdx * 6,
9859091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim													  cwVertices.begin() + (quadNdx + 1) * 6));
9869091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		}
9879091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	}
9889091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
9899091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	// Compare result with reference image
9909091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	{
9919091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const DeviceInterface&				vk					= m_context.getDeviceInterface();
9929091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkDevice						vkDevice			= m_context.getDevice();
9939091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkQueue						queue				= m_context.getUniversalQueue();
9949091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const deUint32						queueFamilyIndex	= m_context.getUniversalQueueFamilyIndex();
9959091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		SimpleAllocator						allocator			(vk, vkDevice, getPhysicalDeviceMemoryProperties(m_context.getInstanceInterface(), m_context.getPhysicalDevice()));
9969091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		de::UniquePtr<tcu::TextureLevel>	result				(readColorAttachment(vk, vkDevice, queue, queueFamilyIndex, allocator, *m_colorImage, m_colorFormat, m_renderSize).release());
9979091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
9989091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		compareOk = tcu::intThresholdPositionDeviationCompare(m_context.getTestContext().getLog(),
9999091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim															  "IntImageCompare",
10009091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim															  "Image comparison",
10019091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim															  refRenderer.getAccess(),
10029091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim															  result->getAccess(),
10039091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim															  tcu::UVec4(2, 2, 2, 2),
10049091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim															  tcu::IVec3(1, 1, 0),
10059091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim															  true,
10069091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim															  tcu::COMPARE_LOG_RESULT);
10079091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	}
10089091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
10099091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	if (compareOk)
10109091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		return tcu::TestStatus::pass("Result image matches reference");
10119091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	else
10129091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		return tcu::TestStatus::fail("Image mismatch");
10139091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim}
10149091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
10159091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
10169091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim// Utilities for test names
10179091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
10189091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimstd::string getShortName (VkCompareOp compareOp)
10199091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{
10209091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	const std::string  fullName = getCompareOpName(compareOp);
10219091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
10229091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	DE_ASSERT(de::beginsWith(fullName, "VK_COMPARE_OP_"));
10239091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
10249091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	return de::toLower(fullName.substr(14));
10259091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim}
10269091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
10279091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimconst char* getShortName (VkStencilOp stencilOp)
10289091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{
10299091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	switch (stencilOp)
10309091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	{
1031120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		case VK_STENCIL_OP_KEEP:					return "keep";
1032120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		case VK_STENCIL_OP_ZERO:					return "zero";
1033120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		case VK_STENCIL_OP_REPLACE:					return "repl";
1034120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		case VK_STENCIL_OP_INCREMENT_AND_CLAMP:		return "incc";
1035120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		case VK_STENCIL_OP_DECREMENT_AND_CLAMP:		return "decc";
1036120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		case VK_STENCIL_OP_INVERT:					return "inv";
1037120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		case VK_STENCIL_OP_INCREMENT_AND_WRAP:		return "wrap";
1038120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		case VK_STENCIL_OP_DECREMENT_AND_WRAP:		return "decw";
10399091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
10409091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		default:
10419091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			DE_FATAL("Invalid VkStencilOpState value");
10429091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	}
10439091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	return DE_NULL;
10449091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim}
10459091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
10469091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimstd::string getStencilName(const VkStencilOpState& stencilOpState)
10479091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{
10489091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	std::ostringstream name;
10499091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
1050120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	name << "fail_" << getShortName(stencilOpState.failOp)
1051120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		 << "_pass_" << getShortName(stencilOpState.passOp)
1052120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		 << "_dfail_" << getShortName(stencilOpState.depthFailOp)
1053120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		 << "_comp_" << getShortName(stencilOpState.compareOp);
10549091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
10559091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	return name.str();
10569091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim}
10579091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
10589091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimstd::string getStencilStateSetName(const VkStencilOpState& stencilOpStateFront,
10599091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim								   const VkStencilOpState& stencilOpStateBack)
10609091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{
10619091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	std::ostringstream name;
10629091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
10639091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	name << "front_" << getStencilName(stencilOpStateFront)
10649091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		 << "_back_" << getStencilName(stencilOpStateBack);
10659091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
10669091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	return name.str();
10679091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim}
10689091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
10699091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimstd::string getStencilStateSetDescription(const VkStencilOpState& stencilOpStateFront,
10709091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim										  const VkStencilOpState& stencilOpStateBack)
10719091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{
10729091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	std::ostringstream desc;
10739091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
10749091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	desc << "\nFront faces:\n" << stencilOpStateFront;
10759091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	desc << "Back faces:\n" << stencilOpStateBack;
10769091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
10779091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	return desc.str();
10789091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim}
10799091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
10809091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimstd::string getFormatCaseName (VkFormat format)
10819091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{
10829091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	const std::string fullName = getFormatName(format);
10839091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
10849091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	DE_ASSERT(de::beginsWith(fullName, "VK_FORMAT_"));
10859091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
10869091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	return de::toLower(fullName.substr(10));
10879091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim}
10889091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
10899091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim} // anonymous
10909091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
10919091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimtcu::TestCaseGroup* createStencilTests (tcu::TestContext& testCtx)
10929091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{
10939091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	const VkFormat stencilFormats[] =
10949091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	{
10959091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		VK_FORMAT_S8_UINT,
10969091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		VK_FORMAT_D16_UNORM_S8_UINT,
10979091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		VK_FORMAT_D24_UNORM_S8_UINT,
10989091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		VK_FORMAT_D32_SFLOAT_S8_UINT
10999091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	};
11009091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
11019091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	de::MovePtr<tcu::TestCaseGroup>		stencilTests	(new tcu::TestCaseGroup(testCtx, "stencil", "Stencil tests"));
11029091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	de::MovePtr<tcu::TestCaseGroup>		formatTests		(new tcu::TestCaseGroup(testCtx, "format", "Uses different stencil formats"));
11039091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	StencilOpStateUniqueRandomIterator	stencilOpItr	(123);
11049091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
11059091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	for (size_t formatNdx = 0; formatNdx < DE_LENGTH_OF_ARRAY(stencilFormats); formatNdx++)
11069091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	{
11079091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkFormat					stencilFormat	= stencilFormats[formatNdx];
11089091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		de::MovePtr<tcu::TestCaseGroup>	formatTest		(new tcu::TestCaseGroup(testCtx,
11099091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim																				getFormatCaseName(stencilFormat).c_str(),
11109091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim																				(std::string("Uses format ") + getFormatName(stencilFormat)).c_str()));
11119091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
11129091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		de::MovePtr<tcu::TestCaseGroup>	stencilStateTests;
11139091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
11149091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			std::ostringstream desc;
11159091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			desc << "Draws 4 quads with the following depths and dynamic stencil states: ";
11169091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			for (int quadNdx = 0; quadNdx < StencilTest::QUAD_COUNT; quadNdx++)
11179091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			{
11189091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim				const StencilTest::StencilStateConfig& stencilConfig = StencilTest::s_stencilStateConfigs[quadNdx];
11199091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
11209091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim				desc << "(" << quadNdx << ") "
11219091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim					 << "z = " << StencilTest::s_quadDepths[quadNdx] << ", "
11229091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim					 << "frontReadMask = " << stencilConfig.frontReadMask << ", "
11239091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim					 << "frontWriteMask = " << stencilConfig.frontWriteMask << ", "
11249091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim					 << "frontRef = " << stencilConfig.frontRef << ", "
11259091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim					 << "backReadMask = " << stencilConfig.backReadMask << ", "
11269091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim					 << "backWriteMask = " << stencilConfig.backWriteMask << ", "
11279091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim					 << "backRef = " << stencilConfig.backRef;
11289091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			}
11299091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
11309091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			stencilStateTests = de::MovePtr<tcu::TestCaseGroup>(new tcu::TestCaseGroup(testCtx, "states", desc.str().c_str()));
11319091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		}
11329091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
11339091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		stencilOpItr.reset();
11349091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
11359091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		VkStencilOpState		prevStencilState	= stencilOpItr.next();
11369091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkStencilOpState	firstStencilState	= prevStencilState;
11379091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
11389091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		while (stencilOpItr.hasNext())
11399091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
11409091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			const VkStencilOpState stencilState = stencilOpItr.next();
11419091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
11429091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			// Use current stencil state in front fraces and previous state in back faces
11439091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			stencilStateTests->addChild(new StencilTest(testCtx,
11449091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim														getStencilStateSetName(stencilState, prevStencilState),
11459091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim														getStencilStateSetDescription(stencilState, prevStencilState),
11469091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim														stencilFormat,
11479091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim														stencilState,
11489091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim														prevStencilState));
11499091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
11509091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			prevStencilState = stencilState;
11519091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		}
11529091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
11539091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		// Use first stencil state with last stencil state. This would make the test suite cover all states in front and back faces.
11549091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		stencilStateTests->addChild(new StencilTest(testCtx,
11559091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim													getStencilStateSetName(firstStencilState, prevStencilState),
11569091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim													getStencilStateSetDescription(firstStencilState, prevStencilState),
11579091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim													stencilFormat,
11589091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim													firstStencilState,
11599091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim													prevStencilState));
11609091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
11619091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		formatTest->addChild(stencilStateTests.release());
11629091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		formatTests->addChild(formatTest.release());
11639091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	}
11649091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	stencilTests->addChild(formatTests.release());
11659091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
11669091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	return stencilTests.release();
11679091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim}
11689091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
11699091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim} // pipeline
11709091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim} // vkt
1171