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 CB State Tests
234b9229de0ea1993c94c91016ba3f955509753fb0scygan *//*--------------------------------------------------------------------*/
244b9229de0ea1993c94c91016ba3f955509753fb0scygan
254b9229de0ea1993c94c91016ba3f955509753fb0scygan#include "vktDynamicStateCBTests.hpp"
26db4efd02b79d71e0d0b1122d01d1a20b37760527scygan
274b9229de0ea1993c94c91016ba3f955509753fb0scygan#include "vktDynamicStateBaseClass.hpp"
28db4efd02b79d71e0d0b1122d01d1a20b37760527scygan#include "vktDynamicStateTestCaseUtil.hpp"
294b9229de0ea1993c94c91016ba3f955509753fb0scygan
30db4efd02b79d71e0d0b1122d01d1a20b37760527scygan#include "vkImageUtil.hpp"
314b9229de0ea1993c94c91016ba3f955509753fb0scygan
32db4efd02b79d71e0d0b1122d01d1a20b37760527scygan#include "tcuImageCompare.hpp"
33db4efd02b79d71e0d0b1122d01d1a20b37760527scygan#include "tcuTextureUtil.hpp"
34db4efd02b79d71e0d0b1122d01d1a20b37760527scygan#include "tcuRGBA.hpp"
354b9229de0ea1993c94c91016ba3f955509753fb0scygan
364b9229de0ea1993c94c91016ba3f955509753fb0scygannamespace vkt
374b9229de0ea1993c94c91016ba3f955509753fb0scygan{
384b9229de0ea1993c94c91016ba3f955509753fb0scygannamespace DynamicState
394b9229de0ea1993c94c91016ba3f955509753fb0scygan{
40456eedb873ee0b778240c067e9ac72529fc444dfPyry Haulos
41456eedb873ee0b778240c067e9ac72529fc444dfPyry Haulosusing namespace Draw;
42456eedb873ee0b778240c067e9ac72529fc444dfPyry Haulos
434b9229de0ea1993c94c91016ba3f955509753fb0scygannamespace
444b9229de0ea1993c94c91016ba3f955509753fb0scygan{
454b9229de0ea1993c94c91016ba3f955509753fb0scygan
464b9229de0ea1993c94c91016ba3f955509753fb0scyganclass BlendConstantsTestInstance : public DynamicStateBaseClass
474b9229de0ea1993c94c91016ba3f955509753fb0scygan{
484b9229de0ea1993c94c91016ba3f955509753fb0scyganpublic:
49db4efd02b79d71e0d0b1122d01d1a20b37760527scygan	BlendConstantsTestInstance (Context& context, ShaderMap shaders)
50db4efd02b79d71e0d0b1122d01d1a20b37760527scygan		: DynamicStateBaseClass	(context, shaders[glu::SHADERTYPE_VERTEX], shaders[glu::SHADERTYPE_FRAGMENT])
514b9229de0ea1993c94c91016ba3f955509753fb0scygan	{
524b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_topology = vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
534b9229de0ea1993c94c91016ba3f955509753fb0scygan
54db4efd02b79d71e0d0b1122d01d1a20b37760527scygan		m_data.push_back(PositionColorVertex(tcu::Vec4(-1.0f, 1.0f, 1.0f, 1.0f), tcu::RGBA::green().toVec()));
55db4efd02b79d71e0d0b1122d01d1a20b37760527scygan		m_data.push_back(PositionColorVertex(tcu::Vec4(1.0f, 1.0f, 1.0f, 1.0f), tcu::RGBA::green().toVec()));
56db4efd02b79d71e0d0b1122d01d1a20b37760527scygan		m_data.push_back(PositionColorVertex(tcu::Vec4(-1.0f, -1.0f, 1.0f, 1.0f), tcu::RGBA::green().toVec()));
57db4efd02b79d71e0d0b1122d01d1a20b37760527scygan		m_data.push_back(PositionColorVertex(tcu::Vec4(1.0f, -1.0f, 1.0f, 1.0f), tcu::RGBA::green().toVec()));
584b9229de0ea1993c94c91016ba3f955509753fb0scygan
594b9229de0ea1993c94c91016ba3f955509753fb0scygan		DynamicStateBaseClass::initialize();
604b9229de0ea1993c94c91016ba3f955509753fb0scygan	}
614b9229de0ea1993c94c91016ba3f955509753fb0scygan
624b9229de0ea1993c94c91016ba3f955509753fb0scygan	virtual void initPipeline (const vk::VkDevice device)
634b9229de0ea1993c94c91016ba3f955509753fb0scygan	{
646a2834ac40395173796b6e8d2a8e6c120d86ee74scygan		const vk::Unique<vk::VkShaderModule> vs (createShaderModule(m_vk, device, m_context.getBinaryCollection().get(m_vertexShaderName), 0));
656a2834ac40395173796b6e8d2a8e6c120d86ee74scygan		const vk::Unique<vk::VkShaderModule> fs (createShaderModule(m_vk, device, m_context.getBinaryCollection().get(m_fragmentShaderName), 0));
66ae21c307c29a6efa73f3d4f2b25f0dd2c0b0e023Pyry Haulos
674b9229de0ea1993c94c91016ba3f955509753fb0scygan		const vk::VkPipelineColorBlendAttachmentState VkPipelineColorBlendAttachmentState =
686cbd34be72b2b732fe4f8d60c850d52fb16f68bcPyry Haulos			PipelineCreateInfo::ColorBlendState::Attachment(VK_TRUE,
69db4efd02b79d71e0d0b1122d01d1a20b37760527scygan															vk::VK_BLEND_FACTOR_SRC_ALPHA, vk::VK_BLEND_FACTOR_CONSTANT_COLOR, vk::VK_BLEND_OP_ADD,
70db4efd02b79d71e0d0b1122d01d1a20b37760527scygan															vk::VK_BLEND_FACTOR_SRC_ALPHA, vk::VK_BLEND_FACTOR_CONSTANT_ALPHA, vk::VK_BLEND_OP_ADD);
714b9229de0ea1993c94c91016ba3f955509753fb0scygan
724b9229de0ea1993c94c91016ba3f955509753fb0scygan		PipelineCreateInfo pipelineCreateInfo(*m_pipelineLayout, *m_renderPass, 0, 0);
736a2834ac40395173796b6e8d2a8e6c120d86ee74scygan		pipelineCreateInfo.addShader(PipelineCreateInfo::PipelineShaderStage(*vs, "main", vk::VK_SHADER_STAGE_VERTEX_BIT));
746a2834ac40395173796b6e8d2a8e6c120d86ee74scygan		pipelineCreateInfo.addShader(PipelineCreateInfo::PipelineShaderStage(*fs, "main", vk::VK_SHADER_STAGE_FRAGMENT_BIT));
754b9229de0ea1993c94c91016ba3f955509753fb0scygan		pipelineCreateInfo.addState(PipelineCreateInfo::VertexInputState(m_vertexInputState));
764b9229de0ea1993c94c91016ba3f955509753fb0scygan		pipelineCreateInfo.addState(PipelineCreateInfo::InputAssemblerState(m_topology));
774b9229de0ea1993c94c91016ba3f955509753fb0scygan		pipelineCreateInfo.addState(PipelineCreateInfo::ColorBlendState(1, &VkPipelineColorBlendAttachmentState));
784b9229de0ea1993c94c91016ba3f955509753fb0scygan		pipelineCreateInfo.addState(PipelineCreateInfo::ViewportState(1));
794b9229de0ea1993c94c91016ba3f955509753fb0scygan		pipelineCreateInfo.addState(PipelineCreateInfo::DepthStencilState());
804b9229de0ea1993c94c91016ba3f955509753fb0scygan		pipelineCreateInfo.addState(PipelineCreateInfo::RasterizerState());
814b9229de0ea1993c94c91016ba3f955509753fb0scygan		pipelineCreateInfo.addState(PipelineCreateInfo::MultiSampleState());
824b9229de0ea1993c94c91016ba3f955509753fb0scygan		pipelineCreateInfo.addState(PipelineCreateInfo::DynamicState());
834b9229de0ea1993c94c91016ba3f955509753fb0scygan
844b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_pipeline = vk::createGraphicsPipeline(m_vk, device, DE_NULL, &pipelineCreateInfo);
854b9229de0ea1993c94c91016ba3f955509753fb0scygan	}
864b9229de0ea1993c94c91016ba3f955509753fb0scygan
874b9229de0ea1993c94c91016ba3f955509753fb0scygan	virtual tcu::TestStatus iterate (void)
884b9229de0ea1993c94c91016ba3f955509753fb0scygan	{
894b9229de0ea1993c94c91016ba3f955509753fb0scygan		tcu::TestLog &log = m_context.getTestContext().getLog();
904b9229de0ea1993c94c91016ba3f955509753fb0scygan		const vk::VkQueue queue = m_context.getUniversalQueue();
914b9229de0ea1993c94c91016ba3f955509753fb0scygan
924b9229de0ea1993c94c91016ba3f955509753fb0scygan		const vk::VkClearColorValue clearColor = { { 1.0f, 1.0f, 1.0f, 1.0f } };
934b9229de0ea1993c94c91016ba3f955509753fb0scygan		beginRenderPassWithClearColor(clearColor);
944b9229de0ea1993c94c91016ba3f955509753fb0scygan
954b9229de0ea1993c94c91016ba3f955509753fb0scygan		// bind states here
964b9229de0ea1993c94c91016ba3f955509753fb0scygan		setDynamicViewportState(WIDTH, HEIGHT);
976a2834ac40395173796b6e8d2a8e6c120d86ee74scygan		setDynamicRasterizationState();
984b9229de0ea1993c94c91016ba3f955509753fb0scygan		setDynamicDepthStencilState();
994b9229de0ea1993c94c91016ba3f955509753fb0scygan		setDynamicBlendState(0.33f, 0.1f, 0.66f, 0.5f);
1004b9229de0ea1993c94c91016ba3f955509753fb0scygan
1014b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_vk.cmdBindPipeline(*m_cmdBuffer, vk::VK_PIPELINE_BIND_POINT_GRAPHICS, *m_pipeline);
1024b9229de0ea1993c94c91016ba3f955509753fb0scygan
1034b9229de0ea1993c94c91016ba3f955509753fb0scygan		const vk::VkDeviceSize vertexBufferOffset = 0;
1044b9229de0ea1993c94c91016ba3f955509753fb0scygan		const vk::VkBuffer vertexBuffer = m_vertexBuffer->object();
1054b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_vk.cmdBindVertexBuffers(*m_cmdBuffer, 0, 1, &vertexBuffer, &vertexBufferOffset);
1064b9229de0ea1993c94c91016ba3f955509753fb0scygan
1074b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_vk.cmdDraw(*m_cmdBuffer, static_cast<deUint32>(m_data.size()), 1, 0, 0);
1084b9229de0ea1993c94c91016ba3f955509753fb0scygan
1094b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_vk.cmdEndRenderPass(*m_cmdBuffer);
1104b9229de0ea1993c94c91016ba3f955509753fb0scygan		m_vk.endCommandBuffer(*m_cmdBuffer);
1114b9229de0ea1993c94c91016ba3f955509753fb0scygan
1126a2834ac40395173796b6e8d2a8e6c120d86ee74scygan		vk::VkSubmitInfo submitInfo =
1136a2834ac40395173796b6e8d2a8e6c120d86ee74scygan		{
114db4efd02b79d71e0d0b1122d01d1a20b37760527scygan			vk::VK_STRUCTURE_TYPE_SUBMIT_INFO,	// VkStructureType			sType;
115db4efd02b79d71e0d0b1122d01d1a20b37760527scygan			DE_NULL,							// const void*				pNext;
116ae21c307c29a6efa73f3d4f2b25f0dd2c0b0e023Pyry Haulos			0,									// deUint32					waitSemaphoreCount;
117ae21c307c29a6efa73f3d4f2b25f0dd2c0b0e023Pyry Haulos			DE_NULL,							// const VkSemaphore*		pWaitSemaphores;
118689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos			(const vk::VkPipelineStageFlags*)DE_NULL,
119ae21c307c29a6efa73f3d4f2b25f0dd2c0b0e023Pyry Haulos			1,									// deUint32					commandBufferCount;
120db4efd02b79d71e0d0b1122d01d1a20b37760527scygan			&m_cmdBuffer.get(),					// const VkCommandBuffer*	pCommandBuffers;
121ae21c307c29a6efa73f3d4f2b25f0dd2c0b0e023Pyry Haulos			0,									// deUint32					signalSemaphoreCount;
122db4efd02b79d71e0d0b1122d01d1a20b37760527scygan			DE_NULL								// const VkSemaphore*		pSignalSemaphores;
1236a2834ac40395173796b6e8d2a8e6c120d86ee74scygan		};
1246a2834ac40395173796b6e8d2a8e6c120d86ee74scygan		m_vk.queueSubmit(queue, 1, &submitInfo, DE_NULL);
1254b9229de0ea1993c94c91016ba3f955509753fb0scygan		VK_CHECK(m_vk.queueWaitIdle(queue));
1264b9229de0ea1993c94c91016ba3f955509753fb0scygan
1274b9229de0ea1993c94c91016ba3f955509753fb0scygan		//validation
1284b9229de0ea1993c94c91016ba3f955509753fb0scygan		{
1294b9229de0ea1993c94c91016ba3f955509753fb0scygan			tcu::Texture2D referenceFrame(vk::mapVkFormat(m_colorAttachmentFormat), (int)(0.5 + WIDTH), (int)(0.5 + HEIGHT));
1304b9229de0ea1993c94c91016ba3f955509753fb0scygan			referenceFrame.allocLevel(0);
1314b9229de0ea1993c94c91016ba3f955509753fb0scygan
1324b9229de0ea1993c94c91016ba3f955509753fb0scygan			const deInt32 frameWidth = referenceFrame.getWidth();
1334b9229de0ea1993c94c91016ba3f955509753fb0scygan			const deInt32 frameHeight = referenceFrame.getHeight();
1344b9229de0ea1993c94c91016ba3f955509753fb0scygan
1354b9229de0ea1993c94c91016ba3f955509753fb0scygan			tcu::clear(referenceFrame.getLevel(0), tcu::Vec4(0.0f, 0.0f, 0.0f, 1.0f));
1364b9229de0ea1993c94c91016ba3f955509753fb0scygan
1374b9229de0ea1993c94c91016ba3f955509753fb0scygan			for (int y = 0; y < frameHeight; y++)
1384b9229de0ea1993c94c91016ba3f955509753fb0scygan			{
1394b9229de0ea1993c94c91016ba3f955509753fb0scygan				const float yCoord = (float)(y / (0.5*frameHeight)) - 1.0f;
1404b9229de0ea1993c94c91016ba3f955509753fb0scygan
1414b9229de0ea1993c94c91016ba3f955509753fb0scygan				for (int x = 0; x < frameWidth; x++)
1424b9229de0ea1993c94c91016ba3f955509753fb0scygan				{
1434b9229de0ea1993c94c91016ba3f955509753fb0scygan					const float xCoord = (float)(x / (0.5*frameWidth)) - 1.0f;
1444b9229de0ea1993c94c91016ba3f955509753fb0scygan
1454b9229de0ea1993c94c91016ba3f955509753fb0scygan					if ((yCoord >= -1.0f && yCoord <= 1.0f && xCoord >= -1.0f && xCoord <= 1.0f))
1464b9229de0ea1993c94c91016ba3f955509753fb0scygan						referenceFrame.getLevel(0).setPixel(tcu::Vec4(0.33f, 1.0f, 0.66f, 1.0f), x, y);
1474b9229de0ea1993c94c91016ba3f955509753fb0scygan				}
1484b9229de0ea1993c94c91016ba3f955509753fb0scygan			}
1494b9229de0ea1993c94c91016ba3f955509753fb0scygan
1504b9229de0ea1993c94c91016ba3f955509753fb0scygan			const vk::VkOffset3D zeroOffset = { 0, 0, 0 };
1514b9229de0ea1993c94c91016ba3f955509753fb0scygan			const tcu::ConstPixelBufferAccess renderedFrame = m_colorTargetImage->readSurface(queue, m_context.getDefaultAllocator(),
152db4efd02b79d71e0d0b1122d01d1a20b37760527scygan																							  vk::VK_IMAGE_LAYOUT_GENERAL, zeroOffset, WIDTH, HEIGHT, vk::VK_IMAGE_ASPECT_COLOR_BIT);
1534b9229de0ea1993c94c91016ba3f955509753fb0scygan
1544b9229de0ea1993c94c91016ba3f955509753fb0scygan			if (!tcu::fuzzyCompare(log, "Result", "Image comparison result",
1554b9229de0ea1993c94c91016ba3f955509753fb0scygan				referenceFrame.getLevel(0), renderedFrame, 0.05f,
1564b9229de0ea1993c94c91016ba3f955509753fb0scygan				tcu::COMPARE_LOG_RESULT))
1574b9229de0ea1993c94c91016ba3f955509753fb0scygan			{
158db4efd02b79d71e0d0b1122d01d1a20b37760527scygan				return tcu::TestStatus(QP_TEST_RESULT_FAIL, "Image verification failed");
1594b9229de0ea1993c94c91016ba3f955509753fb0scygan			}
1604b9229de0ea1993c94c91016ba3f955509753fb0scygan
161db4efd02b79d71e0d0b1122d01d1a20b37760527scygan			return tcu::TestStatus(QP_TEST_RESULT_PASS, "Image verification passed");
1624b9229de0ea1993c94c91016ba3f955509753fb0scygan		}
1634b9229de0ea1993c94c91016ba3f955509753fb0scygan	}
1644b9229de0ea1993c94c91016ba3f955509753fb0scygan};
1654b9229de0ea1993c94c91016ba3f955509753fb0scygan
1664b9229de0ea1993c94c91016ba3f955509753fb0scygan} //anonymous
1674b9229de0ea1993c94c91016ba3f955509753fb0scygan
168db4efd02b79d71e0d0b1122d01d1a20b37760527scyganDynamicStateCBTests::DynamicStateCBTests (tcu::TestContext& testCtx)
1694b9229de0ea1993c94c91016ba3f955509753fb0scygan	: TestCaseGroup (testCtx, "cb_state", "Tests for color blend state")
1704b9229de0ea1993c94c91016ba3f955509753fb0scygan{
1714b9229de0ea1993c94c91016ba3f955509753fb0scygan	/* Left blank on purpose */
1724b9229de0ea1993c94c91016ba3f955509753fb0scygan}
1734b9229de0ea1993c94c91016ba3f955509753fb0scygan
1744b9229de0ea1993c94c91016ba3f955509753fb0scyganDynamicStateCBTests::~DynamicStateCBTests (void) {}
1754b9229de0ea1993c94c91016ba3f955509753fb0scygan
1764b9229de0ea1993c94c91016ba3f955509753fb0scyganvoid DynamicStateCBTests::init (void)
1774b9229de0ea1993c94c91016ba3f955509753fb0scygan{
1784b9229de0ea1993c94c91016ba3f955509753fb0scygan	ShaderMap shaderPaths;
1794b9229de0ea1993c94c91016ba3f955509753fb0scygan	shaderPaths[glu::SHADERTYPE_VERTEX] = "vulkan/dynamic_state/VertexFetch.vert";
1804b9229de0ea1993c94c91016ba3f955509753fb0scygan	shaderPaths[glu::SHADERTYPE_FRAGMENT] = "vulkan/dynamic_state/VertexFetch.frag";
1814b9229de0ea1993c94c91016ba3f955509753fb0scygan	addChild(new InstanceFactory<BlendConstantsTestInstance>(m_testCtx, "blend_constants", "Check if blend constants are working properly", shaderPaths));
1824b9229de0ea1993c94c91016ba3f955509753fb0scygan}
1834b9229de0ea1993c94c91016ba3f955509753fb0scygan
184db4efd02b79d71e0d0b1122d01d1a20b37760527scygan} // DynamicState
185db4efd02b79d71e0d0b1122d01d1a20b37760527scygan} // vkt
186