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