14b9229de0ea1993c94c91016ba3f955509753fb0scygan/*------------------------------------------------------------------------
24b9229de0ea1993c94c91016ba3f955509753fb0scygan * Vulkan Conformance Tests
34b9229de0ea1993c94c91016ba3f955509753fb0scygan * ------------------------
44b9229de0ea1993c94c91016ba3f955509753fb0scygan *
54b9229de0ea1993c94c91016ba3f955509753fb0scygan * Copyright (c) 2015 The Khronos Group Inc.
64b9229de0ea1993c94c91016ba3f955509753fb0scygan * Copyright (c) 2015 Intel Corporation
74b9229de0ea1993c94c91016ba3f955509753fb0scygan *
8d471a12fca5d3077a4ca28eebf83685f4208c3b6Pyry Haulos * Licensed under the Apache License, Version 2.0 (the "License");
9d471a12fca5d3077a4ca28eebf83685f4208c3b6Pyry Haulos * you may not use this file except in compliance with the License.
10d471a12fca5d3077a4ca28eebf83685f4208c3b6Pyry Haulos * You may obtain a copy of the License at
114b9229de0ea1993c94c91016ba3f955509753fb0scygan *
12d471a12fca5d3077a4ca28eebf83685f4208c3b6Pyry Haulos *      http://www.apache.org/licenses/LICENSE-2.0
134b9229de0ea1993c94c91016ba3f955509753fb0scygan *
14d471a12fca5d3077a4ca28eebf83685f4208c3b6Pyry Haulos * Unless required by applicable law or agreed to in writing, software
15d471a12fca5d3077a4ca28eebf83685f4208c3b6Pyry Haulos * distributed under the License is distributed on an "AS IS" BASIS,
16d471a12fca5d3077a4ca28eebf83685f4208c3b6Pyry Haulos * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17d471a12fca5d3077a4ca28eebf83685f4208c3b6Pyry Haulos * See the License for the specific language governing permissions and
18d471a12fca5d3077a4ca28eebf83685f4208c3b6Pyry Haulos * limitations under the License.
194b9229de0ea1993c94c91016ba3f955509753fb0scygan *
204b9229de0ea1993c94c91016ba3f955509753fb0scygan *//*!
214b9229de0ea1993c94c91016ba3f955509753fb0scygan * \file
224b9229de0ea1993c94c91016ba3f955509753fb0scygan * \brief Dynamic Raster State Tests
234b9229de0ea1993c94c91016ba3f955509753fb0scygan *//*--------------------------------------------------------------------*/
244b9229de0ea1993c94c91016ba3f955509753fb0scygan
254b9229de0ea1993c94c91016ba3f955509753fb0scygan#include "vktDynamicStateRSTests.hpp"
264b9229de0ea1993c94c91016ba3f955509753fb0scygan
27db4efd02b79d71e0d0b1122d01d1a20b37760527scygan#include "vktDynamicStateBaseClass.hpp"
284b9229de0ea1993c94c91016ba3f955509753fb0scygan#include "vktDynamicStateTestCaseUtil.hpp"
29db4efd02b79d71e0d0b1122d01d1a20b37760527scygan
30db4efd02b79d71e0d0b1122d01d1a20b37760527scygan#include "vkImageUtil.hpp"
31db4efd02b79d71e0d0b1122d01d1a20b37760527scygan
324b9229de0ea1993c94c91016ba3f955509753fb0scygan#include "tcuTextureUtil.hpp"
33db4efd02b79d71e0d0b1122d01d1a20b37760527scygan#include "tcuImageCompare.hpp"
34db4efd02b79d71e0d0b1122d01d1a20b37760527scygan#include "tcuRGBA.hpp"
354b9229de0ea1993c94c91016ba3f955509753fb0scygan
364b9229de0ea1993c94c91016ba3f955509753fb0scygan#include "deMath.h"
374b9229de0ea1993c94c91016ba3f955509753fb0scygan
384b9229de0ea1993c94c91016ba3f955509753fb0scygannamespace vkt
394b9229de0ea1993c94c91016ba3f955509753fb0scygan{
404b9229de0ea1993c94c91016ba3f955509753fb0scygannamespace DynamicState
414b9229de0ea1993c94c91016ba3f955509753fb0scygan{
42456eedb873ee0b778240c067e9ac72529fc444dfPyry Haulos
43456eedb873ee0b778240c067e9ac72529fc444dfPyry Haulosusing namespace Draw;
44456eedb873ee0b778240c067e9ac72529fc444dfPyry Haulos
454b9229de0ea1993c94c91016ba3f955509753fb0scygannamespace
464b9229de0ea1993c94c91016ba3f955509753fb0scygan{
474b9229de0ea1993c94c91016ba3f955509753fb0scygan
484b9229de0ea1993c94c91016ba3f955509753fb0scyganclass DepthBiasBaseCase : public TestInstance
494b9229de0ea1993c94c91016ba3f955509753fb0scygan{
504b9229de0ea1993c94c91016ba3f955509753fb0scyganpublic:
51db4efd02b79d71e0d0b1122d01d1a20b37760527scygan	DepthBiasBaseCase (Context& context, const char* vertexShaderName, const char* fragmentShaderName)
524b9229de0ea1993c94c91016ba3f955509753fb0scygan		: TestInstance						(context)
534b9229de0ea1993c94c91016ba3f955509753fb0scygan		, m_colorAttachmentFormat			(vk::VK_FORMAT_R8G8B8A8_UNORM)
544b9229de0ea1993c94c91016ba3f955509753fb0scygan		, m_topology						(vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP)
55ae21c307c29a6efa73f3d4f2b25f0dd2c0b0e023Pyry Haulos		, m_vk								(context.getDeviceInterface())
564b9229de0ea1993c94c91016ba3f955509753fb0scygan		, m_vertexShaderName				(vertexShaderName)
574b9229de0ea1993c94c91016ba3f955509753fb0scygan		, m_fragmentShaderName				(fragmentShaderName)
584b9229de0ea1993c94c91016ba3f955509753fb0scygan	{
594b9229de0ea1993c94c91016ba3f955509753fb0scygan	}
604b9229de0ea1993c94c91016ba3f955509753fb0scygan
614b9229de0ea1993c94c91016ba3f955509753fb0scyganprotected:
624b9229de0ea1993c94c91016ba3f955509753fb0scygan
63ae21c307c29a6efa73f3d4f2b25f0dd2c0b0e023Pyry Haulos	enum
644b9229de0ea1993c94c91016ba3f955509753fb0scygan	{
654b9229de0ea1993c94c91016ba3f955509753fb0scygan		WIDTH	= 128,
664b9229de0ea1993c94c91016ba3f955509753fb0scygan		HEIGHT	= 128
674b9229de0ea1993c94c91016ba3f955509753fb0scygan	};
684b9229de0ea1993c94c91016ba3f955509753fb0scygan
694b9229de0ea1993c94c91016ba3f955509753fb0scygan	vk::VkFormat									m_colorAttachmentFormat;
704b9229de0ea1993c94c91016ba3f955509753fb0scygan	vk::VkFormat									m_depthStencilAttachmentFormat;
714b9229de0ea1993c94c91016ba3f955509753fb0scygan
724b9229de0ea1993c94c91016ba3f955509753fb0scygan	vk::VkPrimitiveTopology							m_topology;
734b9229de0ea1993c94c91016ba3f955509753fb0scygan
744b9229de0ea1993c94c91016ba3f955509753fb0scygan	const vk::DeviceInterface&						m_vk;
754b9229de0ea1993c94c91016ba3f955509753fb0scygan
764b9229de0ea1993c94c91016ba3f955509753fb0scygan	vk::Move<vk::VkPipeline>						m_pipeline;
774b9229de0ea1993c94c91016ba3f955509753fb0scygan	vk::Move<vk::VkPipelineLayout>					m_pipelineLayout;
784b9229de0ea1993c94c91016ba3f955509753fb0scygan
794b9229de0ea1993c94c91016ba3f955509753fb0scygan	de::SharedPtr<Image>							m_colorTargetImage;
804b9229de0ea1993c94c91016ba3f955509753fb0scygan	vk::Move<vk::VkImageView>						m_colorTargetView;
814b9229de0ea1993c94c91016ba3f955509753fb0scygan
824b9229de0ea1993c94c91016ba3f955509753fb0scygan	de::SharedPtr<Image>							m_depthStencilImage;
834b9229de0ea1993c94c91016ba3f955509753fb0scygan	vk::Move<vk::VkImageView>						m_attachmentView;
844b9229de0ea1993c94c91016ba3f955509753fb0scygan
854b9229de0ea1993c94c91016ba3f955509753fb0scygan	PipelineCreateInfo::VertexInputState			m_vertexInputState;
864b9229de0ea1993c94c91016ba3f955509753fb0scygan	de::SharedPtr<Buffer>							m_vertexBuffer;
874b9229de0ea1993c94c91016ba3f955509753fb0scygan
886a2834ac40395173796b6e8d2a8e6c120d86ee74scygan	vk::Move<vk::VkCommandPool>						m_cmdPool;
896a2834ac40395173796b6e8d2a8e6c120d86ee74scygan	vk::Move<vk::VkCommandBuffer>					m_cmdBuffer;
904b9229de0ea1993c94c91016ba3f955509753fb0scygan
914b9229de0ea1993c94c91016ba3f955509753fb0scygan	vk::Move<vk::VkFramebuffer>						m_framebuffer;
924b9229de0ea1993c94c91016ba3f955509753fb0scygan	vk::Move<vk::VkRenderPass>						m_renderPass;
934b9229de0ea1993c94c91016ba3f955509753fb0scygan
944b9229de0ea1993c94c91016ba3f955509753fb0scygan	std::string										m_vertexShaderName;
954b9229de0ea1993c94c91016ba3f955509753fb0scygan	std::string										m_fragmentShaderName;
964b9229de0ea1993c94c91016ba3f955509753fb0scygan
97db4efd02b79d71e0d0b1122d01d1a20b37760527scygan	std::vector<PositionColorVertex>				m_data;
984b9229de0ea1993c94c91016ba3f955509753fb0scygan
99db4efd02b79d71e0d0b1122d01d1a20b37760527scygan	PipelineCreateInfo::DepthStencilState			m_depthStencilState;
1004b9229de0ea1993c94c91016ba3f955509753fb0scygan
1014b9229de0ea1993c94c91016ba3f955509753fb0scygan	void initialize (void)
1024b9229de0ea1993c94c91016ba3f955509753fb0scygan	{
103db4efd02b79d71e0d0b1122d01d1a20b37760527scygan		const vk::VkDevice device	= m_context.getDevice();
1044b9229de0ea1993c94c91016ba3f955509753fb0scygan
10591e51d60e47a7a138ef7189f4aaedb56051e4957asokolow		vk::VkFormatProperties formatProperties;
10691e51d60e47a7a138ef7189f4aaedb56051e4957asokolow		// check for VK_FORMAT_D24_UNORM_S8_UINT support
10791e51d60e47a7a138ef7189f4aaedb56051e4957asokolow		m_context.getInstanceInterface().getPhysicalDeviceFormatProperties(m_context.getPhysicalDevice(), vk::VK_FORMAT_D24_UNORM_S8_UINT, &formatProperties);
10891e51d60e47a7a138ef7189f4aaedb56051e4957asokolow		if (formatProperties.optimalTilingFeatures & vk::VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT)
10991e51d60e47a7a138ef7189f4aaedb56051e4957asokolow		{
11091e51d60e47a7a138ef7189f4aaedb56051e4957asokolow			m_depthStencilAttachmentFormat = vk::VK_FORMAT_D24_UNORM_S8_UINT;
11191e51d60e47a7a138ef7189f4aaedb56051e4957asokolow		}
11291e51d60e47a7a138ef7189f4aaedb56051e4957asokolow		else
11391e51d60e47a7a138ef7189f4aaedb56051e4957asokolow		{
11491e51d60e47a7a138ef7189f4aaedb56051e4957asokolow			// check for VK_FORMAT_D32_SFLOAT_S8_UINT support
11591e51d60e47a7a138ef7189f4aaedb56051e4957asokolow			m_context.getInstanceInterface().getPhysicalDeviceFormatProperties(m_context.getPhysicalDevice(), vk::VK_FORMAT_D32_SFLOAT_S8_UINT, &formatProperties);
11691e51d60e47a7a138ef7189f4aaedb56051e4957asokolow			if (formatProperties.optimalTilingFeatures & vk::VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT)
11791e51d60e47a7a138ef7189f4aaedb56051e4957asokolow			{
11891e51d60e47a7a138ef7189f4aaedb56051e4957asokolow				m_depthStencilAttachmentFormat = vk::VK_FORMAT_D32_SFLOAT_S8_UINT;
11991e51d60e47a7a138ef7189f4aaedb56051e4957asokolow			}
12091e51d60e47a7a138ef7189f4aaedb56051e4957asokolow			else
12191e51d60e47a7a138ef7189f4aaedb56051e4957asokolow				throw tcu::NotSupportedError("No valid depth stencil attachment available");
12291e51d60e47a7a138ef7189f4aaedb56051e4957asokolow		}
12391e51d60e47a7a138ef7189f4aaedb56051e4957asokolow
1244b9229de0ea1993c94c91016ba3f955509753fb0scygan		const PipelineLayoutCreateInfo pipelineLayoutCreateInfo;
125db4efd02b79d71e0d0b1122d01d1a20b37760527scygan		m_pipelineLayout			= vk::createPipelineLayout(m_vk, device, &pipelineLayoutCreateInfo);
1264b9229de0ea1993c94c91016ba3f955509753fb0scygan
1276a2834ac40395173796b6e8d2a8e6c120d86ee74scygan		const vk::Unique<vk::VkShaderModule> vs(createShaderModule(m_vk, device, m_context.getBinaryCollection().get(m_vertexShaderName), 0));
1286a2834ac40395173796b6e8d2a8e6c120d86ee74scygan		const vk::Unique<vk::VkShaderModule> fs(createShaderModule(m_vk, device, m_context.getBinaryCollection().get(m_fragmentShaderName), 0));
1294b9229de0ea1993c94c91016ba3f955509753fb0scygan
1304b9229de0ea1993c94c91016ba3f955509753fb0scygan		const vk::VkExtent3D imageExtent = { WIDTH, HEIGHT, 1 };
131db4efd02b79d71e0d0b1122d01d1a20b37760527scygan		ImageCreateInfo targetImageCreateInfo(vk::VK_IMAGE_TYPE_2D, m_colorAttachmentFormat, imageExtent, 1, 1, vk::VK_SAMPLE_COUNT_1_BIT, vk::VK_IMAGE_TILING_OPTIMAL,
13247dbc69873f0290ea73f1b3b19bb7d5df3a01bf5Joerg Wagner											  vk::VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | vk::VK_IMAGE_USAGE_TRANSFER_SRC_BIT | vk::VK_IMAGE_USAGE_TRANSFER_DST_BIT);
1334b9229de0ea1993c94c91016ba3f955509753fb0scygan
1346a2834ac40395173796b6e8d2a8e6c120d86ee74scygan		m_colorTargetImage = Image::createAndAlloc(m_vk, device, targetImageCreateInfo, m_context.getDefaultAllocator());
1354b9229de0ea1993c94c91016ba3f955509753fb0scygan
136db4efd02b79d71e0d0b1122d01d1a20b37760527scygan		const ImageCreateInfo depthStencilImageCreateInfo(vk::VK_IMAGE_TYPE_2D, m_depthStencilAttachmentFormat, imageExtent,
137db4efd02b79d71e0d0b1122d01d1a20b37760527scygan														  1, 1, vk::VK_SAMPLE_COUNT_1_BIT, vk::VK_IMAGE_TILING_OPTIMAL,
13847dbc69873f0290ea73f1b3b19bb7d5df3a01bf5Joerg Wagner														  vk::VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | vk::VK_IMAGE_USAGE_TRANSFER_DST_BIT);
1394b9229de0ea1993c94c91016ba3f955509753fb0scygan
1406a2834ac40395173796b6e8d2a8e6c120d86ee74scygan		m_depthStencilImage = Image::createAndAlloc(m_vk, device, depthStencilImageCreateInfo, m_context.getDefaultAllocator());
1414b9229de0ea1993c94c91016ba3f955509753fb0scygan
1424b9229de0ea1993c94c91016ba3f955509753fb0scygan		const ImageViewCreateInfo colorTargetViewInfo(m_colorTargetImage->object(), vk::VK_IMAGE_VIEW_TYPE_2D, m_colorAttachmentFormat);
1434b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_colorTargetView = vk::createImageView(m_vk, device, &colorTargetViewInfo);
1444b9229de0ea1993c94c91016ba3f955509753fb0scygan
1454b9229de0ea1993c94c91016ba3f955509753fb0scygan		const ImageViewCreateInfo attachmentViewInfo(m_depthStencilImage->object(), vk::VK_IMAGE_VIEW_TYPE_2D, m_depthStencilAttachmentFormat);
1464b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_attachmentView = vk::createImageView(m_vk, device, &attachmentViewInfo);
1474b9229de0ea1993c94c91016ba3f955509753fb0scygan
1484b9229de0ea1993c94c91016ba3f955509753fb0scygan		RenderPassCreateInfo renderPassCreateInfo;
149db4efd02b79d71e0d0b1122d01d1a20b37760527scygan		renderPassCreateInfo.addAttachment(AttachmentDescription(m_colorAttachmentFormat,
150db4efd02b79d71e0d0b1122d01d1a20b37760527scygan																 vk::VK_SAMPLE_COUNT_1_BIT,
151db4efd02b79d71e0d0b1122d01d1a20b37760527scygan																 vk::VK_ATTACHMENT_LOAD_OP_LOAD,
152db4efd02b79d71e0d0b1122d01d1a20b37760527scygan																 vk::VK_ATTACHMENT_STORE_OP_STORE,
153db4efd02b79d71e0d0b1122d01d1a20b37760527scygan																 vk::VK_ATTACHMENT_LOAD_OP_DONT_CARE,
154db4efd02b79d71e0d0b1122d01d1a20b37760527scygan																 vk::VK_ATTACHMENT_STORE_OP_STORE,
155db4efd02b79d71e0d0b1122d01d1a20b37760527scygan																 vk::VK_IMAGE_LAYOUT_GENERAL,
156db4efd02b79d71e0d0b1122d01d1a20b37760527scygan																 vk::VK_IMAGE_LAYOUT_GENERAL));
157db4efd02b79d71e0d0b1122d01d1a20b37760527scygan
158db4efd02b79d71e0d0b1122d01d1a20b37760527scygan		renderPassCreateInfo.addAttachment(AttachmentDescription(m_depthStencilAttachmentFormat,
159db4efd02b79d71e0d0b1122d01d1a20b37760527scygan																 vk::VK_SAMPLE_COUNT_1_BIT,
160db4efd02b79d71e0d0b1122d01d1a20b37760527scygan																 vk::VK_ATTACHMENT_LOAD_OP_LOAD,
161db4efd02b79d71e0d0b1122d01d1a20b37760527scygan																 vk::VK_ATTACHMENT_STORE_OP_STORE,
162db4efd02b79d71e0d0b1122d01d1a20b37760527scygan																 vk::VK_ATTACHMENT_LOAD_OP_DONT_CARE,
163db4efd02b79d71e0d0b1122d01d1a20b37760527scygan																 vk::VK_ATTACHMENT_STORE_OP_STORE,
164db4efd02b79d71e0d0b1122d01d1a20b37760527scygan																 vk::VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
165db4efd02b79d71e0d0b1122d01d1a20b37760527scygan																 vk::VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL));
1664b9229de0ea1993c94c91016ba3f955509753fb0scygan
1674b9229de0ea1993c94c91016ba3f955509753fb0scygan		const vk::VkAttachmentReference colorAttachmentReference =
1684b9229de0ea1993c94c91016ba3f955509753fb0scygan		{
1694b9229de0ea1993c94c91016ba3f955509753fb0scygan			0,
1704b9229de0ea1993c94c91016ba3f955509753fb0scygan			vk::VK_IMAGE_LAYOUT_GENERAL
1714b9229de0ea1993c94c91016ba3f955509753fb0scygan		};
1724b9229de0ea1993c94c91016ba3f955509753fb0scygan
1734b9229de0ea1993c94c91016ba3f955509753fb0scygan		const vk::VkAttachmentReference depthAttachmentReference =
1744b9229de0ea1993c94c91016ba3f955509753fb0scygan		{
1754b9229de0ea1993c94c91016ba3f955509753fb0scygan			1,
1764b9229de0ea1993c94c91016ba3f955509753fb0scygan			vk::VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL
1774b9229de0ea1993c94c91016ba3f955509753fb0scygan		};
1784b9229de0ea1993c94c91016ba3f955509753fb0scygan
179db4efd02b79d71e0d0b1122d01d1a20b37760527scygan		renderPassCreateInfo.addSubpass(SubpassDescription(vk::VK_PIPELINE_BIND_POINT_GRAPHICS,
180db4efd02b79d71e0d0b1122d01d1a20b37760527scygan														   0,
181db4efd02b79d71e0d0b1122d01d1a20b37760527scygan														   0,
182db4efd02b79d71e0d0b1122d01d1a20b37760527scygan														   DE_NULL,
183db4efd02b79d71e0d0b1122d01d1a20b37760527scygan														   1,
184db4efd02b79d71e0d0b1122d01d1a20b37760527scygan														   &colorAttachmentReference,
185db4efd02b79d71e0d0b1122d01d1a20b37760527scygan														   DE_NULL,
186db4efd02b79d71e0d0b1122d01d1a20b37760527scygan														   depthAttachmentReference,
187db4efd02b79d71e0d0b1122d01d1a20b37760527scygan														   0,
188db4efd02b79d71e0d0b1122d01d1a20b37760527scygan														   DE_NULL));
1894b9229de0ea1993c94c91016ba3f955509753fb0scygan
1904b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_renderPass = vk::createRenderPass(m_vk, device, &renderPassCreateInfo);
1914b9229de0ea1993c94c91016ba3f955509753fb0scygan
1924b9229de0ea1993c94c91016ba3f955509753fb0scygan		const vk::VkVertexInputBindingDescription vertexInputBindingDescription =
1934b9229de0ea1993c94c91016ba3f955509753fb0scygan		{
1944b9229de0ea1993c94c91016ba3f955509753fb0scygan			0,
195ed4815d8ed2992c78a19e41910fd8ccd0f6bb432Pyry Haulos			(deUint32)sizeof(tcu::Vec4) * 2,
1966a2834ac40395173796b6e8d2a8e6c120d86ee74scygan			vk::VK_VERTEX_INPUT_RATE_VERTEX,
1974b9229de0ea1993c94c91016ba3f955509753fb0scygan		};
1984b9229de0ea1993c94c91016ba3f955509753fb0scygan
1994b9229de0ea1993c94c91016ba3f955509753fb0scygan		const vk::VkVertexInputAttributeDescription vertexInputAttributeDescriptions[2] =
2004b9229de0ea1993c94c91016ba3f955509753fb0scygan		{
2014b9229de0ea1993c94c91016ba3f955509753fb0scygan			{
2024b9229de0ea1993c94c91016ba3f955509753fb0scygan				0u,
2034b9229de0ea1993c94c91016ba3f955509753fb0scygan				0u,
2044b9229de0ea1993c94c91016ba3f955509753fb0scygan				vk::VK_FORMAT_R32G32B32A32_SFLOAT,
2054b9229de0ea1993c94c91016ba3f955509753fb0scygan				0u
2064b9229de0ea1993c94c91016ba3f955509753fb0scygan			},
2074b9229de0ea1993c94c91016ba3f955509753fb0scygan			{
2084b9229de0ea1993c94c91016ba3f955509753fb0scygan				1u,
2094b9229de0ea1993c94c91016ba3f955509753fb0scygan				0u,
2104b9229de0ea1993c94c91016ba3f955509753fb0scygan				vk::VK_FORMAT_R32G32B32A32_SFLOAT,
2114b9229de0ea1993c94c91016ba3f955509753fb0scygan				(deUint32)(sizeof(float)* 4),
2124b9229de0ea1993c94c91016ba3f955509753fb0scygan			}
2134b9229de0ea1993c94c91016ba3f955509753fb0scygan		};
2144b9229de0ea1993c94c91016ba3f955509753fb0scygan
215db4efd02b79d71e0d0b1122d01d1a20b37760527scygan		m_vertexInputState = PipelineCreateInfo::VertexInputState(1,
216db4efd02b79d71e0d0b1122d01d1a20b37760527scygan																  &vertexInputBindingDescription,
217db4efd02b79d71e0d0b1122d01d1a20b37760527scygan																  2,
218db4efd02b79d71e0d0b1122d01d1a20b37760527scygan																  vertexInputAttributeDescriptions);
2194b9229de0ea1993c94c91016ba3f955509753fb0scygan
2204b9229de0ea1993c94c91016ba3f955509753fb0scygan		const PipelineCreateInfo::ColorBlendState::Attachment vkCbAttachmentState;
2214b9229de0ea1993c94c91016ba3f955509753fb0scygan
2224b9229de0ea1993c94c91016ba3f955509753fb0scygan		PipelineCreateInfo pipelineCreateInfo(*m_pipelineLayout, *m_renderPass, 0, 0);
2236a2834ac40395173796b6e8d2a8e6c120d86ee74scygan		pipelineCreateInfo.addShader(PipelineCreateInfo::PipelineShaderStage(*vs, "main", vk::VK_SHADER_STAGE_VERTEX_BIT));
2246a2834ac40395173796b6e8d2a8e6c120d86ee74scygan		pipelineCreateInfo.addShader(PipelineCreateInfo::PipelineShaderStage(*fs, "main", vk::VK_SHADER_STAGE_FRAGMENT_BIT));
2254b9229de0ea1993c94c91016ba3f955509753fb0scygan		pipelineCreateInfo.addState(PipelineCreateInfo::VertexInputState(m_vertexInputState));
2264b9229de0ea1993c94c91016ba3f955509753fb0scygan		pipelineCreateInfo.addState(PipelineCreateInfo::InputAssemblerState(m_topology));
2274b9229de0ea1993c94c91016ba3f955509753fb0scygan		pipelineCreateInfo.addState(PipelineCreateInfo::ColorBlendState(1, &vkCbAttachmentState));
2284b9229de0ea1993c94c91016ba3f955509753fb0scygan		pipelineCreateInfo.addState(PipelineCreateInfo::ViewportState(1));
2294b9229de0ea1993c94c91016ba3f955509753fb0scygan		pipelineCreateInfo.addState(m_depthStencilState);
2304b9229de0ea1993c94c91016ba3f955509753fb0scygan		pipelineCreateInfo.addState(PipelineCreateInfo::RasterizerState());
2314b9229de0ea1993c94c91016ba3f955509753fb0scygan		pipelineCreateInfo.addState(PipelineCreateInfo::MultiSampleState());
2324b9229de0ea1993c94c91016ba3f955509753fb0scygan		pipelineCreateInfo.addState(PipelineCreateInfo::DynamicState());
2334b9229de0ea1993c94c91016ba3f955509753fb0scygan
2344b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_pipeline = vk::createGraphicsPipeline(m_vk, device, DE_NULL, &pipelineCreateInfo);
2354b9229de0ea1993c94c91016ba3f955509753fb0scygan
2364b9229de0ea1993c94c91016ba3f955509753fb0scygan		std::vector<vk::VkImageView> attachments(2);
2374b9229de0ea1993c94c91016ba3f955509753fb0scygan		attachments[0] = *m_colorTargetView;
2384b9229de0ea1993c94c91016ba3f955509753fb0scygan		attachments[1] = *m_attachmentView;
2394b9229de0ea1993c94c91016ba3f955509753fb0scygan
2404b9229de0ea1993c94c91016ba3f955509753fb0scygan		const FramebufferCreateInfo framebufferCreateInfo(*m_renderPass, attachments, WIDTH, HEIGHT, 1);
2414b9229de0ea1993c94c91016ba3f955509753fb0scygan
2424b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_framebuffer = vk::createFramebuffer(m_vk, device, &framebufferCreateInfo);
2434b9229de0ea1993c94c91016ba3f955509753fb0scygan
244db4efd02b79d71e0d0b1122d01d1a20b37760527scygan		const vk::VkDeviceSize dataSize = m_data.size() * sizeof(PositionColorVertex);
2456a2834ac40395173796b6e8d2a8e6c120d86ee74scygan		m_vertexBuffer = Buffer::createAndAlloc(m_vk, device, BufferCreateInfo(dataSize,
2464b9229de0ea1993c94c91016ba3f955509753fb0scygan			vk::VK_BUFFER_USAGE_VERTEX_BUFFER_BIT),
2474b9229de0ea1993c94c91016ba3f955509753fb0scygan			m_context.getDefaultAllocator(), vk::MemoryRequirement::HostVisible);
2484b9229de0ea1993c94c91016ba3f955509753fb0scygan
249db4efd02b79d71e0d0b1122d01d1a20b37760527scygan		deUint8* ptr = reinterpret_cast<unsigned char *>(m_vertexBuffer->getBoundMemory().getHostPtr());
250d3cfb7f158cb03f3734b7f9f24c5b3f97e18939dPyry Haulos		deMemcpy(ptr, &m_data[0], static_cast<size_t>(dataSize));
2514b9229de0ea1993c94c91016ba3f955509753fb0scygan
2524b9229de0ea1993c94c91016ba3f955509753fb0scygan		vk::flushMappedMemoryRange(m_vk, device,
253db4efd02b79d71e0d0b1122d01d1a20b37760527scygan								   m_vertexBuffer->getBoundMemory().getMemory(),
254db4efd02b79d71e0d0b1122d01d1a20b37760527scygan								   m_vertexBuffer->getBoundMemory().getOffset(),
255c4f13c22feb8b9840b0576ba43edba2e9208135aSlawomir Cygan								   dataSize);
2564b9229de0ea1993c94c91016ba3f955509753fb0scygan
2574b9229de0ea1993c94c91016ba3f955509753fb0scygan		const CmdPoolCreateInfo cmdPoolCreateInfo(m_context.getUniversalQueueFamilyIndex());
2584b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_cmdPool = vk::createCommandPool(m_vk, device, &cmdPoolCreateInfo);
2594b9229de0ea1993c94c91016ba3f955509753fb0scygan
2606a2834ac40395173796b6e8d2a8e6c120d86ee74scygan		const vk::VkCommandBufferAllocateInfo cmdBufferAllocateInfo =
2616a2834ac40395173796b6e8d2a8e6c120d86ee74scygan		{
2626a2834ac40395173796b6e8d2a8e6c120d86ee74scygan			vk::VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,	// VkStructureType			sType;
2636a2834ac40395173796b6e8d2a8e6c120d86ee74scygan			DE_NULL,											// const void*				pNext;
2646a2834ac40395173796b6e8d2a8e6c120d86ee74scygan			*m_cmdPool,											// VkCommandPool			commandPool;
2656a2834ac40395173796b6e8d2a8e6c120d86ee74scygan			vk::VK_COMMAND_BUFFER_LEVEL_PRIMARY,				// VkCommandBufferLevel		level;
2666a2834ac40395173796b6e8d2a8e6c120d86ee74scygan			1u,													// deUint32					bufferCount;
2676a2834ac40395173796b6e8d2a8e6c120d86ee74scygan		};
2686a2834ac40395173796b6e8d2a8e6c120d86ee74scygan		m_cmdBuffer = vk::allocateCommandBuffer(m_vk, device, &cmdBufferAllocateInfo);
2694b9229de0ea1993c94c91016ba3f955509753fb0scygan	}
2704b9229de0ea1993c94c91016ba3f955509753fb0scygan
2714b9229de0ea1993c94c91016ba3f955509753fb0scygan	virtual tcu::TestStatus iterate (void)
2724b9229de0ea1993c94c91016ba3f955509753fb0scygan	{
273db4efd02b79d71e0d0b1122d01d1a20b37760527scygan		DE_ASSERT(false);
274db4efd02b79d71e0d0b1122d01d1a20b37760527scygan		return tcu::TestStatus::fail("Should reimplement iterate() method");
2754b9229de0ea1993c94c91016ba3f955509753fb0scygan	}
2764b9229de0ea1993c94c91016ba3f955509753fb0scygan
2774b9229de0ea1993c94c91016ba3f955509753fb0scygan	void beginRenderPass (void)
2784b9229de0ea1993c94c91016ba3f955509753fb0scygan	{
2794b9229de0ea1993c94c91016ba3f955509753fb0scygan		const vk::VkClearColorValue clearColor = { { 0.0f, 0.0f, 0.0f, 1.0f } };
2804b9229de0ea1993c94c91016ba3f955509753fb0scygan		beginRenderPassWithClearColor(clearColor);
2814b9229de0ea1993c94c91016ba3f955509753fb0scygan	}
2824b9229de0ea1993c94c91016ba3f955509753fb0scygan
2834b9229de0ea1993c94c91016ba3f955509753fb0scygan	void beginRenderPassWithClearColor (const vk::VkClearColorValue &clearColor)
2844b9229de0ea1993c94c91016ba3f955509753fb0scygan	{
2854b9229de0ea1993c94c91016ba3f955509753fb0scygan		const CmdBufferBeginInfo beginInfo;
2864b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_vk.beginCommandBuffer(*m_cmdBuffer, &beginInfo);
2874b9229de0ea1993c94c91016ba3f955509753fb0scygan
2884b9229de0ea1993c94c91016ba3f955509753fb0scygan		initialTransitionColor2DImage(m_vk, *m_cmdBuffer, m_colorTargetImage->object(), vk::VK_IMAGE_LAYOUT_GENERAL);
289188341def51b4a425163576ce1cd1c8931c45df8Arkadiusz Sarwa		initialTransitionDepthStencil2DImage(m_vk, *m_cmdBuffer, m_depthStencilImage->object(), vk::VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 0, vk::VK_ACCESS_TRANSFER_WRITE_BIT);
2904b9229de0ea1993c94c91016ba3f955509753fb0scygan
2914b9229de0ea1993c94c91016ba3f955509753fb0scygan		const ImageSubresourceRange subresourceRangeImage(vk::VK_IMAGE_ASPECT_COLOR_BIT);
2924b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_vk.cmdClearColorImage(*m_cmdBuffer, m_colorTargetImage->object(),
293db4efd02b79d71e0d0b1122d01d1a20b37760527scygan								vk::VK_IMAGE_LAYOUT_GENERAL, &clearColor, 1, &subresourceRangeImage);
2944b9229de0ea1993c94c91016ba3f955509753fb0scygan
2954b9229de0ea1993c94c91016ba3f955509753fb0scygan		const vk::VkClearDepthStencilValue depthStencilClearValue = { 0.0f, 0 };
2964b9229de0ea1993c94c91016ba3f955509753fb0scygan
2974b9229de0ea1993c94c91016ba3f955509753fb0scygan		const ImageSubresourceRange subresourceRangeDepthStencil[2] = { vk::VK_IMAGE_ASPECT_DEPTH_BIT, vk::VK_IMAGE_ASPECT_STENCIL_BIT };
298a15e7d7f566d93c76ca90171eb728e3d1cd82378Pyry Haulos
2994b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_vk.cmdClearDepthStencilImage(*m_cmdBuffer, m_depthStencilImage->object(),
300db4efd02b79d71e0d0b1122d01d1a20b37760527scygan									   vk::VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &depthStencilClearValue, 2, subresourceRangeDepthStencil);
3014b9229de0ea1993c94c91016ba3f955509753fb0scygan
30288a37fd1e3ccfe27b92fb694c5aecbfa73165b85zeppelin		const vk::VkMemoryBarrier memBarrier =
30388a37fd1e3ccfe27b92fb694c5aecbfa73165b85zeppelin		{
30488a37fd1e3ccfe27b92fb694c5aecbfa73165b85zeppelin			vk::VK_STRUCTURE_TYPE_MEMORY_BARRIER,
30588a37fd1e3ccfe27b92fb694c5aecbfa73165b85zeppelin			DE_NULL,
30688a37fd1e3ccfe27b92fb694c5aecbfa73165b85zeppelin			vk::VK_ACCESS_TRANSFER_WRITE_BIT,
30788a37fd1e3ccfe27b92fb694c5aecbfa73165b85zeppelin			vk::VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | vk::VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT |
30888a37fd1e3ccfe27b92fb694c5aecbfa73165b85zeppelin				vk::VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT | vk::VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT
30988a37fd1e3ccfe27b92fb694c5aecbfa73165b85zeppelin		};
31088a37fd1e3ccfe27b92fb694c5aecbfa73165b85zeppelin
31188a37fd1e3ccfe27b92fb694c5aecbfa73165b85zeppelin		m_vk.cmdPipelineBarrier(*m_cmdBuffer, vk::VK_PIPELINE_STAGE_TRANSFER_BIT,
31288a37fd1e3ccfe27b92fb694c5aecbfa73165b85zeppelin			vk::VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT |
31388a37fd1e3ccfe27b92fb694c5aecbfa73165b85zeppelin			vk::VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | vk::VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT,
31488a37fd1e3ccfe27b92fb694c5aecbfa73165b85zeppelin			0, 1, &memBarrier, 0, DE_NULL, 0, DE_NULL);
31588a37fd1e3ccfe27b92fb694c5aecbfa73165b85zeppelin
3164b9229de0ea1993c94c91016ba3f955509753fb0scygan		const vk::VkRect2D renderArea = { { 0, 0 }, { WIDTH, HEIGHT } };
3174b9229de0ea1993c94c91016ba3f955509753fb0scygan		const RenderPassBeginInfo renderPassBegin(*m_renderPass, *m_framebuffer, renderArea);
3184b9229de0ea1993c94c91016ba3f955509753fb0scygan
319188341def51b4a425163576ce1cd1c8931c45df8Arkadiusz 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);
320188341def51b4a425163576ce1cd1c8931c45df8Arkadiusz Sarwa
3216a2834ac40395173796b6e8d2a8e6c120d86ee74scygan		m_vk.cmdBeginRenderPass(*m_cmdBuffer, &renderPassBegin, vk::VK_SUBPASS_CONTENTS_INLINE);
3224b9229de0ea1993c94c91016ba3f955509753fb0scygan	}
3234b9229de0ea1993c94c91016ba3f955509753fb0scygan
3244b9229de0ea1993c94c91016ba3f955509753fb0scygan	void setDynamicViewportState (const deUint32 width, const deUint32 height)
3254b9229de0ea1993c94c91016ba3f955509753fb0scygan	{
3264b9229de0ea1993c94c91016ba3f955509753fb0scygan		vk::VkViewport viewport;
3276a2834ac40395173796b6e8d2a8e6c120d86ee74scygan		viewport.x = 0;
3286a2834ac40395173796b6e8d2a8e6c120d86ee74scygan		viewport.y = 0;
3294b9229de0ea1993c94c91016ba3f955509753fb0scygan		viewport.width = static_cast<float>(width);
3304b9229de0ea1993c94c91016ba3f955509753fb0scygan		viewport.height = static_cast<float>(height);
3314b9229de0ea1993c94c91016ba3f955509753fb0scygan		viewport.minDepth = 0.0f;
3324b9229de0ea1993c94c91016ba3f955509753fb0scygan		viewport.maxDepth = 1.0f;
3334b9229de0ea1993c94c91016ba3f955509753fb0scygan
334689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos		m_vk.cmdSetViewport(*m_cmdBuffer, 0, 1, &viewport);
3354b9229de0ea1993c94c91016ba3f955509753fb0scygan
3364b9229de0ea1993c94c91016ba3f955509753fb0scygan		vk::VkRect2D scissor;
3374b9229de0ea1993c94c91016ba3f955509753fb0scygan		scissor.offset.x = 0;
3384b9229de0ea1993c94c91016ba3f955509753fb0scygan		scissor.offset.y = 0;
3394b9229de0ea1993c94c91016ba3f955509753fb0scygan		scissor.extent.width = width;
3404b9229de0ea1993c94c91016ba3f955509753fb0scygan		scissor.extent.height = height;
341689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos		m_vk.cmdSetScissor(*m_cmdBuffer, 0, 1, &scissor);
3424b9229de0ea1993c94c91016ba3f955509753fb0scygan	}
3434b9229de0ea1993c94c91016ba3f955509753fb0scygan
3444b9229de0ea1993c94c91016ba3f955509753fb0scygan	void setDynamicViewportState (const deUint32 viewportCount, const vk::VkViewport* pViewports, const vk::VkRect2D* pScissors)
3454b9229de0ea1993c94c91016ba3f955509753fb0scygan	{
346689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos		m_vk.cmdSetViewport(*m_cmdBuffer, 0, viewportCount, pViewports);
347689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos		m_vk.cmdSetScissor(*m_cmdBuffer, 0, viewportCount, pScissors);
3484b9229de0ea1993c94c91016ba3f955509753fb0scygan	}
3494b9229de0ea1993c94c91016ba3f955509753fb0scygan
3506a2834ac40395173796b6e8d2a8e6c120d86ee74scygan	void setDynamicRasterizationState (const float lineWidth = 1.0f,
3516a2834ac40395173796b6e8d2a8e6c120d86ee74scygan		const float depthBiasConstantFactor = 0.0f,
3524b9229de0ea1993c94c91016ba3f955509753fb0scygan		const float depthBiasClamp = 0.0f,
3536a2834ac40395173796b6e8d2a8e6c120d86ee74scygan		const float depthBiasSlopeFactor = 0.0f)
3544b9229de0ea1993c94c91016ba3f955509753fb0scygan	{
3554b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_vk.cmdSetLineWidth(*m_cmdBuffer, lineWidth);
3566a2834ac40395173796b6e8d2a8e6c120d86ee74scygan		m_vk.cmdSetDepthBias(*m_cmdBuffer, depthBiasConstantFactor, depthBiasClamp, depthBiasSlopeFactor);
3574b9229de0ea1993c94c91016ba3f955509753fb0scygan	}
3584b9229de0ea1993c94c91016ba3f955509753fb0scygan
3594b9229de0ea1993c94c91016ba3f955509753fb0scygan	void setDynamicBlendState (const float const1 = 0.0f, const float const2 = 0.0f,
3604b9229de0ea1993c94c91016ba3f955509753fb0scygan		const float const3 = 0.0f, const float const4 = 0.0f)
3614b9229de0ea1993c94c91016ba3f955509753fb0scygan	{
3626a2834ac40395173796b6e8d2a8e6c120d86ee74scygan		float blendConstantsants[4] = { const1, const2, const3, const4 };
3636a2834ac40395173796b6e8d2a8e6c120d86ee74scygan		m_vk.cmdSetBlendConstants(*m_cmdBuffer, blendConstantsants);
3644b9229de0ea1993c94c91016ba3f955509753fb0scygan	}
3654b9229de0ea1993c94c91016ba3f955509753fb0scygan
3664b9229de0ea1993c94c91016ba3f955509753fb0scygan	void setDynamicDepthStencilState (const float minDepthBounds = -1.0f, const float maxDepthBounds = 1.0f,
3674b9229de0ea1993c94c91016ba3f955509753fb0scygan		const deUint32 stencilFrontCompareMask = 0xffffffffu, const deUint32 stencilFrontWriteMask = 0xffffffffu,
3684b9229de0ea1993c94c91016ba3f955509753fb0scygan		const deUint32 stencilFrontReference = 0, const deUint32 stencilBackCompareMask = 0xffffffffu,
3694b9229de0ea1993c94c91016ba3f955509753fb0scygan		const deUint32 stencilBackWriteMask = 0xffffffffu, const deUint32 stencilBackReference = 0)
3704b9229de0ea1993c94c91016ba3f955509753fb0scygan	{
3714b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_vk.cmdSetDepthBounds(*m_cmdBuffer, minDepthBounds, maxDepthBounds);
3724b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_vk.cmdSetStencilCompareMask(*m_cmdBuffer, vk::VK_STENCIL_FACE_FRONT_BIT, stencilFrontCompareMask);
3734b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_vk.cmdSetStencilWriteMask(*m_cmdBuffer, vk::VK_STENCIL_FACE_FRONT_BIT, stencilFrontWriteMask);
3744b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_vk.cmdSetStencilReference(*m_cmdBuffer, vk::VK_STENCIL_FACE_FRONT_BIT, stencilFrontReference);
3754b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_vk.cmdSetStencilCompareMask(*m_cmdBuffer, vk::VK_STENCIL_FACE_BACK_BIT, stencilBackCompareMask);
3764b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_vk.cmdSetStencilWriteMask(*m_cmdBuffer, vk::VK_STENCIL_FACE_BACK_BIT, stencilBackWriteMask);
3774b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_vk.cmdSetStencilReference(*m_cmdBuffer, vk::VK_STENCIL_FACE_BACK_BIT, stencilBackReference);
3784b9229de0ea1993c94c91016ba3f955509753fb0scygan	}
3794b9229de0ea1993c94c91016ba3f955509753fb0scygan};
3804b9229de0ea1993c94c91016ba3f955509753fb0scygan
3814b9229de0ea1993c94c91016ba3f955509753fb0scyganclass DepthBiasParamTestInstance : public DepthBiasBaseCase
3824b9229de0ea1993c94c91016ba3f955509753fb0scygan{
3834b9229de0ea1993c94c91016ba3f955509753fb0scyganpublic:
384db4efd02b79d71e0d0b1122d01d1a20b37760527scygan	DepthBiasParamTestInstance (Context& context, ShaderMap shaders)
3854b9229de0ea1993c94c91016ba3f955509753fb0scygan		: DepthBiasBaseCase (context, shaders[glu::SHADERTYPE_VERTEX], shaders[glu::SHADERTYPE_FRAGMENT])
3864b9229de0ea1993c94c91016ba3f955509753fb0scygan	{
387db4efd02b79d71e0d0b1122d01d1a20b37760527scygan		m_data.push_back(PositionColorVertex(tcu::Vec4(-1.0f, 1.0f, 0.5f, 1.0f), tcu::RGBA::blue().toVec()));
388db4efd02b79d71e0d0b1122d01d1a20b37760527scygan		m_data.push_back(PositionColorVertex(tcu::Vec4(1.0f, 1.0f, 0.5f, 1.0f), tcu::RGBA::blue().toVec()));
389db4efd02b79d71e0d0b1122d01d1a20b37760527scygan		m_data.push_back(PositionColorVertex(tcu::Vec4(-1.0f, -1.0f, 0.5f, 1.0f), tcu::RGBA::blue().toVec()));
390db4efd02b79d71e0d0b1122d01d1a20b37760527scygan		m_data.push_back(PositionColorVertex(tcu::Vec4(1.0f, -1.0f, 0.5f, 1.0f), tcu::RGBA::blue().toVec()));
3914b9229de0ea1993c94c91016ba3f955509753fb0scygan
392db4efd02b79d71e0d0b1122d01d1a20b37760527scygan		m_data.push_back(PositionColorVertex(tcu::Vec4(-0.5f, 0.5f, 1.0f, 1.0f), tcu::RGBA::green().toVec()));
393db4efd02b79d71e0d0b1122d01d1a20b37760527scygan		m_data.push_back(PositionColorVertex(tcu::Vec4(0.5f, 0.5f, 1.0f, 1.0f), tcu::RGBA::green().toVec()));
394db4efd02b79d71e0d0b1122d01d1a20b37760527scygan		m_data.push_back(PositionColorVertex(tcu::Vec4(-0.5f, -0.5f, 1.0f, 1.0f), tcu::RGBA::green().toVec()));
395db4efd02b79d71e0d0b1122d01d1a20b37760527scygan		m_data.push_back(PositionColorVertex(tcu::Vec4(0.5f, -0.5f, 1.0f, 1.0f), tcu::RGBA::green().toVec()));
3964b9229de0ea1993c94c91016ba3f955509753fb0scygan
397db4efd02b79d71e0d0b1122d01d1a20b37760527scygan		m_data.push_back(PositionColorVertex(tcu::Vec4(-1.0f, 1.0f, 0.5f, 1.0f), tcu::RGBA::red().toVec()));
398db4efd02b79d71e0d0b1122d01d1a20b37760527scygan		m_data.push_back(PositionColorVertex(tcu::Vec4(1.0f, 1.0f, 0.5f, 1.0f), tcu::RGBA::red().toVec()));
399db4efd02b79d71e0d0b1122d01d1a20b37760527scygan		m_data.push_back(PositionColorVertex(tcu::Vec4(-1.0f, -1.0f, 0.5f, 1.0f), tcu::RGBA::red().toVec()));
400db4efd02b79d71e0d0b1122d01d1a20b37760527scygan		m_data.push_back(PositionColorVertex(tcu::Vec4(1.0f, -1.0f, 0.5f, 1.0f), tcu::RGBA::red().toVec()));
4014b9229de0ea1993c94c91016ba3f955509753fb0scygan
4024b9229de0ea1993c94c91016ba3f955509753fb0scygan		// enable depth test
4034b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_depthStencilState = PipelineCreateInfo::DepthStencilState(
4046cbd34be72b2b732fe4f8d60c850d52fb16f68bcPyry Haulos			VK_TRUE, VK_TRUE, vk::VK_COMPARE_OP_GREATER_OR_EQUAL);
4054b9229de0ea1993c94c91016ba3f955509753fb0scygan
4064b9229de0ea1993c94c91016ba3f955509753fb0scygan		DepthBiasBaseCase::initialize();
4074b9229de0ea1993c94c91016ba3f955509753fb0scygan	}
4084b9229de0ea1993c94c91016ba3f955509753fb0scygan
4094b9229de0ea1993c94c91016ba3f955509753fb0scygan	virtual tcu::TestStatus iterate (void)
4104b9229de0ea1993c94c91016ba3f955509753fb0scygan	{
411db4efd02b79d71e0d0b1122d01d1a20b37760527scygan		tcu::TestLog &log		= m_context.getTestContext().getLog();
4124b9229de0ea1993c94c91016ba3f955509753fb0scygan		const vk::VkQueue queue = m_context.getUniversalQueue();
4134b9229de0ea1993c94c91016ba3f955509753fb0scygan
4144b9229de0ea1993c94c91016ba3f955509753fb0scygan		beginRenderPass();
4154b9229de0ea1993c94c91016ba3f955509753fb0scygan
4164b9229de0ea1993c94c91016ba3f955509753fb0scygan		// set states here
4174b9229de0ea1993c94c91016ba3f955509753fb0scygan		setDynamicViewportState(WIDTH, HEIGHT);
4184b9229de0ea1993c94c91016ba3f955509753fb0scygan		setDynamicBlendState();
4194b9229de0ea1993c94c91016ba3f955509753fb0scygan		setDynamicDepthStencilState();
4204b9229de0ea1993c94c91016ba3f955509753fb0scygan
4214b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_vk.cmdBindPipeline(*m_cmdBuffer, vk::VK_PIPELINE_BIND_POINT_GRAPHICS, *m_pipeline);
4224b9229de0ea1993c94c91016ba3f955509753fb0scygan
423db4efd02b79d71e0d0b1122d01d1a20b37760527scygan		const vk::VkDeviceSize vertexBufferOffset	= 0;
424db4efd02b79d71e0d0b1122d01d1a20b37760527scygan		const vk::VkBuffer vertexBuffer				= m_vertexBuffer->object();
4254b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_vk.cmdBindVertexBuffers(*m_cmdBuffer, 0, 1, &vertexBuffer, &vertexBufferOffset);
4264b9229de0ea1993c94c91016ba3f955509753fb0scygan
4276a2834ac40395173796b6e8d2a8e6c120d86ee74scygan		setDynamicRasterizationState(1.0f, 0.0f);
4284b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_vk.cmdDraw(*m_cmdBuffer, 4, 1, 0, 0);
4294b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_vk.cmdDraw(*m_cmdBuffer, 4, 1, 4, 0);
4304b9229de0ea1993c94c91016ba3f955509753fb0scygan
4316a2834ac40395173796b6e8d2a8e6c120d86ee74scygan		setDynamicRasterizationState(1.0f, -1.0f);
4324b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_vk.cmdDraw(*m_cmdBuffer, 4, 1, 8, 0);
4334b9229de0ea1993c94c91016ba3f955509753fb0scygan
4344b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_vk.cmdEndRenderPass(*m_cmdBuffer);
4354b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_vk.endCommandBuffer(*m_cmdBuffer);
4364b9229de0ea1993c94c91016ba3f955509753fb0scygan
4376a2834ac40395173796b6e8d2a8e6c120d86ee74scygan		vk::VkSubmitInfo submitInfo =
4386a2834ac40395173796b6e8d2a8e6c120d86ee74scygan		{
4396a2834ac40395173796b6e8d2a8e6c120d86ee74scygan			vk::VK_STRUCTURE_TYPE_SUBMIT_INFO,	// VkStructureType			sType;
4406a2834ac40395173796b6e8d2a8e6c120d86ee74scygan			DE_NULL,							// const void*				pNext;
441ae21c307c29a6efa73f3d4f2b25f0dd2c0b0e023Pyry Haulos			0,									// deUint32					waitSemaphoreCount;
442ae21c307c29a6efa73f3d4f2b25f0dd2c0b0e023Pyry Haulos			DE_NULL,							// const VkSemaphore*		pWaitSemaphores;
443689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos			(const vk::VkPipelineStageFlags*)DE_NULL,
444ae21c307c29a6efa73f3d4f2b25f0dd2c0b0e023Pyry Haulos			1,									// deUint32					commandBufferCount;
4456a2834ac40395173796b6e8d2a8e6c120d86ee74scygan			&m_cmdBuffer.get(),					// const VkCommandBuffer*	pCommandBuffers;
446ae21c307c29a6efa73f3d4f2b25f0dd2c0b0e023Pyry Haulos			0,									// deUint32					signalSemaphoreCount;
4476a2834ac40395173796b6e8d2a8e6c120d86ee74scygan			DE_NULL								// const VkSemaphore*		pSignalSemaphores;
4486a2834ac40395173796b6e8d2a8e6c120d86ee74scygan		};
4496a2834ac40395173796b6e8d2a8e6c120d86ee74scygan		m_vk.queueSubmit(queue, 1, &submitInfo, DE_NULL);
4504b9229de0ea1993c94c91016ba3f955509753fb0scygan
4514b9229de0ea1993c94c91016ba3f955509753fb0scygan		// validation
4524b9229de0ea1993c94c91016ba3f955509753fb0scygan		{
4534b9229de0ea1993c94c91016ba3f955509753fb0scygan			VK_CHECK(m_vk.queueWaitIdle(queue));
4544b9229de0ea1993c94c91016ba3f955509753fb0scygan
4554b9229de0ea1993c94c91016ba3f955509753fb0scygan			tcu::Texture2D referenceFrame(vk::mapVkFormat(m_colorAttachmentFormat), (int)(0.5 + WIDTH), (int)(0.5 + HEIGHT));
4564b9229de0ea1993c94c91016ba3f955509753fb0scygan			referenceFrame.allocLevel(0);
4574b9229de0ea1993c94c91016ba3f955509753fb0scygan
4584b9229de0ea1993c94c91016ba3f955509753fb0scygan			const deInt32 frameWidth = referenceFrame.getWidth();
4594b9229de0ea1993c94c91016ba3f955509753fb0scygan			const deInt32 frameHeight = referenceFrame.getHeight();
4604b9229de0ea1993c94c91016ba3f955509753fb0scygan
4614b9229de0ea1993c94c91016ba3f955509753fb0scygan			tcu::clear(referenceFrame.getLevel(0), tcu::Vec4(0.0f, 0.0f, 0.0f, 1.0f));
4624b9229de0ea1993c94c91016ba3f955509753fb0scygan
4634b9229de0ea1993c94c91016ba3f955509753fb0scygan			for (int y = 0; y < frameHeight; y++)
4644b9229de0ea1993c94c91016ba3f955509753fb0scygan			{
4654b9229de0ea1993c94c91016ba3f955509753fb0scygan				const float yCoord = (float)(y / (0.5*frameHeight)) - 1.0f;
4664b9229de0ea1993c94c91016ba3f955509753fb0scygan
4674b9229de0ea1993c94c91016ba3f955509753fb0scygan				for (int x = 0; x < frameWidth; x++)
4684b9229de0ea1993c94c91016ba3f955509753fb0scygan				{
4694b9229de0ea1993c94c91016ba3f955509753fb0scygan					const float xCoord = (float)(x / (0.5*frameWidth)) - 1.0f;
4704b9229de0ea1993c94c91016ba3f955509753fb0scygan
4714b9229de0ea1993c94c91016ba3f955509753fb0scygan					if (xCoord >= -0.5f && xCoord <= 0.5f && yCoord >= -0.5f && yCoord <= 0.5f)
4724b9229de0ea1993c94c91016ba3f955509753fb0scygan						referenceFrame.getLevel(0).setPixel(tcu::Vec4(0.0f, 1.0f, 0.0f, 1.0f), x, y);
4734b9229de0ea1993c94c91016ba3f955509753fb0scygan					else
4744b9229de0ea1993c94c91016ba3f955509753fb0scygan						referenceFrame.getLevel(0).setPixel(tcu::Vec4(0.0f, 0.0f, 1.0f, 1.0f), x, y);
4754b9229de0ea1993c94c91016ba3f955509753fb0scygan				}
4764b9229de0ea1993c94c91016ba3f955509753fb0scygan			}
4774b9229de0ea1993c94c91016ba3f955509753fb0scygan
4784b9229de0ea1993c94c91016ba3f955509753fb0scygan			const vk::VkOffset3D zeroOffset = { 0, 0, 0 };
4794b9229de0ea1993c94c91016ba3f955509753fb0scygan			const tcu::ConstPixelBufferAccess renderedFrame = m_colorTargetImage->readSurface(queue, m_context.getDefaultAllocator(),
4806a2834ac40395173796b6e8d2a8e6c120d86ee74scygan				vk::VK_IMAGE_LAYOUT_GENERAL, zeroOffset, WIDTH, HEIGHT, vk::VK_IMAGE_ASPECT_COLOR_BIT);
4814b9229de0ea1993c94c91016ba3f955509753fb0scygan
4824b9229de0ea1993c94c91016ba3f955509753fb0scygan			if (!tcu::fuzzyCompare(log, "Result", "Image comparison result",
4834b9229de0ea1993c94c91016ba3f955509753fb0scygan				referenceFrame.getLevel(0), renderedFrame, 0.05f,
4844b9229de0ea1993c94c91016ba3f955509753fb0scygan				tcu::COMPARE_LOG_RESULT))
4854b9229de0ea1993c94c91016ba3f955509753fb0scygan			{
486db4efd02b79d71e0d0b1122d01d1a20b37760527scygan				return tcu::TestStatus(QP_TEST_RESULT_FAIL, "Image verification failed");
4874b9229de0ea1993c94c91016ba3f955509753fb0scygan			}
4884b9229de0ea1993c94c91016ba3f955509753fb0scygan
489db4efd02b79d71e0d0b1122d01d1a20b37760527scygan			return tcu::TestStatus(QP_TEST_RESULT_PASS, "Image verification passed");
4904b9229de0ea1993c94c91016ba3f955509753fb0scygan		}
4914b9229de0ea1993c94c91016ba3f955509753fb0scygan	}
4924b9229de0ea1993c94c91016ba3f955509753fb0scygan};
4934b9229de0ea1993c94c91016ba3f955509753fb0scygan
4944b9229de0ea1993c94c91016ba3f955509753fb0scyganclass DepthBiasClampParamTestInstance : public DepthBiasBaseCase
4954b9229de0ea1993c94c91016ba3f955509753fb0scygan{
4964b9229de0ea1993c94c91016ba3f955509753fb0scyganpublic:
497db4efd02b79d71e0d0b1122d01d1a20b37760527scygan	DepthBiasClampParamTestInstance (Context& context, ShaderMap shaders)
4984b9229de0ea1993c94c91016ba3f955509753fb0scygan		: DepthBiasBaseCase (context, shaders[glu::SHADERTYPE_VERTEX], shaders[glu::SHADERTYPE_FRAGMENT])
4994b9229de0ea1993c94c91016ba3f955509753fb0scygan	{
500db4efd02b79d71e0d0b1122d01d1a20b37760527scygan		m_data.push_back(PositionColorVertex(tcu::Vec4(-1.0f, 1.0f, 0.0f, 1.0f), tcu::RGBA::blue().toVec()));
501db4efd02b79d71e0d0b1122d01d1a20b37760527scygan		m_data.push_back(PositionColorVertex(tcu::Vec4(1.0f, 1.0f, 0.0f, 1.0f), tcu::RGBA::blue().toVec()));
502db4efd02b79d71e0d0b1122d01d1a20b37760527scygan		m_data.push_back(PositionColorVertex(tcu::Vec4(-1.0f, -1.0f, 0.0f, 1.0f), tcu::RGBA::blue().toVec()));
503db4efd02b79d71e0d0b1122d01d1a20b37760527scygan		m_data.push_back(PositionColorVertex(tcu::Vec4(1.0f, -1.0f, 0.0f, 1.0f), tcu::RGBA::blue().toVec()));
5044b9229de0ea1993c94c91016ba3f955509753fb0scygan
505db4efd02b79d71e0d0b1122d01d1a20b37760527scygan		m_data.push_back(PositionColorVertex(tcu::Vec4(-0.5f, 0.5f, 0.01f, 1.0f), tcu::RGBA::green().toVec()));
506db4efd02b79d71e0d0b1122d01d1a20b37760527scygan		m_data.push_back(PositionColorVertex(tcu::Vec4(0.5f, 0.5f, 0.01f, 1.0f), tcu::RGBA::green().toVec()));
507db4efd02b79d71e0d0b1122d01d1a20b37760527scygan		m_data.push_back(PositionColorVertex(tcu::Vec4(-0.5f, -0.5f, 0.01f, 1.0f), tcu::RGBA::green().toVec()));
508db4efd02b79d71e0d0b1122d01d1a20b37760527scygan		m_data.push_back(PositionColorVertex(tcu::Vec4(0.5f, -0.5f, 0.01f, 1.0f), tcu::RGBA::green().toVec()));
5094b9229de0ea1993c94c91016ba3f955509753fb0scygan
5104b9229de0ea1993c94c91016ba3f955509753fb0scygan		// enable depth test
5116cbd34be72b2b732fe4f8d60c850d52fb16f68bcPyry Haulos		m_depthStencilState = PipelineCreateInfo::DepthStencilState(VK_TRUE, VK_TRUE, vk::VK_COMPARE_OP_GREATER_OR_EQUAL);
5124b9229de0ea1993c94c91016ba3f955509753fb0scygan
5134b9229de0ea1993c94c91016ba3f955509753fb0scygan		DepthBiasBaseCase::initialize();
5144b9229de0ea1993c94c91016ba3f955509753fb0scygan	}
5154b9229de0ea1993c94c91016ba3f955509753fb0scygan
5164b9229de0ea1993c94c91016ba3f955509753fb0scygan	virtual tcu::TestStatus iterate (void)
5174b9229de0ea1993c94c91016ba3f955509753fb0scygan	{
5184b9229de0ea1993c94c91016ba3f955509753fb0scygan		tcu::TestLog &log = m_context.getTestContext().getLog();
5194b9229de0ea1993c94c91016ba3f955509753fb0scygan		const vk::VkQueue queue = m_context.getUniversalQueue();
5204b9229de0ea1993c94c91016ba3f955509753fb0scygan
5214b9229de0ea1993c94c91016ba3f955509753fb0scygan		beginRenderPass();
5224b9229de0ea1993c94c91016ba3f955509753fb0scygan
5234b9229de0ea1993c94c91016ba3f955509753fb0scygan		// set states here
5244b9229de0ea1993c94c91016ba3f955509753fb0scygan		setDynamicViewportState(WIDTH, HEIGHT);
5254b9229de0ea1993c94c91016ba3f955509753fb0scygan		setDynamicBlendState();
5264b9229de0ea1993c94c91016ba3f955509753fb0scygan		setDynamicDepthStencilState();
5274b9229de0ea1993c94c91016ba3f955509753fb0scygan
5284b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_vk.cmdBindPipeline(*m_cmdBuffer, vk::VK_PIPELINE_BIND_POINT_GRAPHICS, *m_pipeline);
5294b9229de0ea1993c94c91016ba3f955509753fb0scygan
5304b9229de0ea1993c94c91016ba3f955509753fb0scygan		const vk::VkDeviceSize vertexBufferOffset = 0;
5314b9229de0ea1993c94c91016ba3f955509753fb0scygan		const vk::VkBuffer vertexBuffer = m_vertexBuffer->object();
5324b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_vk.cmdBindVertexBuffers(*m_cmdBuffer, 0, 1, &vertexBuffer, &vertexBufferOffset);
5334b9229de0ea1993c94c91016ba3f955509753fb0scygan
5346a2834ac40395173796b6e8d2a8e6c120d86ee74scygan		setDynamicRasterizationState(1.0f, 1000.0f, 0.005f);
5354b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_vk.cmdDraw(*m_cmdBuffer, 4, 1, 0, 0);
5364b9229de0ea1993c94c91016ba3f955509753fb0scygan
5376a2834ac40395173796b6e8d2a8e6c120d86ee74scygan		setDynamicRasterizationState(1.0f, 0.0f);
5384b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_vk.cmdDraw(*m_cmdBuffer, 4, 1, 4, 0);
5394b9229de0ea1993c94c91016ba3f955509753fb0scygan
5404b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_vk.cmdEndRenderPass(*m_cmdBuffer);
5414b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_vk.endCommandBuffer(*m_cmdBuffer);
5424b9229de0ea1993c94c91016ba3f955509753fb0scygan
5436a2834ac40395173796b6e8d2a8e6c120d86ee74scygan		vk::VkSubmitInfo submitInfo =
5446a2834ac40395173796b6e8d2a8e6c120d86ee74scygan		{
5456a2834ac40395173796b6e8d2a8e6c120d86ee74scygan			vk::VK_STRUCTURE_TYPE_SUBMIT_INFO,	// VkStructureType			sType;
5466a2834ac40395173796b6e8d2a8e6c120d86ee74scygan			DE_NULL,							// const void*				pNext;
547ae21c307c29a6efa73f3d4f2b25f0dd2c0b0e023Pyry Haulos			0,									// deUint32					waitSemaphoreCount;
548ae21c307c29a6efa73f3d4f2b25f0dd2c0b0e023Pyry Haulos			DE_NULL,							// const VkSemaphore*		pWaitSemaphores;
549689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos			(const vk::VkPipelineStageFlags*)DE_NULL,
550ae21c307c29a6efa73f3d4f2b25f0dd2c0b0e023Pyry Haulos			1,									// deUint32					commandBufferCount;
5516a2834ac40395173796b6e8d2a8e6c120d86ee74scygan			&m_cmdBuffer.get(),					// const VkCommandBuffer*	pCommandBuffers;
552ae21c307c29a6efa73f3d4f2b25f0dd2c0b0e023Pyry Haulos			0,									// deUint32					signalSemaphoreCount;
5536a2834ac40395173796b6e8d2a8e6c120d86ee74scygan			DE_NULL								// const VkSemaphore*		pSignalSemaphores;
5546a2834ac40395173796b6e8d2a8e6c120d86ee74scygan		};
5556a2834ac40395173796b6e8d2a8e6c120d86ee74scygan		m_vk.queueSubmit(queue, 1, &submitInfo, DE_NULL);
5564b9229de0ea1993c94c91016ba3f955509753fb0scygan
5574b9229de0ea1993c94c91016ba3f955509753fb0scygan		// validation
5584b9229de0ea1993c94c91016ba3f955509753fb0scygan		{
5594b9229de0ea1993c94c91016ba3f955509753fb0scygan			VK_CHECK(m_vk.queueWaitIdle(queue));
5604b9229de0ea1993c94c91016ba3f955509753fb0scygan
5614b9229de0ea1993c94c91016ba3f955509753fb0scygan			tcu::Texture2D referenceFrame(vk::mapVkFormat(m_colorAttachmentFormat), (int)(0.5 + WIDTH), (int)(0.5 + HEIGHT));
5624b9229de0ea1993c94c91016ba3f955509753fb0scygan			referenceFrame.allocLevel(0);
5634b9229de0ea1993c94c91016ba3f955509753fb0scygan
564db4efd02b79d71e0d0b1122d01d1a20b37760527scygan			const deInt32 frameWidth	= referenceFrame.getWidth();
565db4efd02b79d71e0d0b1122d01d1a20b37760527scygan			const deInt32 frameHeight	= referenceFrame.getHeight();
5664b9229de0ea1993c94c91016ba3f955509753fb0scygan
5674b9229de0ea1993c94c91016ba3f955509753fb0scygan			tcu::clear(referenceFrame.getLevel(0), tcu::Vec4(0.0f, 0.0f, 0.0f, 1.0f));
5684b9229de0ea1993c94c91016ba3f955509753fb0scygan
5694b9229de0ea1993c94c91016ba3f955509753fb0scygan			for (int y = 0; y < frameHeight; y++)
5704b9229de0ea1993c94c91016ba3f955509753fb0scygan			{
5714b9229de0ea1993c94c91016ba3f955509753fb0scygan				float yCoord = (float)(y / (0.5*frameHeight)) - 1.0f;
5724b9229de0ea1993c94c91016ba3f955509753fb0scygan
5734b9229de0ea1993c94c91016ba3f955509753fb0scygan				for (int x = 0; x < frameWidth; x++)
5744b9229de0ea1993c94c91016ba3f955509753fb0scygan				{
5754b9229de0ea1993c94c91016ba3f955509753fb0scygan					float xCoord = (float)(x / (0.5*frameWidth)) - 1.0f;
5764b9229de0ea1993c94c91016ba3f955509753fb0scygan
5774b9229de0ea1993c94c91016ba3f955509753fb0scygan					if (xCoord >= -0.5f && xCoord <= 0.5f && yCoord >= -0.5f && yCoord <= 0.5f)
5784b9229de0ea1993c94c91016ba3f955509753fb0scygan						referenceFrame.getLevel(0).setPixel(tcu::Vec4(0.0f, 1.0f, 0.0f, 1.0f), x, y);
5794b9229de0ea1993c94c91016ba3f955509753fb0scygan					else
5804b9229de0ea1993c94c91016ba3f955509753fb0scygan						referenceFrame.getLevel(0).setPixel(tcu::Vec4(0.0f, 0.0f, 1.0f, 1.0f), x, y);
5814b9229de0ea1993c94c91016ba3f955509753fb0scygan				}
5824b9229de0ea1993c94c91016ba3f955509753fb0scygan			}
5834b9229de0ea1993c94c91016ba3f955509753fb0scygan
584db4efd02b79d71e0d0b1122d01d1a20b37760527scygan			const vk::VkOffset3D zeroOffset					= { 0, 0, 0 };
5854b9229de0ea1993c94c91016ba3f955509753fb0scygan			const tcu::ConstPixelBufferAccess renderedFrame = m_colorTargetImage->readSurface(queue, m_context.getDefaultAllocator(),
5866a2834ac40395173796b6e8d2a8e6c120d86ee74scygan				vk::VK_IMAGE_LAYOUT_GENERAL, zeroOffset, WIDTH, HEIGHT, vk::VK_IMAGE_ASPECT_COLOR_BIT);
5874b9229de0ea1993c94c91016ba3f955509753fb0scygan
5884b9229de0ea1993c94c91016ba3f955509753fb0scygan			if (!tcu::fuzzyCompare(log, "Result", "Image comparison result",
5894b9229de0ea1993c94c91016ba3f955509753fb0scygan				referenceFrame.getLevel(0), renderedFrame, 0.05f,
5904b9229de0ea1993c94c91016ba3f955509753fb0scygan				tcu::COMPARE_LOG_RESULT))
5914b9229de0ea1993c94c91016ba3f955509753fb0scygan			{
592db4efd02b79d71e0d0b1122d01d1a20b37760527scygan				return tcu::TestStatus(QP_TEST_RESULT_FAIL, "Image verification failed");
5934b9229de0ea1993c94c91016ba3f955509753fb0scygan			}
5944b9229de0ea1993c94c91016ba3f955509753fb0scygan
595db4efd02b79d71e0d0b1122d01d1a20b37760527scygan			return tcu::TestStatus(QP_TEST_RESULT_PASS, "Image verification passed");
5964b9229de0ea1993c94c91016ba3f955509753fb0scygan		}
5974b9229de0ea1993c94c91016ba3f955509753fb0scygan	}
5984b9229de0ea1993c94c91016ba3f955509753fb0scygan};
5994b9229de0ea1993c94c91016ba3f955509753fb0scygan
6004b9229de0ea1993c94c91016ba3f955509753fb0scyganclass LineWidthParamTestInstance : public DynamicStateBaseClass
6014b9229de0ea1993c94c91016ba3f955509753fb0scygan{
6024b9229de0ea1993c94c91016ba3f955509753fb0scyganpublic:
603db4efd02b79d71e0d0b1122d01d1a20b37760527scygan	LineWidthParamTestInstance (Context& context, ShaderMap shaders)
6044b9229de0ea1993c94c91016ba3f955509753fb0scygan		: DynamicStateBaseClass (context, shaders[glu::SHADERTYPE_VERTEX], shaders[glu::SHADERTYPE_FRAGMENT])
6054b9229de0ea1993c94c91016ba3f955509753fb0scygan	{
60691e51d60e47a7a138ef7189f4aaedb56051e4957asokolow		// Check if line width test is supported
60791e51d60e47a7a138ef7189f4aaedb56051e4957asokolow		{
60891e51d60e47a7a138ef7189f4aaedb56051e4957asokolow			const vk::VkPhysicalDeviceFeatures& deviceFeatures = m_context.getDeviceFeatures();
60991e51d60e47a7a138ef7189f4aaedb56051e4957asokolow
61091e51d60e47a7a138ef7189f4aaedb56051e4957asokolow			if (!deviceFeatures.wideLines)
61191e51d60e47a7a138ef7189f4aaedb56051e4957asokolow				throw tcu::NotSupportedError("Line width test is unsupported");
61291e51d60e47a7a138ef7189f4aaedb56051e4957asokolow		}
61391e51d60e47a7a138ef7189f4aaedb56051e4957asokolow
6144b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_topology = vk::VK_PRIMITIVE_TOPOLOGY_LINE_LIST;
6154b9229de0ea1993c94c91016ba3f955509753fb0scygan
616db4efd02b79d71e0d0b1122d01d1a20b37760527scygan		m_data.push_back(PositionColorVertex(tcu::Vec4(-1.0f, 0.0f, 0.0f, 1.0f), tcu::RGBA::green().toVec()));
617db4efd02b79d71e0d0b1122d01d1a20b37760527scygan		m_data.push_back(PositionColorVertex(tcu::Vec4(1.0f, 0.0f, 0.0f, 1.0f), tcu::RGBA::green().toVec()));
6184b9229de0ea1993c94c91016ba3f955509753fb0scygan
6194b9229de0ea1993c94c91016ba3f955509753fb0scygan		DynamicStateBaseClass::initialize();
6204b9229de0ea1993c94c91016ba3f955509753fb0scygan	}
6214b9229de0ea1993c94c91016ba3f955509753fb0scygan
6224b9229de0ea1993c94c91016ba3f955509753fb0scygan	virtual tcu::TestStatus iterate (void)
6234b9229de0ea1993c94c91016ba3f955509753fb0scygan	{
624db4efd02b79d71e0d0b1122d01d1a20b37760527scygan		tcu::TestLog &log		= m_context.getTestContext().getLog();
6254b9229de0ea1993c94c91016ba3f955509753fb0scygan		const vk::VkQueue queue = m_context.getUniversalQueue();
6264b9229de0ea1993c94c91016ba3f955509753fb0scygan
6274b9229de0ea1993c94c91016ba3f955509753fb0scygan		beginRenderPass();
6284b9229de0ea1993c94c91016ba3f955509753fb0scygan
6294b9229de0ea1993c94c91016ba3f955509753fb0scygan		// set states here
6304b9229de0ea1993c94c91016ba3f955509753fb0scygan		vk::VkPhysicalDeviceProperties deviceProperties;
6314b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_context.getInstanceInterface().getPhysicalDeviceProperties(m_context.getPhysicalDevice(), &deviceProperties);
6324b9229de0ea1993c94c91016ba3f955509753fb0scygan
6334b9229de0ea1993c94c91016ba3f955509753fb0scygan		setDynamicViewportState(WIDTH, HEIGHT);
6344b9229de0ea1993c94c91016ba3f955509753fb0scygan		setDynamicBlendState();
6354b9229de0ea1993c94c91016ba3f955509753fb0scygan		setDynamicDepthStencilState();
636ae21c307c29a6efa73f3d4f2b25f0dd2c0b0e023Pyry Haulos		setDynamicRasterizationState(deFloatFloor(deviceProperties.limits.lineWidthRange[1]));
6374b9229de0ea1993c94c91016ba3f955509753fb0scygan
6384b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_vk.cmdBindPipeline(*m_cmdBuffer, vk::VK_PIPELINE_BIND_POINT_GRAPHICS, *m_pipeline);
6394b9229de0ea1993c94c91016ba3f955509753fb0scygan
640db4efd02b79d71e0d0b1122d01d1a20b37760527scygan		const vk::VkDeviceSize vertexBufferOffset	= 0;
641db4efd02b79d71e0d0b1122d01d1a20b37760527scygan		const vk::VkBuffer vertexBuffer				= m_vertexBuffer->object();
6424b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_vk.cmdBindVertexBuffers(*m_cmdBuffer, 0, 1, &vertexBuffer, &vertexBufferOffset);
6434b9229de0ea1993c94c91016ba3f955509753fb0scygan
6444b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_vk.cmdDraw(*m_cmdBuffer, static_cast<deUint32>(m_data.size()), 1, 0, 0);
6454b9229de0ea1993c94c91016ba3f955509753fb0scygan
6464b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_vk.cmdEndRenderPass(*m_cmdBuffer);
6474b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_vk.endCommandBuffer(*m_cmdBuffer);
6484b9229de0ea1993c94c91016ba3f955509753fb0scygan
6496a2834ac40395173796b6e8d2a8e6c120d86ee74scygan		vk::VkSubmitInfo submitInfo =
6506a2834ac40395173796b6e8d2a8e6c120d86ee74scygan		{
6516a2834ac40395173796b6e8d2a8e6c120d86ee74scygan			vk::VK_STRUCTURE_TYPE_SUBMIT_INFO,	// VkStructureType			sType;
6526a2834ac40395173796b6e8d2a8e6c120d86ee74scygan			DE_NULL,							// const void*				pNext;
653ae21c307c29a6efa73f3d4f2b25f0dd2c0b0e023Pyry Haulos			0,									// deUint32					waitSemaphoreCount;
654ae21c307c29a6efa73f3d4f2b25f0dd2c0b0e023Pyry Haulos			DE_NULL,							// const VkSemaphore*		pWaitSemaphores;
655689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos			(const vk::VkPipelineStageFlags*)DE_NULL,
656ae21c307c29a6efa73f3d4f2b25f0dd2c0b0e023Pyry Haulos			1,									// deUint32					commandBufferCount;
6576a2834ac40395173796b6e8d2a8e6c120d86ee74scygan			&m_cmdBuffer.get(),					// const VkCommandBuffer*	pCommandBuffers;
658ae21c307c29a6efa73f3d4f2b25f0dd2c0b0e023Pyry Haulos			0,									// deUint32					signalSemaphoreCount;
6596a2834ac40395173796b6e8d2a8e6c120d86ee74scygan			DE_NULL								// const VkSemaphore*		pSignalSemaphores;
6606a2834ac40395173796b6e8d2a8e6c120d86ee74scygan		};
6616a2834ac40395173796b6e8d2a8e6c120d86ee74scygan		m_vk.queueSubmit(queue, 1, &submitInfo, DE_NULL);
6624b9229de0ea1993c94c91016ba3f955509753fb0scygan
6634b9229de0ea1993c94c91016ba3f955509753fb0scygan		// validation
6644b9229de0ea1993c94c91016ba3f955509753fb0scygan		{
6654b9229de0ea1993c94c91016ba3f955509753fb0scygan			VK_CHECK(m_vk.queueWaitIdle(queue));
6664b9229de0ea1993c94c91016ba3f955509753fb0scygan
6674b9229de0ea1993c94c91016ba3f955509753fb0scygan			tcu::Texture2D referenceFrame(vk::mapVkFormat(m_colorAttachmentFormat), (int)(0.5 + WIDTH), (int)(0.5 + HEIGHT));
6684b9229de0ea1993c94c91016ba3f955509753fb0scygan			referenceFrame.allocLevel(0);
6694b9229de0ea1993c94c91016ba3f955509753fb0scygan
6704b9229de0ea1993c94c91016ba3f955509753fb0scygan			const deInt32 frameWidth = referenceFrame.getWidth();
6714b9229de0ea1993c94c91016ba3f955509753fb0scygan			const deInt32 frameHeight = referenceFrame.getHeight();
6724b9229de0ea1993c94c91016ba3f955509753fb0scygan
6734b9229de0ea1993c94c91016ba3f955509753fb0scygan			tcu::clear(referenceFrame.getLevel(0), tcu::Vec4(0.0f, 0.0f, 0.0f, 1.0f));
6744b9229de0ea1993c94c91016ba3f955509753fb0scygan
6754b9229de0ea1993c94c91016ba3f955509753fb0scygan			for (int y = 0; y < frameHeight; y++)
6764b9229de0ea1993c94c91016ba3f955509753fb0scygan			{
6774b9229de0ea1993c94c91016ba3f955509753fb0scygan				float yCoord = (float)(y / (0.5*frameHeight)) - 1.0f;
6784b9229de0ea1993c94c91016ba3f955509753fb0scygan
6794b9229de0ea1993c94c91016ba3f955509753fb0scygan				for (int x = 0; x < frameWidth; x++)
6804b9229de0ea1993c94c91016ba3f955509753fb0scygan				{
6814b9229de0ea1993c94c91016ba3f955509753fb0scygan					float xCoord = (float)(x / (0.5*frameWidth)) - 1.0f;
682271724cff305eb9f013d5587ef3f213ed7c9e28bDae Kim					float lineHalfWidth = (float)(deFloor(deviceProperties.limits.lineWidthRange[1]) / frameHeight);
6834b9229de0ea1993c94c91016ba3f955509753fb0scygan
6844b9229de0ea1993c94c91016ba3f955509753fb0scygan					if (xCoord >= -1.0f && xCoord <= 1.0f && yCoord >= -lineHalfWidth && yCoord <= lineHalfWidth)
6854b9229de0ea1993c94c91016ba3f955509753fb0scygan						referenceFrame.getLevel(0).setPixel(tcu::Vec4(0.0f, 1.0f, 0.0f, 1.0f), x, y);
6864b9229de0ea1993c94c91016ba3f955509753fb0scygan				}
6874b9229de0ea1993c94c91016ba3f955509753fb0scygan			}
6884b9229de0ea1993c94c91016ba3f955509753fb0scygan
6894b9229de0ea1993c94c91016ba3f955509753fb0scygan			const vk::VkOffset3D zeroOffset = { 0, 0, 0 };
6904b9229de0ea1993c94c91016ba3f955509753fb0scygan			const tcu::ConstPixelBufferAccess renderedFrame = m_colorTargetImage->readSurface(queue, m_context.getDefaultAllocator(),
691db4efd02b79d71e0d0b1122d01d1a20b37760527scygan																							  vk::VK_IMAGE_LAYOUT_GENERAL, zeroOffset, WIDTH, HEIGHT,
692db4efd02b79d71e0d0b1122d01d1a20b37760527scygan																							  vk::VK_IMAGE_ASPECT_COLOR_BIT);
6934b9229de0ea1993c94c91016ba3f955509753fb0scygan
6944b9229de0ea1993c94c91016ba3f955509753fb0scygan			if (!tcu::fuzzyCompare(log, "Result", "Image comparison result",
6954b9229de0ea1993c94c91016ba3f955509753fb0scygan				referenceFrame.getLevel(0), renderedFrame, 0.05f,
6964b9229de0ea1993c94c91016ba3f955509753fb0scygan				tcu::COMPARE_LOG_RESULT))
6974b9229de0ea1993c94c91016ba3f955509753fb0scygan			{
698db4efd02b79d71e0d0b1122d01d1a20b37760527scygan				return tcu::TestStatus(QP_TEST_RESULT_FAIL, "Image verification failed");
6994b9229de0ea1993c94c91016ba3f955509753fb0scygan			}
7004b9229de0ea1993c94c91016ba3f955509753fb0scygan
701db4efd02b79d71e0d0b1122d01d1a20b37760527scygan			return tcu::TestStatus(QP_TEST_RESULT_PASS, "Image verification passed");
7024b9229de0ea1993c94c91016ba3f955509753fb0scygan		}
7034b9229de0ea1993c94c91016ba3f955509753fb0scygan	}
7044b9229de0ea1993c94c91016ba3f955509753fb0scygan};
7054b9229de0ea1993c94c91016ba3f955509753fb0scygan
7064b9229de0ea1993c94c91016ba3f955509753fb0scygan} //anonymous
7074b9229de0ea1993c94c91016ba3f955509753fb0scygan
708db4efd02b79d71e0d0b1122d01d1a20b37760527scyganDynamicStateRSTests::DynamicStateRSTests (tcu::TestContext& testCtx)
7094b9229de0ea1993c94c91016ba3f955509753fb0scygan	: TestCaseGroup (testCtx, "rs_state", "Tests for rasterizer state")
7104b9229de0ea1993c94c91016ba3f955509753fb0scygan{
7114b9229de0ea1993c94c91016ba3f955509753fb0scygan	/* Left blank on purpose */
7124b9229de0ea1993c94c91016ba3f955509753fb0scygan}
7134b9229de0ea1993c94c91016ba3f955509753fb0scygan
714db4efd02b79d71e0d0b1122d01d1a20b37760527scyganDynamicStateRSTests::~DynamicStateRSTests ()
715db4efd02b79d71e0d0b1122d01d1a20b37760527scygan{
716db4efd02b79d71e0d0b1122d01d1a20b37760527scygan}
7174b9229de0ea1993c94c91016ba3f955509753fb0scygan
7184b9229de0ea1993c94c91016ba3f955509753fb0scyganvoid DynamicStateRSTests::init (void)
7194b9229de0ea1993c94c91016ba3f955509753fb0scygan{
7204b9229de0ea1993c94c91016ba3f955509753fb0scygan	ShaderMap shaderPaths;
721db4efd02b79d71e0d0b1122d01d1a20b37760527scygan	shaderPaths[glu::SHADERTYPE_VERTEX]		= "vulkan/dynamic_state/VertexFetch.vert";
722db4efd02b79d71e0d0b1122d01d1a20b37760527scygan	shaderPaths[glu::SHADERTYPE_FRAGMENT]	= "vulkan/dynamic_state/VertexFetch.frag";
7234b9229de0ea1993c94c91016ba3f955509753fb0scygan
7244b9229de0ea1993c94c91016ba3f955509753fb0scygan	addChild(new InstanceFactory<DepthBiasParamTestInstance>(m_testCtx, "depth_bias", "Test depth bias functionality", shaderPaths));
7254b9229de0ea1993c94c91016ba3f955509753fb0scygan	addChild(new InstanceFactory<DepthBiasClampParamTestInstance>(m_testCtx, "depth_bias_clamp", "Test depth bias clamp functionality", shaderPaths));
7264b9229de0ea1993c94c91016ba3f955509753fb0scygan	addChild(new InstanceFactory<LineWidthParamTestInstance>(m_testCtx, "line_width", "Draw a line with width set to max defined by physical device", shaderPaths));
7274b9229de0ea1993c94c91016ba3f955509753fb0scygan}
7284b9229de0ea1993c94c91016ba3f955509753fb0scygan
729db4efd02b79d71e0d0b1122d01d1a20b37760527scygan} // DynamicState
730db4efd02b79d71e0d0b1122d01d1a20b37760527scygan} // vkt
731