14b9229de0ea1993c94c91016ba3f955509753fb0scygan/*------------------------------------------------------------------------
24b9229de0ea1993c94c91016ba3f955509753fb0scygan * Vulkan Conformance Tests
34b9229de0ea1993c94c91016ba3f955509753fb0scygan * ------------------------
44b9229de0ea1993c94c91016ba3f955509753fb0scygan *
54b9229de0ea1993c94c91016ba3f955509753fb0scygan * Copyright (c) 2015 The Khronos Group Inc.
64b9229de0ea1993c94c91016ba3f955509753fb0scygan * Copyright (c) 2015 Intel Corporation
74b9229de0ea1993c94c91016ba3f955509753fb0scygan *
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
114b9229de0ea1993c94c91016ba3f955509753fb0scygan *
12978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos *      http://www.apache.org/licenses/LICENSE-2.0
134b9229de0ea1993c94c91016ba3f955509753fb0scygan *
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.
194b9229de0ea1993c94c91016ba3f955509753fb0scygan *
204b9229de0ea1993c94c91016ba3f955509753fb0scygan *//*!
214b9229de0ea1993c94c91016ba3f955509753fb0scygan * \file
22ae21c307c29a6efa73f3d4f2b25f0dd2c0b0e023Pyry Haulos * \brief Dynamic State Depth Stencil Tests
234b9229de0ea1993c94c91016ba3f955509753fb0scygan *//*--------------------------------------------------------------------*/
244b9229de0ea1993c94c91016ba3f955509753fb0scygan
254b9229de0ea1993c94c91016ba3f955509753fb0scygan#include "vktDynamicStateDSTests.hpp"
264b9229de0ea1993c94c91016ba3f955509753fb0scygan
274b9229de0ea1993c94c91016ba3f955509753fb0scygan#include "vktTestCaseUtil.hpp"
284b9229de0ea1993c94c91016ba3f955509753fb0scygan#include "vktDynamicStateTestCaseUtil.hpp"
294b9229de0ea1993c94c91016ba3f955509753fb0scygan
304b9229de0ea1993c94c91016ba3f955509753fb0scygan#include "tcuTestLog.hpp"
314b9229de0ea1993c94c91016ba3f955509753fb0scygan#include "tcuResource.hpp"
324b9229de0ea1993c94c91016ba3f955509753fb0scygan#include "tcuImageCompare.hpp"
334b9229de0ea1993c94c91016ba3f955509753fb0scygan#include "tcuCommandLine.hpp"
344b9229de0ea1993c94c91016ba3f955509753fb0scygan#include "tcuTextureUtil.hpp"
35db4efd02b79d71e0d0b1122d01d1a20b37760527scygan#include "tcuRGBA.hpp"
364b9229de0ea1993c94c91016ba3f955509753fb0scygan
374b9229de0ea1993c94c91016ba3f955509753fb0scygan#include "vkRefUtil.hpp"
384b9229de0ea1993c94c91016ba3f955509753fb0scygan#include "vkImageUtil.hpp"
394b9229de0ea1993c94c91016ba3f955509753fb0scygan
40456eedb873ee0b778240c067e9ac72529fc444dfPyry Haulos#include "vktDrawCreateInfoUtil.hpp"
41456eedb873ee0b778240c067e9ac72529fc444dfPyry Haulos#include "vktDrawImageObjectUtil.hpp"
42456eedb873ee0b778240c067e9ac72529fc444dfPyry Haulos#include "vktDrawBufferObjectUtil.hpp"
434b9229de0ea1993c94c91016ba3f955509753fb0scygan#include "vkPrograms.hpp"
444b9229de0ea1993c94c91016ba3f955509753fb0scygan
454b9229de0ea1993c94c91016ba3f955509753fb0scygannamespace vkt
464b9229de0ea1993c94c91016ba3f955509753fb0scygan{
474b9229de0ea1993c94c91016ba3f955509753fb0scygannamespace DynamicState
484b9229de0ea1993c94c91016ba3f955509753fb0scygan{
494b9229de0ea1993c94c91016ba3f955509753fb0scygan
50456eedb873ee0b778240c067e9ac72529fc444dfPyry Haulosusing namespace Draw;
51456eedb873ee0b778240c067e9ac72529fc444dfPyry Haulos
524b9229de0ea1993c94c91016ba3f955509753fb0scygannamespace
534b9229de0ea1993c94c91016ba3f955509753fb0scygan{
544b9229de0ea1993c94c91016ba3f955509753fb0scygan
554b9229de0ea1993c94c91016ba3f955509753fb0scyganclass DepthStencilBaseCase : public TestInstance
564b9229de0ea1993c94c91016ba3f955509753fb0scygan{
574b9229de0ea1993c94c91016ba3f955509753fb0scyganpublic:
58db4efd02b79d71e0d0b1122d01d1a20b37760527scygan	DepthStencilBaseCase (Context& context, const char* vertexShaderName, const char* fragmentShaderName)
594b9229de0ea1993c94c91016ba3f955509753fb0scygan		: TestInstance						(context)
604b9229de0ea1993c94c91016ba3f955509753fb0scygan		, m_colorAttachmentFormat			(vk::VK_FORMAT_R8G8B8A8_UNORM)
614b9229de0ea1993c94c91016ba3f955509753fb0scygan		, m_topology						(vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP)
62ae21c307c29a6efa73f3d4f2b25f0dd2c0b0e023Pyry Haulos		, m_vk								(context.getDeviceInterface())
634b9229de0ea1993c94c91016ba3f955509753fb0scygan		, m_vertexShaderName				(vertexShaderName)
644b9229de0ea1993c94c91016ba3f955509753fb0scygan		, m_fragmentShaderName				(fragmentShaderName)
654b9229de0ea1993c94c91016ba3f955509753fb0scygan	{
664b9229de0ea1993c94c91016ba3f955509753fb0scygan	}
674b9229de0ea1993c94c91016ba3f955509753fb0scygan
684b9229de0ea1993c94c91016ba3f955509753fb0scyganprotected:
694b9229de0ea1993c94c91016ba3f955509753fb0scygan
70ae21c307c29a6efa73f3d4f2b25f0dd2c0b0e023Pyry Haulos	enum
714b9229de0ea1993c94c91016ba3f955509753fb0scygan	{
724b9229de0ea1993c94c91016ba3f955509753fb0scygan		WIDTH   = 128,
734b9229de0ea1993c94c91016ba3f955509753fb0scygan		HEIGHT  = 128
744b9229de0ea1993c94c91016ba3f955509753fb0scygan	};
754b9229de0ea1993c94c91016ba3f955509753fb0scygan
764b9229de0ea1993c94c91016ba3f955509753fb0scygan	vk::VkFormat									m_colorAttachmentFormat;
774b9229de0ea1993c94c91016ba3f955509753fb0scygan	vk::VkFormat									m_depthStencilAttachmentFormat;
784b9229de0ea1993c94c91016ba3f955509753fb0scygan
794b9229de0ea1993c94c91016ba3f955509753fb0scygan	vk::VkPrimitiveTopology							m_topology;
804b9229de0ea1993c94c91016ba3f955509753fb0scygan
814b9229de0ea1993c94c91016ba3f955509753fb0scygan	const vk::DeviceInterface&						m_vk;
824b9229de0ea1993c94c91016ba3f955509753fb0scygan
834b9229de0ea1993c94c91016ba3f955509753fb0scygan	vk::Move<vk::VkPipeline>						m_pipeline_1;
844b9229de0ea1993c94c91016ba3f955509753fb0scygan	vk::Move<vk::VkPipeline>						m_pipeline_2;
854b9229de0ea1993c94c91016ba3f955509753fb0scygan	vk::Move<vk::VkPipelineLayout>					m_pipelineLayout;
864b9229de0ea1993c94c91016ba3f955509753fb0scygan
874b9229de0ea1993c94c91016ba3f955509753fb0scygan	de::SharedPtr<Image>							m_colorTargetImage;
884b9229de0ea1993c94c91016ba3f955509753fb0scygan	vk::Move<vk::VkImageView>						m_colorTargetView;
89ae21c307c29a6efa73f3d4f2b25f0dd2c0b0e023Pyry Haulos
904b9229de0ea1993c94c91016ba3f955509753fb0scygan	de::SharedPtr<Image>							m_depthStencilImage;
914b9229de0ea1993c94c91016ba3f955509753fb0scygan	vk::Move<vk::VkImageView>						m_attachmentView;
924b9229de0ea1993c94c91016ba3f955509753fb0scygan
934b9229de0ea1993c94c91016ba3f955509753fb0scygan	PipelineCreateInfo::VertexInputState			m_vertexInputState;
944b9229de0ea1993c94c91016ba3f955509753fb0scygan	de::SharedPtr<Buffer>							m_vertexBuffer;
954b9229de0ea1993c94c91016ba3f955509753fb0scygan
966a2834ac40395173796b6e8d2a8e6c120d86ee74scygan	vk::Move<vk::VkCommandPool>						m_cmdPool;
976a2834ac40395173796b6e8d2a8e6c120d86ee74scygan	vk::Move<vk::VkCommandBuffer>					m_cmdBuffer;
984b9229de0ea1993c94c91016ba3f955509753fb0scygan
994b9229de0ea1993c94c91016ba3f955509753fb0scygan	vk::Move<vk::VkFramebuffer>						m_framebuffer;
1004b9229de0ea1993c94c91016ba3f955509753fb0scygan	vk::Move<vk::VkRenderPass>						m_renderPass;
1014b9229de0ea1993c94c91016ba3f955509753fb0scygan
1024b9229de0ea1993c94c91016ba3f955509753fb0scygan	const std::string								m_vertexShaderName;
1034b9229de0ea1993c94c91016ba3f955509753fb0scygan	const std::string								m_fragmentShaderName;
1044b9229de0ea1993c94c91016ba3f955509753fb0scygan
105db4efd02b79d71e0d0b1122d01d1a20b37760527scygan	std::vector<PositionColorVertex>				m_data;
1064b9229de0ea1993c94c91016ba3f955509753fb0scygan
1076a2834ac40395173796b6e8d2a8e6c120d86ee74scygan	PipelineCreateInfo::DepthStencilState			m_depthStencilState_1;
1086a2834ac40395173796b6e8d2a8e6c120d86ee74scygan	PipelineCreateInfo::DepthStencilState			m_depthStencilState_2;
1094b9229de0ea1993c94c91016ba3f955509753fb0scygan
1104b9229de0ea1993c94c91016ba3f955509753fb0scygan	void initialize (void)
1114b9229de0ea1993c94c91016ba3f955509753fb0scygan	{
1124b9229de0ea1993c94c91016ba3f955509753fb0scygan		const vk::VkDevice device = m_context.getDevice();
1134b9229de0ea1993c94c91016ba3f955509753fb0scygan
11491e51d60e47a7a138ef7189f4aaedb56051e4957asokolow		vk::VkFormatProperties formatProperties;
11591e51d60e47a7a138ef7189f4aaedb56051e4957asokolow		// check for VK_FORMAT_D24_UNORM_S8_UINT support
11691e51d60e47a7a138ef7189f4aaedb56051e4957asokolow		m_context.getInstanceInterface().getPhysicalDeviceFormatProperties(m_context.getPhysicalDevice(), vk::VK_FORMAT_D24_UNORM_S8_UINT, &formatProperties);
11791e51d60e47a7a138ef7189f4aaedb56051e4957asokolow		if (formatProperties.optimalTilingFeatures & vk::VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT)
11891e51d60e47a7a138ef7189f4aaedb56051e4957asokolow		{
11991e51d60e47a7a138ef7189f4aaedb56051e4957asokolow			m_depthStencilAttachmentFormat = vk::VK_FORMAT_D24_UNORM_S8_UINT;
12091e51d60e47a7a138ef7189f4aaedb56051e4957asokolow		}
12191e51d60e47a7a138ef7189f4aaedb56051e4957asokolow		else
12291e51d60e47a7a138ef7189f4aaedb56051e4957asokolow		{
12391e51d60e47a7a138ef7189f4aaedb56051e4957asokolow			// check for VK_FORMAT_D32_SFLOAT_S8_UINT support
12491e51d60e47a7a138ef7189f4aaedb56051e4957asokolow			m_context.getInstanceInterface().getPhysicalDeviceFormatProperties(m_context.getPhysicalDevice(), vk::VK_FORMAT_D32_SFLOAT_S8_UINT, &formatProperties);
12591e51d60e47a7a138ef7189f4aaedb56051e4957asokolow			if (formatProperties.optimalTilingFeatures & vk::VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT)
12691e51d60e47a7a138ef7189f4aaedb56051e4957asokolow			{
12791e51d60e47a7a138ef7189f4aaedb56051e4957asokolow				m_depthStencilAttachmentFormat = vk::VK_FORMAT_D32_SFLOAT_S8_UINT;
12891e51d60e47a7a138ef7189f4aaedb56051e4957asokolow			}
12991e51d60e47a7a138ef7189f4aaedb56051e4957asokolow			else
13091e51d60e47a7a138ef7189f4aaedb56051e4957asokolow				throw tcu::NotSupportedError("No valid depth stencil attachment available");
13191e51d60e47a7a138ef7189f4aaedb56051e4957asokolow		}
13291e51d60e47a7a138ef7189f4aaedb56051e4957asokolow
1334b9229de0ea1993c94c91016ba3f955509753fb0scygan		const PipelineLayoutCreateInfo pipelineLayoutCreateInfo;
1344b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_pipelineLayout = vk::createPipelineLayout(m_vk, device, &pipelineLayoutCreateInfo);
1354b9229de0ea1993c94c91016ba3f955509753fb0scygan
1366a2834ac40395173796b6e8d2a8e6c120d86ee74scygan		const vk::Unique<vk::VkShaderModule> vs(createShaderModule(m_vk, device, m_context.getBinaryCollection().get(m_vertexShaderName), 0));
1376a2834ac40395173796b6e8d2a8e6c120d86ee74scygan		const vk::Unique<vk::VkShaderModule> fs(createShaderModule(m_vk, device, m_context.getBinaryCollection().get(m_fragmentShaderName), 0));
1384b9229de0ea1993c94c91016ba3f955509753fb0scygan
1394b9229de0ea1993c94c91016ba3f955509753fb0scygan		const vk::VkExtent3D imageExtent = { WIDTH, HEIGHT, 1 };
140ae21c307c29a6efa73f3d4f2b25f0dd2c0b0e023Pyry Haulos		const ImageCreateInfo targetImageCreateInfo(vk::VK_IMAGE_TYPE_2D, m_colorAttachmentFormat, imageExtent, 1, 1, vk::VK_SAMPLE_COUNT_1_BIT,
14147dbc69873f0290ea73f1b3b19bb7d5df3a01bf5Joerg Wagner													vk::VK_IMAGE_TILING_OPTIMAL,
14247dbc69873f0290ea73f1b3b19bb7d5df3a01bf5Joerg Wagner													vk::VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
14347dbc69873f0290ea73f1b3b19bb7d5df3a01bf5Joerg Wagner													vk::VK_IMAGE_USAGE_TRANSFER_SRC_BIT |
14447dbc69873f0290ea73f1b3b19bb7d5df3a01bf5Joerg Wagner													vk::VK_IMAGE_USAGE_TRANSFER_DST_BIT);
1454b9229de0ea1993c94c91016ba3f955509753fb0scygan
1466a2834ac40395173796b6e8d2a8e6c120d86ee74scygan		m_colorTargetImage = Image::createAndAlloc(m_vk, device, targetImageCreateInfo, m_context.getDefaultAllocator());
1474b9229de0ea1993c94c91016ba3f955509753fb0scygan
148db4efd02b79d71e0d0b1122d01d1a20b37760527scygan		const ImageCreateInfo depthStencilImageCreateInfo(vk::VK_IMAGE_TYPE_2D, m_depthStencilAttachmentFormat, imageExtent,
149db4efd02b79d71e0d0b1122d01d1a20b37760527scygan														  1, 1, vk::VK_SAMPLE_COUNT_1_BIT, vk::VK_IMAGE_TILING_OPTIMAL,
150c26e05b88da7c86a30f7d9abed2e6c30608f846dJoerg Wagner														  vk::VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT |
151c26e05b88da7c86a30f7d9abed2e6c30608f846dJoerg Wagner														  vk::VK_IMAGE_USAGE_TRANSFER_DST_BIT);
1524b9229de0ea1993c94c91016ba3f955509753fb0scygan
1536a2834ac40395173796b6e8d2a8e6c120d86ee74scygan		m_depthStencilImage = Image::createAndAlloc(m_vk, device, depthStencilImageCreateInfo, m_context.getDefaultAllocator());
1544b9229de0ea1993c94c91016ba3f955509753fb0scygan
1554b9229de0ea1993c94c91016ba3f955509753fb0scygan		const ImageViewCreateInfo colorTargetViewInfo(m_colorTargetImage->object(), vk::VK_IMAGE_VIEW_TYPE_2D, m_colorAttachmentFormat);
1564b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_colorTargetView = vk::createImageView(m_vk, device, &colorTargetViewInfo);
1574b9229de0ea1993c94c91016ba3f955509753fb0scygan
1584b9229de0ea1993c94c91016ba3f955509753fb0scygan		const ImageViewCreateInfo attachmentViewInfo(m_depthStencilImage->object(), vk::VK_IMAGE_VIEW_TYPE_2D, m_depthStencilAttachmentFormat);
1594b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_attachmentView = vk::createImageView(m_vk, device, &attachmentViewInfo);
1604b9229de0ea1993c94c91016ba3f955509753fb0scygan
1614b9229de0ea1993c94c91016ba3f955509753fb0scygan		RenderPassCreateInfo renderPassCreateInfo;
162db4efd02b79d71e0d0b1122d01d1a20b37760527scygan		renderPassCreateInfo.addAttachment(AttachmentDescription(m_colorAttachmentFormat,
163db4efd02b79d71e0d0b1122d01d1a20b37760527scygan																 vk::VK_SAMPLE_COUNT_1_BIT,
164db4efd02b79d71e0d0b1122d01d1a20b37760527scygan																 vk::VK_ATTACHMENT_LOAD_OP_LOAD,
165db4efd02b79d71e0d0b1122d01d1a20b37760527scygan																 vk::VK_ATTACHMENT_STORE_OP_STORE,
166db4efd02b79d71e0d0b1122d01d1a20b37760527scygan																 vk::VK_ATTACHMENT_LOAD_OP_DONT_CARE,
167db4efd02b79d71e0d0b1122d01d1a20b37760527scygan																 vk::VK_ATTACHMENT_STORE_OP_STORE,
168db4efd02b79d71e0d0b1122d01d1a20b37760527scygan																 vk::VK_IMAGE_LAYOUT_GENERAL,
169db4efd02b79d71e0d0b1122d01d1a20b37760527scygan																 vk::VK_IMAGE_LAYOUT_GENERAL));
170db4efd02b79d71e0d0b1122d01d1a20b37760527scygan
171db4efd02b79d71e0d0b1122d01d1a20b37760527scygan		renderPassCreateInfo.addAttachment(AttachmentDescription(m_depthStencilAttachmentFormat,
172db4efd02b79d71e0d0b1122d01d1a20b37760527scygan																 vk::VK_SAMPLE_COUNT_1_BIT,
173db4efd02b79d71e0d0b1122d01d1a20b37760527scygan																 vk::VK_ATTACHMENT_LOAD_OP_LOAD,
174db4efd02b79d71e0d0b1122d01d1a20b37760527scygan																 vk::VK_ATTACHMENT_STORE_OP_STORE,
175c26e05b88da7c86a30f7d9abed2e6c30608f846dJoerg Wagner																 vk::VK_ATTACHMENT_LOAD_OP_LOAD,
176db4efd02b79d71e0d0b1122d01d1a20b37760527scygan																 vk::VK_ATTACHMENT_STORE_OP_STORE,
177db4efd02b79d71e0d0b1122d01d1a20b37760527scygan																 vk::VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
178db4efd02b79d71e0d0b1122d01d1a20b37760527scygan																 vk::VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL));
1794b9229de0ea1993c94c91016ba3f955509753fb0scygan
1804b9229de0ea1993c94c91016ba3f955509753fb0scygan		const vk::VkAttachmentReference colorAttachmentReference =
1814b9229de0ea1993c94c91016ba3f955509753fb0scygan		{
1824b9229de0ea1993c94c91016ba3f955509753fb0scygan			0,
1834b9229de0ea1993c94c91016ba3f955509753fb0scygan			vk::VK_IMAGE_LAYOUT_GENERAL
1844b9229de0ea1993c94c91016ba3f955509753fb0scygan		};
1854b9229de0ea1993c94c91016ba3f955509753fb0scygan
1864b9229de0ea1993c94c91016ba3f955509753fb0scygan		const vk::VkAttachmentReference depthAttachmentReference =
1874b9229de0ea1993c94c91016ba3f955509753fb0scygan		{
1884b9229de0ea1993c94c91016ba3f955509753fb0scygan			1,
1894b9229de0ea1993c94c91016ba3f955509753fb0scygan			vk::VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL
1904b9229de0ea1993c94c91016ba3f955509753fb0scygan		};
1914b9229de0ea1993c94c91016ba3f955509753fb0scygan
1924b9229de0ea1993c94c91016ba3f955509753fb0scygan		renderPassCreateInfo.addSubpass(SubpassDescription(
1934b9229de0ea1993c94c91016ba3f955509753fb0scygan			vk::VK_PIPELINE_BIND_POINT_GRAPHICS,
1946a2834ac40395173796b6e8d2a8e6c120d86ee74scygan			0,
1954b9229de0ea1993c94c91016ba3f955509753fb0scygan			0,
1964b9229de0ea1993c94c91016ba3f955509753fb0scygan			DE_NULL,
1974b9229de0ea1993c94c91016ba3f955509753fb0scygan			1,
1984b9229de0ea1993c94c91016ba3f955509753fb0scygan			&colorAttachmentReference,
1994b9229de0ea1993c94c91016ba3f955509753fb0scygan			DE_NULL,
2004b9229de0ea1993c94c91016ba3f955509753fb0scygan			depthAttachmentReference,
2014b9229de0ea1993c94c91016ba3f955509753fb0scygan			0,
2024b9229de0ea1993c94c91016ba3f955509753fb0scygan			DE_NULL));
2034b9229de0ea1993c94c91016ba3f955509753fb0scygan
2044b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_renderPass = vk::createRenderPass(m_vk, device, &renderPassCreateInfo);
2054b9229de0ea1993c94c91016ba3f955509753fb0scygan
2064b9229de0ea1993c94c91016ba3f955509753fb0scygan		const vk::VkVertexInputBindingDescription vertexInputBindingDescription =
2074b9229de0ea1993c94c91016ba3f955509753fb0scygan		{
2084b9229de0ea1993c94c91016ba3f955509753fb0scygan			0,
209ed4815d8ed2992c78a19e41910fd8ccd0f6bb432Pyry Haulos			(deUint32)sizeof(tcu::Vec4) * 2,
2106a2834ac40395173796b6e8d2a8e6c120d86ee74scygan			vk::VK_VERTEX_INPUT_RATE_VERTEX,
2114b9229de0ea1993c94c91016ba3f955509753fb0scygan		};
2124b9229de0ea1993c94c91016ba3f955509753fb0scygan
2134b9229de0ea1993c94c91016ba3f955509753fb0scygan		const vk::VkVertexInputAttributeDescription vertexInputAttributeDescriptions[2] =
2144b9229de0ea1993c94c91016ba3f955509753fb0scygan		{
2154b9229de0ea1993c94c91016ba3f955509753fb0scygan			{
2164b9229de0ea1993c94c91016ba3f955509753fb0scygan				0u,
2174b9229de0ea1993c94c91016ba3f955509753fb0scygan				0u,
2184b9229de0ea1993c94c91016ba3f955509753fb0scygan				vk::VK_FORMAT_R32G32B32A32_SFLOAT,
2194b9229de0ea1993c94c91016ba3f955509753fb0scygan				0u
2204b9229de0ea1993c94c91016ba3f955509753fb0scygan			},
2214b9229de0ea1993c94c91016ba3f955509753fb0scygan			{
2224b9229de0ea1993c94c91016ba3f955509753fb0scygan				1u,
2234b9229de0ea1993c94c91016ba3f955509753fb0scygan				0u,
2244b9229de0ea1993c94c91016ba3f955509753fb0scygan				vk::VK_FORMAT_R32G32B32A32_SFLOAT,
2254b9229de0ea1993c94c91016ba3f955509753fb0scygan				(deUint32)(sizeof(float)* 4),
2264b9229de0ea1993c94c91016ba3f955509753fb0scygan			}
2274b9229de0ea1993c94c91016ba3f955509753fb0scygan		};
2284b9229de0ea1993c94c91016ba3f955509753fb0scygan
2294b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_vertexInputState = PipelineCreateInfo::VertexInputState(
2304b9229de0ea1993c94c91016ba3f955509753fb0scygan			1,
2314b9229de0ea1993c94c91016ba3f955509753fb0scygan			&vertexInputBindingDescription,
2324b9229de0ea1993c94c91016ba3f955509753fb0scygan			2,
2334b9229de0ea1993c94c91016ba3f955509753fb0scygan			vertexInputAttributeDescriptions);
2344b9229de0ea1993c94c91016ba3f955509753fb0scygan
2354b9229de0ea1993c94c91016ba3f955509753fb0scygan		const PipelineCreateInfo::ColorBlendState::Attachment vkCbAttachmentState;
2364b9229de0ea1993c94c91016ba3f955509753fb0scygan
2374b9229de0ea1993c94c91016ba3f955509753fb0scygan		PipelineCreateInfo pipelineCreateInfo_1(*m_pipelineLayout, *m_renderPass, 0, 0);
2386a2834ac40395173796b6e8d2a8e6c120d86ee74scygan		pipelineCreateInfo_1.addShader(PipelineCreateInfo::PipelineShaderStage(*vs, "main", vk::VK_SHADER_STAGE_VERTEX_BIT));
2396a2834ac40395173796b6e8d2a8e6c120d86ee74scygan		pipelineCreateInfo_1.addShader(PipelineCreateInfo::PipelineShaderStage(*fs, "main", vk::VK_SHADER_STAGE_FRAGMENT_BIT));
2404b9229de0ea1993c94c91016ba3f955509753fb0scygan		pipelineCreateInfo_1.addState(PipelineCreateInfo::VertexInputState(m_vertexInputState));
2414b9229de0ea1993c94c91016ba3f955509753fb0scygan		pipelineCreateInfo_1.addState(PipelineCreateInfo::InputAssemblerState(m_topology));
2424b9229de0ea1993c94c91016ba3f955509753fb0scygan		pipelineCreateInfo_1.addState(PipelineCreateInfo::ColorBlendState(1, &vkCbAttachmentState));
2434b9229de0ea1993c94c91016ba3f955509753fb0scygan		pipelineCreateInfo_1.addState(PipelineCreateInfo::ViewportState(1));
2444b9229de0ea1993c94c91016ba3f955509753fb0scygan		pipelineCreateInfo_1.addState(m_depthStencilState_1);
2454b9229de0ea1993c94c91016ba3f955509753fb0scygan		pipelineCreateInfo_1.addState(PipelineCreateInfo::RasterizerState());
2464b9229de0ea1993c94c91016ba3f955509753fb0scygan		pipelineCreateInfo_1.addState(PipelineCreateInfo::MultiSampleState());
2474b9229de0ea1993c94c91016ba3f955509753fb0scygan		pipelineCreateInfo_1.addState(PipelineCreateInfo::DynamicState());
2484b9229de0ea1993c94c91016ba3f955509753fb0scygan
2494b9229de0ea1993c94c91016ba3f955509753fb0scygan		PipelineCreateInfo pipelineCreateInfo_2(*m_pipelineLayout, *m_renderPass, 0, 0);
2506a2834ac40395173796b6e8d2a8e6c120d86ee74scygan		pipelineCreateInfo_2.addShader(PipelineCreateInfo::PipelineShaderStage(*vs, "main", vk::VK_SHADER_STAGE_VERTEX_BIT));
2516a2834ac40395173796b6e8d2a8e6c120d86ee74scygan		pipelineCreateInfo_2.addShader(PipelineCreateInfo::PipelineShaderStage(*fs, "main", vk::VK_SHADER_STAGE_FRAGMENT_BIT));
2524b9229de0ea1993c94c91016ba3f955509753fb0scygan		pipelineCreateInfo_2.addState(PipelineCreateInfo::VertexInputState(m_vertexInputState));
2534b9229de0ea1993c94c91016ba3f955509753fb0scygan		pipelineCreateInfo_2.addState(PipelineCreateInfo::InputAssemblerState(m_topology));
2544b9229de0ea1993c94c91016ba3f955509753fb0scygan		pipelineCreateInfo_2.addState(PipelineCreateInfo::ColorBlendState(1, &vkCbAttachmentState));
2554b9229de0ea1993c94c91016ba3f955509753fb0scygan		pipelineCreateInfo_2.addState(PipelineCreateInfo::ViewportState(1));
2564b9229de0ea1993c94c91016ba3f955509753fb0scygan		pipelineCreateInfo_2.addState(m_depthStencilState_2);
2574b9229de0ea1993c94c91016ba3f955509753fb0scygan		pipelineCreateInfo_2.addState(PipelineCreateInfo::RasterizerState());
2584b9229de0ea1993c94c91016ba3f955509753fb0scygan		pipelineCreateInfo_2.addState(PipelineCreateInfo::MultiSampleState());
2594b9229de0ea1993c94c91016ba3f955509753fb0scygan		pipelineCreateInfo_2.addState(PipelineCreateInfo::DynamicState());
2604b9229de0ea1993c94c91016ba3f955509753fb0scygan
2614b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_pipeline_1 = vk::createGraphicsPipeline(m_vk, device, DE_NULL, &pipelineCreateInfo_1);
2624b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_pipeline_2 = vk::createGraphicsPipeline(m_vk, device, DE_NULL, &pipelineCreateInfo_2);
2634b9229de0ea1993c94c91016ba3f955509753fb0scygan
2644b9229de0ea1993c94c91016ba3f955509753fb0scygan		std::vector<vk::VkImageView> attachments(2);
2654b9229de0ea1993c94c91016ba3f955509753fb0scygan		attachments[0] = *m_colorTargetView;
2664b9229de0ea1993c94c91016ba3f955509753fb0scygan		attachments[1] = *m_attachmentView;
2674b9229de0ea1993c94c91016ba3f955509753fb0scygan
2684b9229de0ea1993c94c91016ba3f955509753fb0scygan		const FramebufferCreateInfo framebufferCreateInfo(*m_renderPass, attachments, WIDTH, HEIGHT, 1);
2694b9229de0ea1993c94c91016ba3f955509753fb0scygan
2704b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_framebuffer = vk::createFramebuffer(m_vk, device, &framebufferCreateInfo);
2714b9229de0ea1993c94c91016ba3f955509753fb0scygan
272db4efd02b79d71e0d0b1122d01d1a20b37760527scygan		const vk::VkDeviceSize dataSize = m_data.size() * sizeof(PositionColorVertex);
273db4efd02b79d71e0d0b1122d01d1a20b37760527scygan		m_vertexBuffer = Buffer::createAndAlloc(m_vk, device, BufferCreateInfo(dataSize, vk::VK_BUFFER_USAGE_VERTEX_BUFFER_BIT),
274db4efd02b79d71e0d0b1122d01d1a20b37760527scygan												m_context.getDefaultAllocator(), vk::MemoryRequirement::HostVisible);
2754b9229de0ea1993c94c91016ba3f955509753fb0scygan
276db4efd02b79d71e0d0b1122d01d1a20b37760527scygan		deUint8* ptr = reinterpret_cast<unsigned char *>(m_vertexBuffer->getBoundMemory().getHostPtr());
277271724cff305eb9f013d5587ef3f213ed7c9e28bDae Kim		deMemcpy(ptr, &m_data[0], (size_t)dataSize);
2784b9229de0ea1993c94c91016ba3f955509753fb0scygan
2794b9229de0ea1993c94c91016ba3f955509753fb0scygan		vk::flushMappedMemoryRange(m_vk, device,
2804b9229de0ea1993c94c91016ba3f955509753fb0scygan			m_vertexBuffer->getBoundMemory().getMemory(),
2814b9229de0ea1993c94c91016ba3f955509753fb0scygan			m_vertexBuffer->getBoundMemory().getOffset(),
282c4f13c22feb8b9840b0576ba43edba2e9208135aSlawomir Cygan			dataSize);
2834b9229de0ea1993c94c91016ba3f955509753fb0scygan
2844b9229de0ea1993c94c91016ba3f955509753fb0scygan		const CmdPoolCreateInfo cmdPoolCreateInfo(m_context.getUniversalQueueFamilyIndex());
2854b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_cmdPool = vk::createCommandPool(m_vk, device, &cmdPoolCreateInfo);
2864b9229de0ea1993c94c91016ba3f955509753fb0scygan
2876a2834ac40395173796b6e8d2a8e6c120d86ee74scygan		const vk::VkCommandBufferAllocateInfo cmdBufferAllocateInfo =
2886a2834ac40395173796b6e8d2a8e6c120d86ee74scygan		{
2896a2834ac40395173796b6e8d2a8e6c120d86ee74scygan			vk::VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,	// VkStructureType			sType;
2906a2834ac40395173796b6e8d2a8e6c120d86ee74scygan			DE_NULL,											// const void*				pNext;
2916a2834ac40395173796b6e8d2a8e6c120d86ee74scygan			*m_cmdPool,											// VkCommandPool			commandPool;
2926a2834ac40395173796b6e8d2a8e6c120d86ee74scygan			vk::VK_COMMAND_BUFFER_LEVEL_PRIMARY,				// VkCommandBufferLevel		level;
2936a2834ac40395173796b6e8d2a8e6c120d86ee74scygan			1u,													// deUint32					bufferCount;
2946a2834ac40395173796b6e8d2a8e6c120d86ee74scygan		};
2956a2834ac40395173796b6e8d2a8e6c120d86ee74scygan		m_cmdBuffer = vk::allocateCommandBuffer(m_vk, device, &cmdBufferAllocateInfo);
2964b9229de0ea1993c94c91016ba3f955509753fb0scygan	}
2974b9229de0ea1993c94c91016ba3f955509753fb0scygan
2984b9229de0ea1993c94c91016ba3f955509753fb0scygan	virtual tcu::TestStatus iterate (void)
2994b9229de0ea1993c94c91016ba3f955509753fb0scygan	{
300db4efd02b79d71e0d0b1122d01d1a20b37760527scygan		DE_ASSERT(false);
301db4efd02b79d71e0d0b1122d01d1a20b37760527scygan		return tcu::TestStatus::fail("Implement iterate() method!");
3024b9229de0ea1993c94c91016ba3f955509753fb0scygan	}
3034b9229de0ea1993c94c91016ba3f955509753fb0scygan
3044b9229de0ea1993c94c91016ba3f955509753fb0scygan	void beginRenderPass (void)
3054b9229de0ea1993c94c91016ba3f955509753fb0scygan	{
3064b9229de0ea1993c94c91016ba3f955509753fb0scygan		const vk::VkClearColorValue clearColor = { { 0.0f, 0.0f, 0.0f, 1.0f } };
3074b9229de0ea1993c94c91016ba3f955509753fb0scygan		beginRenderPassWithClearColor(clearColor);
3084b9229de0ea1993c94c91016ba3f955509753fb0scygan	}
3094b9229de0ea1993c94c91016ba3f955509753fb0scygan
3104b9229de0ea1993c94c91016ba3f955509753fb0scygan	void beginRenderPassWithClearColor (const vk::VkClearColorValue &clearColor)
3114b9229de0ea1993c94c91016ba3f955509753fb0scygan	{
3124b9229de0ea1993c94c91016ba3f955509753fb0scygan		const CmdBufferBeginInfo beginInfo;
3134b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_vk.beginCommandBuffer(*m_cmdBuffer, &beginInfo);
3144b9229de0ea1993c94c91016ba3f955509753fb0scygan
3154b9229de0ea1993c94c91016ba3f955509753fb0scygan		initialTransitionColor2DImage(m_vk, *m_cmdBuffer, m_colorTargetImage->object(), vk::VK_IMAGE_LAYOUT_GENERAL);
316188341def51b4a425163576ce1cd1c8931c45df8Arkadiusz Sarwa		initialTransitionDepthStencil2DImage(m_vk, *m_cmdBuffer, m_depthStencilImage->object(), vk::VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 0, vk::VK_ACCESS_TRANSFER_WRITE_BIT);
3174b9229de0ea1993c94c91016ba3f955509753fb0scygan
3184b9229de0ea1993c94c91016ba3f955509753fb0scygan		const ImageSubresourceRange subresourceRangeImage(vk::VK_IMAGE_ASPECT_COLOR_BIT);
3194b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_vk.cmdClearColorImage(*m_cmdBuffer, m_colorTargetImage->object(),
3204b9229de0ea1993c94c91016ba3f955509753fb0scygan			vk::VK_IMAGE_LAYOUT_GENERAL, &clearColor, 1, &subresourceRangeImage);
3214b9229de0ea1993c94c91016ba3f955509753fb0scygan
3224b9229de0ea1993c94c91016ba3f955509753fb0scygan		const vk::VkClearDepthStencilValue depthStencilClearValue = { 0.0f, 0 };
3234b9229de0ea1993c94c91016ba3f955509753fb0scygan
3244b9229de0ea1993c94c91016ba3f955509753fb0scygan		const ImageSubresourceRange subresourceRangeDepthStencil[2] = { vk::VK_IMAGE_ASPECT_DEPTH_BIT, vk::VK_IMAGE_ASPECT_STENCIL_BIT };
3254b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_vk.cmdClearDepthStencilImage(*m_cmdBuffer, m_depthStencilImage->object(),
3266a2834ac40395173796b6e8d2a8e6c120d86ee74scygan			vk::VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &depthStencilClearValue, 2, subresourceRangeDepthStencil);
3274b9229de0ea1993c94c91016ba3f955509753fb0scygan
328c26e05b88da7c86a30f7d9abed2e6c30608f846dJoerg Wagner		vk::VkMemoryBarrier memBarrier;
329c26e05b88da7c86a30f7d9abed2e6c30608f846dJoerg Wagner		memBarrier.sType = vk::VK_STRUCTURE_TYPE_MEMORY_BARRIER;
330c26e05b88da7c86a30f7d9abed2e6c30608f846dJoerg Wagner		memBarrier.pNext = NULL;
331c26e05b88da7c86a30f7d9abed2e6c30608f846dJoerg Wagner		memBarrier.srcAccessMask = vk::VK_ACCESS_TRANSFER_WRITE_BIT;
332653ad0e8a4209754304cbd5b5ceb4fdc7b29c01aPyry Haulos		memBarrier.dstAccessMask = vk::VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | vk::VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT |
333c26e05b88da7c86a30f7d9abed2e6c30608f846dJoerg Wagner					   vk::VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT | vk::VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
334a15e7d7f566d93c76ca90171eb728e3d1cd82378Pyry Haulos
335c26e05b88da7c86a30f7d9abed2e6c30608f846dJoerg Wagner		m_vk.cmdPipelineBarrier(*m_cmdBuffer, vk::VK_PIPELINE_STAGE_TRANSFER_BIT,
336c26e05b88da7c86a30f7d9abed2e6c30608f846dJoerg Wagner						      vk::VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT |
337c26e05b88da7c86a30f7d9abed2e6c30608f846dJoerg Wagner						      vk::VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | vk::VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT,
338c26e05b88da7c86a30f7d9abed2e6c30608f846dJoerg Wagner						      0, 1, &memBarrier, 0, NULL, 0, NULL);
339a15e7d7f566d93c76ca90171eb728e3d1cd82378Pyry Haulos
3404b9229de0ea1993c94c91016ba3f955509753fb0scygan		const vk::VkRect2D renderArea = { { 0, 0 }, { WIDTH, HEIGHT } };
3414b9229de0ea1993c94c91016ba3f955509753fb0scygan		const RenderPassBeginInfo renderPassBegin(*m_renderPass, *m_framebuffer, renderArea);
3424b9229de0ea1993c94c91016ba3f955509753fb0scygan
343188341def51b4a425163576ce1cd1c8931c45df8Arkadiusz Sarwa		transition2DImage(m_vk, *m_cmdBuffer, m_depthStencilImage->object(), vk::VK_IMAGE_ASPECT_DEPTH_BIT | vk::VK_IMAGE_ASPECT_STENCIL_BIT, vk::VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, vk::VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, vk::VK_ACCESS_TRANSFER_WRITE_BIT, vk::VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT);
344188341def51b4a425163576ce1cd1c8931c45df8Arkadiusz Sarwa
3456a2834ac40395173796b6e8d2a8e6c120d86ee74scygan		m_vk.cmdBeginRenderPass(*m_cmdBuffer, &renderPassBegin, vk::VK_SUBPASS_CONTENTS_INLINE);
3464b9229de0ea1993c94c91016ba3f955509753fb0scygan	}
3474b9229de0ea1993c94c91016ba3f955509753fb0scygan
3484b9229de0ea1993c94c91016ba3f955509753fb0scygan	void setDynamicViewportState (const deUint32 width, const deUint32 height)
3494b9229de0ea1993c94c91016ba3f955509753fb0scygan	{
3504b9229de0ea1993c94c91016ba3f955509753fb0scygan		vk::VkViewport viewport;
3516a2834ac40395173796b6e8d2a8e6c120d86ee74scygan		viewport.x = 0;
3526a2834ac40395173796b6e8d2a8e6c120d86ee74scygan		viewport.y = 0;
3534b9229de0ea1993c94c91016ba3f955509753fb0scygan		viewport.width = static_cast<float>(width);
3544b9229de0ea1993c94c91016ba3f955509753fb0scygan		viewport.height = static_cast<float>(height);
3554b9229de0ea1993c94c91016ba3f955509753fb0scygan		viewport.minDepth = 0.0f;
3564b9229de0ea1993c94c91016ba3f955509753fb0scygan		viewport.maxDepth = 1.0f;
3574b9229de0ea1993c94c91016ba3f955509753fb0scygan
358689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos		m_vk.cmdSetViewport(*m_cmdBuffer, 0, 1, &viewport);
3594b9229de0ea1993c94c91016ba3f955509753fb0scygan
3604b9229de0ea1993c94c91016ba3f955509753fb0scygan		vk::VkRect2D scissor;
3614b9229de0ea1993c94c91016ba3f955509753fb0scygan		scissor.offset.x = 0;
3624b9229de0ea1993c94c91016ba3f955509753fb0scygan		scissor.offset.y = 0;
3634b9229de0ea1993c94c91016ba3f955509753fb0scygan		scissor.extent.width = width;
3644b9229de0ea1993c94c91016ba3f955509753fb0scygan		scissor.extent.height = height;
365689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos		m_vk.cmdSetScissor(*m_cmdBuffer, 0, 1, &scissor);
3664b9229de0ea1993c94c91016ba3f955509753fb0scygan	}
3674b9229de0ea1993c94c91016ba3f955509753fb0scygan
3684b9229de0ea1993c94c91016ba3f955509753fb0scygan	void setDynamicViewportState(const deUint32 viewportCount, const vk::VkViewport* pViewports, const vk::VkRect2D* pScissors)
3694b9229de0ea1993c94c91016ba3f955509753fb0scygan	{
370689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos		m_vk.cmdSetViewport(*m_cmdBuffer, 0, viewportCount, pViewports);
371689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos		m_vk.cmdSetScissor(*m_cmdBuffer, 0, viewportCount, pScissors);
3724b9229de0ea1993c94c91016ba3f955509753fb0scygan	}
3734b9229de0ea1993c94c91016ba3f955509753fb0scygan
3746a2834ac40395173796b6e8d2a8e6c120d86ee74scygan	void setDynamicRasterizationState(const float lineWidth = 1.0f,
3756a2834ac40395173796b6e8d2a8e6c120d86ee74scygan							   const float depthBiasConstantFactor = 0.0f,
3764b9229de0ea1993c94c91016ba3f955509753fb0scygan							   const float depthBiasClamp = 0.0f,
3776a2834ac40395173796b6e8d2a8e6c120d86ee74scygan							   const float depthBiasSlopeFactor = 0.0f)
3784b9229de0ea1993c94c91016ba3f955509753fb0scygan	{
3794b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_vk.cmdSetLineWidth(*m_cmdBuffer, lineWidth);
3806a2834ac40395173796b6e8d2a8e6c120d86ee74scygan		m_vk.cmdSetDepthBias(*m_cmdBuffer, depthBiasConstantFactor, depthBiasClamp, depthBiasSlopeFactor);
3814b9229de0ea1993c94c91016ba3f955509753fb0scygan	}
3824b9229de0ea1993c94c91016ba3f955509753fb0scygan
3834b9229de0ea1993c94c91016ba3f955509753fb0scygan	void setDynamicBlendState(const float const1 = 0.0f, const float const2 = 0.0f,
3844b9229de0ea1993c94c91016ba3f955509753fb0scygan							  const float const3 = 0.0f, const float const4 = 0.0f)
3854b9229de0ea1993c94c91016ba3f955509753fb0scygan	{
3866a2834ac40395173796b6e8d2a8e6c120d86ee74scygan		float blendConstantsants[4] = { const1, const2, const3, const4 };
3876a2834ac40395173796b6e8d2a8e6c120d86ee74scygan		m_vk.cmdSetBlendConstants(*m_cmdBuffer, blendConstantsants);
3884b9229de0ea1993c94c91016ba3f955509753fb0scygan	}
3894b9229de0ea1993c94c91016ba3f955509753fb0scygan
390ae21c307c29a6efa73f3d4f2b25f0dd2c0b0e023Pyry Haulos	void setDynamicDepthStencilState(const float minDepthBounds = -1.0f,
3914b9229de0ea1993c94c91016ba3f955509753fb0scygan									 const float maxDepthBounds = 1.0f,
392ae21c307c29a6efa73f3d4f2b25f0dd2c0b0e023Pyry Haulos									 const deUint32 stencilFrontCompareMask = 0xffffffffu,
3934b9229de0ea1993c94c91016ba3f955509753fb0scygan									 const deUint32 stencilFrontWriteMask = 0xffffffffu,
394ae21c307c29a6efa73f3d4f2b25f0dd2c0b0e023Pyry Haulos									 const deUint32 stencilFrontReference = 0,
3954b9229de0ea1993c94c91016ba3f955509753fb0scygan									 const deUint32 stencilBackCompareMask = 0xffffffffu,
396ae21c307c29a6efa73f3d4f2b25f0dd2c0b0e023Pyry Haulos									 const deUint32 stencilBackWriteMask = 0xffffffffu,
3974b9229de0ea1993c94c91016ba3f955509753fb0scygan									 const deUint32 stencilBackReference = 0)
3984b9229de0ea1993c94c91016ba3f955509753fb0scygan	{
3994b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_vk.cmdSetDepthBounds(*m_cmdBuffer, minDepthBounds, maxDepthBounds);
4004b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_vk.cmdSetStencilCompareMask(*m_cmdBuffer, vk::VK_STENCIL_FACE_FRONT_BIT, stencilFrontCompareMask);
4014b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_vk.cmdSetStencilWriteMask(*m_cmdBuffer, vk::VK_STENCIL_FACE_FRONT_BIT, stencilFrontWriteMask);
4024b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_vk.cmdSetStencilReference(*m_cmdBuffer, vk::VK_STENCIL_FACE_FRONT_BIT, stencilFrontReference);
4034b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_vk.cmdSetStencilCompareMask(*m_cmdBuffer, vk::VK_STENCIL_FACE_BACK_BIT, stencilBackCompareMask);
4044b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_vk.cmdSetStencilWriteMask(*m_cmdBuffer, vk::VK_STENCIL_FACE_BACK_BIT, stencilBackWriteMask);
4054b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_vk.cmdSetStencilReference(*m_cmdBuffer, vk::VK_STENCIL_FACE_BACK_BIT, stencilBackReference);
4064b9229de0ea1993c94c91016ba3f955509753fb0scygan	}
4074b9229de0ea1993c94c91016ba3f955509753fb0scygan};
4084b9229de0ea1993c94c91016ba3f955509753fb0scygan
4094b9229de0ea1993c94c91016ba3f955509753fb0scyganclass DepthBoundsParamTestInstance : public DepthStencilBaseCase
4104b9229de0ea1993c94c91016ba3f955509753fb0scygan{
4114b9229de0ea1993c94c91016ba3f955509753fb0scyganpublic:
4124b9229de0ea1993c94c91016ba3f955509753fb0scygan	DepthBoundsParamTestInstance (Context &context, ShaderMap shaders)
4134b9229de0ea1993c94c91016ba3f955509753fb0scygan		: DepthStencilBaseCase (context, shaders[glu::SHADERTYPE_VERTEX], shaders[glu::SHADERTYPE_FRAGMENT])
4144b9229de0ea1993c94c91016ba3f955509753fb0scygan	{
41591e51d60e47a7a138ef7189f4aaedb56051e4957asokolow		// Check if depth bounds test is supported
41691e51d60e47a7a138ef7189f4aaedb56051e4957asokolow		{
41791e51d60e47a7a138ef7189f4aaedb56051e4957asokolow			const vk::VkPhysicalDeviceFeatures& deviceFeatures = m_context.getDeviceFeatures();
41891e51d60e47a7a138ef7189f4aaedb56051e4957asokolow
41991e51d60e47a7a138ef7189f4aaedb56051e4957asokolow			if (!deviceFeatures.depthBounds)
42091e51d60e47a7a138ef7189f4aaedb56051e4957asokolow				throw tcu::NotSupportedError("Depth bounds test is unsupported");
42191e51d60e47a7a138ef7189f4aaedb56051e4957asokolow		}
42291e51d60e47a7a138ef7189f4aaedb56051e4957asokolow
423db4efd02b79d71e0d0b1122d01d1a20b37760527scygan		m_data.push_back(PositionColorVertex(tcu::Vec4(-1.0f, 1.0f, 0.375f, 1.0f), tcu::RGBA::green().toVec()));
424db4efd02b79d71e0d0b1122d01d1a20b37760527scygan		m_data.push_back(PositionColorVertex(tcu::Vec4(0.0f, 1.0f, 0.375f, 1.0f), tcu::RGBA::green().toVec()));
425db4efd02b79d71e0d0b1122d01d1a20b37760527scygan		m_data.push_back(PositionColorVertex(tcu::Vec4(-1.0f, -1.0f, 0.375f, 1.0f), tcu::RGBA::green().toVec()));
426db4efd02b79d71e0d0b1122d01d1a20b37760527scygan		m_data.push_back(PositionColorVertex(tcu::Vec4(0.0f, -1.0f, 0.375f, 1.0f), tcu::RGBA::green().toVec()));
4274b9229de0ea1993c94c91016ba3f955509753fb0scygan
428db4efd02b79d71e0d0b1122d01d1a20b37760527scygan		m_data.push_back(PositionColorVertex(tcu::Vec4(0.0f, 1.0f, 0.625f, 1.0f), tcu::RGBA::green().toVec()));
429db4efd02b79d71e0d0b1122d01d1a20b37760527scygan		m_data.push_back(PositionColorVertex(tcu::Vec4(1.0f, 1.0f, 0.625f, 1.0f), tcu::RGBA::green().toVec()));
430db4efd02b79d71e0d0b1122d01d1a20b37760527scygan		m_data.push_back(PositionColorVertex(tcu::Vec4(0.0f, -1.0f, 0.625f, 1.0f), tcu::RGBA::green().toVec()));
431db4efd02b79d71e0d0b1122d01d1a20b37760527scygan		m_data.push_back(PositionColorVertex(tcu::Vec4(1.0f, -1.0f, 0.625f, 1.0f), tcu::RGBA::green().toVec()));
4324b9229de0ea1993c94c91016ba3f955509753fb0scygan
433db4efd02b79d71e0d0b1122d01d1a20b37760527scygan		m_data.push_back(PositionColorVertex(tcu::Vec4(-1.0f, 1.0f, 1.0f, 1.0f), tcu::RGBA::blue().toVec()));
434db4efd02b79d71e0d0b1122d01d1a20b37760527scygan		m_data.push_back(PositionColorVertex(tcu::Vec4(1.0f, 1.0f, 1.0f, 1.0f), tcu::RGBA::blue().toVec()));
435db4efd02b79d71e0d0b1122d01d1a20b37760527scygan		m_data.push_back(PositionColorVertex(tcu::Vec4(-1.0f, -1.0f, 1.0f, 1.0f), tcu::RGBA::blue().toVec()));
436db4efd02b79d71e0d0b1122d01d1a20b37760527scygan		m_data.push_back(PositionColorVertex(tcu::Vec4(1.0f, -1.0f, 1.0f, 1.0f), tcu::RGBA::blue().toVec()));
4374b9229de0ea1993c94c91016ba3f955509753fb0scygan
4384b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_depthStencilState_1 = PipelineCreateInfo::DepthStencilState(
4396cbd34be72b2b732fe4f8d60c850d52fb16f68bcPyry Haulos			VK_TRUE, VK_TRUE, vk::VK_COMPARE_OP_ALWAYS, VK_FALSE);
4404b9229de0ea1993c94c91016ba3f955509753fb0scygan
4414b9229de0ea1993c94c91016ba3f955509753fb0scygan		// enable depth bounds test
4424b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_depthStencilState_2 = PipelineCreateInfo::DepthStencilState(
4436cbd34be72b2b732fe4f8d60c850d52fb16f68bcPyry Haulos			VK_FALSE, VK_FALSE, vk::VK_COMPARE_OP_NEVER, VK_TRUE);
4444b9229de0ea1993c94c91016ba3f955509753fb0scygan
4454b9229de0ea1993c94c91016ba3f955509753fb0scygan		DepthStencilBaseCase::initialize();
4464b9229de0ea1993c94c91016ba3f955509753fb0scygan	}
4474b9229de0ea1993c94c91016ba3f955509753fb0scygan
4484b9229de0ea1993c94c91016ba3f955509753fb0scygan	virtual tcu::TestStatus iterate (void)
4494b9229de0ea1993c94c91016ba3f955509753fb0scygan	{
4504b9229de0ea1993c94c91016ba3f955509753fb0scygan		tcu::TestLog &log = m_context.getTestContext().getLog();
4514b9229de0ea1993c94c91016ba3f955509753fb0scygan		const vk::VkQueue queue = m_context.getUniversalQueue();
4524b9229de0ea1993c94c91016ba3f955509753fb0scygan
4534b9229de0ea1993c94c91016ba3f955509753fb0scygan		beginRenderPass();
4544b9229de0ea1993c94c91016ba3f955509753fb0scygan
4554b9229de0ea1993c94c91016ba3f955509753fb0scygan		// set states here
4564b9229de0ea1993c94c91016ba3f955509753fb0scygan		setDynamicViewportState(WIDTH, HEIGHT);
4576a2834ac40395173796b6e8d2a8e6c120d86ee74scygan		setDynamicRasterizationState();
4584b9229de0ea1993c94c91016ba3f955509753fb0scygan		setDynamicBlendState();
4594b9229de0ea1993c94c91016ba3f955509753fb0scygan		setDynamicDepthStencilState(0.5f, 0.75f);
4604b9229de0ea1993c94c91016ba3f955509753fb0scygan
4614b9229de0ea1993c94c91016ba3f955509753fb0scygan		const vk::VkDeviceSize vertexBufferOffset = 0;
4624b9229de0ea1993c94c91016ba3f955509753fb0scygan		const vk::VkBuffer vertexBuffer = m_vertexBuffer->object();
4634b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_vk.cmdBindVertexBuffers(*m_cmdBuffer, 0, 1, &vertexBuffer, &vertexBufferOffset);
4644b9229de0ea1993c94c91016ba3f955509753fb0scygan
4654b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_vk.cmdBindPipeline(*m_cmdBuffer, vk::VK_PIPELINE_BIND_POINT_GRAPHICS, *m_pipeline_1);
4664b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_vk.cmdDraw(*m_cmdBuffer, 4, 1, 0, 0);
4674b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_vk.cmdDraw(*m_cmdBuffer, 4, 1, 4, 0);
4684b9229de0ea1993c94c91016ba3f955509753fb0scygan
4694b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_vk.cmdBindPipeline(*m_cmdBuffer, vk::VK_PIPELINE_BIND_POINT_GRAPHICS, *m_pipeline_2);
4704b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_vk.cmdDraw(*m_cmdBuffer, 4, 1, 8, 0);
4714b9229de0ea1993c94c91016ba3f955509753fb0scygan
4724b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_vk.cmdEndRenderPass(*m_cmdBuffer);
4734b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_vk.endCommandBuffer(*m_cmdBuffer);
4744b9229de0ea1993c94c91016ba3f955509753fb0scygan
4756a2834ac40395173796b6e8d2a8e6c120d86ee74scygan		vk::VkSubmitInfo submitInfo =
4766a2834ac40395173796b6e8d2a8e6c120d86ee74scygan		{
4776a2834ac40395173796b6e8d2a8e6c120d86ee74scygan			vk::VK_STRUCTURE_TYPE_SUBMIT_INFO,	// VkStructureType			sType;
4786a2834ac40395173796b6e8d2a8e6c120d86ee74scygan			DE_NULL,							// const void*				pNext;
479ae21c307c29a6efa73f3d4f2b25f0dd2c0b0e023Pyry Haulos			0,									// deUint32					waitSemaphoreCount;
480ae21c307c29a6efa73f3d4f2b25f0dd2c0b0e023Pyry Haulos			DE_NULL,							// const VkSemaphore*		pWaitSemaphores;
481689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos			(const vk::VkPipelineStageFlags*)DE_NULL,
482ae21c307c29a6efa73f3d4f2b25f0dd2c0b0e023Pyry Haulos			1,									// deUint32					commandBufferCount;
4836a2834ac40395173796b6e8d2a8e6c120d86ee74scygan			&m_cmdBuffer.get(),					// const VkCommandBuffer*	pCommandBuffers;
484ae21c307c29a6efa73f3d4f2b25f0dd2c0b0e023Pyry Haulos			0,									// deUint32					signalSemaphoreCount;
4856a2834ac40395173796b6e8d2a8e6c120d86ee74scygan			DE_NULL								// const VkSemaphore*		pSignalSemaphores;
4866a2834ac40395173796b6e8d2a8e6c120d86ee74scygan		};
4876a2834ac40395173796b6e8d2a8e6c120d86ee74scygan		m_vk.queueSubmit(queue, 1, &submitInfo, DE_NULL);
4884b9229de0ea1993c94c91016ba3f955509753fb0scygan
4894b9229de0ea1993c94c91016ba3f955509753fb0scygan		// validation
4904b9229de0ea1993c94c91016ba3f955509753fb0scygan		{
4914b9229de0ea1993c94c91016ba3f955509753fb0scygan			VK_CHECK(m_vk.queueWaitIdle(queue));
4924b9229de0ea1993c94c91016ba3f955509753fb0scygan
4934b9229de0ea1993c94c91016ba3f955509753fb0scygan			tcu::Texture2D referenceFrame(vk::mapVkFormat(m_colorAttachmentFormat), (int)(0.5 + WIDTH), (int)(0.5 + HEIGHT));
4944b9229de0ea1993c94c91016ba3f955509753fb0scygan			referenceFrame.allocLevel(0);
4954b9229de0ea1993c94c91016ba3f955509753fb0scygan
4964b9229de0ea1993c94c91016ba3f955509753fb0scygan			const deInt32 frameWidth = referenceFrame.getWidth();
4974b9229de0ea1993c94c91016ba3f955509753fb0scygan			const deInt32 frameHeight = referenceFrame.getHeight();
4984b9229de0ea1993c94c91016ba3f955509753fb0scygan
4994b9229de0ea1993c94c91016ba3f955509753fb0scygan			tcu::clear(referenceFrame.getLevel(0), tcu::Vec4(0.0f, 0.0f, 0.0f, 1.0f));
5004b9229de0ea1993c94c91016ba3f955509753fb0scygan
5014b9229de0ea1993c94c91016ba3f955509753fb0scygan			for (int y = 0; y < frameHeight; y++)
5024b9229de0ea1993c94c91016ba3f955509753fb0scygan			{
5034b9229de0ea1993c94c91016ba3f955509753fb0scygan				const float yCoord = (float)(y / (0.5*frameHeight)) - 1.0f;
5044b9229de0ea1993c94c91016ba3f955509753fb0scygan
5054b9229de0ea1993c94c91016ba3f955509753fb0scygan				for (int x = 0; x < frameWidth; x++)
5064b9229de0ea1993c94c91016ba3f955509753fb0scygan				{
5074b9229de0ea1993c94c91016ba3f955509753fb0scygan					const float xCoord = (float)(x / (0.5*frameWidth)) - 1.0f;
5084b9229de0ea1993c94c91016ba3f955509753fb0scygan
5094b9229de0ea1993c94c91016ba3f955509753fb0scygan					if (xCoord >= 0.0f && xCoord <= 1.0f && yCoord >= -1.0f && yCoord <= 1.0f)
5104b9229de0ea1993c94c91016ba3f955509753fb0scygan						referenceFrame.getLevel(0).setPixel(tcu::Vec4(0.0f, 0.0f, 1.0f, 1.0f), x, y);
5114b9229de0ea1993c94c91016ba3f955509753fb0scygan					else
5124b9229de0ea1993c94c91016ba3f955509753fb0scygan						referenceFrame.getLevel(0).setPixel(tcu::Vec4(0.0f, 1.0f, 0.0f, 1.0f), x, y);
5134b9229de0ea1993c94c91016ba3f955509753fb0scygan				}
5144b9229de0ea1993c94c91016ba3f955509753fb0scygan			}
5154b9229de0ea1993c94c91016ba3f955509753fb0scygan
5164b9229de0ea1993c94c91016ba3f955509753fb0scygan			const vk::VkOffset3D zeroOffset = { 0, 0, 0 };
5174b9229de0ea1993c94c91016ba3f955509753fb0scygan			const tcu::ConstPixelBufferAccess renderedFrame = m_colorTargetImage->readSurface(queue, m_context.getDefaultAllocator(),
5186a2834ac40395173796b6e8d2a8e6c120d86ee74scygan				vk::VK_IMAGE_LAYOUT_GENERAL, zeroOffset, WIDTH, HEIGHT, vk::VK_IMAGE_ASPECT_COLOR_BIT);
5194b9229de0ea1993c94c91016ba3f955509753fb0scygan
5204b9229de0ea1993c94c91016ba3f955509753fb0scygan			if (!tcu::fuzzyCompare(log, "Result", "Image comparison result",
5214b9229de0ea1993c94c91016ba3f955509753fb0scygan				referenceFrame.getLevel(0), renderedFrame, 0.05f,
5224b9229de0ea1993c94c91016ba3f955509753fb0scygan				tcu::COMPARE_LOG_RESULT))
5234b9229de0ea1993c94c91016ba3f955509753fb0scygan			{
524db4efd02b79d71e0d0b1122d01d1a20b37760527scygan				return tcu::TestStatus(QP_TEST_RESULT_FAIL, "Image verification failed");
5254b9229de0ea1993c94c91016ba3f955509753fb0scygan			}
5264b9229de0ea1993c94c91016ba3f955509753fb0scygan
527db4efd02b79d71e0d0b1122d01d1a20b37760527scygan			return tcu::TestStatus(QP_TEST_RESULT_PASS, "Image verification passed");
5284b9229de0ea1993c94c91016ba3f955509753fb0scygan		}
5294b9229de0ea1993c94c91016ba3f955509753fb0scygan	}
5304b9229de0ea1993c94c91016ba3f955509753fb0scygan};
5314b9229de0ea1993c94c91016ba3f955509753fb0scygan
5324b9229de0ea1993c94c91016ba3f955509753fb0scyganclass StencilParamsBasicTestInstance : public DepthStencilBaseCase
5334b9229de0ea1993c94c91016ba3f955509753fb0scygan{
5344b9229de0ea1993c94c91016ba3f955509753fb0scyganprotected:
5354b9229de0ea1993c94c91016ba3f955509753fb0scygan	deUint32 m_writeMask;
5364b9229de0ea1993c94c91016ba3f955509753fb0scygan	deUint32 m_readMask;
5374b9229de0ea1993c94c91016ba3f955509753fb0scygan	deUint32 m_expectedValue;
5384b9229de0ea1993c94c91016ba3f955509753fb0scygan	tcu::Vec4 m_expectedColor;
5394b9229de0ea1993c94c91016ba3f955509753fb0scygan
5404b9229de0ea1993c94c91016ba3f955509753fb0scyganpublic:
541db4efd02b79d71e0d0b1122d01d1a20b37760527scygan	StencilParamsBasicTestInstance (Context& context, const char* vertexShaderName, const char* fragmentShaderName,
542ae21c307c29a6efa73f3d4f2b25f0dd2c0b0e023Pyry Haulos									const deUint32 writeMask, const deUint32 readMask,
5434b9229de0ea1993c94c91016ba3f955509753fb0scygan									const deUint32 expectedValue, const tcu::Vec4 expectedColor)
5444b9229de0ea1993c94c91016ba3f955509753fb0scygan		: DepthStencilBaseCase  (context, vertexShaderName, fragmentShaderName)
5454b9229de0ea1993c94c91016ba3f955509753fb0scygan		, m_expectedColor		(1.0f, 1.0f, 1.0f, 1.0f)
5464b9229de0ea1993c94c91016ba3f955509753fb0scygan	{
5474b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_writeMask = writeMask;
5484b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_readMask = readMask;
5494b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_expectedValue = expectedValue;
5504b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_expectedColor = expectedColor;
5514b9229de0ea1993c94c91016ba3f955509753fb0scygan
552db4efd02b79d71e0d0b1122d01d1a20b37760527scygan		m_data.push_back(PositionColorVertex(tcu::Vec4(-1.0f, 1.0f, 1.0f, 1.0f), tcu::RGBA::green().toVec()));
553db4efd02b79d71e0d0b1122d01d1a20b37760527scygan		m_data.push_back(PositionColorVertex(tcu::Vec4(1.0f, 1.0f, 1.0f, 1.0f), tcu::RGBA::green().toVec()));
554db4efd02b79d71e0d0b1122d01d1a20b37760527scygan		m_data.push_back(PositionColorVertex(tcu::Vec4(-1.0f, -1.0f, 1.0f, 1.0f), tcu::RGBA::green().toVec()));
555db4efd02b79d71e0d0b1122d01d1a20b37760527scygan		m_data.push_back(PositionColorVertex(tcu::Vec4(1.0f, -1.0f, 1.0f, 1.0f), tcu::RGBA::green().toVec()));
5564b9229de0ea1993c94c91016ba3f955509753fb0scygan
557db4efd02b79d71e0d0b1122d01d1a20b37760527scygan		m_data.push_back(PositionColorVertex(tcu::Vec4(-1.0f, 1.0f, 1.0f, 1.0f), tcu::RGBA::blue().toVec()));
558db4efd02b79d71e0d0b1122d01d1a20b37760527scygan		m_data.push_back(PositionColorVertex(tcu::Vec4(1.0f, 1.0f, 1.0f, 1.0f), tcu::RGBA::blue().toVec()));
559db4efd02b79d71e0d0b1122d01d1a20b37760527scygan		m_data.push_back(PositionColorVertex(tcu::Vec4(-1.0f, -1.0f, 1.0f, 1.0f), tcu::RGBA::blue().toVec()));
560db4efd02b79d71e0d0b1122d01d1a20b37760527scygan		m_data.push_back(PositionColorVertex(tcu::Vec4(1.0f, -1.0f, 1.0f, 1.0f), tcu::RGBA::blue().toVec()));
5614b9229de0ea1993c94c91016ba3f955509753fb0scygan
5624b9229de0ea1993c94c91016ba3f955509753fb0scygan		const PipelineCreateInfo::DepthStencilState::StencilOpState frontState_1 =
5634b9229de0ea1993c94c91016ba3f955509753fb0scygan			PipelineCreateInfo::DepthStencilState::StencilOpState(
5644b9229de0ea1993c94c91016ba3f955509753fb0scygan			vk::VK_STENCIL_OP_REPLACE,
5654b9229de0ea1993c94c91016ba3f955509753fb0scygan			vk::VK_STENCIL_OP_REPLACE,
5664b9229de0ea1993c94c91016ba3f955509753fb0scygan			vk::VK_STENCIL_OP_REPLACE,
5674b9229de0ea1993c94c91016ba3f955509753fb0scygan			vk::VK_COMPARE_OP_ALWAYS);
5684b9229de0ea1993c94c91016ba3f955509753fb0scygan
5694b9229de0ea1993c94c91016ba3f955509753fb0scygan		const PipelineCreateInfo::DepthStencilState::StencilOpState backState_1 =
5704b9229de0ea1993c94c91016ba3f955509753fb0scygan			PipelineCreateInfo::DepthStencilState::StencilOpState(
5714b9229de0ea1993c94c91016ba3f955509753fb0scygan			vk::VK_STENCIL_OP_REPLACE,
5724b9229de0ea1993c94c91016ba3f955509753fb0scygan			vk::VK_STENCIL_OP_REPLACE,
5734b9229de0ea1993c94c91016ba3f955509753fb0scygan			vk::VK_STENCIL_OP_REPLACE,
5744b9229de0ea1993c94c91016ba3f955509753fb0scygan			vk::VK_COMPARE_OP_ALWAYS);
5754b9229de0ea1993c94c91016ba3f955509753fb0scygan
5764b9229de0ea1993c94c91016ba3f955509753fb0scygan		const PipelineCreateInfo::DepthStencilState::StencilOpState frontState_2 =
5774b9229de0ea1993c94c91016ba3f955509753fb0scygan			PipelineCreateInfo::DepthStencilState::StencilOpState(
5784b9229de0ea1993c94c91016ba3f955509753fb0scygan			vk::VK_STENCIL_OP_REPLACE,
5794b9229de0ea1993c94c91016ba3f955509753fb0scygan			vk::VK_STENCIL_OP_REPLACE,
5804b9229de0ea1993c94c91016ba3f955509753fb0scygan			vk::VK_STENCIL_OP_REPLACE,
5814b9229de0ea1993c94c91016ba3f955509753fb0scygan			vk::VK_COMPARE_OP_EQUAL);
5824b9229de0ea1993c94c91016ba3f955509753fb0scygan
5834b9229de0ea1993c94c91016ba3f955509753fb0scygan		const PipelineCreateInfo::DepthStencilState::StencilOpState backState_2 =
5844b9229de0ea1993c94c91016ba3f955509753fb0scygan			PipelineCreateInfo::DepthStencilState::StencilOpState(
5854b9229de0ea1993c94c91016ba3f955509753fb0scygan			vk::VK_STENCIL_OP_REPLACE,
5864b9229de0ea1993c94c91016ba3f955509753fb0scygan			vk::VK_STENCIL_OP_REPLACE,
5874b9229de0ea1993c94c91016ba3f955509753fb0scygan			vk::VK_STENCIL_OP_REPLACE,
5884b9229de0ea1993c94c91016ba3f955509753fb0scygan			vk::VK_COMPARE_OP_EQUAL);
5894b9229de0ea1993c94c91016ba3f955509753fb0scygan
5904b9229de0ea1993c94c91016ba3f955509753fb0scygan		// enable stencil test
5914b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_depthStencilState_1 = PipelineCreateInfo::DepthStencilState(
5926cbd34be72b2b732fe4f8d60c850d52fb16f68bcPyry Haulos			VK_FALSE, VK_FALSE, vk::VK_COMPARE_OP_NEVER, VK_FALSE, VK_TRUE, frontState_1, backState_1);
5934b9229de0ea1993c94c91016ba3f955509753fb0scygan
5944b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_depthStencilState_2 = PipelineCreateInfo::DepthStencilState(
5956cbd34be72b2b732fe4f8d60c850d52fb16f68bcPyry Haulos			VK_FALSE, VK_FALSE, vk::VK_COMPARE_OP_NEVER, VK_FALSE, VK_TRUE, frontState_2, backState_2);
5964b9229de0ea1993c94c91016ba3f955509753fb0scygan
5974b9229de0ea1993c94c91016ba3f955509753fb0scygan		DepthStencilBaseCase::initialize();
5984b9229de0ea1993c94c91016ba3f955509753fb0scygan	}
5994b9229de0ea1993c94c91016ba3f955509753fb0scygan
6004b9229de0ea1993c94c91016ba3f955509753fb0scygan	virtual tcu::TestStatus iterate (void)
6014b9229de0ea1993c94c91016ba3f955509753fb0scygan	{
6024b9229de0ea1993c94c91016ba3f955509753fb0scygan		tcu::TestLog &log = m_context.getTestContext().getLog();
6034b9229de0ea1993c94c91016ba3f955509753fb0scygan		const vk::VkQueue queue = m_context.getUniversalQueue();
6044b9229de0ea1993c94c91016ba3f955509753fb0scygan
6054b9229de0ea1993c94c91016ba3f955509753fb0scygan		beginRenderPass();
6064b9229de0ea1993c94c91016ba3f955509753fb0scygan
6074b9229de0ea1993c94c91016ba3f955509753fb0scygan		// set states here
6084b9229de0ea1993c94c91016ba3f955509753fb0scygan		setDynamicViewportState(WIDTH, HEIGHT);
6096a2834ac40395173796b6e8d2a8e6c120d86ee74scygan		setDynamicRasterizationState();
6104b9229de0ea1993c94c91016ba3f955509753fb0scygan		setDynamicBlendState();
6114b9229de0ea1993c94c91016ba3f955509753fb0scygan
6124b9229de0ea1993c94c91016ba3f955509753fb0scygan		const vk::VkDeviceSize vertexBufferOffset = 0;
6134b9229de0ea1993c94c91016ba3f955509753fb0scygan		const vk::VkBuffer vertexBuffer = m_vertexBuffer->object();
6144b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_vk.cmdBindVertexBuffers(*m_cmdBuffer, 0, 1, &vertexBuffer, &vertexBufferOffset);
6154b9229de0ea1993c94c91016ba3f955509753fb0scygan
6164b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_vk.cmdBindPipeline(*m_cmdBuffer, vk::VK_PIPELINE_BIND_POINT_GRAPHICS, *m_pipeline_1);
6174b9229de0ea1993c94c91016ba3f955509753fb0scygan		setDynamicDepthStencilState(-1.0f, 1.0f, 0xFF, m_writeMask, 0x0F, 0xFF, m_writeMask, 0x0F);
6184b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_vk.cmdDraw(*m_cmdBuffer, 4, 1, 0, 0);
6194b9229de0ea1993c94c91016ba3f955509753fb0scygan
6204b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_vk.cmdBindPipeline(*m_cmdBuffer, vk::VK_PIPELINE_BIND_POINT_GRAPHICS, *m_pipeline_2);
6214b9229de0ea1993c94c91016ba3f955509753fb0scygan		setDynamicDepthStencilState(-1.0f, 1.0f, m_readMask, 0xFF, m_expectedValue, m_readMask, 0xFF, m_expectedValue);
6224b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_vk.cmdDraw(*m_cmdBuffer, 4, 1, 4, 0);
6234b9229de0ea1993c94c91016ba3f955509753fb0scygan
6244b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_vk.cmdEndRenderPass(*m_cmdBuffer);
6254b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_vk.endCommandBuffer(*m_cmdBuffer);
6264b9229de0ea1993c94c91016ba3f955509753fb0scygan
6276a2834ac40395173796b6e8d2a8e6c120d86ee74scygan		vk::VkSubmitInfo submitInfo =
6286a2834ac40395173796b6e8d2a8e6c120d86ee74scygan		{
6296a2834ac40395173796b6e8d2a8e6c120d86ee74scygan			vk::VK_STRUCTURE_TYPE_SUBMIT_INFO,	// VkStructureType			sType;
6306a2834ac40395173796b6e8d2a8e6c120d86ee74scygan			DE_NULL,							// const void*				pNext;
631ae21c307c29a6efa73f3d4f2b25f0dd2c0b0e023Pyry Haulos			0,									// deUint32					waitSemaphoreCount;
632ae21c307c29a6efa73f3d4f2b25f0dd2c0b0e023Pyry Haulos			DE_NULL,							// const VkSemaphore*		pWaitSemaphores;
633689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos			(const vk::VkPipelineStageFlags*)DE_NULL,
634ae21c307c29a6efa73f3d4f2b25f0dd2c0b0e023Pyry Haulos			1,									// deUint32					commandBufferCount;
6356a2834ac40395173796b6e8d2a8e6c120d86ee74scygan			&m_cmdBuffer.get(),					// const VkCommandBuffer*	pCommandBuffers;
636ae21c307c29a6efa73f3d4f2b25f0dd2c0b0e023Pyry Haulos			0,									// deUint32					signalSemaphoreCount;
6376a2834ac40395173796b6e8d2a8e6c120d86ee74scygan			DE_NULL								// const VkSemaphore*		pSignalSemaphores;
6386a2834ac40395173796b6e8d2a8e6c120d86ee74scygan		};
6396a2834ac40395173796b6e8d2a8e6c120d86ee74scygan		m_vk.queueSubmit(queue, 1, &submitInfo, DE_NULL);
6404b9229de0ea1993c94c91016ba3f955509753fb0scygan
6414b9229de0ea1993c94c91016ba3f955509753fb0scygan		// validation
6424b9229de0ea1993c94c91016ba3f955509753fb0scygan		{
6434b9229de0ea1993c94c91016ba3f955509753fb0scygan			VK_CHECK(m_vk.queueWaitIdle(queue));
6444b9229de0ea1993c94c91016ba3f955509753fb0scygan
6454b9229de0ea1993c94c91016ba3f955509753fb0scygan			tcu::Texture2D referenceFrame(vk::mapVkFormat(m_colorAttachmentFormat), (int)(0.5 + WIDTH), (int)(0.5 + HEIGHT));
6464b9229de0ea1993c94c91016ba3f955509753fb0scygan			referenceFrame.allocLevel(0);
6474b9229de0ea1993c94c91016ba3f955509753fb0scygan
6484b9229de0ea1993c94c91016ba3f955509753fb0scygan			const deInt32 frameWidth = referenceFrame.getWidth();
6494b9229de0ea1993c94c91016ba3f955509753fb0scygan			const deInt32 frameHeight = referenceFrame.getHeight();
6504b9229de0ea1993c94c91016ba3f955509753fb0scygan
6514b9229de0ea1993c94c91016ba3f955509753fb0scygan			for (int y = 0; y < frameHeight; y++)
6524b9229de0ea1993c94c91016ba3f955509753fb0scygan			{
6534b9229de0ea1993c94c91016ba3f955509753fb0scygan				const float yCoord = (float)(y / (0.5*frameHeight)) - 1.0f;
6544b9229de0ea1993c94c91016ba3f955509753fb0scygan
6554b9229de0ea1993c94c91016ba3f955509753fb0scygan				for (int x = 0; x < frameWidth; x++)
6564b9229de0ea1993c94c91016ba3f955509753fb0scygan				{
6574b9229de0ea1993c94c91016ba3f955509753fb0scygan					const float xCoord = (float)(x / (0.5*frameWidth)) - 1.0f;
6584b9229de0ea1993c94c91016ba3f955509753fb0scygan
6594b9229de0ea1993c94c91016ba3f955509753fb0scygan					if (xCoord >= -1.0f && xCoord <= 1.0f && yCoord >= -1.0f && yCoord <= 1.0f)
6604b9229de0ea1993c94c91016ba3f955509753fb0scygan						referenceFrame.getLevel(0).setPixel(m_expectedColor, x, y);
6614b9229de0ea1993c94c91016ba3f955509753fb0scygan				}
6624b9229de0ea1993c94c91016ba3f955509753fb0scygan			}
6634b9229de0ea1993c94c91016ba3f955509753fb0scygan
6644b9229de0ea1993c94c91016ba3f955509753fb0scygan			const vk::VkOffset3D zeroOffset = { 0, 0, 0 };
6654b9229de0ea1993c94c91016ba3f955509753fb0scygan			const tcu::ConstPixelBufferAccess renderedFrame = m_colorTargetImage->readSurface(queue, m_context.getDefaultAllocator(),
6666a2834ac40395173796b6e8d2a8e6c120d86ee74scygan				vk::VK_IMAGE_LAYOUT_GENERAL, zeroOffset, WIDTH, HEIGHT, vk::VK_IMAGE_ASPECT_COLOR_BIT);
6674b9229de0ea1993c94c91016ba3f955509753fb0scygan
6684b9229de0ea1993c94c91016ba3f955509753fb0scygan			if (!tcu::fuzzyCompare(log, "Result", "Image comparison result",
6694b9229de0ea1993c94c91016ba3f955509753fb0scygan				referenceFrame.getLevel(0), renderedFrame, 0.05f,
6704b9229de0ea1993c94c91016ba3f955509753fb0scygan				tcu::COMPARE_LOG_RESULT))
6714b9229de0ea1993c94c91016ba3f955509753fb0scygan			{
672db4efd02b79d71e0d0b1122d01d1a20b37760527scygan				return tcu::TestStatus(QP_TEST_RESULT_FAIL, "Image verification failed");
6734b9229de0ea1993c94c91016ba3f955509753fb0scygan			}
6744b9229de0ea1993c94c91016ba3f955509753fb0scygan
675db4efd02b79d71e0d0b1122d01d1a20b37760527scygan			return tcu::TestStatus(QP_TEST_RESULT_PASS, "Image verification passed");
6764b9229de0ea1993c94c91016ba3f955509753fb0scygan		}
6774b9229de0ea1993c94c91016ba3f955509753fb0scygan	}
6784b9229de0ea1993c94c91016ba3f955509753fb0scygan};
6794b9229de0ea1993c94c91016ba3f955509753fb0scygan
6804b9229de0ea1993c94c91016ba3f955509753fb0scyganclass StencilParamsBasicTestCase : public TestCase
6814b9229de0ea1993c94c91016ba3f955509753fb0scygan{
6824b9229de0ea1993c94c91016ba3f955509753fb0scyganprotected:
6834b9229de0ea1993c94c91016ba3f955509753fb0scygan	TestInstance* createInstance(Context& context) const
6844b9229de0ea1993c94c91016ba3f955509753fb0scygan	{
6854b9229de0ea1993c94c91016ba3f955509753fb0scygan		return new StencilParamsBasicTestInstance(context, "VertexFetch.vert", "VertexFetch.frag",
6864b9229de0ea1993c94c91016ba3f955509753fb0scygan			m_writeMask, m_readMask, m_expectedValue, m_expectedColor);
6874b9229de0ea1993c94c91016ba3f955509753fb0scygan	}
6884b9229de0ea1993c94c91016ba3f955509753fb0scygan
6894b9229de0ea1993c94c91016ba3f955509753fb0scygan	virtual void initPrograms(vk::SourceCollections& programCollection) const
6904b9229de0ea1993c94c91016ba3f955509753fb0scygan	{
6914b9229de0ea1993c94c91016ba3f955509753fb0scygan		programCollection.glslSources.add("VertexFetch.vert") <<
6924b9229de0ea1993c94c91016ba3f955509753fb0scygan			glu::VertexSource(ShaderSourceProvider::getSource(m_testCtx.getArchive(), "vulkan/dynamic_state/VertexFetch.vert"));
6934b9229de0ea1993c94c91016ba3f955509753fb0scygan
6944b9229de0ea1993c94c91016ba3f955509753fb0scygan		programCollection.glslSources.add("VertexFetch.frag") <<
6954b9229de0ea1993c94c91016ba3f955509753fb0scygan			glu::FragmentSource(ShaderSourceProvider::getSource(m_testCtx.getArchive(), "vulkan/dynamic_state/VertexFetch.frag"));
6964b9229de0ea1993c94c91016ba3f955509753fb0scygan	}
6974b9229de0ea1993c94c91016ba3f955509753fb0scygan
6984b9229de0ea1993c94c91016ba3f955509753fb0scygan	deUint32 m_writeMask;
6994b9229de0ea1993c94c91016ba3f955509753fb0scygan	deUint32 m_readMask;
7004b9229de0ea1993c94c91016ba3f955509753fb0scygan	deUint32 m_expectedValue;
7014b9229de0ea1993c94c91016ba3f955509753fb0scygan	tcu::Vec4 m_expectedColor;
7024b9229de0ea1993c94c91016ba3f955509753fb0scygan
7034b9229de0ea1993c94c91016ba3f955509753fb0scyganpublic:
704db4efd02b79d71e0d0b1122d01d1a20b37760527scygan	StencilParamsBasicTestCase (tcu::TestContext& context, const char *name, const char *description,
705ae21c307c29a6efa73f3d4f2b25f0dd2c0b0e023Pyry Haulos								const deUint32 writeMask, const deUint32 readMask,
7064b9229de0ea1993c94c91016ba3f955509753fb0scygan								const deUint32 expectedValue, const tcu::Vec4 expectedColor)
7074b9229de0ea1993c94c91016ba3f955509753fb0scygan		: TestCase				(context, name, description)
7084b9229de0ea1993c94c91016ba3f955509753fb0scygan		, m_writeMask			(writeMask)
7094b9229de0ea1993c94c91016ba3f955509753fb0scygan		, m_readMask			(readMask)
7104b9229de0ea1993c94c91016ba3f955509753fb0scygan		, m_expectedValue		(expectedValue)
7114b9229de0ea1993c94c91016ba3f955509753fb0scygan		, m_expectedColor		(expectedColor)
7124b9229de0ea1993c94c91016ba3f955509753fb0scygan	{
7134b9229de0ea1993c94c91016ba3f955509753fb0scygan	}
7144b9229de0ea1993c94c91016ba3f955509753fb0scygan};
7154b9229de0ea1993c94c91016ba3f955509753fb0scygan
7164b9229de0ea1993c94c91016ba3f955509753fb0scyganclass StencilParamsAdvancedTestInstance : public DepthStencilBaseCase
7174b9229de0ea1993c94c91016ba3f955509753fb0scygan{
7184b9229de0ea1993c94c91016ba3f955509753fb0scyganpublic:
719db4efd02b79d71e0d0b1122d01d1a20b37760527scygan	StencilParamsAdvancedTestInstance (Context& context, ShaderMap shaders)
7204b9229de0ea1993c94c91016ba3f955509753fb0scygan		: DepthStencilBaseCase (context, shaders[glu::SHADERTYPE_VERTEX], shaders[glu::SHADERTYPE_FRAGMENT])
7214b9229de0ea1993c94c91016ba3f955509753fb0scygan	{
722db4efd02b79d71e0d0b1122d01d1a20b37760527scygan		m_data.push_back(PositionColorVertex(tcu::Vec4(-0.5f, 0.5f, 1.0f, 1.0f), tcu::RGBA::green().toVec()));
723db4efd02b79d71e0d0b1122d01d1a20b37760527scygan		m_data.push_back(PositionColorVertex(tcu::Vec4(0.5f, 0.5f, 1.0f, 1.0f), tcu::RGBA::green().toVec()));
724db4efd02b79d71e0d0b1122d01d1a20b37760527scygan		m_data.push_back(PositionColorVertex(tcu::Vec4(-0.5f, -0.5f, 1.0f, 1.0f), tcu::RGBA::green().toVec()));
725db4efd02b79d71e0d0b1122d01d1a20b37760527scygan		m_data.push_back(PositionColorVertex(tcu::Vec4(0.5f, -0.5f, 1.0f, 1.0f), tcu::RGBA::green().toVec()));
7264b9229de0ea1993c94c91016ba3f955509753fb0scygan
727db4efd02b79d71e0d0b1122d01d1a20b37760527scygan		m_data.push_back(PositionColorVertex(tcu::Vec4(-1.0f, 1.0f, 1.0f, 1.0f), tcu::RGBA::blue().toVec()));
728db4efd02b79d71e0d0b1122d01d1a20b37760527scygan		m_data.push_back(PositionColorVertex(tcu::Vec4(1.0f, 1.0f, 1.0f, 1.0f), tcu::RGBA::blue().toVec()));
729db4efd02b79d71e0d0b1122d01d1a20b37760527scygan		m_data.push_back(PositionColorVertex(tcu::Vec4(-1.0f, -1.0f, 1.0f, 1.0f), tcu::RGBA::blue().toVec()));
730db4efd02b79d71e0d0b1122d01d1a20b37760527scygan		m_data.push_back(PositionColorVertex(tcu::Vec4(1.0f, -1.0f, 1.0f, 1.0f), tcu::RGBA::blue().toVec()));
7314b9229de0ea1993c94c91016ba3f955509753fb0scygan
7324b9229de0ea1993c94c91016ba3f955509753fb0scygan		const PipelineCreateInfo::DepthStencilState::StencilOpState frontState_1 =
7334b9229de0ea1993c94c91016ba3f955509753fb0scygan			PipelineCreateInfo::DepthStencilState::StencilOpState(
7344b9229de0ea1993c94c91016ba3f955509753fb0scygan			vk::VK_STENCIL_OP_REPLACE,
7354b9229de0ea1993c94c91016ba3f955509753fb0scygan			vk::VK_STENCIL_OP_REPLACE,
7364b9229de0ea1993c94c91016ba3f955509753fb0scygan			vk::VK_STENCIL_OP_REPLACE,
7374b9229de0ea1993c94c91016ba3f955509753fb0scygan			vk::VK_COMPARE_OP_ALWAYS);
7384b9229de0ea1993c94c91016ba3f955509753fb0scygan
7394b9229de0ea1993c94c91016ba3f955509753fb0scygan		const PipelineCreateInfo::DepthStencilState::StencilOpState backState_1 =
7404b9229de0ea1993c94c91016ba3f955509753fb0scygan			PipelineCreateInfo::DepthStencilState::StencilOpState(
7414b9229de0ea1993c94c91016ba3f955509753fb0scygan			vk::VK_STENCIL_OP_REPLACE,
7424b9229de0ea1993c94c91016ba3f955509753fb0scygan			vk::VK_STENCIL_OP_REPLACE,
7434b9229de0ea1993c94c91016ba3f955509753fb0scygan			vk::VK_STENCIL_OP_REPLACE,
7444b9229de0ea1993c94c91016ba3f955509753fb0scygan			vk::VK_COMPARE_OP_ALWAYS);
7454b9229de0ea1993c94c91016ba3f955509753fb0scygan
7464b9229de0ea1993c94c91016ba3f955509753fb0scygan		const PipelineCreateInfo::DepthStencilState::StencilOpState frontState_2 =
7474b9229de0ea1993c94c91016ba3f955509753fb0scygan			PipelineCreateInfo::DepthStencilState::StencilOpState(
7484b9229de0ea1993c94c91016ba3f955509753fb0scygan			vk::VK_STENCIL_OP_REPLACE,
7494b9229de0ea1993c94c91016ba3f955509753fb0scygan			vk::VK_STENCIL_OP_REPLACE,
7504b9229de0ea1993c94c91016ba3f955509753fb0scygan			vk::VK_STENCIL_OP_REPLACE,
7514b9229de0ea1993c94c91016ba3f955509753fb0scygan			vk::VK_COMPARE_OP_NOT_EQUAL);
7524b9229de0ea1993c94c91016ba3f955509753fb0scygan
7534b9229de0ea1993c94c91016ba3f955509753fb0scygan		const PipelineCreateInfo::DepthStencilState::StencilOpState backState_2 =
7544b9229de0ea1993c94c91016ba3f955509753fb0scygan			PipelineCreateInfo::DepthStencilState::StencilOpState(
7554b9229de0ea1993c94c91016ba3f955509753fb0scygan			vk::VK_STENCIL_OP_REPLACE,
7564b9229de0ea1993c94c91016ba3f955509753fb0scygan			vk::VK_STENCIL_OP_REPLACE,
7574b9229de0ea1993c94c91016ba3f955509753fb0scygan			vk::VK_STENCIL_OP_REPLACE,
7584b9229de0ea1993c94c91016ba3f955509753fb0scygan			vk::VK_COMPARE_OP_NOT_EQUAL);
7594b9229de0ea1993c94c91016ba3f955509753fb0scygan
7604b9229de0ea1993c94c91016ba3f955509753fb0scygan		// enable stencil test
7614b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_depthStencilState_1 = PipelineCreateInfo::DepthStencilState(
7626cbd34be72b2b732fe4f8d60c850d52fb16f68bcPyry Haulos			VK_FALSE, VK_FALSE, vk::VK_COMPARE_OP_NEVER, VK_FALSE, VK_TRUE, frontState_1, backState_1);
7634b9229de0ea1993c94c91016ba3f955509753fb0scygan
7644b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_depthStencilState_2 = PipelineCreateInfo::DepthStencilState(
7656cbd34be72b2b732fe4f8d60c850d52fb16f68bcPyry Haulos			VK_FALSE, VK_FALSE, vk::VK_COMPARE_OP_NEVER, VK_FALSE, VK_TRUE, frontState_2, backState_2);
7664b9229de0ea1993c94c91016ba3f955509753fb0scygan
7674b9229de0ea1993c94c91016ba3f955509753fb0scygan		DepthStencilBaseCase::initialize();
7684b9229de0ea1993c94c91016ba3f955509753fb0scygan	}
7694b9229de0ea1993c94c91016ba3f955509753fb0scygan
7704b9229de0ea1993c94c91016ba3f955509753fb0scygan	virtual tcu::TestStatus iterate (void)
7714b9229de0ea1993c94c91016ba3f955509753fb0scygan	{
7724b9229de0ea1993c94c91016ba3f955509753fb0scygan		tcu::TestLog &log = m_context.getTestContext().getLog();
7734b9229de0ea1993c94c91016ba3f955509753fb0scygan		const vk::VkQueue queue = m_context.getUniversalQueue();
7744b9229de0ea1993c94c91016ba3f955509753fb0scygan
7754b9229de0ea1993c94c91016ba3f955509753fb0scygan		beginRenderPass();
7764b9229de0ea1993c94c91016ba3f955509753fb0scygan
7774b9229de0ea1993c94c91016ba3f955509753fb0scygan		// set states here
7784b9229de0ea1993c94c91016ba3f955509753fb0scygan		setDynamicViewportState(WIDTH, HEIGHT);
7796a2834ac40395173796b6e8d2a8e6c120d86ee74scygan		setDynamicRasterizationState();
7804b9229de0ea1993c94c91016ba3f955509753fb0scygan		setDynamicBlendState();
7814b9229de0ea1993c94c91016ba3f955509753fb0scygan
7824b9229de0ea1993c94c91016ba3f955509753fb0scygan		const vk::VkDeviceSize vertexBufferOffset = 0;
7834b9229de0ea1993c94c91016ba3f955509753fb0scygan		const vk::VkBuffer vertexBuffer = m_vertexBuffer->object();
7844b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_vk.cmdBindVertexBuffers(*m_cmdBuffer, 0, 1, &vertexBuffer, &vertexBufferOffset);
7854b9229de0ea1993c94c91016ba3f955509753fb0scygan
7864b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_vk.cmdBindPipeline(*m_cmdBuffer, vk::VK_PIPELINE_BIND_POINT_GRAPHICS, *m_pipeline_1);
7874b9229de0ea1993c94c91016ba3f955509753fb0scygan		setDynamicDepthStencilState(-1.0f, 1.0f, 0xFF, 0x0E, 0x0F, 0xFF, 0x0E, 0x0F);
7884b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_vk.cmdDraw(*m_cmdBuffer, 4, 1, 0, 0);
7894b9229de0ea1993c94c91016ba3f955509753fb0scygan
7904b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_vk.cmdBindPipeline(*m_cmdBuffer, vk::VK_PIPELINE_BIND_POINT_GRAPHICS, *m_pipeline_2);
7914b9229de0ea1993c94c91016ba3f955509753fb0scygan		setDynamicDepthStencilState(-1.0f, 1.0f, 0xFF, 0xFF, 0x0E, 0xFF, 0xFF, 0x0E);
7924b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_vk.cmdDraw(*m_cmdBuffer, 4, 1, 4, 0);
7934b9229de0ea1993c94c91016ba3f955509753fb0scygan
7944b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_vk.cmdEndRenderPass(*m_cmdBuffer);
7954b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_vk.endCommandBuffer(*m_cmdBuffer);
7964b9229de0ea1993c94c91016ba3f955509753fb0scygan
7976a2834ac40395173796b6e8d2a8e6c120d86ee74scygan		vk::VkSubmitInfo submitInfo =
7986a2834ac40395173796b6e8d2a8e6c120d86ee74scygan		{
7996a2834ac40395173796b6e8d2a8e6c120d86ee74scygan			vk::VK_STRUCTURE_TYPE_SUBMIT_INFO,	// VkStructureType			sType;
8006a2834ac40395173796b6e8d2a8e6c120d86ee74scygan			DE_NULL,							// const void*				pNext;
801ae21c307c29a6efa73f3d4f2b25f0dd2c0b0e023Pyry Haulos			0,									// deUint32					waitSemaphoreCount;
802ae21c307c29a6efa73f3d4f2b25f0dd2c0b0e023Pyry Haulos			DE_NULL,							// const VkSemaphore*		pWaitSemaphores;
803689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos			(const vk::VkPipelineStageFlags*)DE_NULL,
804ae21c307c29a6efa73f3d4f2b25f0dd2c0b0e023Pyry Haulos			1,									// deUint32					commandBufferCount;
8056a2834ac40395173796b6e8d2a8e6c120d86ee74scygan			&m_cmdBuffer.get(),					// const VkCommandBuffer*	pCommandBuffers;
806ae21c307c29a6efa73f3d4f2b25f0dd2c0b0e023Pyry Haulos			0,									// deUint32					signalSemaphoreCount;
8076a2834ac40395173796b6e8d2a8e6c120d86ee74scygan			DE_NULL								// const VkSemaphore*		pSignalSemaphores;
8086a2834ac40395173796b6e8d2a8e6c120d86ee74scygan		};
8096a2834ac40395173796b6e8d2a8e6c120d86ee74scygan		m_vk.queueSubmit(queue, 1, &submitInfo, DE_NULL);
8104b9229de0ea1993c94c91016ba3f955509753fb0scygan
8114b9229de0ea1993c94c91016ba3f955509753fb0scygan		// validation
8124b9229de0ea1993c94c91016ba3f955509753fb0scygan		{
8134b9229de0ea1993c94c91016ba3f955509753fb0scygan			VK_CHECK(m_vk.queueWaitIdle(queue));
8144b9229de0ea1993c94c91016ba3f955509753fb0scygan
8154b9229de0ea1993c94c91016ba3f955509753fb0scygan			tcu::Texture2D referenceFrame(vk::mapVkFormat(m_colorAttachmentFormat), (int)(0.5 + WIDTH), (int)(0.5 + HEIGHT));
8164b9229de0ea1993c94c91016ba3f955509753fb0scygan			referenceFrame.allocLevel(0);
8174b9229de0ea1993c94c91016ba3f955509753fb0scygan
8184b9229de0ea1993c94c91016ba3f955509753fb0scygan			const deInt32 frameWidth = referenceFrame.getWidth();
8194b9229de0ea1993c94c91016ba3f955509753fb0scygan			const deInt32 frameHeight = referenceFrame.getHeight();
8204b9229de0ea1993c94c91016ba3f955509753fb0scygan
8214b9229de0ea1993c94c91016ba3f955509753fb0scygan			for (int y = 0; y < frameHeight; y++)
8224b9229de0ea1993c94c91016ba3f955509753fb0scygan			{
8234b9229de0ea1993c94c91016ba3f955509753fb0scygan				const float yCoord = (float)(y / (0.5*frameHeight)) - 1.0f;
8244b9229de0ea1993c94c91016ba3f955509753fb0scygan
8254b9229de0ea1993c94c91016ba3f955509753fb0scygan				for (int x = 0; x < frameWidth; x++)
8264b9229de0ea1993c94c91016ba3f955509753fb0scygan				{
8274b9229de0ea1993c94c91016ba3f955509753fb0scygan					const float xCoord = (float)(x / (0.5*frameWidth)) - 1.0f;
8284b9229de0ea1993c94c91016ba3f955509753fb0scygan
8294b9229de0ea1993c94c91016ba3f955509753fb0scygan					if (xCoord >= -0.5f && xCoord <= 0.5f && yCoord >= -0.5f && yCoord <= 0.5f)
8304b9229de0ea1993c94c91016ba3f955509753fb0scygan						referenceFrame.getLevel(0).setPixel(tcu::Vec4(0.0f, 1.0f, 0.0f, 1.0f), x, y);
8314b9229de0ea1993c94c91016ba3f955509753fb0scygan					else
8324b9229de0ea1993c94c91016ba3f955509753fb0scygan						referenceFrame.getLevel(0).setPixel(tcu::Vec4(0.0f, 0.0f, 1.0f, 1.0f), x, y);
8334b9229de0ea1993c94c91016ba3f955509753fb0scygan				}
8344b9229de0ea1993c94c91016ba3f955509753fb0scygan			}
8354b9229de0ea1993c94c91016ba3f955509753fb0scygan
8364b9229de0ea1993c94c91016ba3f955509753fb0scygan			const vk::VkOffset3D zeroOffset = { 0, 0, 0 };
8374b9229de0ea1993c94c91016ba3f955509753fb0scygan			const tcu::ConstPixelBufferAccess renderedFrame = m_colorTargetImage->readSurface(queue, m_context.getDefaultAllocator(),
8386a2834ac40395173796b6e8d2a8e6c120d86ee74scygan				vk::VK_IMAGE_LAYOUT_GENERAL, zeroOffset, WIDTH, HEIGHT, vk::VK_IMAGE_ASPECT_COLOR_BIT);
8394b9229de0ea1993c94c91016ba3f955509753fb0scygan
8404b9229de0ea1993c94c91016ba3f955509753fb0scygan			if (!tcu::fuzzyCompare(log, "Result", "Image comparison result",
8414b9229de0ea1993c94c91016ba3f955509753fb0scygan				referenceFrame.getLevel(0), renderedFrame, 0.05f,
8424b9229de0ea1993c94c91016ba3f955509753fb0scygan				tcu::COMPARE_LOG_RESULT))
8434b9229de0ea1993c94c91016ba3f955509753fb0scygan			{
844db4efd02b79d71e0d0b1122d01d1a20b37760527scygan				return tcu::TestStatus(QP_TEST_RESULT_FAIL, "Image verification failed");
8454b9229de0ea1993c94c91016ba3f955509753fb0scygan			}
8464b9229de0ea1993c94c91016ba3f955509753fb0scygan
847db4efd02b79d71e0d0b1122d01d1a20b37760527scygan			return tcu::TestStatus(QP_TEST_RESULT_PASS, "Image verification passed");
8484b9229de0ea1993c94c91016ba3f955509753fb0scygan		}
8494b9229de0ea1993c94c91016ba3f955509753fb0scygan	}
8504b9229de0ea1993c94c91016ba3f955509753fb0scygan};
8514b9229de0ea1993c94c91016ba3f955509753fb0scygan
8524b9229de0ea1993c94c91016ba3f955509753fb0scygan} //anonymous
8534b9229de0ea1993c94c91016ba3f955509753fb0scygan
854db4efd02b79d71e0d0b1122d01d1a20b37760527scyganDynamicStateDSTests::DynamicStateDSTests (tcu::TestContext& testCtx)
8554b9229de0ea1993c94c91016ba3f955509753fb0scygan	: TestCaseGroup (testCtx, "ds_state", "Tests for depth stencil state")
8564b9229de0ea1993c94c91016ba3f955509753fb0scygan{
8574b9229de0ea1993c94c91016ba3f955509753fb0scygan	/* Left blank on purpose */
8584b9229de0ea1993c94c91016ba3f955509753fb0scygan}
8594b9229de0ea1993c94c91016ba3f955509753fb0scygan
860db4efd02b79d71e0d0b1122d01d1a20b37760527scyganDynamicStateDSTests::~DynamicStateDSTests ()
861db4efd02b79d71e0d0b1122d01d1a20b37760527scygan{
862db4efd02b79d71e0d0b1122d01d1a20b37760527scygan}
8634b9229de0ea1993c94c91016ba3f955509753fb0scygan
8644b9229de0ea1993c94c91016ba3f955509753fb0scyganvoid DynamicStateDSTests::init (void)
8654b9229de0ea1993c94c91016ba3f955509753fb0scygan{
8664b9229de0ea1993c94c91016ba3f955509753fb0scygan	ShaderMap shaderPaths;
8674b9229de0ea1993c94c91016ba3f955509753fb0scygan	shaderPaths[glu::SHADERTYPE_VERTEX] = "vulkan/dynamic_state/VertexFetch.vert";
8684b9229de0ea1993c94c91016ba3f955509753fb0scygan	shaderPaths[glu::SHADERTYPE_FRAGMENT] = "vulkan/dynamic_state/VertexFetch.frag";
8694b9229de0ea1993c94c91016ba3f955509753fb0scygan
8704b9229de0ea1993c94c91016ba3f955509753fb0scygan	addChild(new InstanceFactory<DepthBoundsParamTestInstance>(m_testCtx, "depth_bounds", "Perform depth bounds test", shaderPaths));
8714b9229de0ea1993c94c91016ba3f955509753fb0scygan	addChild(new StencilParamsBasicTestCase(m_testCtx, "stencil_params_basic_1", "Perform basic stencil test 1", 0x0D, 0x06, 0x05, tcu::Vec4(0.0f, 0.0f, 1.0f, 1.0f)));
8724b9229de0ea1993c94c91016ba3f955509753fb0scygan	addChild(new StencilParamsBasicTestCase(m_testCtx, "stencil_params_basic_2", "Perform basic stencil test 2", 0x06, 0x02, 0x05, tcu::Vec4(0.0f, 1.0f, 0.0f, 1.0f)));
8734b9229de0ea1993c94c91016ba3f955509753fb0scygan	addChild(new InstanceFactory<StencilParamsAdvancedTestInstance>(m_testCtx, "stencil_params_advanced", "Perform advanced stencil test", shaderPaths));
8744b9229de0ea1993c94c91016ba3f955509753fb0scygan}
8754b9229de0ea1993c94c91016ba3f955509753fb0scygan
876db4efd02b79d71e0d0b1122d01d1a20b37760527scygan} // DynamicState
877db4efd02b79d71e0d0b1122d01d1a20b37760527scygan} // vkt
878