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"
381d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski#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) {}
730fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi	virtual VkStencilOpState	getIndexedValue						(deUint32 index);
749091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
759091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimprivate:
769091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
779091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	// Pre-calculated constants
780fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi	const static deUint32		s_stencilOpsLength;
790fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi	const static deUint32		s_stencilOpsLength2;
800fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi	const static deUint32		s_stencilOpsLength3;
810fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi	const static deUint32		s_compareOpsLength;
829091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
839091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	// Total number of cross-combinations of (stencilFailOp x stencilPassOp x stencilDepthFailOp x stencilCompareOp)
840fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi	const static deUint32		s_totalStencilOpStates;
859091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim};
869091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
879091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
889091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimclass StencilTest : public vkt::TestCase
899091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{
909091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimpublic:
919091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	enum
929091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	{
939091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		QUAD_COUNT = 4
949091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	};
959091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
969091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	struct StencilStateConfig
979091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	{
989091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		deUint32	frontReadMask;
999091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		deUint32	frontWriteMask;
1009091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		deUint32	frontRef;
1019091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
1029091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		deUint32	backReadMask;
1039091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		deUint32	backWriteMask;
1049091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		deUint32	backRef;
1059091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	};
1069091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
1079091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	const static StencilStateConfig			s_stencilStateConfigs[QUAD_COUNT];
1089091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	const static float						s_quadDepths[QUAD_COUNT];
1099091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
1109091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
1119091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim											StencilTest				(tcu::TestContext&			testContext,
1129091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim																	 const std::string&			name,
1139091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim																	 const std::string&			description,
1149091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim																	 VkFormat					stencilFormat,
1159091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim																	 const VkStencilOpState&	stencilOpStateFront,
1169091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim																	 const VkStencilOpState&	stencilOpStateBack);
1179091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	virtual									~StencilTest			(void);
1189091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	virtual void							initPrograms			(SourceCollections& sourceCollections) const;
1199091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	virtual TestInstance*					createInstance			(Context& context) const;
1209091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
1219091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimprivate:
1229091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	VkFormat								m_stencilFormat;
1239091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	const VkStencilOpState					m_stencilOpStateFront;
1249091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	const VkStencilOpState					m_stencilOpStateBack;
1259091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim};
1269091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
1279091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimclass StencilTestInstance : public vkt::TestInstance
1289091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{
1299091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimpublic:
1309091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim										StencilTestInstance		(Context&					context,
1319091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim																 VkFormat					stencilFormat,
1329091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim																 const VkStencilOpState&	stencilOpStatesFront,
1339091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim																 const VkStencilOpState&	stencilOpStatesBack);
1349091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	virtual								~StencilTestInstance	(void);
1359091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	virtual tcu::TestStatus				iterate					(void);
1369091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
1379091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimprivate:
1389091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	tcu::TestStatus						verifyImage				(void);
1399091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
1409091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	VkStencilOpState					m_stencilOpStateFront;
1419091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	VkStencilOpState					m_stencilOpStateBack;
142689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos	const tcu::UVec2					m_renderSize;
1439091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	const VkFormat						m_colorFormat;
1449091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	const VkFormat						m_stencilFormat;
1451d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski	VkImageSubresourceRange				m_stencilImageSubresourceRange;
1469091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
1479091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	VkImageCreateInfo					m_colorImageCreateInfo;
1489091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	Move<VkImage>						m_colorImage;
1499091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	de::MovePtr<Allocation>				m_colorImageAlloc;
1509091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	Move<VkImage>						m_stencilImage;
1519091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	de::MovePtr<Allocation>				m_stencilImageAlloc;
1529091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	Move<VkImageView>					m_colorAttachmentView;
1539091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	Move<VkImageView>					m_stencilAttachmentView;
1549091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	Move<VkRenderPass>					m_renderPass;
1559091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	Move<VkFramebuffer>					m_framebuffer;
1569091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
1579091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	Move<VkShaderModule>				m_vertexShaderModule;
1589091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	Move<VkShaderModule>				m_fragmentShaderModule;
1599091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
1609091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	Move<VkBuffer>						m_vertexBuffer;
1619091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	std::vector<Vertex4RGBA>			m_vertices;
1629091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	de::MovePtr<Allocation>				m_vertexBufferAlloc;
1639091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
1649091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	Move<VkPipelineLayout>				m_pipelineLayout;
1659091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	Move<VkPipeline>					m_graphicsPipelines[StencilTest::QUAD_COUNT];
1669091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
167120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	Move<VkCommandPool>					m_cmdPool;
168120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	Move<VkCommandBuffer>				m_cmdBuffer;
1699091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
1709091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	Move<VkFence>						m_fence;
1719091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim};
1729091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
1730fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessiconst VkStencilOp stencilOps[] =
1749091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{
1759091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	VK_STENCIL_OP_KEEP,
1769091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	VK_STENCIL_OP_ZERO,
1779091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	VK_STENCIL_OP_REPLACE,
178120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	VK_STENCIL_OP_INCREMENT_AND_CLAMP,
179120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	VK_STENCIL_OP_DECREMENT_AND_CLAMP,
1809091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	VK_STENCIL_OP_INVERT,
181120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	VK_STENCIL_OP_INCREMENT_AND_WRAP,
182120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	VK_STENCIL_OP_DECREMENT_AND_WRAP
1839091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim};
1849091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
1850fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessiconst VkCompareOp compareOps[] =
1869091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{
1879091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	VK_COMPARE_OP_NEVER,
1889091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	VK_COMPARE_OP_LESS,
1899091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	VK_COMPARE_OP_EQUAL,
190120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	VK_COMPARE_OP_LESS_OR_EQUAL,
1919091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	VK_COMPARE_OP_GREATER,
1929091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	VK_COMPARE_OP_NOT_EQUAL,
193120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	VK_COMPARE_OP_GREATER_OR_EQUAL,
1949091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	VK_COMPARE_OP_ALWAYS
1959091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim};
1969091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
1970fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi// StencilOpStateUniqueRandomIterator
1980fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi
1990fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessiconst deUint32 StencilOpStateUniqueRandomIterator::s_stencilOpsLength		= DE_LENGTH_OF_ARRAY(stencilOps);
2000fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessiconst deUint32 StencilOpStateUniqueRandomIterator::s_stencilOpsLength2		= s_stencilOpsLength * s_stencilOpsLength;
2010fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessiconst deUint32 StencilOpStateUniqueRandomIterator::s_stencilOpsLength3		= s_stencilOpsLength2 * s_stencilOpsLength;
2020fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessiconst deUint32 StencilOpStateUniqueRandomIterator::s_compareOpsLength		= DE_LENGTH_OF_ARRAY(compareOps);
2030fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessiconst deUint32 StencilOpStateUniqueRandomIterator::s_totalStencilOpStates	= s_stencilOpsLength3 * s_compareOpsLength;
2049091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
2059091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae KimStencilOpStateUniqueRandomIterator::StencilOpStateUniqueRandomIterator (int seed)
2060fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi	: UniqueRandomIterator<VkStencilOpState>(s_totalStencilOpStates, s_totalStencilOpStates, seed)
2079091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{
2089091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim}
2099091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
2109091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae KimVkStencilOpState StencilOpStateUniqueRandomIterator::getIndexedValue (deUint32 index)
2119091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{
2120fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi	const deUint32 stencilCompareOpIndex = index / s_stencilOpsLength3;
2130fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi	const deUint32 stencilCompareOpSeqIndex = stencilCompareOpIndex * s_stencilOpsLength3;
2149091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
2150fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi	const deUint32 stencilDepthFailOpIndex = (index - stencilCompareOpSeqIndex) / s_stencilOpsLength2;
2160fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi	const deUint32 stencilDepthFailOpSeqIndex = stencilDepthFailOpIndex * s_stencilOpsLength2;
2179091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
2180fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi	const deUint32 stencilPassOpIndex = (index - stencilCompareOpSeqIndex - stencilDepthFailOpSeqIndex) / s_stencilOpsLength;
2190fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi	const deUint32 stencilPassOpSeqIndex = stencilPassOpIndex * s_stencilOpsLength;
2209091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
2219091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	const deUint32 stencilFailOpIndex = index - stencilCompareOpSeqIndex - stencilDepthFailOpSeqIndex - stencilPassOpSeqIndex;
2229091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
2239091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	const VkStencilOpState stencilOpState =
2249091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	{
2250fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi		stencilOps[stencilFailOpIndex],			// VkStencilOp	failOp;
2260fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi		stencilOps[stencilPassOpIndex],			// VkStencilOp	passOp;
2270fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi		stencilOps[stencilDepthFailOpIndex],	// VkStencilOp	depthFailOp;
2280fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi		compareOps[stencilCompareOpIndex],		// VkCompareOp	compareOp;
229120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		0x0,									// deUint32		compareMask;
230120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		0x0,									// deUint32		writeMask;
231120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		0x0										// deUint32		reference;
2329091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	};
2339091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
2349091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	return stencilOpState;
2359091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim}
2369091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
2379091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
2389091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim// StencilTest
2399091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
2409091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimconst StencilTest::StencilStateConfig StencilTest::s_stencilStateConfigs[QUAD_COUNT] =
2419091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{
2429091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	//	frontReadMask	frontWriteMask		frontRef		backReadMask	backWriteMask	backRef
2439091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	{	0xFF,			0xFF,				0xAB,			0xF0,			0xFF,			0xFF	},
2449091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	{	0xFF,			0xF0,				0xCD,			0xF0,			0xF0,			0xEF	},
2459091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	{	0xF0,			0x0F,				0xEF,			0xFF,			0x0F,			0xCD	},
2469091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	{	0xF0,			0x01,				0xFF,			0xFF,			0x01,			0xAB	}
2479091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim};
2489091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
2499091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimconst float StencilTest::s_quadDepths[QUAD_COUNT] =
2509091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{
2519091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	0.1f,
2529091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	0.0f,
2539091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	0.3f,
2549091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	0.2f
2559091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim};
2569091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
2579091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae KimStencilTest::StencilTest (tcu::TestContext&			testContext,
2589091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim						  const std::string&		name,
2599091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim						  const std::string&		description,
2609091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim						  VkFormat					stencilFormat,
2619091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim						  const VkStencilOpState&	stencilOpStateFront,
2629091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim						  const VkStencilOpState&	stencilOpStateBack)
2639091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	: vkt::TestCase			(testContext, name, description)
2649091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	, m_stencilFormat		(stencilFormat)
2659091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	, m_stencilOpStateFront	(stencilOpStateFront)
2669091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	, m_stencilOpStateBack	(stencilOpStateBack)
2679091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{
2689091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim}
2699091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
2709091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae KimStencilTest::~StencilTest (void)
2719091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{
2729091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim}
2739091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
2749091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae KimTestInstance* StencilTest::createInstance (Context& context) const
2759091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{
2769091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	return new StencilTestInstance(context, m_stencilFormat, m_stencilOpStateFront, m_stencilOpStateBack);
2779091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim}
2789091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
2799091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimvoid StencilTest::initPrograms (SourceCollections& sourceCollections) const
2809091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{
2819091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	sourceCollections.glslSources.add("color_vert") << glu::VertexSource(
2829091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		"#version 310 es\n"
2839091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		"layout(location = 0) in vec4 position;\n"
2849091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		"layout(location = 1) in vec4 color;\n"
2859091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		"layout(location = 0) out highp vec4 vtxColor;\n"
2869091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		"void main (void)\n"
2879091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		"{\n"
2889091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		"	gl_Position = position;\n"
2899091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		"	vtxColor = color;\n"
2909091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		"}\n");
2919091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
2929091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	sourceCollections.glslSources.add("color_frag") << glu::FragmentSource(
2939091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		"#version 310 es\n"
2949091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		"layout(location = 0) in highp vec4 vtxColor;\n"
2959091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		"layout(location = 0) out highp vec4 fragColor;\n"
2969091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		"void main (void)\n"
2979091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		"{\n"
2989091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		"	fragColor = vtxColor;\n"
2999091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		"}\n");
3009091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim}
3019091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
3029091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
3039091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim// StencilTestInstance
3049091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
3059091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae KimStencilTestInstance::StencilTestInstance (Context&					context,
3069091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim										  VkFormat					stencilFormat,
3079091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim										  const VkStencilOpState&	stencilOpStateFront,
3089091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim										  const VkStencilOpState&	stencilOpStateBack)
3099091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	: vkt::TestInstance		(context)
3109091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	, m_stencilOpStateFront	(stencilOpStateFront)
3119091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	, m_stencilOpStateBack	(stencilOpStateBack)
3129091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	, m_renderSize			(32, 32)
3139091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	, m_colorFormat			(VK_FORMAT_R8G8B8A8_UNORM)
3149091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	, m_stencilFormat		(stencilFormat)
3159091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{
316120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	const DeviceInterface&		vk						= context.getDeviceInterface();
317120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	const VkDevice				vkDevice				= context.getDevice();
318120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	const deUint32				queueFamilyIndex		= context.getUniversalQueueFamilyIndex();
319120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	SimpleAllocator				memAlloc				(vk, vkDevice, getPhysicalDeviceMemoryProperties(context.getInstanceInterface(), context.getPhysicalDevice()));
320120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	const VkComponentMapping	componentMappingRGBA	= { VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A };
3219091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
3229091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	// Create color image
3239091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	{
3249091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkImageCreateInfo colorImageParams =
3259091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
326120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,										// VkStructureType			sType;
327120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			DE_NULL,																	// const void*				pNext;
328120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,																			// VkImageCreateFlags		flags;
329120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_IMAGE_TYPE_2D,															// VkImageType				imageType;
330120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			m_colorFormat,																// VkFormat					format;
331120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			{ m_renderSize.x(), m_renderSize.y(), 1u },									// VkExtent3D				extent;
332120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			1u,																			// deUint32					mipLevels;
333120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			1u,																			// deUint32					arrayLayers;
334120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_SAMPLE_COUNT_1_BIT,														// VkSampleCountFlagBits	samples;
335120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_IMAGE_TILING_OPTIMAL,													// VkImageTiling			tiling;
336120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT,		// VkImageUsageFlags		usage;
337120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_SHARING_MODE_EXCLUSIVE,													// VkSharingMode			sharingMode;
338120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			1u,																			// deUint32					queueFamilyIndexCount;
339120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			&queueFamilyIndex,															// const deUint32*			pQueueFamilyIndices;
340120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_IMAGE_LAYOUT_UNDEFINED													// VkImageLayout			initialLayout;
3419091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
3429091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
3439091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		m_colorImageCreateInfo	= colorImageParams;
3449091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		m_colorImage			= createImage(vk, vkDevice, &m_colorImageCreateInfo);
3459091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
3469091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		// Allocate and bind color image memory
3479091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		m_colorImageAlloc		= memAlloc.allocate(getImageMemoryRequirements(vk, vkDevice, *m_colorImage), MemoryRequirement::Any);
3489091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		VK_CHECK(vk.bindImageMemory(vkDevice, *m_colorImage, m_colorImageAlloc->getMemory(), m_colorImageAlloc->getOffset()));
3499091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	}
3509091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
3519091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	// Create stencil image
3529091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	{
3539091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		// Check format support
3549091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		if (!isSupportedDepthStencilFormat(context.getInstanceInterface(), context.getPhysicalDevice(), m_stencilFormat))
3559091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			throw tcu::NotSupportedError(std::string("Unsupported depth/stencil format: ") + getFormatName(m_stencilFormat));
3569091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
3579091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkImageCreateInfo stencilImageParams =
3589091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
359120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,			// VkStructureType			sType;
360120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			DE_NULL,										// const void*				pNext;
361120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,												// VkImageCreateFlags		flags;
362120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_IMAGE_TYPE_2D,								// VkImageType				imageType;
363120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			m_stencilFormat,								// VkFormat					format;
364120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			{ m_renderSize.x(), m_renderSize.y(), 1u },		// VkExtent3D				extent;
365120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			1u,												// deUint32					mipLevels;
366120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			1u,												// deUint32					arrayLayers;
367120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_SAMPLE_COUNT_1_BIT,							// VkSampleCountFlagBits	samples;
368120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_IMAGE_TILING_OPTIMAL,						// VkImageTiling			tiling;
369120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,	// VkImageUsageFlags		usage;
370120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_SHARING_MODE_EXCLUSIVE,						// VkSharingMode			sharingMode;
371120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			1u,												// deUint32					queueFamilyIndexCount;
372120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			&queueFamilyIndex,								// const deUint32*			pQueueFamilyIndices;
373120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_IMAGE_LAYOUT_UNDEFINED						// VkImageLayout			initialLayout;
3749091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
3759091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
3769091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		m_stencilImage = createImage(vk, vkDevice, &stencilImageParams);
3779091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
3789091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		// Allocate and bind stencil image memory
3799091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		m_stencilImageAlloc = memAlloc.allocate(getImageMemoryRequirements(vk, vkDevice, *m_stencilImage), MemoryRequirement::Any);
3809091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		VK_CHECK(vk.bindImageMemory(vkDevice, *m_stencilImage, m_stencilImageAlloc->getMemory(), m_stencilImageAlloc->getOffset()));
3811d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski
3821d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski		const VkImageAspectFlags aspect = (mapVkFormat(m_stencilFormat).order == tcu::TextureFormat::DS ? VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_DEPTH_BIT
3831d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski																										: VK_IMAGE_ASPECT_STENCIL_BIT);
3841d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski		m_stencilImageSubresourceRange  = makeImageSubresourceRange(aspect, 0u, stencilImageParams.mipLevels, 0u, stencilImageParams.arrayLayers);
3859091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	}
3869091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
3879091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	// Create color attachment view
3889091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	{
3899091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkImageViewCreateInfo colorAttachmentViewParams =
3909091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
391120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,			// VkStructureType			sType;
392120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			DE_NULL,											// const void*				pNext;
393120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,													// VkImageViewCreateFlags	flags;
394120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			*m_colorImage,										// VkImage					image;
395120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_IMAGE_VIEW_TYPE_2D,								// VkImageViewType			viewType;
396120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			m_colorFormat,										// VkFormat					format;
397120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			componentMappingRGBA,								// VkComponentMapping		components;
398120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			{ VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u }		// VkImageSubresourceRange	subresourceRange;
3999091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
4009091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
4019091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		m_colorAttachmentView = createImageView(vk, vkDevice, &colorAttachmentViewParams);
4029091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	}
4039091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
4049091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	// Create stencil attachment view
4059091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	{
4069091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkImageViewCreateInfo stencilAttachmentViewParams =
4079091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
408120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,			// VkStructureType			sType;
409120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			DE_NULL,											// const void*				pNext;
410120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,													// VkImageViewCreateFlags	flags;
411120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			*m_stencilImage,									// VkImage					image;
412120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_IMAGE_VIEW_TYPE_2D,								// VkImageViewType			viewType;
413120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			m_stencilFormat,									// VkFormat					format;
414120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			componentMappingRGBA,								// VkComponentMapping		components;
4151d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski			m_stencilImageSubresourceRange,						// VkImageSubresourceRange	subresourceRange;
4169091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
4179091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
4189091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		m_stencilAttachmentView = createImageView(vk, vkDevice, &stencilAttachmentViewParams);
4199091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	}
4209091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
4219091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	// Create render pass
4229091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	{
4239091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkAttachmentDescription colorAttachmentDescription =
4249091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
42594128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos			0u,													// VkAttachmentDescriptionFlags	flags;
4269091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			m_colorFormat,										// VkFormat						format;
427120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_SAMPLE_COUNT_1_BIT,								// VkSampleCountFlagBits		samples;
4289091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			VK_ATTACHMENT_LOAD_OP_CLEAR,						// VkAttachmentLoadOp			loadOp;
4299091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			VK_ATTACHMENT_STORE_OP_STORE,						// VkAttachmentStoreOp			storeOp;
4309091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			VK_ATTACHMENT_LOAD_OP_DONT_CARE,					// VkAttachmentLoadOp			stencilLoadOp;
4319091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			VK_ATTACHMENT_STORE_OP_DONT_CARE,					// VkAttachmentStoreOp			stencilStoreOp;
4329091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,			// VkImageLayout				initialLayout;
4339091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,			// VkImageLayout				finalLayout;
4349091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
4359091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
4369091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkAttachmentDescription stencilAttachmentDescription =
4379091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
438120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,													// VkAttachmentDescriptionFlags	flags;
4399091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			m_stencilFormat,									// VkFormat						format;
440120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_SAMPLE_COUNT_1_BIT,								// VkSampleCountFlagBits		samples;
4419091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			VK_ATTACHMENT_LOAD_OP_CLEAR,						// VkAttachmentLoadOp			loadOp;
4429091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			VK_ATTACHMENT_STORE_OP_DONT_CARE,					// VkAttachmentStoreOp			storeOp;
4439091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			VK_ATTACHMENT_LOAD_OP_CLEAR,						// VkAttachmentLoadOp			stencilLoadOp;
4449091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			VK_ATTACHMENT_STORE_OP_DONT_CARE,					// VkAttachmentStoreOp			stencilStoreOp;
4459091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,	// VkImageLayout				initialLayout;
4469091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,	// VkImageLayout				finalLayout;
4479091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
4489091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
4499091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkAttachmentDescription attachments[2] =
4509091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
4519091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			colorAttachmentDescription,
4529091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			stencilAttachmentDescription
4539091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
4549091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
4559091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkAttachmentReference colorAttachmentReference =
4569091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
4579091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			0u,													// deUint32			attachment;
4589091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL			// VkImageLayout	layout;
4599091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
4609091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
4619091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkAttachmentReference stencilAttachmentReference =
4629091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
4639091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			1u,													// deUint32			attachment;
4649091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL	// VkImageLayout	layout;
4659091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
4669091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
4679091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkSubpassDescription subpassDescription =
4689091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
4699091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			0u,													// VkSubpassDescriptionFlags	flags;
470120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_PIPELINE_BIND_POINT_GRAPHICS,					// VkPipelineBindPoint			pipelineBindPoint;
471120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,													// deUint32						inputAttachmentCount;
4729091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			DE_NULL,											// const VkAttachmentReference*	pInputAttachments;
473120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			1u,													// deUint32						colorAttachmentCount;
4749091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			&colorAttachmentReference,							// const VkAttachmentReference*	pColorAttachments;
475120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			DE_NULL,											// const VkAttachmentReference*	pResolveAttachments;
476120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			&stencilAttachmentReference,						// const VkAttachmentReference*	pDepthStencilAttachment;
477120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,													// deUint32						preserveAttachmentCount;
4789091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			DE_NULL												// const VkAttachmentReference*	pPreserveAttachments;
4799091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
4809091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
4819091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkRenderPassCreateInfo renderPassParams =
4829091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
4839091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,			// VkStructureType					sType;
4849091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			DE_NULL,											// const void*						pNext;
485120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,													// VkRenderPassCreateFlags			flags;
4869091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			2u,													// deUint32							attachmentCount;
4879091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			attachments,										// const VkAttachmentDescription*	pAttachments;
4889091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			1u,													// deUint32							subpassCount;
4899091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			&subpassDescription,								// const VkSubpassDescription*		pSubpasses;
4909091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			0u,													// deUint32							dependencyCount;
4919091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			DE_NULL												// const VkSubpassDependency*		pDependencies;
4929091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
4939091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
4949091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		m_renderPass = createRenderPass(vk, vkDevice, &renderPassParams);
4959091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	}
4969091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
4979091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	// Create framebuffer
4989091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	{
4999091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkImageView attachmentBindInfos[2] = { *m_colorAttachmentView, *m_stencilAttachmentView };
5009091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
5019091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkFramebufferCreateInfo framebufferParams =
5029091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
503120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO,			// VkStructureType			sType;
504120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			DE_NULL,											// const void*				pNext;
505120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,													// VkFramebufferCreateFlags	flags;
506120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			*m_renderPass,										// VkRenderPass				renderPass;
507120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			2u,													// deUint32					attachmentCount;
508120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			attachmentBindInfos,								// const VkImageView*		pAttachments;
509120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			(deUint32)m_renderSize.x(),							// deUint32					width;
510120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			(deUint32)m_renderSize.y(),							// deUint32					height;
511120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			1u													// deUint32					layers;
5129091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
5139091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
5149091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		m_framebuffer = createFramebuffer(vk, vkDevice, &framebufferParams);
5159091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	}
5169091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
5179091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	// Create pipeline layout
5189091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	{
5199091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkPipelineLayoutCreateInfo pipelineLayoutParams =
5209091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
5219091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,		// VkStructureType				sType;
5229091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			DE_NULL,											// const void*					pNext;
523120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,													// VkPipelineLayoutCreateFlags	flags;
524120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,													// deUint32						setLayoutCount;
5259091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			DE_NULL,											// const VkDescriptorSetLayout*	pSetLayouts;
5269091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			0u,													// deUint32						pushConstantRangeCount;
5279091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			DE_NULL												// const VkPushConstantRange*	pPushConstantRanges;
5289091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
5299091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
5309091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		m_pipelineLayout = createPipelineLayout(vk, vkDevice, &pipelineLayoutParams);
5319091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	}
5329091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
533120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	m_vertexShaderModule	= createShaderModule(vk, vkDevice, m_context.getBinaryCollection().get("color_vert"), 0);
534120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	m_fragmentShaderModule	= createShaderModule(vk, vkDevice, m_context.getBinaryCollection().get("color_frag"), 0);
5359091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
5369091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	// Create pipeline
5379091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	{
538120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		const VkPipelineShaderStageCreateInfo shaderStages[2] =
5399091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
5409091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			{
541120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,		// VkStructureType						sType;
542120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				DE_NULL,													// const void*							pNext;
543120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				0u,															// VkPipelineShaderStageCreateFlags		flags;
544120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				VK_SHADER_STAGE_VERTEX_BIT,									// VkShaderStageFlagBits				stage;
545120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				*m_vertexShaderModule,										// VkShaderModule						module;
546120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				"main",														// const char*							pName;
547120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				DE_NULL														// const VkSpecializationInfo*			pSpecializationInfo;
5489091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			},
5499091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			{
550120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,		// VkStructureType						sType;
551120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				DE_NULL,													// const void*							pNext;
552120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				0u,															// VkPipelineShaderStageCreateFlags		flags;
553120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				VK_SHADER_STAGE_FRAGMENT_BIT,								// VkShaderStageFlagBits				stage;
554120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				*m_fragmentShaderModule,									// VkShaderModule						module;
555120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				"main",														// const char*							pName;
556120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				DE_NULL														// const VkSpecializationInfo*			pSpecializationInfo;
5579091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			}
5589091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
5599091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
5609091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkVertexInputBindingDescription vertexInputBindingDescription =
5619091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
5629091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			0u,										// deUint32					binding;
5639091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			sizeof(Vertex4RGBA),					// deUint32					strideInBytes;
564120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_VERTEX_INPUT_RATE_VERTEX				// VkVertexInputStepRate	inputRate;
5659091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
5669091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
5679091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkVertexInputAttributeDescription vertexInputAttributeDescriptions[2] =
5689091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
5699091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			{
5709091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim				0u,									// deUint32	location;
5719091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim				0u,									// deUint32	binding;
5729091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim				VK_FORMAT_R32G32B32A32_SFLOAT,		// VkFormat	format;
5739091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim				0u									// deUint32	offsetInBytes;
5749091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			},
5759091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			{
5769091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim				1u,									// deUint32	location;
5779091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim				0u,									// deUint32	binding;
5789091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim				VK_FORMAT_R32G32B32A32_SFLOAT,		// VkFormat	format;
5799091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim				DE_OFFSET_OF(Vertex4RGBA, color),	// deUint32	offsetInBytes;
5809091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			}
5819091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
5829091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
5839091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkPipelineVertexInputStateCreateInfo vertexInputStateParams =
5849091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
5859091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO,		// VkStructureType							sType;
5869091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			DE_NULL,														// const void*								pNext;
587120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,																// VkPipelineVertexInputStateCreateFlags	flags;
588120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			1u,																// deUint32									vertexBindingDescriptionCount;
5899091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			&vertexInputBindingDescription,									// const VkVertexInputBindingDescription*	pVertexBindingDescriptions;
590120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			2u,																// deUint32									vertexAttributeDescriptionCount;
5919091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			vertexInputAttributeDescriptions								// const VkVertexInputAttributeDescription*	pVertexAttributeDescriptions;
5929091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
5939091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
5949091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkPipelineInputAssemblyStateCreateInfo inputAssemblyStateParams =
5959091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
596120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,	// VkStructureType							sType;
597120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			DE_NULL,														// const void*								pNext;
598120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,																// VkPipelineInputAssemblyStateCreateFlags	flags;
599120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST,							// VkPrimitiveTopology						topology;
600120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			false															// VkBool32									primitiveRestartEnable;
6019091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
6029091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
6039091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkViewport viewport =
6049091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
605120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0.0f,						// float	x;
606120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0.0f,						// float	y;
6079091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			(float)m_renderSize.x(),	// float	width;
6089091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			(float)m_renderSize.y(),	// float	height;
6099091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			0.0f,						// float	minDepth;
6109091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			1.0f						// float	maxDepth;
6119091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
6129091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
6139091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkRect2D scissor = { { 0, 0 }, { m_renderSize.x(), m_renderSize.y() } };
6149091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
6159091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkPipelineViewportStateCreateInfo viewportStateParams =
6169091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
617120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO,			// VkStructureType						sType;
618120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			DE_NULL,														// const void*							pNext;
619120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,																// VkPipelineViewportStateCreateFlags	flags;
620120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			1u,																// deUint32								viewportCount;
621120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			&viewport,														// const VkViewport*					pViewports;
622120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			1u,																// deUint32								scissorCount;
623120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			&scissor,														// const VkRect2D*						pScissors;
6249091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
6259091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
626120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		const VkPipelineRasterizationStateCreateInfo rasterStateParams =
6279091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
628120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO,		// VkStructureType							sType;
629120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			DE_NULL,														// const void*								pNext;
630120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,																// VkPipelineRasterizationStateCreateFlags	flags;
631120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			false,															// VkBool32									depthClampEnable;
632120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			false,															// VkBool32									rasterizerDiscardEnable;
633120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_POLYGON_MODE_FILL,											// VkPolygonMode							polygonMode;
634120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_CULL_MODE_NONE,												// VkCullModeFlags							cullMode;
635120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_FRONT_FACE_COUNTER_CLOCKWISE,								// VkFrontFace								frontFace;
636120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			false,															// VkBool32									depthBiasEnable;
637120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0.0f,															// float									depthBiasConstantFactor;
638120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0.0f,															// float									depthBiasClamp;
639120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0.0f,															// float									depthBiasSlopeFactor;
640120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			1.0f															// float									lineWidth;
6419091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
6429091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
6439091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkPipelineColorBlendAttachmentState colorBlendAttachmentState =
6449091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
645120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			false,															// VkBool32					blendEnable;
646120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_BLEND_FACTOR_ONE,											// VkBlendFactor			srcColorBlendFactor;
647120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_BLEND_FACTOR_ZERO,											// VkBlendFactor			dstColorBlendFactor;
648120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_BLEND_OP_ADD,												// VkBlendOp				colorBlendOp;
649120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_BLEND_FACTOR_ONE,											// VKBLENDFACTOR			SRCALPHABLENDFACTOR;
650120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_BLEND_FACTOR_ZERO,											// VkBlendFactor			dstAlphaBlendFactor;
651120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_BLEND_OP_ADD,												// VkBlendOp				alphaBlendOp;
652120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT |			// VkColorComponentFlags	colorWriteMask;
653120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT
6549091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
6559091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
6569091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkPipelineColorBlendStateCreateInfo colorBlendStateParams =
6579091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
6589091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO,	// VkStructureType								sType;
6599091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			DE_NULL,													// const void*									pNext;
660120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,															// VkPipelineColorBlendStateCreateFlags			flags;
6619091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			false,														// VkBool32										logicOpEnable;
6629091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			VK_LOGIC_OP_COPY,											// VkLogicOp									logicOp;
6639091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			1u,															// deUint32										attachmentCount;
6649091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			&colorBlendAttachmentState,									// const VkPipelineColorBlendAttachmentState*	pAttachments;
665120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			{ 0.0f, 0.0f, 0.0f, 0.0f }									// float										blendConstants[4];
6669091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
6679091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
6689091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkPipelineMultisampleStateCreateInfo multisampleStateParams =
6699091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
670120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO,	// VkStructureType							sType;
671120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			DE_NULL,													// const void*								pNext;
672120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,															// VkPipelineMultisampleStateCreateFlags	flags;
673120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_SAMPLE_COUNT_1_BIT,										// VkSampleCountFlagBits					rasterizationSamples;
674120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			false,														// VkBool32									sampleShadingEnable;
675120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0.0f,														// float									minSampleShading;
676120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			DE_NULL,													// const VkSampleMask*						pSampleMask;
677120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			false,														// VkBool32									alphaToCoverageEnable;
678120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			false														// VkBool32									alphaToOneEnable;
6799091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
6809091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
6819091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const bool isDepthEnabled = (vk::mapVkFormat(m_stencilFormat).order != tcu::TextureFormat::S);
6829091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
6839091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		VkPipelineDepthStencilStateCreateInfo depthStencilStateParams =
6849091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
685120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO,	// VkStructureType							sType;
686120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			DE_NULL,													// const void*								pNext;
687120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,															// VkPipelineDepthStencilStateCreateFlags	flags;
688120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			isDepthEnabled,												// VkBool32									depthTestEnable;
689120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			isDepthEnabled,												// VkBool32									depthWriteEnable;
690120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_COMPARE_OP_LESS,											// VkCompareOp								depthCompareOp;
691120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			false,														// VkBool32									depthBoundsTestEnable;
692120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			true,														// VkBool32									stencilTestEnable;
693120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			m_stencilOpStateFront,										// VkStencilOpState							front;
694120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			m_stencilOpStateBack,										// VkStencilOpState							back;
6951d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski			0.0f,														// float									minDepthBounds;
6961d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski			1.0f														// float									maxDepthBounds;
6979091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
6989091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
6999091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkGraphicsPipelineCreateInfo graphicsPipelineParams =
7009091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
7019091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,	// VkStructureType									sType;
7029091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			DE_NULL,											// const void*										pNext;
703120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,													// VkPipelineCreateFlags							flags;
7049091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			2u,													// deUint32											stageCount;
705120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			shaderStages,										// const VkPipelineShaderStageCreateInfo*			pStages;
7069091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			&vertexInputStateParams,							// const VkPipelineVertexInputStateCreateInfo*		pVertexInputState;
7079091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			&inputAssemblyStateParams,							// const VkPipelineInputAssemblyStateCreateInfo*	pInputAssemblyState;
7089091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			DE_NULL,											// const VkPipelineTessellationStateCreateInfo*		pTessellationState;
7099091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			&viewportStateParams,								// const VkPipelineViewportStateCreateInfo*			pViewportState;
710120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			&rasterStateParams,									// const VkPipelineRasterizationStateCreateInfo*	pRasterizationState;
7119091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			&multisampleStateParams,							// const VkPipelineMultisampleStateCreateInfo*		pMultisampleState;
7129091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			&depthStencilStateParams,							// const VkPipelineDepthStencilStateCreateInfo*		pDepthStencilState;
7139091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			&colorBlendStateParams,								// const VkPipelineColorBlendStateCreateInfo*		pColorBlendState;
71486a8ae9e0d61bbfe1f1e273fdbb026369bdb5f29Pyry Haulos			(const VkPipelineDynamicStateCreateInfo*)DE_NULL,	// const VkPipelineDynamicStateCreateInfo*			pDynamicState;
7159091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			*m_pipelineLayout,									// VkPipelineLayout									layout;
7169091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			*m_renderPass,										// VkRenderPass										renderPass;
7179091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			0u,													// deUint32											subpass;
7189091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			0u,													// VkPipeline										basePipelineHandle;
7199091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			0u													// deInt32											basePipelineIndex;
7209091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
7219091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
7229091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		// Setup different stencil masks and refs in each quad
7239091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		for (int quadNdx = 0; quadNdx < StencilTest::QUAD_COUNT; quadNdx++)
7249091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
7259091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			const StencilTest::StencilStateConfig&	config	= StencilTest::s_stencilStateConfigs[quadNdx];
7269091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			VkStencilOpState&						front	= depthStencilStateParams.front;
7279091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			VkStencilOpState&						back	= depthStencilStateParams.back;
7289091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
729120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			front.compareMask	= config.frontReadMask;
730120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			front.writeMask		= config.frontWriteMask;
731120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			front.reference		= config.frontRef;
7329091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
733120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			back.compareMask	= config.backReadMask;
734120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			back.writeMask		= config.backWriteMask;
735120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			back.reference		= config.backRef;
7369091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
7379091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			m_graphicsPipelines[quadNdx] = createGraphicsPipeline(vk, vkDevice, DE_NULL, &graphicsPipelineParams);
7389091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		}
7399091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	}
7409091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
7419091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
7429091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	// Create vertex buffer
7439091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	{
7449091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkBufferCreateInfo vertexBufferParams =
7459091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
7469091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,		// VkStructureType		sType;
7479091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			DE_NULL,									// const void*			pNext;
748120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,											// VkBufferCreateFlags	flags;
7499091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			1024u,										// VkDeviceSize			size;
7509091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			VK_BUFFER_USAGE_VERTEX_BUFFER_BIT,			// VkBufferUsageFlags	usage;
7519091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			VK_SHARING_MODE_EXCLUSIVE,					// VkSharingMode		sharingMode;
752120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			1u,											// deUint32				queueFamilyIndexCount;
7539091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			&queueFamilyIndex							// const deUint32*		pQueueFamilyIndices;
7549091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
7559091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
7569091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		m_vertices			= createOverlappingQuads();
7579091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		m_vertexBuffer		= createBuffer(vk, vkDevice, &vertexBufferParams);
7589091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		m_vertexBufferAlloc	= memAlloc.allocate(getBufferMemoryRequirements(vk, vkDevice, *m_vertexBuffer), MemoryRequirement::HostVisible);
7599091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
7609091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		VK_CHECK(vk.bindBufferMemory(vkDevice, *m_vertexBuffer, m_vertexBufferAlloc->getMemory(), m_vertexBufferAlloc->getOffset()));
7619091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
7629091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		// Adjust depths
7639091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		for (int quadNdx = 0; quadNdx < 4; quadNdx++)
7649091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			for (int vertexNdx = 0; vertexNdx < 6; vertexNdx++)
7659091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim				m_vertices[quadNdx * 6 + vertexNdx].position.z() = StencilTest::s_quadDepths[quadNdx];
7669091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
7679091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		// Load vertices into vertex buffer
7689091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		deMemcpy(m_vertexBufferAlloc->getHostPtr(), m_vertices.data(), m_vertices.size() * sizeof(Vertex4RGBA));
7699091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
7709091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkMappedMemoryRange flushRange =
7719091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
7729091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim				VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE,	// VkStructureType	sType;
7739091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim				DE_NULL,								// const void*		pNext;
774120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				m_vertexBufferAlloc->getMemory(),		// VkDeviceMemory	memory;
7759091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim				m_vertexBufferAlloc->getOffset(),		// VkDeviceSize		offset;
7769091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim				vertexBufferParams.size					// VkDeviceSize		size;
7779091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
7789091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
7799091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		vk.flushMappedMemoryRanges(vkDevice, 1, &flushRange);
7809091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	}
7819091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
7829091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	// Create command pool
783da03200a87f51bed33b3c3030ecbb6df06ff4f60Mika Isojärvi	m_cmdPool = createCommandPool(vk, vkDevice, VK_COMMAND_POOL_CREATE_TRANSIENT_BIT, queueFamilyIndex);
7849091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
7859091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	// Create command buffer
7869091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	{
787120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		const VkCommandBufferBeginInfo cmdBufferBeginInfo =
7889091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
789120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,	// VkStructureType					sType;
790120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			DE_NULL,										// const void*						pNext;
791120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim			0u,												// VkCommandBufferUsageFlags		flags;
792689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos			(const VkCommandBufferInheritanceInfo*)DE_NULL,
7939091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
7949091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
7959091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkClearValue attachmentClearValues[2] =
7969091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
7979091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			defaultClearValue(m_colorFormat),
7989091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			defaultClearValue(m_stencilFormat)
7999091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
8009091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
8019091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkRenderPassBeginInfo renderPassBeginInfo =
8029091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
8039091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,				// VkStructureType		sType;
8049091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			DE_NULL,												// const void*			pNext;
8059091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			*m_renderPass,											// VkRenderPass			renderPass;
8069091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			*m_framebuffer,											// VkFramebuffer		framebuffer;
8079091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			{ { 0, 0 } , { m_renderSize.x(), m_renderSize.y() } },	// VkRect2D				renderArea;
8089091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			2,														// deUint32				clearValueCount;
8099091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			attachmentClearValues									// const VkClearValue*	pClearValues;
8109091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		};
8119091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
8121d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski		const VkImageMemoryBarrier imageLayoutBarriers[] =
8131d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski		{
8141d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski			// color image layout transition
8151d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski			{
8161d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski				VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,									// VkStructureType            sType;
8171d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski				DE_NULL,																// const void*                pNext;
8181d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski				(VkAccessFlags)0,														// VkAccessFlags              srcAccessMask;
8191d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski				VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,									// VkAccessFlags              dstAccessMask;
8201d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski				VK_IMAGE_LAYOUT_UNDEFINED,												// VkImageLayout              oldLayout;
8211d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski				VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,								// VkImageLayout              newLayout;
8221d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski				VK_QUEUE_FAMILY_IGNORED,												// uint32_t                   srcQueueFamilyIndex;
8231d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski				VK_QUEUE_FAMILY_IGNORED,												// uint32_t                   dstQueueFamilyIndex;
8241d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski				*m_colorImage,															// VkImage                    image;
8251d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski				{ VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u }							// VkImageSubresourceRange    subresourceRange;
8261d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski			},
8271d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski			// stencil image layout transition
8281d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski			{
8291d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski				VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,									// VkStructureType            sType;
8301d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski				DE_NULL,																// const void*                pNext;
8311d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski				(VkAccessFlags)0,														// VkAccessFlags              srcAccessMask;
8321d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski				VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT,							// VkAccessFlags              dstAccessMask;
8331d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski				VK_IMAGE_LAYOUT_UNDEFINED,												// VkImageLayout              oldLayout;
8341d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski				VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,						// VkImageLayout              newLayout;
8351d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski				VK_QUEUE_FAMILY_IGNORED,												// uint32_t                   srcQueueFamilyIndex;
8361d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski				VK_QUEUE_FAMILY_IGNORED,												// uint32_t                   dstQueueFamilyIndex;
8371d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski				*m_stencilImage,														// VkImage                    image;
8381d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski				m_stencilImageSubresourceRange,											// VkImageSubresourceRange    subresourceRange;
8391d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski			},
8401d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski		};
8411d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski
842da03200a87f51bed33b3c3030ecbb6df06ff4f60Mika Isojärvi		m_cmdBuffer = allocateCommandBuffer(vk, vkDevice, *m_cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY);
8439091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
8449091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		VK_CHECK(vk.beginCommandBuffer(*m_cmdBuffer, &cmdBufferBeginInfo));
8451d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski
8461d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski		vk.cmdPipelineBarrier(*m_cmdBuffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, (VkDependencyFlags)0,
8471d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski			0u, DE_NULL, 0u, DE_NULL, DE_LENGTH_OF_ARRAY(imageLayoutBarriers), imageLayoutBarriers);
8481d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski
849120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		vk.cmdBeginRenderPass(*m_cmdBuffer, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
8509091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
8519091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkDeviceSize		quadOffset		= (m_vertices.size() / StencilTest::QUAD_COUNT) * sizeof(Vertex4RGBA);
8529091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
8539091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		for (int quadNdx = 0; quadNdx < StencilTest::QUAD_COUNT; quadNdx++)
8549091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
8559091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			VkDeviceSize vertexBufferOffset = quadOffset * quadNdx;
8569091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
8579091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			vk.cmdBindPipeline(*m_cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *m_graphicsPipelines[quadNdx]);
8589091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			vk.cmdBindVertexBuffers(*m_cmdBuffer, 0, 1, &m_vertexBuffer.get(), &vertexBufferOffset);
8599091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			vk.cmdDraw(*m_cmdBuffer, (deUint32)(m_vertices.size() / StencilTest::QUAD_COUNT), 1, 0, 0);
8609091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		}
8619091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
8629091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		vk.cmdEndRenderPass(*m_cmdBuffer);
8639091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
8649091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	}
8659091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
8669091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	// Create fence
867da03200a87f51bed33b3c3030ecbb6df06ff4f60Mika Isojärvi	m_fence = createFence(vk, vkDevice);
8689091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim}
8699091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
8709091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae KimStencilTestInstance::~StencilTestInstance (void)
8719091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{
8729091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim}
8739091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
8749091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimtcu::TestStatus StencilTestInstance::iterate (void)
8759091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{
8769091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	const DeviceInterface&		vk			= m_context.getDeviceInterface();
8779091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	const VkDevice				vkDevice	= m_context.getDevice();
8789091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	const VkQueue				queue		= m_context.getUniversalQueue();
879120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	const VkSubmitInfo			submitInfo	=
880120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	{
881120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		VK_STRUCTURE_TYPE_SUBMIT_INFO,	// VkStructureType			sType;
882120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		DE_NULL,						// const void*				pNext;
883120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		0u,								// deUint32					waitSemaphoreCount;
884120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		DE_NULL,						// const VkSemaphore*		pWaitSemaphores;
885689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos		(const VkPipelineStageFlags*)DE_NULL,
886120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		1u,								// deUint32					commandBufferCount;
887120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		&m_cmdBuffer.get(),				// const VkCommandBuffer*	pCommandBuffers;
888120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		0u,								// deUint32					signalSemaphoreCount;
889120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		DE_NULL							// const VkSemaphore*		pSignalSemaphores;
890120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	};
8919091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
8929091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	VK_CHECK(vk.resetFences(vkDevice, 1, &m_fence.get()));
893120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	VK_CHECK(vk.queueSubmit(queue, 1, &submitInfo, *m_fence));
8949091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	VK_CHECK(vk.waitForFences(vkDevice, 1, &m_fence.get(), true, ~(0ull) /* infinity*/));
8959091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
8969091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	return verifyImage();
8979091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim}
8989091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
8999091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimtcu::TestStatus StencilTestInstance::verifyImage (void)
9009091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{
9019091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	const tcu::TextureFormat	tcuColorFormat		= mapVkFormat(m_colorFormat);
9029091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	const tcu::TextureFormat	tcuStencilFormat	= mapVkFormat(m_stencilFormat);
9039091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	const ColorVertexShader		vertexShader;
9049091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	const ColorFragmentShader	fragmentShader		(tcuColorFormat, tcuStencilFormat);
9059091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	const rr::Program			program				(&vertexShader, &fragmentShader);
9069091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	ReferenceRenderer			refRenderer			(m_renderSize.x(), m_renderSize.y(), 1, tcuColorFormat, tcuStencilFormat, &program);
9079091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	bool						compareOk			= false;
9089091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
9099091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	// Render reference image
9109091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	{
9119091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		// Set depth state
9129091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		rr::RenderState renderState(refRenderer.getViewportState());
9139091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
9149091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		renderState.fragOps.depthTestEnabled	= true;
9159091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		renderState.fragOps.depthFunc			= mapVkCompareOp(VK_COMPARE_OP_LESS);
9169091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		renderState.fragOps.stencilTestEnabled	= true;
9179091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
9189091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		rr::StencilState& refStencilFront	= renderState.fragOps.stencilStates[rr::FACETYPE_FRONT];
9199091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		rr::StencilState& refStencilBack	= renderState.fragOps.stencilStates[rr::FACETYPE_BACK];
9209091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
921120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		refStencilFront.sFail		= mapVkStencilOp(m_stencilOpStateFront.failOp);
922120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		refStencilFront.dpFail		= mapVkStencilOp(m_stencilOpStateFront.depthFailOp);
923120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		refStencilFront.dpPass		= mapVkStencilOp(m_stencilOpStateFront.passOp);
924120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		refStencilFront.func		= mapVkCompareOp(m_stencilOpStateFront.compareOp);
9259091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
926120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		refStencilBack.sFail		= mapVkStencilOp(m_stencilOpStateBack.failOp);
927120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		refStencilBack.dpPass		= mapVkStencilOp(m_stencilOpStateBack.passOp);
9280fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi		refStencilBack.dpFail		= mapVkStencilOp(m_stencilOpStateBack.depthFailOp);
929120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		refStencilBack.func			= mapVkCompareOp(m_stencilOpStateBack.compareOp);
9309091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
9319091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		// Reverse winding of vertices, as Vulkan screen coordinates start at upper left
9329091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		std::vector<Vertex4RGBA> cwVertices(m_vertices);
9339091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		for (size_t vertexNdx = 0; vertexNdx < cwVertices.size() - 2; vertexNdx += 3)
9349091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
9359091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			const Vertex4RGBA cwVertex1	= cwVertices[vertexNdx + 1];
9369091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
9379091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			cwVertices[vertexNdx + 1]	= cwVertices[vertexNdx + 2];
9389091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			cwVertices[vertexNdx + 2]	= cwVertex1;
9399091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		}
9409091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
9419091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		for (int quadNdx = 0; quadNdx < StencilTest::QUAD_COUNT; quadNdx++)
9429091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
9439091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			refStencilFront.ref			= (int)StencilTest::s_stencilStateConfigs[quadNdx].frontRef;
9449091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			refStencilFront.compMask	= StencilTest::s_stencilStateConfigs[quadNdx].frontReadMask;
9459091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			refStencilFront.writeMask	= StencilTest::s_stencilStateConfigs[quadNdx].frontWriteMask;
9469091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
9479091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			refStencilBack.ref			= (int)StencilTest::s_stencilStateConfigs[quadNdx].backRef;
9489091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			refStencilBack.compMask		= StencilTest::s_stencilStateConfigs[quadNdx].backReadMask;
9499091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			refStencilBack.writeMask	= StencilTest::s_stencilStateConfigs[quadNdx].backWriteMask;
9509091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
9519091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			refRenderer.draw(renderState,
9529091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim							 rr::PRIMITIVETYPE_TRIANGLES,
9539091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim							 std::vector<Vertex4RGBA>(cwVertices.begin() + quadNdx * 6,
9549091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim													  cwVertices.begin() + (quadNdx + 1) * 6));
9559091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		}
9569091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	}
9579091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
9589091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	// Compare result with reference image
9599091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	{
9609091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const DeviceInterface&				vk					= m_context.getDeviceInterface();
9619091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkDevice						vkDevice			= m_context.getDevice();
9629091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkQueue						queue				= m_context.getUniversalQueue();
9639091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const deUint32						queueFamilyIndex	= m_context.getUniversalQueueFamilyIndex();
9649091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		SimpleAllocator						allocator			(vk, vkDevice, getPhysicalDeviceMemoryProperties(m_context.getInstanceInterface(), m_context.getPhysicalDevice()));
9659091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		de::UniquePtr<tcu::TextureLevel>	result				(readColorAttachment(vk, vkDevice, queue, queueFamilyIndex, allocator, *m_colorImage, m_colorFormat, m_renderSize).release());
9669091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
9679091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		compareOk = tcu::intThresholdPositionDeviationCompare(m_context.getTestContext().getLog(),
9689091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim															  "IntImageCompare",
9699091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim															  "Image comparison",
9709091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim															  refRenderer.getAccess(),
9719091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim															  result->getAccess(),
9729091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim															  tcu::UVec4(2, 2, 2, 2),
9739091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim															  tcu::IVec3(1, 1, 0),
9749091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim															  true,
9759091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim															  tcu::COMPARE_LOG_RESULT);
9769091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	}
9779091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
9789091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	if (compareOk)
9799091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		return tcu::TestStatus::pass("Result image matches reference");
9809091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	else
9819091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		return tcu::TestStatus::fail("Image mismatch");
9829091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim}
9839091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
9849091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
9859091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim// Utilities for test names
9869091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
9879091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimstd::string getShortName (VkCompareOp compareOp)
9889091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{
9899091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	const std::string  fullName = getCompareOpName(compareOp);
9909091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
9919091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	DE_ASSERT(de::beginsWith(fullName, "VK_COMPARE_OP_"));
9929091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
9939091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	return de::toLower(fullName.substr(14));
9949091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim}
9959091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
9969091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimconst char* getShortName (VkStencilOp stencilOp)
9979091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{
9989091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	switch (stencilOp)
9999091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	{
1000120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		case VK_STENCIL_OP_KEEP:					return "keep";
1001120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		case VK_STENCIL_OP_ZERO:					return "zero";
1002120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		case VK_STENCIL_OP_REPLACE:					return "repl";
1003120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		case VK_STENCIL_OP_INCREMENT_AND_CLAMP:		return "incc";
1004120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		case VK_STENCIL_OP_DECREMENT_AND_CLAMP:		return "decc";
1005120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		case VK_STENCIL_OP_INVERT:					return "inv";
1006120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		case VK_STENCIL_OP_INCREMENT_AND_WRAP:		return "wrap";
1007120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		case VK_STENCIL_OP_DECREMENT_AND_WRAP:		return "decw";
10089091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
10099091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		default:
10109091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			DE_FATAL("Invalid VkStencilOpState value");
10119091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	}
10129091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	return DE_NULL;
10139091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim}
10149091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
10159091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimstd::string getStencilStateSetDescription(const VkStencilOpState& stencilOpStateFront,
10169091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim										  const VkStencilOpState& stencilOpStateBack)
10179091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{
10189091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	std::ostringstream desc;
10199091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
10209091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	desc << "\nFront faces:\n" << stencilOpStateFront;
10219091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	desc << "Back faces:\n" << stencilOpStateBack;
10229091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
10239091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	return desc.str();
10249091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim}
10259091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
10269091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimstd::string getFormatCaseName (VkFormat format)
10279091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{
10289091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	const std::string fullName = getFormatName(format);
10299091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
10309091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	DE_ASSERT(de::beginsWith(fullName, "VK_FORMAT_"));
10319091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
10329091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	return de::toLower(fullName.substr(10));
10339091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim}
10349091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
10359091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim} // anonymous
10369091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
10379091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimtcu::TestCaseGroup* createStencilTests (tcu::TestContext& testCtx)
10389091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{
10399091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	const VkFormat stencilFormats[] =
10409091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	{
10419091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		VK_FORMAT_S8_UINT,
10429091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		VK_FORMAT_D16_UNORM_S8_UINT,
10439091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		VK_FORMAT_D24_UNORM_S8_UINT,
10449091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		VK_FORMAT_D32_SFLOAT_S8_UINT
10459091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	};
10469091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
10479091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	de::MovePtr<tcu::TestCaseGroup>		stencilTests	(new tcu::TestCaseGroup(testCtx, "stencil", "Stencil tests"));
10489091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	de::MovePtr<tcu::TestCaseGroup>		formatTests		(new tcu::TestCaseGroup(testCtx, "format", "Uses different stencil formats"));
10499091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	StencilOpStateUniqueRandomIterator	stencilOpItr	(123);
10509091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
10519091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	for (size_t formatNdx = 0; formatNdx < DE_LENGTH_OF_ARRAY(stencilFormats); formatNdx++)
10529091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	{
10539091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		const VkFormat					stencilFormat	= stencilFormats[formatNdx];
10549091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		de::MovePtr<tcu::TestCaseGroup>	formatTest		(new tcu::TestCaseGroup(testCtx,
10559091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim																				getFormatCaseName(stencilFormat).c_str(),
10569091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim																				(std::string("Uses format ") + getFormatName(stencilFormat)).c_str()));
10579091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
10589091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		de::MovePtr<tcu::TestCaseGroup>	stencilStateTests;
10599091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
10609091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			std::ostringstream desc;
10619091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			desc << "Draws 4 quads with the following depths and dynamic stencil states: ";
10629091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			for (int quadNdx = 0; quadNdx < StencilTest::QUAD_COUNT; quadNdx++)
10639091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			{
10649091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim				const StencilTest::StencilStateConfig& stencilConfig = StencilTest::s_stencilStateConfigs[quadNdx];
10659091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
10669091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim				desc << "(" << quadNdx << ") "
10679091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim					 << "z = " << StencilTest::s_quadDepths[quadNdx] << ", "
10689091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim					 << "frontReadMask = " << stencilConfig.frontReadMask << ", "
10699091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim					 << "frontWriteMask = " << stencilConfig.frontWriteMask << ", "
10709091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim					 << "frontRef = " << stencilConfig.frontRef << ", "
10719091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim					 << "backReadMask = " << stencilConfig.backReadMask << ", "
10729091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim					 << "backWriteMask = " << stencilConfig.backWriteMask << ", "
10739091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim					 << "backRef = " << stencilConfig.backRef;
10749091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			}
10759091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
10769091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim			stencilStateTests = de::MovePtr<tcu::TestCaseGroup>(new tcu::TestCaseGroup(testCtx, "states", desc.str().c_str()));
10779091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		}
10789091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
10799091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		stencilOpItr.reset();
10809091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
10810fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi		for (deUint32 failOpNdx = 0u; failOpNdx < DE_LENGTH_OF_ARRAY(stencilOps); failOpNdx++)
10829091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		{
10830fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi			const std::string				failOpName	= std::string("fail_") + getShortName(stencilOps[failOpNdx]);
10840fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi			de::MovePtr<tcu::TestCaseGroup>	failOpTest	(new tcu::TestCaseGroup(testCtx, failOpName.c_str(), ""));
10859091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
10860fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi			for (deUint32 passOpNdx = 0u; passOpNdx < DE_LENGTH_OF_ARRAY(stencilOps); passOpNdx++)
10870fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi			{
10880fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi				const std::string				passOpName	= std::string("pass_") + getShortName(stencilOps[passOpNdx]);
10890fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi				de::MovePtr<tcu::TestCaseGroup>	passOpTest	(new tcu::TestCaseGroup(testCtx, passOpName.c_str(), ""));
10900fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi
10910fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi				for (deUint32 dFailOpNdx = 0u; dFailOpNdx < DE_LENGTH_OF_ARRAY(stencilOps); dFailOpNdx++)
10920fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi				{
10930fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi					const std::string				dFailOpName	= std::string("dfail_") + getShortName(stencilOps[dFailOpNdx]);
10940fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi					de::MovePtr<tcu::TestCaseGroup>	dFailOpTest	(new tcu::TestCaseGroup(testCtx, dFailOpName.c_str(), ""));
10950fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi
10960fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi					for (deUint32 compareOpNdx = 0u; compareOpNdx < DE_LENGTH_OF_ARRAY(compareOps); compareOpNdx++)
10970fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi					{
10980fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi						// Iterate front set of stencil state in ascending order
10990fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi						const VkStencilOpState	stencilStateFront	=
11000fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi						{
11010fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi							stencilOps[failOpNdx],		// failOp
11020fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi							stencilOps[passOpNdx],		// passOp
11030fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi							stencilOps[dFailOpNdx],		// depthFailOp
11040fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi							compareOps[compareOpNdx],	// compareOp
11050fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi							0x0,						// compareMask
11060fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi							0x0,						// writeMask
11070fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi							0x0							// reference
11080fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi						};
11090fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi
11100fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi						// Iterate back set of stencil state in random order
11110fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi						const VkStencilOpState	stencilStateBack	= stencilOpItr.next();
11120fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi						const std::string		caseName			= std::string("comp_") + getShortName(compareOps[compareOpNdx]);
11130fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi						const std::string		caseDesc			= getStencilStateSetDescription(stencilStateFront, stencilStateBack);
11140fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi
11150fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi						dFailOpTest->addChild(new StencilTest(testCtx, caseName, caseDesc, stencilFormat, stencilStateFront, stencilStateBack));
11160fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi					}
11170fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi					passOpTest->addChild(dFailOpTest.release());
11180fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi				}
11190fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi				failOpTest->addChild(passOpTest.release());
11200fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi			}
11210fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi			stencilStateTests->addChild(failOpTest.release());
11229091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		}
11239091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
11249091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		formatTest->addChild(stencilStateTests.release());
11259091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim		formatTests->addChild(formatTest.release());
11269091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	}
11279091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	stencilTests->addChild(formatTests.release());
11289091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
11299091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim	return stencilTests.release();
11309091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim}
11319091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim
11329091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim} // pipeline
11339091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim} // vkt
1134