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 * 8978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * Licensed under the Apache License, Version 2.0 (the "License"); 9978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * you may not use this file except in compliance with the License. 10978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * You may obtain a copy of the License at 119091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim * 12978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * http://www.apache.org/licenses/LICENSE-2.0 139091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim * 14978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * Unless required by applicable law or agreed to in writing, software 15978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * distributed under the License is distributed on an "AS IS" BASIS, 16978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 17978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * See the License for the specific language governing permissions and 18978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * limitations under the License. 199091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim * 209091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim *//*! 219091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim * \file 229091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim * \brief Stencil Tests 239091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim *//*--------------------------------------------------------------------*/ 249091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 259091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim#include "vktPipelineStencilTests.hpp" 269091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim#include "vktPipelineClearUtil.hpp" 279091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim#include "vktPipelineImageUtil.hpp" 289091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim#include "vktPipelineVertexUtil.hpp" 299091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim#include "vktPipelineReferenceRenderer.hpp" 309091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim#include "vktPipelineUniqueRandomIterator.hpp" 319091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim#include "vktTestCase.hpp" 329091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim#include "vkImageUtil.hpp" 339091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim#include "vkMemUtil.hpp" 349091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim#include "vkPrograms.hpp" 359091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim#include "vkQueryUtil.hpp" 369091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim#include "vkRef.hpp" 379091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim#include "vkRefUtil.hpp" 383d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos#include "vkTypeUtil.hpp" 399091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim#include "tcuImageCompare.hpp" 409091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim#include "deMemory.h" 419091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim#include "deRandom.hpp" 429091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim#include "deStringUtil.hpp" 439091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim#include "deUniquePtr.hpp" 449091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 459091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim#include <algorithm> 469091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim#include <sstream> 479091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim#include <vector> 489091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 499091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimnamespace vkt 509091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{ 519091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimnamespace pipeline 529091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{ 539091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 549091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimusing namespace vk; 559091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 569091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimnamespace 579091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{ 589091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 599091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimbool isSupportedDepthStencilFormat (const InstanceInterface& instanceInterface, VkPhysicalDevice device, VkFormat format) 609091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{ 619091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VkFormatProperties formatProps; 629091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 63120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim instanceInterface.getPhysicalDeviceFormatProperties(device, format, &formatProps); 649091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 65682d882fdacf7d4711d23a5ba006f7fb377cf0e3Pyry Haulos return (formatProps.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) != 0; 669091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim} 679091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 689091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimclass StencilOpStateUniqueRandomIterator : public UniqueRandomIterator<VkStencilOpState> 699091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{ 709091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimpublic: 719091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim StencilOpStateUniqueRandomIterator (int seed); 729091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim virtual ~StencilOpStateUniqueRandomIterator (void) {} 739091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim virtual VkStencilOpState getIndexedValue (deUint32 index); 749091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 759091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimprivate: 769091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const static VkStencilOp m_stencilOps[]; 779091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const static VkCompareOp m_compareOps[]; 789091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 799091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim // Pre-calculated constants 809091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const static deUint32 m_stencilOpsLength; 819091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const static deUint32 m_stencilOpsLength2; 829091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const static deUint32 m_stencilOpsLength3; 839091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const static deUint32 m_compareOpsLength; 849091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 859091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim // Total number of cross-combinations of (stencilFailOp x stencilPassOp x stencilDepthFailOp x stencilCompareOp) 869091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const static deUint32 m_totalStencilOpStates; 879091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim}; 889091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 899091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 909091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimclass StencilTest : public vkt::TestCase 919091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{ 929091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimpublic: 939091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim enum 949091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 959091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim QUAD_COUNT = 4 969091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 979091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 989091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim struct StencilStateConfig 999091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 1009091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim deUint32 frontReadMask; 1019091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim deUint32 frontWriteMask; 1029091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim deUint32 frontRef; 1039091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 1049091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim deUint32 backReadMask; 1059091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim deUint32 backWriteMask; 1069091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim deUint32 backRef; 1079091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 1089091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 1099091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const static StencilStateConfig s_stencilStateConfigs[QUAD_COUNT]; 1109091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const static float s_quadDepths[QUAD_COUNT]; 1119091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 1129091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 1139091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim StencilTest (tcu::TestContext& testContext, 1149091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const std::string& name, 1159091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const std::string& description, 1169091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VkFormat stencilFormat, 1179091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkStencilOpState& stencilOpStateFront, 1189091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkStencilOpState& stencilOpStateBack); 1199091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim virtual ~StencilTest (void); 1209091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim virtual void initPrograms (SourceCollections& sourceCollections) const; 1219091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim virtual TestInstance* createInstance (Context& context) const; 1229091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 1239091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimprivate: 1249091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VkFormat m_stencilFormat; 1259091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkStencilOpState m_stencilOpStateFront; 1269091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkStencilOpState m_stencilOpStateBack; 1279091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim}; 1289091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 1299091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimclass StencilTestInstance : public vkt::TestInstance 1309091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{ 1319091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimpublic: 1329091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim StencilTestInstance (Context& context, 1339091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VkFormat stencilFormat, 1349091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkStencilOpState& stencilOpStatesFront, 1359091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkStencilOpState& stencilOpStatesBack); 1369091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim virtual ~StencilTestInstance (void); 1379091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim virtual tcu::TestStatus iterate (void); 1389091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 1399091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimprivate: 1409091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim tcu::TestStatus verifyImage (void); 1419091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 1429091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VkStencilOpState m_stencilOpStateFront; 1439091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VkStencilOpState m_stencilOpStateBack; 144689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos const tcu::UVec2 m_renderSize; 1459091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkFormat m_colorFormat; 1469091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkFormat m_stencilFormat; 1473d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos VkImageSubresourceRange m_stencilImageSubresourceRange; 1489091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 1499091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VkImageCreateInfo m_colorImageCreateInfo; 1509091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim Move<VkImage> m_colorImage; 1519091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim de::MovePtr<Allocation> m_colorImageAlloc; 1529091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim Move<VkImage> m_stencilImage; 1539091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim de::MovePtr<Allocation> m_stencilImageAlloc; 1549091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim Move<VkImageView> m_colorAttachmentView; 1559091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim Move<VkImageView> m_stencilAttachmentView; 1569091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim Move<VkRenderPass> m_renderPass; 1579091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim Move<VkFramebuffer> m_framebuffer; 1589091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 1599091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim Move<VkShaderModule> m_vertexShaderModule; 1609091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim Move<VkShaderModule> m_fragmentShaderModule; 1619091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 1629091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim Move<VkBuffer> m_vertexBuffer; 1639091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim std::vector<Vertex4RGBA> m_vertices; 1649091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim de::MovePtr<Allocation> m_vertexBufferAlloc; 1659091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 1669091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim Move<VkPipelineLayout> m_pipelineLayout; 1679091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim Move<VkPipeline> m_graphicsPipelines[StencilTest::QUAD_COUNT]; 1689091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 169120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim Move<VkCommandPool> m_cmdPool; 170120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim Move<VkCommandBuffer> m_cmdBuffer; 1719091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 1729091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim Move<VkFence> m_fence; 1739091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim}; 1749091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 1759091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 1769091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim// StencilOpStateUniqueRandomIterator 1779091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 1789091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimconst VkStencilOp StencilOpStateUniqueRandomIterator::m_stencilOps[] = 1799091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{ 1809091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_STENCIL_OP_KEEP, 1819091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_STENCIL_OP_ZERO, 1829091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_STENCIL_OP_REPLACE, 183120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_STENCIL_OP_INCREMENT_AND_CLAMP, 184120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_STENCIL_OP_DECREMENT_AND_CLAMP, 1859091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_STENCIL_OP_INVERT, 186120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_STENCIL_OP_INCREMENT_AND_WRAP, 187120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_STENCIL_OP_DECREMENT_AND_WRAP 1889091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim}; 1899091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 1909091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimconst VkCompareOp StencilOpStateUniqueRandomIterator::m_compareOps[] = 1919091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{ 1929091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_COMPARE_OP_NEVER, 1939091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_COMPARE_OP_LESS, 1949091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_COMPARE_OP_EQUAL, 195120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_COMPARE_OP_LESS_OR_EQUAL, 1969091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_COMPARE_OP_GREATER, 1979091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_COMPARE_OP_NOT_EQUAL, 198120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_COMPARE_OP_GREATER_OR_EQUAL, 1999091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_COMPARE_OP_ALWAYS 2009091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim}; 2019091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 2029091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimconst deUint32 StencilOpStateUniqueRandomIterator::m_stencilOpsLength = DE_LENGTH_OF_ARRAY(m_stencilOps); 2039091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimconst deUint32 StencilOpStateUniqueRandomIterator::m_stencilOpsLength2 = m_stencilOpsLength * m_stencilOpsLength; 2049091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimconst deUint32 StencilOpStateUniqueRandomIterator::m_stencilOpsLength3 = m_stencilOpsLength2 * m_stencilOpsLength; 2059091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimconst deUint32 StencilOpStateUniqueRandomIterator::m_compareOpsLength = DE_LENGTH_OF_ARRAY(m_compareOps); 2069091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimconst deUint32 StencilOpStateUniqueRandomIterator::m_totalStencilOpStates = m_stencilOpsLength3 * m_compareOpsLength; 2079091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 2089091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae KimStencilOpStateUniqueRandomIterator::StencilOpStateUniqueRandomIterator (int seed) 2099091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim : UniqueRandomIterator<VkStencilOpState>(m_totalStencilOpStates, m_totalStencilOpStates, seed) 2109091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{ 2119091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim} 2129091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 2139091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae KimVkStencilOpState StencilOpStateUniqueRandomIterator::getIndexedValue (deUint32 index) 2149091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{ 2159091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const deUint32 stencilCompareOpIndex = index / m_stencilOpsLength3; 2169091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const deUint32 stencilCompareOpSeqIndex = stencilCompareOpIndex * m_stencilOpsLength3; 2179091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 2189091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const deUint32 stencilDepthFailOpIndex = (index - stencilCompareOpSeqIndex) / m_stencilOpsLength2; 2199091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const deUint32 stencilDepthFailOpSeqIndex = stencilDepthFailOpIndex * m_stencilOpsLength2; 2209091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 2219091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const deUint32 stencilPassOpIndex = (index - stencilCompareOpSeqIndex - stencilDepthFailOpSeqIndex) / m_stencilOpsLength; 2229091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const deUint32 stencilPassOpSeqIndex = stencilPassOpIndex * m_stencilOpsLength; 2239091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 2249091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const deUint32 stencilFailOpIndex = index - stencilCompareOpSeqIndex - stencilDepthFailOpSeqIndex - stencilPassOpSeqIndex; 2259091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 2269091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkStencilOpState stencilOpState = 2279091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 228120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim m_stencilOps[stencilFailOpIndex], // VkStencilOp failOp; 229120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim m_stencilOps[stencilPassOpIndex], // VkStencilOp passOp; 230120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim m_stencilOps[stencilDepthFailOpIndex], // VkStencilOp depthFailOp; 231120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim m_compareOps[stencilCompareOpIndex], // VkCompareOp compareOp; 232120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0x0, // deUint32 compareMask; 233120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0x0, // deUint32 writeMask; 234120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0x0 // deUint32 reference; 2359091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 2369091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 2379091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim return stencilOpState; 2389091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim} 2399091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 2409091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 2419091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim// StencilTest 2429091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 2439091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimconst StencilTest::StencilStateConfig StencilTest::s_stencilStateConfigs[QUAD_COUNT] = 2449091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{ 2459091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim // frontReadMask frontWriteMask frontRef backReadMask backWriteMask backRef 2469091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 0xFF, 0xFF, 0xAB, 0xF0, 0xFF, 0xFF }, 2479091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 0xFF, 0xF0, 0xCD, 0xF0, 0xF0, 0xEF }, 2489091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 0xF0, 0x0F, 0xEF, 0xFF, 0x0F, 0xCD }, 2499091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 0xF0, 0x01, 0xFF, 0xFF, 0x01, 0xAB } 2509091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim}; 2519091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 2529091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimconst float StencilTest::s_quadDepths[QUAD_COUNT] = 2539091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{ 2549091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 0.1f, 2559091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 0.0f, 2569091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 0.3f, 2579091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 0.2f 2589091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim}; 2599091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 2609091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae KimStencilTest::StencilTest (tcu::TestContext& testContext, 2619091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const std::string& name, 2629091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const std::string& description, 2639091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VkFormat stencilFormat, 2649091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkStencilOpState& stencilOpStateFront, 2659091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkStencilOpState& stencilOpStateBack) 2669091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim : vkt::TestCase (testContext, name, description) 2679091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim , m_stencilFormat (stencilFormat) 2689091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim , m_stencilOpStateFront (stencilOpStateFront) 2699091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim , m_stencilOpStateBack (stencilOpStateBack) 2709091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{ 2719091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim} 2729091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 2739091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae KimStencilTest::~StencilTest (void) 2749091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{ 2759091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim} 2769091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 2779091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae KimTestInstance* StencilTest::createInstance (Context& context) const 2789091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{ 2799091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim return new StencilTestInstance(context, m_stencilFormat, m_stencilOpStateFront, m_stencilOpStateBack); 2809091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim} 2819091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 2829091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimvoid StencilTest::initPrograms (SourceCollections& sourceCollections) const 2839091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{ 2849091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim sourceCollections.glslSources.add("color_vert") << glu::VertexSource( 2859091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim "#version 310 es\n" 2869091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim "layout(location = 0) in vec4 position;\n" 2879091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim "layout(location = 1) in vec4 color;\n" 2889091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim "layout(location = 0) out highp vec4 vtxColor;\n" 2899091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim "void main (void)\n" 2909091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim "{\n" 2919091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim " gl_Position = position;\n" 2929091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim " vtxColor = color;\n" 2939091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim "}\n"); 2949091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 2959091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim sourceCollections.glslSources.add("color_frag") << glu::FragmentSource( 2969091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim "#version 310 es\n" 2979091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim "layout(location = 0) in highp vec4 vtxColor;\n" 2989091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim "layout(location = 0) out highp vec4 fragColor;\n" 2999091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim "void main (void)\n" 3009091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim "{\n" 3019091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim " fragColor = vtxColor;\n" 3029091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim "}\n"); 3039091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim} 3049091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 3059091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 3069091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim// StencilTestInstance 3079091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 3089091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae KimStencilTestInstance::StencilTestInstance (Context& context, 3099091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VkFormat stencilFormat, 3109091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkStencilOpState& stencilOpStateFront, 3119091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkStencilOpState& stencilOpStateBack) 3129091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim : vkt::TestInstance (context) 3139091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim , m_stencilOpStateFront (stencilOpStateFront) 3149091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim , m_stencilOpStateBack (stencilOpStateBack) 3159091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim , m_renderSize (32, 32) 3169091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim , m_colorFormat (VK_FORMAT_R8G8B8A8_UNORM) 3179091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim , m_stencilFormat (stencilFormat) 3189091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{ 319120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim const DeviceInterface& vk = context.getDeviceInterface(); 320120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim const VkDevice vkDevice = context.getDevice(); 321120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex(); 322120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim SimpleAllocator memAlloc (vk, vkDevice, getPhysicalDeviceMemoryProperties(context.getInstanceInterface(), context.getPhysicalDevice())); 323120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim const VkComponentMapping componentMappingRGBA = { VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A }; 3249091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 3259091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim // Create color image 3269091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 3279091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkImageCreateInfo colorImageParams = 3289091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 329120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, // VkStructureType sType; 330120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim DE_NULL, // const void* pNext; 331120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // VkImageCreateFlags flags; 332120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_IMAGE_TYPE_2D, // VkImageType imageType; 333120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim m_colorFormat, // VkFormat format; 334120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim { m_renderSize.x(), m_renderSize.y(), 1u }, // VkExtent3D extent; 335120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 1u, // deUint32 mipLevels; 336120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 1u, // deUint32 arrayLayers; 337120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits samples; 338120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_IMAGE_TILING_OPTIMAL, // VkImageTiling tiling; 339120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT, // VkImageUsageFlags usage; 340120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode; 341120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 1u, // deUint32 queueFamilyIndexCount; 342120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim &queueFamilyIndex, // const deUint32* pQueueFamilyIndices; 343120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_IMAGE_LAYOUT_UNDEFINED // VkImageLayout initialLayout; 3449091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 3459091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 3469091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim m_colorImageCreateInfo = colorImageParams; 3479091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim m_colorImage = createImage(vk, vkDevice, &m_colorImageCreateInfo); 3489091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 3499091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim // Allocate and bind color image memory 3509091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim m_colorImageAlloc = memAlloc.allocate(getImageMemoryRequirements(vk, vkDevice, *m_colorImage), MemoryRequirement::Any); 3519091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_CHECK(vk.bindImageMemory(vkDevice, *m_colorImage, m_colorImageAlloc->getMemory(), m_colorImageAlloc->getOffset())); 3529091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim } 3539091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 3549091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim // Create stencil image 3559091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 3569091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim // Check format support 3579091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim if (!isSupportedDepthStencilFormat(context.getInstanceInterface(), context.getPhysicalDevice(), m_stencilFormat)) 3589091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim throw tcu::NotSupportedError(std::string("Unsupported depth/stencil format: ") + getFormatName(m_stencilFormat)); 3599091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 3609091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkImageCreateInfo stencilImageParams = 3619091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 362120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, // VkStructureType sType; 363120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim DE_NULL, // const void* pNext; 364120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // VkImageCreateFlags flags; 365120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_IMAGE_TYPE_2D, // VkImageType imageType; 366120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim m_stencilFormat, // VkFormat format; 367120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim { m_renderSize.x(), m_renderSize.y(), 1u }, // VkExtent3D extent; 368120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 1u, // deUint32 mipLevels; 369120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 1u, // deUint32 arrayLayers; 370120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits samples; 371120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_IMAGE_TILING_OPTIMAL, // VkImageTiling tiling; 372120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, // VkImageUsageFlags usage; 373120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode; 374120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 1u, // deUint32 queueFamilyIndexCount; 375120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim &queueFamilyIndex, // const deUint32* pQueueFamilyIndices; 376120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_IMAGE_LAYOUT_UNDEFINED // VkImageLayout initialLayout; 3779091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 3789091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 3799091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim m_stencilImage = createImage(vk, vkDevice, &stencilImageParams); 3809091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 3819091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim // Allocate and bind stencil image memory 3829091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim m_stencilImageAlloc = memAlloc.allocate(getImageMemoryRequirements(vk, vkDevice, *m_stencilImage), MemoryRequirement::Any); 3839091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_CHECK(vk.bindImageMemory(vkDevice, *m_stencilImage, m_stencilImageAlloc->getMemory(), m_stencilImageAlloc->getOffset())); 3843d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos 3853d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos const VkImageAspectFlags aspect = (mapVkFormat(m_stencilFormat).order == tcu::TextureFormat::DS ? VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_DEPTH_BIT 3863d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos : VK_IMAGE_ASPECT_STENCIL_BIT); 3873d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos m_stencilImageSubresourceRange = makeImageSubresourceRange(aspect, 0u, stencilImageParams.mipLevels, 0u, stencilImageParams.arrayLayers); 3889091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim } 3899091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 3909091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim // Create color attachment view 3919091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 3929091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkImageViewCreateInfo colorAttachmentViewParams = 3939091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 394120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, // VkStructureType sType; 395120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim DE_NULL, // const void* pNext; 396120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // VkImageViewCreateFlags flags; 397120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim *m_colorImage, // VkImage image; 398120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_IMAGE_VIEW_TYPE_2D, // VkImageViewType viewType; 399120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim m_colorFormat, // VkFormat format; 400120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim componentMappingRGBA, // VkComponentMapping components; 401120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim { VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u } // VkImageSubresourceRange subresourceRange; 4029091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 4039091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 4049091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim m_colorAttachmentView = createImageView(vk, vkDevice, &colorAttachmentViewParams); 4059091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim } 4069091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 4079091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim // Create stencil attachment view 4089091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 4099091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkImageViewCreateInfo stencilAttachmentViewParams = 4109091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 411120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, // VkStructureType sType; 412120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim DE_NULL, // const void* pNext; 413120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // VkImageViewCreateFlags flags; 414120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim *m_stencilImage, // VkImage image; 415120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_IMAGE_VIEW_TYPE_2D, // VkImageViewType viewType; 416120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim m_stencilFormat, // VkFormat format; 417120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim componentMappingRGBA, // VkComponentMapping components; 4183d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos m_stencilImageSubresourceRange, // VkImageSubresourceRange subresourceRange; 4199091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 4209091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 4219091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim m_stencilAttachmentView = createImageView(vk, vkDevice, &stencilAttachmentViewParams); 4229091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim } 4239091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 4249091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim // Create render pass 4259091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 4269091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkAttachmentDescription colorAttachmentDescription = 4279091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 42894128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos 0u, // VkAttachmentDescriptionFlags flags; 4299091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim m_colorFormat, // VkFormat format; 430120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits samples; 4319091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_ATTACHMENT_LOAD_OP_CLEAR, // VkAttachmentLoadOp loadOp; 4329091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_ATTACHMENT_STORE_OP_STORE, // VkAttachmentStoreOp storeOp; 4339091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_ATTACHMENT_LOAD_OP_DONT_CARE, // VkAttachmentLoadOp stencilLoadOp; 4349091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_ATTACHMENT_STORE_OP_DONT_CARE, // VkAttachmentStoreOp stencilStoreOp; 4359091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // VkImageLayout initialLayout; 4369091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // VkImageLayout finalLayout; 4379091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 4389091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 4399091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkAttachmentDescription stencilAttachmentDescription = 4409091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 441120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // VkAttachmentDescriptionFlags flags; 4429091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim m_stencilFormat, // VkFormat format; 443120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits samples; 4449091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_ATTACHMENT_LOAD_OP_CLEAR, // VkAttachmentLoadOp loadOp; 4459091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_ATTACHMENT_STORE_OP_DONT_CARE, // VkAttachmentStoreOp storeOp; 4469091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_ATTACHMENT_LOAD_OP_CLEAR, // VkAttachmentLoadOp stencilLoadOp; 4479091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_ATTACHMENT_STORE_OP_DONT_CARE, // VkAttachmentStoreOp stencilStoreOp; 4489091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, // VkImageLayout initialLayout; 4499091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, // VkImageLayout finalLayout; 4509091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 4519091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 4529091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkAttachmentDescription attachments[2] = 4539091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 4549091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim colorAttachmentDescription, 4559091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim stencilAttachmentDescription 4569091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 4579091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 4589091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkAttachmentReference colorAttachmentReference = 4599091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 4609091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 0u, // deUint32 attachment; 4619091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL // VkImageLayout layout; 4629091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 4639091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 4649091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkAttachmentReference stencilAttachmentReference = 4659091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 4669091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 1u, // deUint32 attachment; 4679091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL // VkImageLayout layout; 4689091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 4699091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 4709091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkSubpassDescription subpassDescription = 4719091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 4729091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 0u, // VkSubpassDescriptionFlags flags; 473120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_PIPELINE_BIND_POINT_GRAPHICS, // VkPipelineBindPoint pipelineBindPoint; 474120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // deUint32 inputAttachmentCount; 4759091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim DE_NULL, // const VkAttachmentReference* pInputAttachments; 476120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 1u, // deUint32 colorAttachmentCount; 4779091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim &colorAttachmentReference, // const VkAttachmentReference* pColorAttachments; 478120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim DE_NULL, // const VkAttachmentReference* pResolveAttachments; 479120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim &stencilAttachmentReference, // const VkAttachmentReference* pDepthStencilAttachment; 480120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // deUint32 preserveAttachmentCount; 4819091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim DE_NULL // const VkAttachmentReference* pPreserveAttachments; 4829091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 4839091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 4849091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkRenderPassCreateInfo renderPassParams = 4859091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 4869091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, // VkStructureType sType; 4879091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim DE_NULL, // const void* pNext; 488120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // VkRenderPassCreateFlags flags; 4899091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 2u, // deUint32 attachmentCount; 4909091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim attachments, // const VkAttachmentDescription* pAttachments; 4919091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 1u, // deUint32 subpassCount; 4929091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim &subpassDescription, // const VkSubpassDescription* pSubpasses; 4939091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 0u, // deUint32 dependencyCount; 4949091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim DE_NULL // const VkSubpassDependency* pDependencies; 4959091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 4969091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 4979091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim m_renderPass = createRenderPass(vk, vkDevice, &renderPassParams); 4989091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim } 4999091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 5009091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim // Create framebuffer 5019091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 5029091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkImageView attachmentBindInfos[2] = { *m_colorAttachmentView, *m_stencilAttachmentView }; 5039091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 5049091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkFramebufferCreateInfo framebufferParams = 5059091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 506120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, // VkStructureType sType; 507120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim DE_NULL, // const void* pNext; 508120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // VkFramebufferCreateFlags flags; 509120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim *m_renderPass, // VkRenderPass renderPass; 510120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 2u, // deUint32 attachmentCount; 511120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim attachmentBindInfos, // const VkImageView* pAttachments; 512120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim (deUint32)m_renderSize.x(), // deUint32 width; 513120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim (deUint32)m_renderSize.y(), // deUint32 height; 514120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 1u // deUint32 layers; 5159091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 5169091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 5179091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim m_framebuffer = createFramebuffer(vk, vkDevice, &framebufferParams); 5189091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim } 5199091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 5209091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim // Create pipeline layout 5219091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 5229091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkPipelineLayoutCreateInfo pipelineLayoutParams = 5239091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 5249091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, // VkStructureType sType; 5259091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim DE_NULL, // const void* pNext; 526120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // VkPipelineLayoutCreateFlags flags; 527120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // deUint32 setLayoutCount; 5289091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim DE_NULL, // const VkDescriptorSetLayout* pSetLayouts; 5299091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 0u, // deUint32 pushConstantRangeCount; 5309091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim DE_NULL // const VkPushConstantRange* pPushConstantRanges; 5319091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 5329091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 5339091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim m_pipelineLayout = createPipelineLayout(vk, vkDevice, &pipelineLayoutParams); 5349091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim } 5359091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 536120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim m_vertexShaderModule = createShaderModule(vk, vkDevice, m_context.getBinaryCollection().get("color_vert"), 0); 537120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim m_fragmentShaderModule = createShaderModule(vk, vkDevice, m_context.getBinaryCollection().get("color_frag"), 0); 5389091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 5399091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim // Create pipeline 5409091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 541120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim const VkPipelineShaderStageCreateInfo shaderStages[2] = 5429091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 5439091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 544120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, // VkStructureType sType; 545120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim DE_NULL, // const void* pNext; 546120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // VkPipelineShaderStageCreateFlags flags; 547120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_SHADER_STAGE_VERTEX_BIT, // VkShaderStageFlagBits stage; 548120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim *m_vertexShaderModule, // VkShaderModule module; 549120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim "main", // const char* pName; 550120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim DE_NULL // const VkSpecializationInfo* pSpecializationInfo; 5519091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }, 5529091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 553120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, // VkStructureType sType; 554120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim DE_NULL, // const void* pNext; 555120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // VkPipelineShaderStageCreateFlags flags; 556120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_SHADER_STAGE_FRAGMENT_BIT, // VkShaderStageFlagBits stage; 557120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim *m_fragmentShaderModule, // VkShaderModule module; 558120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim "main", // const char* pName; 559120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim DE_NULL // const VkSpecializationInfo* pSpecializationInfo; 5609091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim } 5619091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 5629091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 5639091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkVertexInputBindingDescription vertexInputBindingDescription = 5649091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 5659091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 0u, // deUint32 binding; 5669091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim sizeof(Vertex4RGBA), // deUint32 strideInBytes; 567120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_VERTEX_INPUT_RATE_VERTEX // VkVertexInputStepRate inputRate; 5689091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 5699091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 5709091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkVertexInputAttributeDescription vertexInputAttributeDescriptions[2] = 5719091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 5729091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 5739091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 0u, // deUint32 location; 5749091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 0u, // deUint32 binding; 5759091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_FORMAT_R32G32B32A32_SFLOAT, // VkFormat format; 5769091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 0u // deUint32 offsetInBytes; 5779091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }, 5789091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 5799091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 1u, // deUint32 location; 5809091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 0u, // deUint32 binding; 5819091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_FORMAT_R32G32B32A32_SFLOAT, // VkFormat format; 5829091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim DE_OFFSET_OF(Vertex4RGBA, color), // deUint32 offsetInBytes; 5839091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim } 5849091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 5859091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 5869091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkPipelineVertexInputStateCreateInfo vertexInputStateParams = 5879091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 5889091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO, // VkStructureType sType; 5899091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim DE_NULL, // const void* pNext; 590120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // VkPipelineVertexInputStateCreateFlags flags; 591120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 1u, // deUint32 vertexBindingDescriptionCount; 5929091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim &vertexInputBindingDescription, // const VkVertexInputBindingDescription* pVertexBindingDescriptions; 593120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 2u, // deUint32 vertexAttributeDescriptionCount; 5949091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim vertexInputAttributeDescriptions // const VkVertexInputAttributeDescription* pVertexAttributeDescriptions; 5959091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 5969091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 5979091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkPipelineInputAssemblyStateCreateInfo inputAssemblyStateParams = 5989091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 599120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, // VkStructureType sType; 600120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim DE_NULL, // const void* pNext; 601120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // VkPipelineInputAssemblyStateCreateFlags flags; 602120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, // VkPrimitiveTopology topology; 603120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim false // VkBool32 primitiveRestartEnable; 6049091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 6059091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 6069091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkViewport viewport = 6079091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 608120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0.0f, // float x; 609120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0.0f, // float y; 6109091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim (float)m_renderSize.x(), // float width; 6119091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim (float)m_renderSize.y(), // float height; 6129091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 0.0f, // float minDepth; 6139091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 1.0f // float maxDepth; 6149091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 6159091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 6169091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkRect2D scissor = { { 0, 0 }, { m_renderSize.x(), m_renderSize.y() } }; 6179091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 6189091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkPipelineViewportStateCreateInfo viewportStateParams = 6199091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 620120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO, // VkStructureType sType; 621120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim DE_NULL, // const void* pNext; 622120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // VkPipelineViewportStateCreateFlags flags; 623120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 1u, // deUint32 viewportCount; 624120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim &viewport, // const VkViewport* pViewports; 625120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 1u, // deUint32 scissorCount; 626120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim &scissor, // const VkRect2D* pScissors; 6279091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 6289091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 629120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim const VkPipelineRasterizationStateCreateInfo rasterStateParams = 6309091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 631120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO, // VkStructureType sType; 632120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim DE_NULL, // const void* pNext; 633120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // VkPipelineRasterizationStateCreateFlags flags; 634120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim false, // VkBool32 depthClampEnable; 635120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim false, // VkBool32 rasterizerDiscardEnable; 636120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_POLYGON_MODE_FILL, // VkPolygonMode polygonMode; 637120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_CULL_MODE_NONE, // VkCullModeFlags cullMode; 638120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_FRONT_FACE_COUNTER_CLOCKWISE, // VkFrontFace frontFace; 639120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim false, // VkBool32 depthBiasEnable; 640120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0.0f, // float depthBiasConstantFactor; 641120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0.0f, // float depthBiasClamp; 642120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0.0f, // float depthBiasSlopeFactor; 643120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 1.0f // float lineWidth; 6449091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 6459091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 6469091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkPipelineColorBlendAttachmentState colorBlendAttachmentState = 6479091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 648120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim false, // VkBool32 blendEnable; 649120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_BLEND_FACTOR_ONE, // VkBlendFactor srcColorBlendFactor; 650120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_BLEND_FACTOR_ZERO, // VkBlendFactor dstColorBlendFactor; 651120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_BLEND_OP_ADD, // VkBlendOp colorBlendOp; 652120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_BLEND_FACTOR_ONE, // VKBLENDFACTOR SRCALPHABLENDFACTOR; 653120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_BLEND_FACTOR_ZERO, // VkBlendFactor dstAlphaBlendFactor; 654120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_BLEND_OP_ADD, // VkBlendOp alphaBlendOp; 655120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | // VkColorComponentFlags colorWriteMask; 656120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT 6579091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 6589091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 6599091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkPipelineColorBlendStateCreateInfo colorBlendStateParams = 6609091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 6619091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO, // VkStructureType sType; 6629091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim DE_NULL, // const void* pNext; 663120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // VkPipelineColorBlendStateCreateFlags flags; 6649091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim false, // VkBool32 logicOpEnable; 6659091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_LOGIC_OP_COPY, // VkLogicOp logicOp; 6669091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 1u, // deUint32 attachmentCount; 6679091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim &colorBlendAttachmentState, // const VkPipelineColorBlendAttachmentState* pAttachments; 668120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim { 0.0f, 0.0f, 0.0f, 0.0f } // float blendConstants[4]; 6699091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 6709091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 6719091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkPipelineMultisampleStateCreateInfo multisampleStateParams = 6729091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 673120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO, // VkStructureType sType; 674120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim DE_NULL, // const void* pNext; 675120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // VkPipelineMultisampleStateCreateFlags flags; 676120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits rasterizationSamples; 677120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim false, // VkBool32 sampleShadingEnable; 678120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0.0f, // float minSampleShading; 679120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim DE_NULL, // const VkSampleMask* pSampleMask; 680120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim false, // VkBool32 alphaToCoverageEnable; 681120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim false // VkBool32 alphaToOneEnable; 6829091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 6839091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 6849091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const bool isDepthEnabled = (vk::mapVkFormat(m_stencilFormat).order != tcu::TextureFormat::S); 6859091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 6869091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VkPipelineDepthStencilStateCreateInfo depthStencilStateParams = 6879091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 688120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO, // VkStructureType sType; 689120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim DE_NULL, // const void* pNext; 690120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // VkPipelineDepthStencilStateCreateFlags flags; 691120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim isDepthEnabled, // VkBool32 depthTestEnable; 692120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim isDepthEnabled, // VkBool32 depthWriteEnable; 693120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_COMPARE_OP_LESS, // VkCompareOp depthCompareOp; 694120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim false, // VkBool32 depthBoundsTestEnable; 695120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim true, // VkBool32 stencilTestEnable; 696120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim m_stencilOpStateFront, // VkStencilOpState front; 697120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim m_stencilOpStateBack, // VkStencilOpState back; 6983d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos 0.0f, // float minDepthBounds; 6993d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos 1.0f // float maxDepthBounds; 7009091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 7019091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 7029091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkGraphicsPipelineCreateInfo graphicsPipelineParams = 7039091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 7049091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO, // VkStructureType sType; 7059091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim DE_NULL, // const void* pNext; 706120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // VkPipelineCreateFlags flags; 7079091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 2u, // deUint32 stageCount; 708120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim shaderStages, // const VkPipelineShaderStageCreateInfo* pStages; 7099091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim &vertexInputStateParams, // const VkPipelineVertexInputStateCreateInfo* pVertexInputState; 7109091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim &inputAssemblyStateParams, // const VkPipelineInputAssemblyStateCreateInfo* pInputAssemblyState; 7119091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim DE_NULL, // const VkPipelineTessellationStateCreateInfo* pTessellationState; 7129091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim &viewportStateParams, // const VkPipelineViewportStateCreateInfo* pViewportState; 713120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim &rasterStateParams, // const VkPipelineRasterizationStateCreateInfo* pRasterizationState; 7149091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim &multisampleStateParams, // const VkPipelineMultisampleStateCreateInfo* pMultisampleState; 7159091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim &depthStencilStateParams, // const VkPipelineDepthStencilStateCreateInfo* pDepthStencilState; 7169091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim &colorBlendStateParams, // const VkPipelineColorBlendStateCreateInfo* pColorBlendState; 71786a8ae9e0d61bbfe1f1e273fdbb026369bdb5f29Pyry Haulos (const VkPipelineDynamicStateCreateInfo*)DE_NULL, // const VkPipelineDynamicStateCreateInfo* pDynamicState; 7189091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim *m_pipelineLayout, // VkPipelineLayout layout; 7199091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim *m_renderPass, // VkRenderPass renderPass; 7209091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 0u, // deUint32 subpass; 7219091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 0u, // VkPipeline basePipelineHandle; 7229091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 0u // deInt32 basePipelineIndex; 7239091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 7249091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 7259091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim // Setup different stencil masks and refs in each quad 7269091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim for (int quadNdx = 0; quadNdx < StencilTest::QUAD_COUNT; quadNdx++) 7279091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 7289091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const StencilTest::StencilStateConfig& config = StencilTest::s_stencilStateConfigs[quadNdx]; 7299091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VkStencilOpState& front = depthStencilStateParams.front; 7309091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VkStencilOpState& back = depthStencilStateParams.back; 7319091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 732120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim front.compareMask = config.frontReadMask; 733120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim front.writeMask = config.frontWriteMask; 734120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim front.reference = config.frontRef; 7359091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 736120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim back.compareMask = config.backReadMask; 737120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim back.writeMask = config.backWriteMask; 738120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim back.reference = config.backRef; 7399091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 7409091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim m_graphicsPipelines[quadNdx] = createGraphicsPipeline(vk, vkDevice, DE_NULL, &graphicsPipelineParams); 7419091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim } 7429091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim } 7439091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 7449091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 7459091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim // Create vertex buffer 7469091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 7479091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkBufferCreateInfo vertexBufferParams = 7489091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 7499091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, // VkStructureType sType; 7509091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim DE_NULL, // const void* pNext; 751120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // VkBufferCreateFlags flags; 7529091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 1024u, // VkDeviceSize size; 7539091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, // VkBufferUsageFlags usage; 7549091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode; 755120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 1u, // deUint32 queueFamilyIndexCount; 7569091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim &queueFamilyIndex // const deUint32* pQueueFamilyIndices; 7579091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 7589091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 7599091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim m_vertices = createOverlappingQuads(); 7609091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim m_vertexBuffer = createBuffer(vk, vkDevice, &vertexBufferParams); 7619091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim m_vertexBufferAlloc = memAlloc.allocate(getBufferMemoryRequirements(vk, vkDevice, *m_vertexBuffer), MemoryRequirement::HostVisible); 7629091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 7639091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_CHECK(vk.bindBufferMemory(vkDevice, *m_vertexBuffer, m_vertexBufferAlloc->getMemory(), m_vertexBufferAlloc->getOffset())); 7649091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 7659091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim // Adjust depths 7669091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim for (int quadNdx = 0; quadNdx < 4; quadNdx++) 7679091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim for (int vertexNdx = 0; vertexNdx < 6; vertexNdx++) 7689091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim m_vertices[quadNdx * 6 + vertexNdx].position.z() = StencilTest::s_quadDepths[quadNdx]; 7699091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 7709091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim // Load vertices into vertex buffer 7719091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim deMemcpy(m_vertexBufferAlloc->getHostPtr(), m_vertices.data(), m_vertices.size() * sizeof(Vertex4RGBA)); 7729091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 7739091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkMappedMemoryRange flushRange = 7749091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 7759091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE, // VkStructureType sType; 7769091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim DE_NULL, // const void* pNext; 777120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim m_vertexBufferAlloc->getMemory(), // VkDeviceMemory memory; 7789091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim m_vertexBufferAlloc->getOffset(), // VkDeviceSize offset; 7799091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim vertexBufferParams.size // VkDeviceSize size; 7809091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 7819091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 7829091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim vk.flushMappedMemoryRanges(vkDevice, 1, &flushRange); 7839091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim } 7849091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 7859091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim // Create command pool 7869091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 787120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim const VkCommandPoolCreateInfo cmdPoolParams = 7889091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 789120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // VkStructureType sType; 790120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim DE_NULL, // const void* pNext; 791120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_COMMAND_POOL_CREATE_TRANSIENT_BIT, // VkCommandPoolCreateFlags flags; 792120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim queueFamilyIndex, // deUint32 queueFamilyIndex; 7939091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 7949091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 7959091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim m_cmdPool = createCommandPool(vk, vkDevice, &cmdPoolParams); 7969091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim } 7979091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 7989091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim // Create command buffer 7999091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 800120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim const VkCommandBufferAllocateInfo cmdBufferAllocateInfo = 8019091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 80294128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType; 80394128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos DE_NULL, // const void* pNext; 80494128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos *m_cmdPool, // VkCommandPool commandPool; 80594128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos VK_COMMAND_BUFFER_LEVEL_PRIMARY, // VkCommandBufferLevel level; 80694128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos 1u // deUint32 bufferCount; 8079091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 8089091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 809120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim const VkCommandBufferBeginInfo cmdBufferBeginInfo = 8109091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 811120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // VkStructureType sType; 812120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim DE_NULL, // const void* pNext; 813120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // VkCommandBufferUsageFlags flags; 814689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (const VkCommandBufferInheritanceInfo*)DE_NULL, 8159091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 8169091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 8179091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkClearValue attachmentClearValues[2] = 8189091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 8199091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim defaultClearValue(m_colorFormat), 8209091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim defaultClearValue(m_stencilFormat) 8219091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 8229091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 8239091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkRenderPassBeginInfo renderPassBeginInfo = 8249091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 8259091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, // VkStructureType sType; 8269091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim DE_NULL, // const void* pNext; 8279091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim *m_renderPass, // VkRenderPass renderPass; 8289091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim *m_framebuffer, // VkFramebuffer framebuffer; 8299091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { { 0, 0 } , { m_renderSize.x(), m_renderSize.y() } }, // VkRect2D renderArea; 8309091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 2, // deUint32 clearValueCount; 8319091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim attachmentClearValues // const VkClearValue* pClearValues; 8329091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 8339091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 8343d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos const VkImageMemoryBarrier imageLayoutBarriers[] = 8353d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos { 8363d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos // color image layout transition 8373d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos { 8383d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // VkStructureType sType; 8393d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos DE_NULL, // const void* pNext; 8403d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos (VkAccessFlags)0, // VkAccessFlags srcAccessMask; 8413d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, // VkAccessFlags dstAccessMask; 8423d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout oldLayout; 8433d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // VkImageLayout newLayout; 8443d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos VK_QUEUE_FAMILY_IGNORED, // uint32_t srcQueueFamilyIndex; 8453d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos VK_QUEUE_FAMILY_IGNORED, // uint32_t dstQueueFamilyIndex; 8463d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos *m_colorImage, // VkImage image; 8473d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos { VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u } // VkImageSubresourceRange subresourceRange; 8483d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos }, 8493d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos // stencil image layout transition 8503d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos { 8513d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // VkStructureType sType; 8523d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos DE_NULL, // const void* pNext; 8533d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos (VkAccessFlags)0, // VkAccessFlags srcAccessMask; 8543d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT, // VkAccessFlags dstAccessMask; 8553d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout oldLayout; 8563d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, // VkImageLayout newLayout; 8573d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos VK_QUEUE_FAMILY_IGNORED, // uint32_t srcQueueFamilyIndex; 8583d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos VK_QUEUE_FAMILY_IGNORED, // uint32_t dstQueueFamilyIndex; 8593d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos *m_stencilImage, // VkImage image; 8603d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos m_stencilImageSubresourceRange, // VkImageSubresourceRange subresourceRange; 8613d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos }, 8623d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos }; 8633d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos 864120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim m_cmdBuffer = allocateCommandBuffer(vk, vkDevice, &cmdBufferAllocateInfo); 8659091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 8669091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_CHECK(vk.beginCommandBuffer(*m_cmdBuffer, &cmdBufferBeginInfo)); 8673d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos 8683d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos vk.cmdPipelineBarrier(*m_cmdBuffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, (VkDependencyFlags)0, 8693d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos 0u, DE_NULL, 0u, DE_NULL, DE_LENGTH_OF_ARRAY(imageLayoutBarriers), imageLayoutBarriers); 8703d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos 871120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim vk.cmdBeginRenderPass(*m_cmdBuffer, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE); 8729091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 8739091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkDeviceSize quadOffset = (m_vertices.size() / StencilTest::QUAD_COUNT) * sizeof(Vertex4RGBA); 8749091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 8759091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim for (int quadNdx = 0; quadNdx < StencilTest::QUAD_COUNT; quadNdx++) 8769091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 8779091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VkDeviceSize vertexBufferOffset = quadOffset * quadNdx; 8789091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 8799091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim vk.cmdBindPipeline(*m_cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *m_graphicsPipelines[quadNdx]); 8809091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim vk.cmdBindVertexBuffers(*m_cmdBuffer, 0, 1, &m_vertexBuffer.get(), &vertexBufferOffset); 8819091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim vk.cmdDraw(*m_cmdBuffer, (deUint32)(m_vertices.size() / StencilTest::QUAD_COUNT), 1, 0, 0); 8829091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim } 8839091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 8849091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim vk.cmdEndRenderPass(*m_cmdBuffer); 8859091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer)); 8869091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim } 8879091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 8889091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim // Create fence 8899091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 8909091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkFenceCreateInfo fenceParams = 8919091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 8929091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, // VkStructureType sType; 8939091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim DE_NULL, // const void* pNext; 8949091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 0u // VkFenceCreateFlags flags; 8959091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 8969091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 8979091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim m_fence = createFence(vk, vkDevice, &fenceParams); 8989091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim } 8999091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim} 9009091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 9019091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae KimStencilTestInstance::~StencilTestInstance (void) 9029091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{ 9039091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim} 9049091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 9059091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimtcu::TestStatus StencilTestInstance::iterate (void) 9069091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{ 9079091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const DeviceInterface& vk = m_context.getDeviceInterface(); 9089091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkDevice vkDevice = m_context.getDevice(); 9099091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkQueue queue = m_context.getUniversalQueue(); 910120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim const VkSubmitInfo submitInfo = 911120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim { 912120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_STRUCTURE_TYPE_SUBMIT_INFO, // VkStructureType sType; 913120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim DE_NULL, // const void* pNext; 914120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // deUint32 waitSemaphoreCount; 915120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim DE_NULL, // const VkSemaphore* pWaitSemaphores; 916689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (const VkPipelineStageFlags*)DE_NULL, 917120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 1u, // deUint32 commandBufferCount; 918120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim &m_cmdBuffer.get(), // const VkCommandBuffer* pCommandBuffers; 919120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // deUint32 signalSemaphoreCount; 920120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim DE_NULL // const VkSemaphore* pSignalSemaphores; 921120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim }; 9229091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 9239091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_CHECK(vk.resetFences(vkDevice, 1, &m_fence.get())); 924120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_CHECK(vk.queueSubmit(queue, 1, &submitInfo, *m_fence)); 9259091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_CHECK(vk.waitForFences(vkDevice, 1, &m_fence.get(), true, ~(0ull) /* infinity*/)); 9269091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 9279091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim return verifyImage(); 9289091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim} 9299091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 9309091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimtcu::TestStatus StencilTestInstance::verifyImage (void) 9319091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{ 9329091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const tcu::TextureFormat tcuColorFormat = mapVkFormat(m_colorFormat); 9339091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const tcu::TextureFormat tcuStencilFormat = mapVkFormat(m_stencilFormat); 9349091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const ColorVertexShader vertexShader; 9359091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const ColorFragmentShader fragmentShader (tcuColorFormat, tcuStencilFormat); 9369091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const rr::Program program (&vertexShader, &fragmentShader); 9379091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim ReferenceRenderer refRenderer (m_renderSize.x(), m_renderSize.y(), 1, tcuColorFormat, tcuStencilFormat, &program); 9389091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim bool compareOk = false; 9399091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 9409091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim // Render reference image 9419091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 9429091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim // Set depth state 9439091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim rr::RenderState renderState(refRenderer.getViewportState()); 9449091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 9459091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim renderState.fragOps.depthTestEnabled = true; 9469091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim renderState.fragOps.depthFunc = mapVkCompareOp(VK_COMPARE_OP_LESS); 9479091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim renderState.fragOps.stencilTestEnabled = true; 9489091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 9499091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim rr::StencilState& refStencilFront = renderState.fragOps.stencilStates[rr::FACETYPE_FRONT]; 9509091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim rr::StencilState& refStencilBack = renderState.fragOps.stencilStates[rr::FACETYPE_BACK]; 9519091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 952120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim refStencilFront.sFail = mapVkStencilOp(m_stencilOpStateFront.failOp); 953120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim refStencilFront.dpFail = mapVkStencilOp(m_stencilOpStateFront.depthFailOp); 954120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim refStencilFront.dpPass = mapVkStencilOp(m_stencilOpStateFront.passOp); 955120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim refStencilFront.func = mapVkCompareOp(m_stencilOpStateFront.compareOp); 9569091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 957120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim refStencilBack.sFail = mapVkStencilOp(m_stencilOpStateBack.failOp); 958120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim refStencilBack.dpFail = mapVkStencilOp(m_stencilOpStateBack.depthFailOp); 959120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim refStencilBack.dpPass = mapVkStencilOp(m_stencilOpStateBack.passOp); 960120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim refStencilBack.func = mapVkCompareOp(m_stencilOpStateBack.compareOp); 9619091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 9629091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim // Reverse winding of vertices, as Vulkan screen coordinates start at upper left 9639091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim std::vector<Vertex4RGBA> cwVertices(m_vertices); 9649091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim for (size_t vertexNdx = 0; vertexNdx < cwVertices.size() - 2; vertexNdx += 3) 9659091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 9669091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const Vertex4RGBA cwVertex1 = cwVertices[vertexNdx + 1]; 9679091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 9689091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim cwVertices[vertexNdx + 1] = cwVertices[vertexNdx + 2]; 9699091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim cwVertices[vertexNdx + 2] = cwVertex1; 9709091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim } 9719091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 9729091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim for (int quadNdx = 0; quadNdx < StencilTest::QUAD_COUNT; quadNdx++) 9739091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 9749091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim refStencilFront.ref = (int)StencilTest::s_stencilStateConfigs[quadNdx].frontRef; 9759091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim refStencilFront.compMask = StencilTest::s_stencilStateConfigs[quadNdx].frontReadMask; 9769091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim refStencilFront.writeMask = StencilTest::s_stencilStateConfigs[quadNdx].frontWriteMask; 9779091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 9789091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim refStencilBack.ref = (int)StencilTest::s_stencilStateConfigs[quadNdx].backRef; 9799091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim refStencilBack.compMask = StencilTest::s_stencilStateConfigs[quadNdx].backReadMask; 9809091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim refStencilBack.writeMask = StencilTest::s_stencilStateConfigs[quadNdx].backWriteMask; 9819091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 9829091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim refRenderer.draw(renderState, 9839091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim rr::PRIMITIVETYPE_TRIANGLES, 9849091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim std::vector<Vertex4RGBA>(cwVertices.begin() + quadNdx * 6, 9859091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim cwVertices.begin() + (quadNdx + 1) * 6)); 9869091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim } 9879091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim } 9889091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 9899091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim // Compare result with reference image 9909091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 9919091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const DeviceInterface& vk = m_context.getDeviceInterface(); 9929091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkDevice vkDevice = m_context.getDevice(); 9939091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkQueue queue = m_context.getUniversalQueue(); 9949091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const deUint32 queueFamilyIndex = m_context.getUniversalQueueFamilyIndex(); 9959091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim SimpleAllocator allocator (vk, vkDevice, getPhysicalDeviceMemoryProperties(m_context.getInstanceInterface(), m_context.getPhysicalDevice())); 9969091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim de::UniquePtr<tcu::TextureLevel> result (readColorAttachment(vk, vkDevice, queue, queueFamilyIndex, allocator, *m_colorImage, m_colorFormat, m_renderSize).release()); 9979091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 9989091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim compareOk = tcu::intThresholdPositionDeviationCompare(m_context.getTestContext().getLog(), 9999091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim "IntImageCompare", 10009091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim "Image comparison", 10019091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim refRenderer.getAccess(), 10029091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim result->getAccess(), 10039091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim tcu::UVec4(2, 2, 2, 2), 10049091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim tcu::IVec3(1, 1, 0), 10059091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim true, 10069091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim tcu::COMPARE_LOG_RESULT); 10079091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim } 10089091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 10099091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim if (compareOk) 10109091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim return tcu::TestStatus::pass("Result image matches reference"); 10119091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim else 10129091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim return tcu::TestStatus::fail("Image mismatch"); 10139091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim} 10149091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 10159091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 10169091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim// Utilities for test names 10179091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 10189091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimstd::string getShortName (VkCompareOp compareOp) 10199091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{ 10209091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const std::string fullName = getCompareOpName(compareOp); 10219091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 10229091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim DE_ASSERT(de::beginsWith(fullName, "VK_COMPARE_OP_")); 10239091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 10249091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim return de::toLower(fullName.substr(14)); 10259091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim} 10269091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 10279091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimconst char* getShortName (VkStencilOp stencilOp) 10289091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{ 10299091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim switch (stencilOp) 10309091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 1031120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_STENCIL_OP_KEEP: return "keep"; 1032120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_STENCIL_OP_ZERO: return "zero"; 1033120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_STENCIL_OP_REPLACE: return "repl"; 1034120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_STENCIL_OP_INCREMENT_AND_CLAMP: return "incc"; 1035120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_STENCIL_OP_DECREMENT_AND_CLAMP: return "decc"; 1036120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_STENCIL_OP_INVERT: return "inv"; 1037120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_STENCIL_OP_INCREMENT_AND_WRAP: return "wrap"; 1038120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_STENCIL_OP_DECREMENT_AND_WRAP: return "decw"; 10399091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 10409091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim default: 10419091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim DE_FATAL("Invalid VkStencilOpState value"); 10429091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim } 10439091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim return DE_NULL; 10449091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim} 10459091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 10469091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimstd::string getStencilName(const VkStencilOpState& stencilOpState) 10479091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{ 10489091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim std::ostringstream name; 10499091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 1050120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim name << "fail_" << getShortName(stencilOpState.failOp) 1051120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim << "_pass_" << getShortName(stencilOpState.passOp) 1052120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim << "_dfail_" << getShortName(stencilOpState.depthFailOp) 1053120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim << "_comp_" << getShortName(stencilOpState.compareOp); 10549091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 10559091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim return name.str(); 10569091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim} 10579091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 10589091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimstd::string getStencilStateSetName(const VkStencilOpState& stencilOpStateFront, 10599091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkStencilOpState& stencilOpStateBack) 10609091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{ 10619091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim std::ostringstream name; 10629091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 10639091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim name << "front_" << getStencilName(stencilOpStateFront) 10649091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim << "_back_" << getStencilName(stencilOpStateBack); 10659091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 10669091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim return name.str(); 10679091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim} 10689091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 10699091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimstd::string getStencilStateSetDescription(const VkStencilOpState& stencilOpStateFront, 10709091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkStencilOpState& stencilOpStateBack) 10719091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{ 10729091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim std::ostringstream desc; 10739091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 10749091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim desc << "\nFront faces:\n" << stencilOpStateFront; 10759091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim desc << "Back faces:\n" << stencilOpStateBack; 10769091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 10779091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim return desc.str(); 10789091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim} 10799091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 10809091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimstd::string getFormatCaseName (VkFormat format) 10819091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{ 10829091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const std::string fullName = getFormatName(format); 10839091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 10849091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim DE_ASSERT(de::beginsWith(fullName, "VK_FORMAT_")); 10859091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 10869091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim return de::toLower(fullName.substr(10)); 10879091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim} 10889091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 10899091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim} // anonymous 10909091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 10919091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimtcu::TestCaseGroup* createStencilTests (tcu::TestContext& testCtx) 10929091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{ 10939091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkFormat stencilFormats[] = 10949091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 10959091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_FORMAT_S8_UINT, 10969091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_FORMAT_D16_UNORM_S8_UINT, 10979091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_FORMAT_D24_UNORM_S8_UINT, 10989091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_FORMAT_D32_SFLOAT_S8_UINT 10999091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 11009091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 11019091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim de::MovePtr<tcu::TestCaseGroup> stencilTests (new tcu::TestCaseGroup(testCtx, "stencil", "Stencil tests")); 11029091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim de::MovePtr<tcu::TestCaseGroup> formatTests (new tcu::TestCaseGroup(testCtx, "format", "Uses different stencil formats")); 11039091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim StencilOpStateUniqueRandomIterator stencilOpItr (123); 11049091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 11059091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim for (size_t formatNdx = 0; formatNdx < DE_LENGTH_OF_ARRAY(stencilFormats); formatNdx++) 11069091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 11079091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkFormat stencilFormat = stencilFormats[formatNdx]; 11089091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim de::MovePtr<tcu::TestCaseGroup> formatTest (new tcu::TestCaseGroup(testCtx, 11099091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim getFormatCaseName(stencilFormat).c_str(), 11109091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim (std::string("Uses format ") + getFormatName(stencilFormat)).c_str())); 11119091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 11129091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim de::MovePtr<tcu::TestCaseGroup> stencilStateTests; 11139091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 11149091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim std::ostringstream desc; 11159091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim desc << "Draws 4 quads with the following depths and dynamic stencil states: "; 11169091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim for (int quadNdx = 0; quadNdx < StencilTest::QUAD_COUNT; quadNdx++) 11179091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 11189091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const StencilTest::StencilStateConfig& stencilConfig = StencilTest::s_stencilStateConfigs[quadNdx]; 11199091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 11209091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim desc << "(" << quadNdx << ") " 11219091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim << "z = " << StencilTest::s_quadDepths[quadNdx] << ", " 11229091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim << "frontReadMask = " << stencilConfig.frontReadMask << ", " 11239091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim << "frontWriteMask = " << stencilConfig.frontWriteMask << ", " 11249091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim << "frontRef = " << stencilConfig.frontRef << ", " 11259091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim << "backReadMask = " << stencilConfig.backReadMask << ", " 11269091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim << "backWriteMask = " << stencilConfig.backWriteMask << ", " 11279091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim << "backRef = " << stencilConfig.backRef; 11289091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim } 11299091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 11309091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim stencilStateTests = de::MovePtr<tcu::TestCaseGroup>(new tcu::TestCaseGroup(testCtx, "states", desc.str().c_str())); 11319091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim } 11329091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 11339091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim stencilOpItr.reset(); 11349091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 11359091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VkStencilOpState prevStencilState = stencilOpItr.next(); 11369091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkStencilOpState firstStencilState = prevStencilState; 11379091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 11389091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim while (stencilOpItr.hasNext()) 11399091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 11409091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkStencilOpState stencilState = stencilOpItr.next(); 11419091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 11429091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim // Use current stencil state in front fraces and previous state in back faces 11439091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim stencilStateTests->addChild(new StencilTest(testCtx, 11449091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim getStencilStateSetName(stencilState, prevStencilState), 11459091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim getStencilStateSetDescription(stencilState, prevStencilState), 11469091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim stencilFormat, 11479091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim stencilState, 11489091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim prevStencilState)); 11499091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 11509091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim prevStencilState = stencilState; 11519091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim } 11529091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 11539091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim // Use first stencil state with last stencil state. This would make the test suite cover all states in front and back faces. 11549091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim stencilStateTests->addChild(new StencilTest(testCtx, 11559091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim getStencilStateSetName(firstStencilState, prevStencilState), 11569091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim getStencilStateSetDescription(firstStencilState, prevStencilState), 11579091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim stencilFormat, 11589091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim firstStencilState, 11599091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim prevStencilState)); 11609091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 11619091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim formatTest->addChild(stencilStateTests.release()); 11629091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim formatTests->addChild(formatTest.release()); 11639091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim } 11649091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim stencilTests->addChild(formatTests.release()); 11659091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 11669091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim return stencilTests.release(); 11679091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim} 11689091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 11699091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim} // pipeline 11709091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim} // vkt 1171