vktPipelineStencilTests.cpp revision 689c095f881a410da6a315795452a8e00ad95a9d
19091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim/*------------------------------------------------------------------------ 29091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim * Vulkan Conformance Tests 39091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim * ------------------------ 49091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim * 59091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim * Copyright (c) 2015 The Khronos Group Inc. 69091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim * Copyright (c) 2015 Imagination Technologies Ltd. 79091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim * 89091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim * Permission is hereby granted, free of charge, to any person obtaining a 99091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim * copy of this software and/or associated documentation files (the 109091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim * "Materials"), to deal in the Materials without restriction, including 119091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim * without limitation the rights to use, copy, modify, merge, publish, 129091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim * distribute, sublicense, and/or sell copies of the Materials, and to 139091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim * permit persons to whom the Materials are furnished to do so, subject to 149091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim * the following conditions: 159091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim * 169091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim * The above copyright notice(s) and this permission notice shall be included 179091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim * in all copies or substantial portions of the Materials. 189091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim * 199091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim * The Materials are Confidential Information as defined by the 209091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim * Khronos Membership Agreement until designated non-confidential by Khronos, 219091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim * at which point this condition clause shall be removed. 229091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim * 239091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 249091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 259091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 269091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY 279091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 289091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 299091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim * MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. 309091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim * 319091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim *//*! 329091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim * \file 339091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim * \brief Stencil Tests 349091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim *//*--------------------------------------------------------------------*/ 359091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 369091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim#include "vktPipelineStencilTests.hpp" 379091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim#include "vktPipelineClearUtil.hpp" 389091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim#include "vktPipelineImageUtil.hpp" 399091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim#include "vktPipelineVertexUtil.hpp" 409091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim#include "vktPipelineReferenceRenderer.hpp" 419091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim#include "vktPipelineUniqueRandomIterator.hpp" 429091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim#include "vktTestCase.hpp" 439091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim#include "vkImageUtil.hpp" 449091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim#include "vkMemUtil.hpp" 459091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim#include "vkPrograms.hpp" 469091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim#include "vkQueryUtil.hpp" 479091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim#include "vkRef.hpp" 489091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim#include "vkRefUtil.hpp" 499091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim#include "tcuImageCompare.hpp" 509091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim#include "deMemory.h" 519091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim#include "deRandom.hpp" 529091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim#include "deStringUtil.hpp" 539091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim#include "deUniquePtr.hpp" 549091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 559091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim#include <algorithm> 569091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim#include <sstream> 579091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim#include <vector> 589091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 599091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimnamespace vkt 609091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{ 619091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimnamespace pipeline 629091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{ 639091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 649091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimusing namespace vk; 659091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 669091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimnamespace 679091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{ 689091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 699091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimbool isSupportedDepthStencilFormat (const InstanceInterface& instanceInterface, VkPhysicalDevice device, VkFormat format) 709091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{ 719091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VkFormatProperties formatProps; 729091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 73120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim instanceInterface.getPhysicalDeviceFormatProperties(device, format, &formatProps); 749091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 75682d882fdacf7d4711d23a5ba006f7fb377cf0e3Pyry Haulos return (formatProps.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) != 0; 769091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim} 779091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 789091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimclass StencilOpStateUniqueRandomIterator : public UniqueRandomIterator<VkStencilOpState> 799091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{ 809091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimpublic: 819091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim StencilOpStateUniqueRandomIterator (int seed); 829091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim virtual ~StencilOpStateUniqueRandomIterator (void) {} 839091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim virtual VkStencilOpState getIndexedValue (deUint32 index); 849091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 859091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimprivate: 869091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const static VkStencilOp m_stencilOps[]; 879091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const static VkCompareOp m_compareOps[]; 889091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 899091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim // Pre-calculated constants 909091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const static deUint32 m_stencilOpsLength; 919091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const static deUint32 m_stencilOpsLength2; 929091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const static deUint32 m_stencilOpsLength3; 939091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const static deUint32 m_compareOpsLength; 949091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 959091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim // Total number of cross-combinations of (stencilFailOp x stencilPassOp x stencilDepthFailOp x stencilCompareOp) 969091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const static deUint32 m_totalStencilOpStates; 979091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim}; 989091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 999091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 1009091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimclass StencilTest : public vkt::TestCase 1019091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{ 1029091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimpublic: 1039091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim enum 1049091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 1059091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim QUAD_COUNT = 4 1069091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 1079091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 1089091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim struct StencilStateConfig 1099091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 1109091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim deUint32 frontReadMask; 1119091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim deUint32 frontWriteMask; 1129091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim deUint32 frontRef; 1139091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 1149091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim deUint32 backReadMask; 1159091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim deUint32 backWriteMask; 1169091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim deUint32 backRef; 1179091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 1189091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 1199091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const static StencilStateConfig s_stencilStateConfigs[QUAD_COUNT]; 1209091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const static float s_quadDepths[QUAD_COUNT]; 1219091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 1229091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 1239091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim StencilTest (tcu::TestContext& testContext, 1249091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const std::string& name, 1259091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const std::string& description, 1269091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VkFormat stencilFormat, 1279091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkStencilOpState& stencilOpStateFront, 1289091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkStencilOpState& stencilOpStateBack); 1299091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim virtual ~StencilTest (void); 1309091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim virtual void initPrograms (SourceCollections& sourceCollections) const; 1319091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim virtual TestInstance* createInstance (Context& context) const; 1329091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 1339091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimprivate: 1349091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VkFormat m_stencilFormat; 1359091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkStencilOpState m_stencilOpStateFront; 1369091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkStencilOpState m_stencilOpStateBack; 1379091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim}; 1389091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 1399091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimclass StencilTestInstance : public vkt::TestInstance 1409091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{ 1419091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimpublic: 1429091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim StencilTestInstance (Context& context, 1439091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VkFormat stencilFormat, 1449091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkStencilOpState& stencilOpStatesFront, 1459091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkStencilOpState& stencilOpStatesBack); 1469091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim virtual ~StencilTestInstance (void); 1479091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim virtual tcu::TestStatus iterate (void); 1489091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 1499091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimprivate: 1509091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim tcu::TestStatus verifyImage (void); 1519091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 1529091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VkStencilOpState m_stencilOpStateFront; 1539091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VkStencilOpState m_stencilOpStateBack; 154689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos const tcu::UVec2 m_renderSize; 1559091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkFormat m_colorFormat; 1569091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkFormat m_stencilFormat; 1579091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 1589091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VkImageCreateInfo m_colorImageCreateInfo; 1599091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim Move<VkImage> m_colorImage; 1609091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim de::MovePtr<Allocation> m_colorImageAlloc; 1619091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim Move<VkImage> m_stencilImage; 1629091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim de::MovePtr<Allocation> m_stencilImageAlloc; 1639091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim Move<VkImageView> m_colorAttachmentView; 1649091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim Move<VkImageView> m_stencilAttachmentView; 1659091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim Move<VkRenderPass> m_renderPass; 1669091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim Move<VkFramebuffer> m_framebuffer; 1679091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 1689091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim Move<VkShaderModule> m_vertexShaderModule; 1699091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim Move<VkShaderModule> m_fragmentShaderModule; 1709091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 1719091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim Move<VkBuffer> m_vertexBuffer; 1729091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim std::vector<Vertex4RGBA> m_vertices; 1739091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim de::MovePtr<Allocation> m_vertexBufferAlloc; 1749091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 1759091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim Move<VkPipelineLayout> m_pipelineLayout; 1769091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim Move<VkPipeline> m_graphicsPipelines[StencilTest::QUAD_COUNT]; 1779091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 178120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim Move<VkCommandPool> m_cmdPool; 179120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim Move<VkCommandBuffer> m_cmdBuffer; 1809091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 1819091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim Move<VkFence> m_fence; 1829091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim}; 1839091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 1849091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 1859091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim// StencilOpStateUniqueRandomIterator 1869091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 1879091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimconst VkStencilOp StencilOpStateUniqueRandomIterator::m_stencilOps[] = 1889091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{ 1899091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_STENCIL_OP_KEEP, 1909091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_STENCIL_OP_ZERO, 1919091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_STENCIL_OP_REPLACE, 192120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_STENCIL_OP_INCREMENT_AND_CLAMP, 193120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_STENCIL_OP_DECREMENT_AND_CLAMP, 1949091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_STENCIL_OP_INVERT, 195120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_STENCIL_OP_INCREMENT_AND_WRAP, 196120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_STENCIL_OP_DECREMENT_AND_WRAP 1979091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim}; 1989091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 1999091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimconst VkCompareOp StencilOpStateUniqueRandomIterator::m_compareOps[] = 2009091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{ 2019091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_COMPARE_OP_NEVER, 2029091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_COMPARE_OP_LESS, 2039091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_COMPARE_OP_EQUAL, 204120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_COMPARE_OP_LESS_OR_EQUAL, 2059091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_COMPARE_OP_GREATER, 2069091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_COMPARE_OP_NOT_EQUAL, 207120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_COMPARE_OP_GREATER_OR_EQUAL, 2089091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_COMPARE_OP_ALWAYS 2099091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim}; 2109091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 2119091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimconst deUint32 StencilOpStateUniqueRandomIterator::m_stencilOpsLength = DE_LENGTH_OF_ARRAY(m_stencilOps); 2129091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimconst deUint32 StencilOpStateUniqueRandomIterator::m_stencilOpsLength2 = m_stencilOpsLength * m_stencilOpsLength; 2139091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimconst deUint32 StencilOpStateUniqueRandomIterator::m_stencilOpsLength3 = m_stencilOpsLength2 * m_stencilOpsLength; 2149091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimconst deUint32 StencilOpStateUniqueRandomIterator::m_compareOpsLength = DE_LENGTH_OF_ARRAY(m_compareOps); 2159091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimconst deUint32 StencilOpStateUniqueRandomIterator::m_totalStencilOpStates = m_stencilOpsLength3 * m_compareOpsLength; 2169091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 2179091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae KimStencilOpStateUniqueRandomIterator::StencilOpStateUniqueRandomIterator (int seed) 2189091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim : UniqueRandomIterator<VkStencilOpState>(m_totalStencilOpStates, m_totalStencilOpStates, seed) 2199091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{ 2209091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim} 2219091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 2229091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae KimVkStencilOpState StencilOpStateUniqueRandomIterator::getIndexedValue (deUint32 index) 2239091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{ 2249091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const deUint32 stencilCompareOpIndex = index / m_stencilOpsLength3; 2259091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const deUint32 stencilCompareOpSeqIndex = stencilCompareOpIndex * m_stencilOpsLength3; 2269091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 2279091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const deUint32 stencilDepthFailOpIndex = (index - stencilCompareOpSeqIndex) / m_stencilOpsLength2; 2289091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const deUint32 stencilDepthFailOpSeqIndex = stencilDepthFailOpIndex * m_stencilOpsLength2; 2299091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 2309091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const deUint32 stencilPassOpIndex = (index - stencilCompareOpSeqIndex - stencilDepthFailOpSeqIndex) / m_stencilOpsLength; 2319091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const deUint32 stencilPassOpSeqIndex = stencilPassOpIndex * m_stencilOpsLength; 2329091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 2339091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const deUint32 stencilFailOpIndex = index - stencilCompareOpSeqIndex - stencilDepthFailOpSeqIndex - stencilPassOpSeqIndex; 2349091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 2359091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkStencilOpState stencilOpState = 2369091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 237120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim m_stencilOps[stencilFailOpIndex], // VkStencilOp failOp; 238120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim m_stencilOps[stencilPassOpIndex], // VkStencilOp passOp; 239120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim m_stencilOps[stencilDepthFailOpIndex], // VkStencilOp depthFailOp; 240120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim m_compareOps[stencilCompareOpIndex], // VkCompareOp compareOp; 241120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0x0, // deUint32 compareMask; 242120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0x0, // deUint32 writeMask; 243120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0x0 // deUint32 reference; 2449091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 2459091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 2469091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim return stencilOpState; 2479091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim} 2489091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 2499091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 2509091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim// StencilTest 2519091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 2529091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimconst StencilTest::StencilStateConfig StencilTest::s_stencilStateConfigs[QUAD_COUNT] = 2539091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{ 2549091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim // frontReadMask frontWriteMask frontRef backReadMask backWriteMask backRef 2559091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 0xFF, 0xFF, 0xAB, 0xF0, 0xFF, 0xFF }, 2569091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 0xFF, 0xF0, 0xCD, 0xF0, 0xF0, 0xEF }, 2579091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 0xF0, 0x0F, 0xEF, 0xFF, 0x0F, 0xCD }, 2589091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 0xF0, 0x01, 0xFF, 0xFF, 0x01, 0xAB } 2599091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim}; 2609091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 2619091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimconst float StencilTest::s_quadDepths[QUAD_COUNT] = 2629091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{ 2639091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 0.1f, 2649091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 0.0f, 2659091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 0.3f, 2669091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 0.2f 2679091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim}; 2689091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 2699091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae KimStencilTest::StencilTest (tcu::TestContext& testContext, 2709091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const std::string& name, 2719091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const std::string& description, 2729091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VkFormat stencilFormat, 2739091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkStencilOpState& stencilOpStateFront, 2749091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkStencilOpState& stencilOpStateBack) 2759091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim : vkt::TestCase (testContext, name, description) 2769091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim , m_stencilFormat (stencilFormat) 2779091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim , m_stencilOpStateFront (stencilOpStateFront) 2789091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim , m_stencilOpStateBack (stencilOpStateBack) 2799091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{ 2809091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim} 2819091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 2829091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae KimStencilTest::~StencilTest (void) 2839091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{ 2849091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim} 2859091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 2869091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae KimTestInstance* StencilTest::createInstance (Context& context) const 2879091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{ 2889091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim return new StencilTestInstance(context, m_stencilFormat, m_stencilOpStateFront, m_stencilOpStateBack); 2899091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim} 2909091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 2919091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimvoid StencilTest::initPrograms (SourceCollections& sourceCollections) const 2929091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{ 2939091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim sourceCollections.glslSources.add("color_vert") << glu::VertexSource( 2949091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim "#version 310 es\n" 2959091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim "layout(location = 0) in vec4 position;\n" 2969091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim "layout(location = 1) in vec4 color;\n" 2979091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim "layout(location = 0) out highp vec4 vtxColor;\n" 2989091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim "void main (void)\n" 2999091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim "{\n" 3009091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim " gl_Position = position;\n" 3019091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim " vtxColor = color;\n" 3029091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim "}\n"); 3039091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 3049091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim sourceCollections.glslSources.add("color_frag") << glu::FragmentSource( 3059091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim "#version 310 es\n" 3069091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim "layout(location = 0) in highp vec4 vtxColor;\n" 3079091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim "layout(location = 0) out highp vec4 fragColor;\n" 3089091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim "void main (void)\n" 3099091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim "{\n" 3109091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim " fragColor = vtxColor;\n" 3119091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim "}\n"); 3129091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim} 3139091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 3149091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 3159091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim// StencilTestInstance 3169091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 3179091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae KimStencilTestInstance::StencilTestInstance (Context& context, 3189091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VkFormat stencilFormat, 3199091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkStencilOpState& stencilOpStateFront, 3209091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkStencilOpState& stencilOpStateBack) 3219091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim : vkt::TestInstance (context) 3229091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim , m_stencilOpStateFront (stencilOpStateFront) 3239091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim , m_stencilOpStateBack (stencilOpStateBack) 3249091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim , m_renderSize (32, 32) 3259091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim , m_colorFormat (VK_FORMAT_R8G8B8A8_UNORM) 3269091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim , m_stencilFormat (stencilFormat) 3279091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{ 328120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim const DeviceInterface& vk = context.getDeviceInterface(); 329120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim const VkDevice vkDevice = context.getDevice(); 330120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex(); 331120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim SimpleAllocator memAlloc (vk, vkDevice, getPhysicalDeviceMemoryProperties(context.getInstanceInterface(), context.getPhysicalDevice())); 332120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim const VkComponentMapping componentMappingRGBA = { VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A }; 3339091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 3349091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim // Create color image 3359091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 3369091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkImageCreateInfo colorImageParams = 3379091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 338120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, // VkStructureType sType; 339120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim DE_NULL, // const void* pNext; 340120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // VkImageCreateFlags flags; 341120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_IMAGE_TYPE_2D, // VkImageType imageType; 342120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim m_colorFormat, // VkFormat format; 343120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim { m_renderSize.x(), m_renderSize.y(), 1u }, // VkExtent3D extent; 344120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 1u, // deUint32 mipLevels; 345120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 1u, // deUint32 arrayLayers; 346120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits samples; 347120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_IMAGE_TILING_OPTIMAL, // VkImageTiling tiling; 348120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT, // VkImageUsageFlags usage; 349120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode; 350120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 1u, // deUint32 queueFamilyIndexCount; 351120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim &queueFamilyIndex, // const deUint32* pQueueFamilyIndices; 352120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_IMAGE_LAYOUT_UNDEFINED // VkImageLayout initialLayout; 3539091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 3549091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 3559091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim m_colorImageCreateInfo = colorImageParams; 3569091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim m_colorImage = createImage(vk, vkDevice, &m_colorImageCreateInfo); 3579091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 3589091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim // Allocate and bind color image memory 3599091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim m_colorImageAlloc = memAlloc.allocate(getImageMemoryRequirements(vk, vkDevice, *m_colorImage), MemoryRequirement::Any); 3609091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_CHECK(vk.bindImageMemory(vkDevice, *m_colorImage, m_colorImageAlloc->getMemory(), m_colorImageAlloc->getOffset())); 3619091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim } 3629091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 3639091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim // Create stencil image 3649091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 3659091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim // Check format support 3669091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim if (!isSupportedDepthStencilFormat(context.getInstanceInterface(), context.getPhysicalDevice(), m_stencilFormat)) 3679091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim throw tcu::NotSupportedError(std::string("Unsupported depth/stencil format: ") + getFormatName(m_stencilFormat)); 3689091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 3699091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkImageCreateInfo stencilImageParams = 3709091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 371120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, // VkStructureType sType; 372120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim DE_NULL, // const void* pNext; 373120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // VkImageCreateFlags flags; 374120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_IMAGE_TYPE_2D, // VkImageType imageType; 375120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim m_stencilFormat, // VkFormat format; 376120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim { m_renderSize.x(), m_renderSize.y(), 1u }, // VkExtent3D extent; 377120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 1u, // deUint32 mipLevels; 378120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 1u, // deUint32 arrayLayers; 379120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits samples; 380120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_IMAGE_TILING_OPTIMAL, // VkImageTiling tiling; 381120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, // VkImageUsageFlags usage; 382120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode; 383120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 1u, // deUint32 queueFamilyIndexCount; 384120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim &queueFamilyIndex, // const deUint32* pQueueFamilyIndices; 385120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_IMAGE_LAYOUT_UNDEFINED // VkImageLayout initialLayout; 3869091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 3879091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 3889091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim m_stencilImage = createImage(vk, vkDevice, &stencilImageParams); 3899091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 3909091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim // Allocate and bind stencil image memory 3919091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim m_stencilImageAlloc = memAlloc.allocate(getImageMemoryRequirements(vk, vkDevice, *m_stencilImage), MemoryRequirement::Any); 3929091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_CHECK(vk.bindImageMemory(vkDevice, *m_stencilImage, m_stencilImageAlloc->getMemory(), m_stencilImageAlloc->getOffset())); 3939091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim } 3949091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 3959091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim // Create color attachment view 3969091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 3979091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkImageViewCreateInfo colorAttachmentViewParams = 3989091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 399120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, // VkStructureType sType; 400120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim DE_NULL, // const void* pNext; 401120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // VkImageViewCreateFlags flags; 402120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim *m_colorImage, // VkImage image; 403120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_IMAGE_VIEW_TYPE_2D, // VkImageViewType viewType; 404120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim m_colorFormat, // VkFormat format; 405120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim componentMappingRGBA, // VkComponentMapping components; 406120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim { VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u } // VkImageSubresourceRange subresourceRange; 4079091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 4089091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 4099091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim m_colorAttachmentView = createImageView(vk, vkDevice, &colorAttachmentViewParams); 4109091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim } 4119091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 4129091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim // Create stencil attachment view 4139091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 4149091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkImageViewCreateInfo stencilAttachmentViewParams = 4159091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 416120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, // VkStructureType sType; 417120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim DE_NULL, // const void* pNext; 418120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // VkImageViewCreateFlags flags; 419120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim *m_stencilImage, // VkImage image; 420120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_IMAGE_VIEW_TYPE_2D, // VkImageViewType viewType; 421120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim m_stencilFormat, // VkFormat format; 422120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim componentMappingRGBA, // VkComponentMapping components; 423120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim { VK_IMAGE_ASPECT_STENCIL_BIT, 0u, 1u, 0u, 1u }, // VkImageSubresourceRange subresourceRange; 4249091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 4259091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 4269091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim m_stencilAttachmentView = createImageView(vk, vkDevice, &stencilAttachmentViewParams); 4279091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim } 4289091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 4299091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim // Create render pass 4309091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 4319091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkAttachmentDescription colorAttachmentDescription = 4329091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 43394128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos 0u, // VkAttachmentDescriptionFlags flags; 4349091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim m_colorFormat, // VkFormat format; 435120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits samples; 4369091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_ATTACHMENT_LOAD_OP_CLEAR, // VkAttachmentLoadOp loadOp; 4379091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_ATTACHMENT_STORE_OP_STORE, // VkAttachmentStoreOp storeOp; 4389091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_ATTACHMENT_LOAD_OP_DONT_CARE, // VkAttachmentLoadOp stencilLoadOp; 4399091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_ATTACHMENT_STORE_OP_DONT_CARE, // VkAttachmentStoreOp stencilStoreOp; 4409091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // VkImageLayout initialLayout; 4419091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // VkImageLayout finalLayout; 4429091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 4439091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 4449091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkAttachmentDescription stencilAttachmentDescription = 4459091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 446120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // VkAttachmentDescriptionFlags flags; 4479091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim m_stencilFormat, // VkFormat format; 448120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits samples; 4499091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_ATTACHMENT_LOAD_OP_CLEAR, // VkAttachmentLoadOp loadOp; 4509091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_ATTACHMENT_STORE_OP_DONT_CARE, // VkAttachmentStoreOp storeOp; 4519091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_ATTACHMENT_LOAD_OP_CLEAR, // VkAttachmentLoadOp stencilLoadOp; 4529091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_ATTACHMENT_STORE_OP_DONT_CARE, // VkAttachmentStoreOp stencilStoreOp; 4539091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, // VkImageLayout initialLayout; 4549091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, // VkImageLayout finalLayout; 4559091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 4569091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 4579091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkAttachmentDescription attachments[2] = 4589091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 4599091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim colorAttachmentDescription, 4609091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim stencilAttachmentDescription 4619091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 4629091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 4639091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkAttachmentReference colorAttachmentReference = 4649091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 4659091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 0u, // deUint32 attachment; 4669091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL // VkImageLayout layout; 4679091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 4689091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 4699091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkAttachmentReference stencilAttachmentReference = 4709091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 4719091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 1u, // deUint32 attachment; 4729091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL // VkImageLayout layout; 4739091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 4749091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 4759091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkSubpassDescription subpassDescription = 4769091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 4779091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 0u, // VkSubpassDescriptionFlags flags; 478120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_PIPELINE_BIND_POINT_GRAPHICS, // VkPipelineBindPoint pipelineBindPoint; 479120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // deUint32 inputAttachmentCount; 4809091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim DE_NULL, // const VkAttachmentReference* pInputAttachments; 481120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 1u, // deUint32 colorAttachmentCount; 4829091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim &colorAttachmentReference, // const VkAttachmentReference* pColorAttachments; 483120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim DE_NULL, // const VkAttachmentReference* pResolveAttachments; 484120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim &stencilAttachmentReference, // const VkAttachmentReference* pDepthStencilAttachment; 485120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // deUint32 preserveAttachmentCount; 4869091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim DE_NULL // const VkAttachmentReference* pPreserveAttachments; 4879091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 4889091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 4899091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkRenderPassCreateInfo renderPassParams = 4909091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 4919091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, // VkStructureType sType; 4929091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim DE_NULL, // const void* pNext; 493120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // VkRenderPassCreateFlags flags; 4949091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 2u, // deUint32 attachmentCount; 4959091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim attachments, // const VkAttachmentDescription* pAttachments; 4969091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 1u, // deUint32 subpassCount; 4979091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim &subpassDescription, // const VkSubpassDescription* pSubpasses; 4989091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 0u, // deUint32 dependencyCount; 4999091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim DE_NULL // const VkSubpassDependency* pDependencies; 5009091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 5019091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 5029091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim m_renderPass = createRenderPass(vk, vkDevice, &renderPassParams); 5039091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim } 5049091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 5059091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim // Create framebuffer 5069091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 5079091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkImageView attachmentBindInfos[2] = { *m_colorAttachmentView, *m_stencilAttachmentView }; 5089091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 5099091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkFramebufferCreateInfo framebufferParams = 5109091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 511120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, // VkStructureType sType; 512120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim DE_NULL, // const void* pNext; 513120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // VkFramebufferCreateFlags flags; 514120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim *m_renderPass, // VkRenderPass renderPass; 515120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 2u, // deUint32 attachmentCount; 516120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim attachmentBindInfos, // const VkImageView* pAttachments; 517120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim (deUint32)m_renderSize.x(), // deUint32 width; 518120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim (deUint32)m_renderSize.y(), // deUint32 height; 519120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 1u // deUint32 layers; 5209091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 5219091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 5229091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim m_framebuffer = createFramebuffer(vk, vkDevice, &framebufferParams); 5239091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim } 5249091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 5259091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim // Create pipeline layout 5269091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 5279091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkPipelineLayoutCreateInfo pipelineLayoutParams = 5289091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 5299091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, // VkStructureType sType; 5309091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim DE_NULL, // const void* pNext; 531120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // VkPipelineLayoutCreateFlags flags; 532120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // deUint32 setLayoutCount; 5339091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim DE_NULL, // const VkDescriptorSetLayout* pSetLayouts; 5349091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 0u, // deUint32 pushConstantRangeCount; 5359091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim DE_NULL // const VkPushConstantRange* pPushConstantRanges; 5369091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 5379091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 5389091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim m_pipelineLayout = createPipelineLayout(vk, vkDevice, &pipelineLayoutParams); 5399091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim } 5409091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 541120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim m_vertexShaderModule = createShaderModule(vk, vkDevice, m_context.getBinaryCollection().get("color_vert"), 0); 542120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim m_fragmentShaderModule = createShaderModule(vk, vkDevice, m_context.getBinaryCollection().get("color_frag"), 0); 5439091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 5449091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim // Create pipeline 5459091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 546120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim const VkPipelineShaderStageCreateInfo shaderStages[2] = 5479091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 5489091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 549120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, // VkStructureType sType; 550120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim DE_NULL, // const void* pNext; 551120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // VkPipelineShaderStageCreateFlags flags; 552120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_SHADER_STAGE_VERTEX_BIT, // VkShaderStageFlagBits stage; 553120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim *m_vertexShaderModule, // VkShaderModule module; 554120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim "main", // const char* pName; 555120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim DE_NULL // const VkSpecializationInfo* pSpecializationInfo; 5569091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }, 5579091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 558120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, // VkStructureType sType; 559120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim DE_NULL, // const void* pNext; 560120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // VkPipelineShaderStageCreateFlags flags; 561120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_SHADER_STAGE_FRAGMENT_BIT, // VkShaderStageFlagBits stage; 562120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim *m_fragmentShaderModule, // VkShaderModule module; 563120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim "main", // const char* pName; 564120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim DE_NULL // const VkSpecializationInfo* pSpecializationInfo; 5659091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim } 5669091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 5679091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 5689091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkVertexInputBindingDescription vertexInputBindingDescription = 5699091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 5709091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 0u, // deUint32 binding; 5719091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim sizeof(Vertex4RGBA), // deUint32 strideInBytes; 572120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_VERTEX_INPUT_RATE_VERTEX // VkVertexInputStepRate inputRate; 5739091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 5749091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 5759091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkVertexInputAttributeDescription vertexInputAttributeDescriptions[2] = 5769091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 5779091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 5789091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 0u, // deUint32 location; 5799091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 0u, // deUint32 binding; 5809091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_FORMAT_R32G32B32A32_SFLOAT, // VkFormat format; 5819091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 0u // deUint32 offsetInBytes; 5829091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }, 5839091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 5849091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 1u, // deUint32 location; 5859091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 0u, // deUint32 binding; 5869091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_FORMAT_R32G32B32A32_SFLOAT, // VkFormat format; 5879091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim DE_OFFSET_OF(Vertex4RGBA, color), // deUint32 offsetInBytes; 5889091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim } 5899091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 5909091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 5919091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkPipelineVertexInputStateCreateInfo vertexInputStateParams = 5929091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 5939091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO, // VkStructureType sType; 5949091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim DE_NULL, // const void* pNext; 595120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // VkPipelineVertexInputStateCreateFlags flags; 596120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 1u, // deUint32 vertexBindingDescriptionCount; 5979091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim &vertexInputBindingDescription, // const VkVertexInputBindingDescription* pVertexBindingDescriptions; 598120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 2u, // deUint32 vertexAttributeDescriptionCount; 5999091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim vertexInputAttributeDescriptions // const VkVertexInputAttributeDescription* pVertexAttributeDescriptions; 6009091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 6019091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 6029091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkPipelineInputAssemblyStateCreateInfo inputAssemblyStateParams = 6039091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 604120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, // VkStructureType sType; 605120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim DE_NULL, // const void* pNext; 606120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // VkPipelineInputAssemblyStateCreateFlags flags; 607120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, // VkPrimitiveTopology topology; 608120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim false // VkBool32 primitiveRestartEnable; 6099091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 6109091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 6119091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkViewport viewport = 6129091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 613120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0.0f, // float x; 614120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0.0f, // float y; 6159091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim (float)m_renderSize.x(), // float width; 6169091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim (float)m_renderSize.y(), // float height; 6179091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 0.0f, // float minDepth; 6189091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 1.0f // float maxDepth; 6199091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 6209091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 6219091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkRect2D scissor = { { 0, 0 }, { m_renderSize.x(), m_renderSize.y() } }; 6229091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 6239091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkPipelineViewportStateCreateInfo viewportStateParams = 6249091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 625120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO, // VkStructureType sType; 626120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim DE_NULL, // const void* pNext; 627120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // VkPipelineViewportStateCreateFlags flags; 628120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 1u, // deUint32 viewportCount; 629120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim &viewport, // const VkViewport* pViewports; 630120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 1u, // deUint32 scissorCount; 631120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim &scissor, // const VkRect2D* pScissors; 6329091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 6339091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 634120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim const VkPipelineRasterizationStateCreateInfo rasterStateParams = 6359091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 636120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO, // VkStructureType sType; 637120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim DE_NULL, // const void* pNext; 638120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // VkPipelineRasterizationStateCreateFlags flags; 639120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim false, // VkBool32 depthClampEnable; 640120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim false, // VkBool32 rasterizerDiscardEnable; 641120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_POLYGON_MODE_FILL, // VkPolygonMode polygonMode; 642120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_CULL_MODE_NONE, // VkCullModeFlags cullMode; 643120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_FRONT_FACE_COUNTER_CLOCKWISE, // VkFrontFace frontFace; 644120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim false, // VkBool32 depthBiasEnable; 645120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0.0f, // float depthBiasConstantFactor; 646120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0.0f, // float depthBiasClamp; 647120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0.0f, // float depthBiasSlopeFactor; 648120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 1.0f // float lineWidth; 6499091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 6509091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 6519091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkPipelineColorBlendAttachmentState colorBlendAttachmentState = 6529091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 653120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim false, // VkBool32 blendEnable; 654120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_BLEND_FACTOR_ONE, // VkBlendFactor srcColorBlendFactor; 655120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_BLEND_FACTOR_ZERO, // VkBlendFactor dstColorBlendFactor; 656120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_BLEND_OP_ADD, // VkBlendOp colorBlendOp; 657120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_BLEND_FACTOR_ONE, // VKBLENDFACTOR SRCALPHABLENDFACTOR; 658120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_BLEND_FACTOR_ZERO, // VkBlendFactor dstAlphaBlendFactor; 659120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_BLEND_OP_ADD, // VkBlendOp alphaBlendOp; 660120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | // VkColorComponentFlags colorWriteMask; 661120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT 6629091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 6639091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 6649091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkPipelineColorBlendStateCreateInfo colorBlendStateParams = 6659091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 6669091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO, // VkStructureType sType; 6679091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim DE_NULL, // const void* pNext; 668120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // VkPipelineColorBlendStateCreateFlags flags; 6699091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim false, // VkBool32 logicOpEnable; 6709091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_LOGIC_OP_COPY, // VkLogicOp logicOp; 6719091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 1u, // deUint32 attachmentCount; 6729091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim &colorBlendAttachmentState, // const VkPipelineColorBlendAttachmentState* pAttachments; 673120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim { 0.0f, 0.0f, 0.0f, 0.0f } // float blendConstants[4]; 6749091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 6759091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 6769091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkPipelineMultisampleStateCreateInfo multisampleStateParams = 6779091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 678120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO, // VkStructureType sType; 679120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim DE_NULL, // const void* pNext; 680120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // VkPipelineMultisampleStateCreateFlags flags; 681120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits rasterizationSamples; 682120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim false, // VkBool32 sampleShadingEnable; 683120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0.0f, // float minSampleShading; 684120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim DE_NULL, // const VkSampleMask* pSampleMask; 685120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim false, // VkBool32 alphaToCoverageEnable; 686120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim false // VkBool32 alphaToOneEnable; 6879091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 6889091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 6899091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const bool isDepthEnabled = (vk::mapVkFormat(m_stencilFormat).order != tcu::TextureFormat::S); 6909091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 6919091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VkPipelineDepthStencilStateCreateInfo depthStencilStateParams = 6929091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 693120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO, // VkStructureType sType; 694120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim DE_NULL, // const void* pNext; 695120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // VkPipelineDepthStencilStateCreateFlags flags; 696120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim isDepthEnabled, // VkBool32 depthTestEnable; 697120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim isDepthEnabled, // VkBool32 depthWriteEnable; 698120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_COMPARE_OP_LESS, // VkCompareOp depthCompareOp; 699120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim false, // VkBool32 depthBoundsTestEnable; 700120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim true, // VkBool32 stencilTestEnable; 701120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim m_stencilOpStateFront, // VkStencilOpState front; 702120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim m_stencilOpStateBack, // VkStencilOpState back; 703120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim -1.0f, // float minDepthBounds; 704120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim +1.0f // float maxDepthBounds; 7059091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 7069091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 7079091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkPipelineDynamicStateCreateInfo dynamicStateParams = 7089091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 709120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO, // VkStructureType sType; 710120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim DE_NULL, // const void* pNext; 711120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // VkPipelineDynamicStateCreateFlags flags; 712120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // deUint32 dynamicStateCount; 713120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim DE_NULL // const VkDynamicState* pDynamicStates; 7149091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 7159091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 7169091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkGraphicsPipelineCreateInfo graphicsPipelineParams = 7179091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 7189091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO, // VkStructureType sType; 7199091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim DE_NULL, // const void* pNext; 720120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // VkPipelineCreateFlags flags; 7219091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 2u, // deUint32 stageCount; 722120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim shaderStages, // const VkPipelineShaderStageCreateInfo* pStages; 7239091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim &vertexInputStateParams, // const VkPipelineVertexInputStateCreateInfo* pVertexInputState; 7249091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim &inputAssemblyStateParams, // const VkPipelineInputAssemblyStateCreateInfo* pInputAssemblyState; 7259091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim DE_NULL, // const VkPipelineTessellationStateCreateInfo* pTessellationState; 7269091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim &viewportStateParams, // const VkPipelineViewportStateCreateInfo* pViewportState; 727120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim &rasterStateParams, // const VkPipelineRasterizationStateCreateInfo* pRasterizationState; 7289091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim &multisampleStateParams, // const VkPipelineMultisampleStateCreateInfo* pMultisampleState; 7299091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim &depthStencilStateParams, // const VkPipelineDepthStencilStateCreateInfo* pDepthStencilState; 7309091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim &colorBlendStateParams, // const VkPipelineColorBlendStateCreateInfo* pColorBlendState; 7319091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim &dynamicStateParams, // const VkPipelineDynamicStateCreateInfo* pDynamicState; 7329091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim *m_pipelineLayout, // VkPipelineLayout layout; 7339091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim *m_renderPass, // VkRenderPass renderPass; 7349091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 0u, // deUint32 subpass; 7359091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 0u, // VkPipeline basePipelineHandle; 7369091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 0u // deInt32 basePipelineIndex; 7379091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 7389091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 7399091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim // Setup different stencil masks and refs in each quad 7409091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim for (int quadNdx = 0; quadNdx < StencilTest::QUAD_COUNT; quadNdx++) 7419091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 7429091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const StencilTest::StencilStateConfig& config = StencilTest::s_stencilStateConfigs[quadNdx]; 7439091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VkStencilOpState& front = depthStencilStateParams.front; 7449091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VkStencilOpState& back = depthStencilStateParams.back; 7459091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 746120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim front.compareMask = config.frontReadMask; 747120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim front.writeMask = config.frontWriteMask; 748120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim front.reference = config.frontRef; 7499091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 750120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim back.compareMask = config.backReadMask; 751120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim back.writeMask = config.backWriteMask; 752120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim back.reference = config.backRef; 7539091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 7549091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim m_graphicsPipelines[quadNdx] = createGraphicsPipeline(vk, vkDevice, DE_NULL, &graphicsPipelineParams); 7559091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim } 7569091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim } 7579091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 7589091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 7599091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim // Create vertex buffer 7609091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 7619091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkBufferCreateInfo vertexBufferParams = 7629091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 7639091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, // VkStructureType sType; 7649091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim DE_NULL, // const void* pNext; 765120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // VkBufferCreateFlags flags; 7669091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 1024u, // VkDeviceSize size; 7679091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, // VkBufferUsageFlags usage; 7689091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode; 769120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 1u, // deUint32 queueFamilyIndexCount; 7709091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim &queueFamilyIndex // const deUint32* pQueueFamilyIndices; 7719091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 7729091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 7739091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim m_vertices = createOverlappingQuads(); 7749091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim m_vertexBuffer = createBuffer(vk, vkDevice, &vertexBufferParams); 7759091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim m_vertexBufferAlloc = memAlloc.allocate(getBufferMemoryRequirements(vk, vkDevice, *m_vertexBuffer), MemoryRequirement::HostVisible); 7769091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 7779091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_CHECK(vk.bindBufferMemory(vkDevice, *m_vertexBuffer, m_vertexBufferAlloc->getMemory(), m_vertexBufferAlloc->getOffset())); 7789091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 7799091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim // Adjust depths 7809091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim for (int quadNdx = 0; quadNdx < 4; quadNdx++) 7819091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim for (int vertexNdx = 0; vertexNdx < 6; vertexNdx++) 7829091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim m_vertices[quadNdx * 6 + vertexNdx].position.z() = StencilTest::s_quadDepths[quadNdx]; 7839091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 7849091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim // Load vertices into vertex buffer 7859091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim deMemcpy(m_vertexBufferAlloc->getHostPtr(), m_vertices.data(), m_vertices.size() * sizeof(Vertex4RGBA)); 7869091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 7879091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkMappedMemoryRange flushRange = 7889091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 7899091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE, // VkStructureType sType; 7909091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim DE_NULL, // const void* pNext; 791120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim m_vertexBufferAlloc->getMemory(), // VkDeviceMemory memory; 7929091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim m_vertexBufferAlloc->getOffset(), // VkDeviceSize offset; 7939091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim vertexBufferParams.size // VkDeviceSize size; 7949091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 7959091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 7969091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim vk.flushMappedMemoryRanges(vkDevice, 1, &flushRange); 7979091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim } 7989091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 7999091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim // Create command pool 8009091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 801120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim const VkCommandPoolCreateInfo cmdPoolParams = 8029091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 803120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // VkStructureType sType; 804120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim DE_NULL, // const void* pNext; 805120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_COMMAND_POOL_CREATE_TRANSIENT_BIT, // VkCommandPoolCreateFlags flags; 806120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim queueFamilyIndex, // deUint32 queueFamilyIndex; 8079091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 8089091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 8099091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim m_cmdPool = createCommandPool(vk, vkDevice, &cmdPoolParams); 8109091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim } 8119091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 8129091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim // Create command buffer 8139091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 814120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim const VkCommandBufferAllocateInfo cmdBufferAllocateInfo = 8159091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 81694128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType; 81794128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos DE_NULL, // const void* pNext; 81894128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos *m_cmdPool, // VkCommandPool commandPool; 81994128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos VK_COMMAND_BUFFER_LEVEL_PRIMARY, // VkCommandBufferLevel level; 82094128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos 1u // deUint32 bufferCount; 8219091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 8229091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 823120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim const VkCommandBufferBeginInfo cmdBufferBeginInfo = 8249091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 825120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // VkStructureType sType; 826120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim DE_NULL, // const void* pNext; 827120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // VkCommandBufferUsageFlags flags; 828689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (const VkCommandBufferInheritanceInfo*)DE_NULL, 8299091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 8309091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 8319091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkClearValue attachmentClearValues[2] = 8329091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 8339091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim defaultClearValue(m_colorFormat), 8349091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim defaultClearValue(m_stencilFormat) 8359091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 8369091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 8379091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkRenderPassBeginInfo renderPassBeginInfo = 8389091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 8399091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, // VkStructureType sType; 8409091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim DE_NULL, // const void* pNext; 8419091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim *m_renderPass, // VkRenderPass renderPass; 8429091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim *m_framebuffer, // VkFramebuffer framebuffer; 8439091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { { 0, 0 } , { m_renderSize.x(), m_renderSize.y() } }, // VkRect2D renderArea; 8449091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 2, // deUint32 clearValueCount; 8459091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim attachmentClearValues // const VkClearValue* pClearValues; 8469091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 8479091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 848120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim m_cmdBuffer = allocateCommandBuffer(vk, vkDevice, &cmdBufferAllocateInfo); 8499091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 8509091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_CHECK(vk.beginCommandBuffer(*m_cmdBuffer, &cmdBufferBeginInfo)); 851120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim vk.cmdBeginRenderPass(*m_cmdBuffer, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE); 8529091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 8539091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkDeviceSize quadOffset = (m_vertices.size() / StencilTest::QUAD_COUNT) * sizeof(Vertex4RGBA); 8549091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 8559091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim for (int quadNdx = 0; quadNdx < StencilTest::QUAD_COUNT; quadNdx++) 8569091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 8579091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VkDeviceSize vertexBufferOffset = quadOffset * quadNdx; 8589091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 8599091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim vk.cmdBindPipeline(*m_cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *m_graphicsPipelines[quadNdx]); 8609091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim vk.cmdBindVertexBuffers(*m_cmdBuffer, 0, 1, &m_vertexBuffer.get(), &vertexBufferOffset); 8619091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim vk.cmdDraw(*m_cmdBuffer, (deUint32)(m_vertices.size() / StencilTest::QUAD_COUNT), 1, 0, 0); 8629091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim } 8639091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 8649091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim vk.cmdEndRenderPass(*m_cmdBuffer); 8659091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer)); 8669091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim } 8679091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 8689091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim // Create fence 8699091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 8709091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkFenceCreateInfo fenceParams = 8719091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 8729091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, // VkStructureType sType; 8739091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim DE_NULL, // const void* pNext; 8749091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 0u // VkFenceCreateFlags flags; 8759091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 8769091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 8779091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim m_fence = createFence(vk, vkDevice, &fenceParams); 8789091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim } 8799091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim} 8809091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 8819091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae KimStencilTestInstance::~StencilTestInstance (void) 8829091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{ 8839091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim} 8849091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 8859091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimtcu::TestStatus StencilTestInstance::iterate (void) 8869091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{ 8879091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const DeviceInterface& vk = m_context.getDeviceInterface(); 8889091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkDevice vkDevice = m_context.getDevice(); 8899091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkQueue queue = m_context.getUniversalQueue(); 890120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim const VkSubmitInfo submitInfo = 891120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim { 892120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_STRUCTURE_TYPE_SUBMIT_INFO, // VkStructureType sType; 893120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim DE_NULL, // const void* pNext; 894120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // deUint32 waitSemaphoreCount; 895120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim DE_NULL, // const VkSemaphore* pWaitSemaphores; 896689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (const VkPipelineStageFlags*)DE_NULL, 897120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 1u, // deUint32 commandBufferCount; 898120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim &m_cmdBuffer.get(), // const VkCommandBuffer* pCommandBuffers; 899120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // deUint32 signalSemaphoreCount; 900120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim DE_NULL // const VkSemaphore* pSignalSemaphores; 901120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim }; 9029091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 9039091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_CHECK(vk.resetFences(vkDevice, 1, &m_fence.get())); 904120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_CHECK(vk.queueSubmit(queue, 1, &submitInfo, *m_fence)); 9059091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_CHECK(vk.waitForFences(vkDevice, 1, &m_fence.get(), true, ~(0ull) /* infinity*/)); 9069091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 9079091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim return verifyImage(); 9089091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim} 9099091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 9109091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimtcu::TestStatus StencilTestInstance::verifyImage (void) 9119091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{ 9129091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const tcu::TextureFormat tcuColorFormat = mapVkFormat(m_colorFormat); 9139091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const tcu::TextureFormat tcuStencilFormat = mapVkFormat(m_stencilFormat); 9149091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const ColorVertexShader vertexShader; 9159091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const ColorFragmentShader fragmentShader (tcuColorFormat, tcuStencilFormat); 9169091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const rr::Program program (&vertexShader, &fragmentShader); 9179091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim ReferenceRenderer refRenderer (m_renderSize.x(), m_renderSize.y(), 1, tcuColorFormat, tcuStencilFormat, &program); 9189091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim bool compareOk = false; 9199091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 9209091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim // Render reference image 9219091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 9229091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim // Set depth state 9239091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim rr::RenderState renderState(refRenderer.getViewportState()); 9249091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 9259091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim renderState.fragOps.depthTestEnabled = true; 9269091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim renderState.fragOps.depthFunc = mapVkCompareOp(VK_COMPARE_OP_LESS); 9279091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim renderState.fragOps.stencilTestEnabled = true; 9289091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 9299091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim rr::StencilState& refStencilFront = renderState.fragOps.stencilStates[rr::FACETYPE_FRONT]; 9309091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim rr::StencilState& refStencilBack = renderState.fragOps.stencilStates[rr::FACETYPE_BACK]; 9319091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 932120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim refStencilFront.sFail = mapVkStencilOp(m_stencilOpStateFront.failOp); 933120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim refStencilFront.dpFail = mapVkStencilOp(m_stencilOpStateFront.depthFailOp); 934120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim refStencilFront.dpPass = mapVkStencilOp(m_stencilOpStateFront.passOp); 935120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim refStencilFront.func = mapVkCompareOp(m_stencilOpStateFront.compareOp); 9369091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 937120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim refStencilBack.sFail = mapVkStencilOp(m_stencilOpStateBack.failOp); 938120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim refStencilBack.dpFail = mapVkStencilOp(m_stencilOpStateBack.depthFailOp); 939120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim refStencilBack.dpPass = mapVkStencilOp(m_stencilOpStateBack.passOp); 940120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim refStencilBack.func = mapVkCompareOp(m_stencilOpStateBack.compareOp); 9419091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 9429091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim // Reverse winding of vertices, as Vulkan screen coordinates start at upper left 9439091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim std::vector<Vertex4RGBA> cwVertices(m_vertices); 9449091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim for (size_t vertexNdx = 0; vertexNdx < cwVertices.size() - 2; vertexNdx += 3) 9459091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 9469091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const Vertex4RGBA cwVertex1 = cwVertices[vertexNdx + 1]; 9479091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 9489091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim cwVertices[vertexNdx + 1] = cwVertices[vertexNdx + 2]; 9499091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim cwVertices[vertexNdx + 2] = cwVertex1; 9509091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim } 9519091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 9529091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim for (int quadNdx = 0; quadNdx < StencilTest::QUAD_COUNT; quadNdx++) 9539091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 9549091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim refStencilFront.ref = (int)StencilTest::s_stencilStateConfigs[quadNdx].frontRef; 9559091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim refStencilFront.compMask = StencilTest::s_stencilStateConfigs[quadNdx].frontReadMask; 9569091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim refStencilFront.writeMask = StencilTest::s_stencilStateConfigs[quadNdx].frontWriteMask; 9579091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 9589091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim refStencilBack.ref = (int)StencilTest::s_stencilStateConfigs[quadNdx].backRef; 9599091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim refStencilBack.compMask = StencilTest::s_stencilStateConfigs[quadNdx].backReadMask; 9609091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim refStencilBack.writeMask = StencilTest::s_stencilStateConfigs[quadNdx].backWriteMask; 9619091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 9629091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim refRenderer.draw(renderState, 9639091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim rr::PRIMITIVETYPE_TRIANGLES, 9649091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim std::vector<Vertex4RGBA>(cwVertices.begin() + quadNdx * 6, 9659091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim cwVertices.begin() + (quadNdx + 1) * 6)); 9669091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim } 9679091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim } 9689091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 9699091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim // Compare result with reference image 9709091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 9719091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const DeviceInterface& vk = m_context.getDeviceInterface(); 9729091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkDevice vkDevice = m_context.getDevice(); 9739091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkQueue queue = m_context.getUniversalQueue(); 9749091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const deUint32 queueFamilyIndex = m_context.getUniversalQueueFamilyIndex(); 9759091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim SimpleAllocator allocator (vk, vkDevice, getPhysicalDeviceMemoryProperties(m_context.getInstanceInterface(), m_context.getPhysicalDevice())); 9769091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim de::UniquePtr<tcu::TextureLevel> result (readColorAttachment(vk, vkDevice, queue, queueFamilyIndex, allocator, *m_colorImage, m_colorFormat, m_renderSize).release()); 9779091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 9789091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim compareOk = tcu::intThresholdPositionDeviationCompare(m_context.getTestContext().getLog(), 9799091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim "IntImageCompare", 9809091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim "Image comparison", 9819091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim refRenderer.getAccess(), 9829091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim result->getAccess(), 9839091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim tcu::UVec4(2, 2, 2, 2), 9849091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim tcu::IVec3(1, 1, 0), 9859091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim true, 9869091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim tcu::COMPARE_LOG_RESULT); 9879091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim } 9889091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 9899091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim if (compareOk) 9909091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim return tcu::TestStatus::pass("Result image matches reference"); 9919091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim else 9929091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim return tcu::TestStatus::fail("Image mismatch"); 9939091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim} 9949091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 9959091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 9969091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim// Utilities for test names 9979091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 9989091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimstd::string getShortName (VkCompareOp compareOp) 9999091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{ 10009091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const std::string fullName = getCompareOpName(compareOp); 10019091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 10029091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim DE_ASSERT(de::beginsWith(fullName, "VK_COMPARE_OP_")); 10039091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 10049091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim return de::toLower(fullName.substr(14)); 10059091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim} 10069091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 10079091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimconst char* getShortName (VkStencilOp stencilOp) 10089091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{ 10099091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim switch (stencilOp) 10109091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 1011120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_STENCIL_OP_KEEP: return "keep"; 1012120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_STENCIL_OP_ZERO: return "zero"; 1013120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_STENCIL_OP_REPLACE: return "repl"; 1014120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_STENCIL_OP_INCREMENT_AND_CLAMP: return "incc"; 1015120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_STENCIL_OP_DECREMENT_AND_CLAMP: return "decc"; 1016120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_STENCIL_OP_INVERT: return "inv"; 1017120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_STENCIL_OP_INCREMENT_AND_WRAP: return "wrap"; 1018120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_STENCIL_OP_DECREMENT_AND_WRAP: return "decw"; 10199091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 10209091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim default: 10219091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim DE_FATAL("Invalid VkStencilOpState value"); 10229091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim } 10239091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim return DE_NULL; 10249091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim} 10259091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 10269091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimstd::string getStencilName(const VkStencilOpState& stencilOpState) 10279091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{ 10289091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim std::ostringstream name; 10299091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 1030120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim name << "fail_" << getShortName(stencilOpState.failOp) 1031120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim << "_pass_" << getShortName(stencilOpState.passOp) 1032120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim << "_dfail_" << getShortName(stencilOpState.depthFailOp) 1033120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim << "_comp_" << getShortName(stencilOpState.compareOp); 10349091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 10359091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim return name.str(); 10369091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim} 10379091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 10389091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimstd::string getStencilStateSetName(const VkStencilOpState& stencilOpStateFront, 10399091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkStencilOpState& stencilOpStateBack) 10409091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{ 10419091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim std::ostringstream name; 10429091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 10439091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim name << "front_" << getStencilName(stencilOpStateFront) 10449091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim << "_back_" << getStencilName(stencilOpStateBack); 10459091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 10469091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim return name.str(); 10479091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim} 10489091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 10499091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimstd::string getStencilStateSetDescription(const VkStencilOpState& stencilOpStateFront, 10509091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkStencilOpState& stencilOpStateBack) 10519091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{ 10529091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim std::ostringstream desc; 10539091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 10549091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim desc << "\nFront faces:\n" << stencilOpStateFront; 10559091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim desc << "Back faces:\n" << stencilOpStateBack; 10569091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 10579091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim return desc.str(); 10589091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim} 10599091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 10609091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimstd::string getFormatCaseName (VkFormat format) 10619091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{ 10629091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const std::string fullName = getFormatName(format); 10639091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 10649091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim DE_ASSERT(de::beginsWith(fullName, "VK_FORMAT_")); 10659091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 10669091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim return de::toLower(fullName.substr(10)); 10679091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim} 10689091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 10699091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim} // anonymous 10709091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 10719091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimtcu::TestCaseGroup* createStencilTests (tcu::TestContext& testCtx) 10729091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{ 10739091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkFormat stencilFormats[] = 10749091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 10759091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_FORMAT_S8_UINT, 10769091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_FORMAT_D16_UNORM_S8_UINT, 10779091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_FORMAT_D24_UNORM_S8_UINT, 10789091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_FORMAT_D32_SFLOAT_S8_UINT 10799091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 10809091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 10819091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim de::MovePtr<tcu::TestCaseGroup> stencilTests (new tcu::TestCaseGroup(testCtx, "stencil", "Stencil tests")); 10829091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim de::MovePtr<tcu::TestCaseGroup> formatTests (new tcu::TestCaseGroup(testCtx, "format", "Uses different stencil formats")); 10839091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim StencilOpStateUniqueRandomIterator stencilOpItr (123); 10849091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 10859091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim for (size_t formatNdx = 0; formatNdx < DE_LENGTH_OF_ARRAY(stencilFormats); formatNdx++) 10869091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 10879091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkFormat stencilFormat = stencilFormats[formatNdx]; 10889091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim de::MovePtr<tcu::TestCaseGroup> formatTest (new tcu::TestCaseGroup(testCtx, 10899091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim getFormatCaseName(stencilFormat).c_str(), 10909091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim (std::string("Uses format ") + getFormatName(stencilFormat)).c_str())); 10919091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 10929091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim de::MovePtr<tcu::TestCaseGroup> stencilStateTests; 10939091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 10949091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim std::ostringstream desc; 10959091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim desc << "Draws 4 quads with the following depths and dynamic stencil states: "; 10969091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim for (int quadNdx = 0; quadNdx < StencilTest::QUAD_COUNT; quadNdx++) 10979091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 10989091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const StencilTest::StencilStateConfig& stencilConfig = StencilTest::s_stencilStateConfigs[quadNdx]; 10999091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 11009091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim desc << "(" << quadNdx << ") " 11019091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim << "z = " << StencilTest::s_quadDepths[quadNdx] << ", " 11029091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim << "frontReadMask = " << stencilConfig.frontReadMask << ", " 11039091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim << "frontWriteMask = " << stencilConfig.frontWriteMask << ", " 11049091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim << "frontRef = " << stencilConfig.frontRef << ", " 11059091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim << "backReadMask = " << stencilConfig.backReadMask << ", " 11069091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim << "backWriteMask = " << stencilConfig.backWriteMask << ", " 11079091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim << "backRef = " << stencilConfig.backRef; 11089091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim } 11099091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 11109091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim stencilStateTests = de::MovePtr<tcu::TestCaseGroup>(new tcu::TestCaseGroup(testCtx, "states", desc.str().c_str())); 11119091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim } 11129091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 11139091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim stencilOpItr.reset(); 11149091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 11159091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VkStencilOpState prevStencilState = stencilOpItr.next(); 11169091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkStencilOpState firstStencilState = prevStencilState; 11179091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 11189091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim while (stencilOpItr.hasNext()) 11199091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 11209091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkStencilOpState stencilState = stencilOpItr.next(); 11219091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 11229091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim // Use current stencil state in front fraces and previous state in back faces 11239091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim stencilStateTests->addChild(new StencilTest(testCtx, 11249091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim getStencilStateSetName(stencilState, prevStencilState), 11259091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim getStencilStateSetDescription(stencilState, prevStencilState), 11269091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim stencilFormat, 11279091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim stencilState, 11289091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim prevStencilState)); 11299091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 11309091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim prevStencilState = stencilState; 11319091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim } 11329091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 11339091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim // Use first stencil state with last stencil state. This would make the test suite cover all states in front and back faces. 11349091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim stencilStateTests->addChild(new StencilTest(testCtx, 11359091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim getStencilStateSetName(firstStencilState, prevStencilState), 11369091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim getStencilStateSetDescription(firstStencilState, prevStencilState), 11379091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim stencilFormat, 11389091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim firstStencilState, 11399091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim prevStencilState)); 11409091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 11419091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim formatTest->addChild(stencilStateTests.release()); 11429091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim formatTests->addChild(formatTest.release()); 11439091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim } 11449091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim stencilTests->addChild(formatTests.release()); 11459091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 11469091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim return stencilTests.release(); 11479091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim} 11489091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 11499091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim} // pipeline 11509091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim} // vkt 1151