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