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" 381d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski#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) {} 730fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi virtual VkStencilOpState getIndexedValue (deUint32 index); 749091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 759091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimprivate: 769091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 779091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim // Pre-calculated constants 780fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi const static deUint32 s_stencilOpsLength; 790fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi const static deUint32 s_stencilOpsLength2; 800fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi const static deUint32 s_stencilOpsLength3; 810fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi const static deUint32 s_compareOpsLength; 829091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 839091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim // Total number of cross-combinations of (stencilFailOp x stencilPassOp x stencilDepthFailOp x stencilCompareOp) 840fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi const static deUint32 s_totalStencilOpStates; 859091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim}; 869091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 879091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 889091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimclass StencilTest : public vkt::TestCase 899091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{ 909091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimpublic: 919091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim enum 929091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 939091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim QUAD_COUNT = 4 949091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 959091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 969091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim struct StencilStateConfig 979091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 989091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim deUint32 frontReadMask; 999091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim deUint32 frontWriteMask; 1009091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim deUint32 frontRef; 1019091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 1029091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim deUint32 backReadMask; 1039091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim deUint32 backWriteMask; 1049091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim deUint32 backRef; 1059091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 1069091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 1079091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const static StencilStateConfig s_stencilStateConfigs[QUAD_COUNT]; 1089091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const static float s_quadDepths[QUAD_COUNT]; 1099091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 1109091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 1119091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim StencilTest (tcu::TestContext& testContext, 1129091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const std::string& name, 1139091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const std::string& description, 1149091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VkFormat stencilFormat, 1159091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkStencilOpState& stencilOpStateFront, 1169091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkStencilOpState& stencilOpStateBack); 1179091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim virtual ~StencilTest (void); 1189091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim virtual void initPrograms (SourceCollections& sourceCollections) const; 1199091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim virtual TestInstance* createInstance (Context& context) const; 1209091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 1219091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimprivate: 1229091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VkFormat m_stencilFormat; 1239091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkStencilOpState m_stencilOpStateFront; 1249091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkStencilOpState m_stencilOpStateBack; 1259091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim}; 1269091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 1279091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimclass StencilTestInstance : public vkt::TestInstance 1289091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{ 1299091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimpublic: 1309091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim StencilTestInstance (Context& context, 1319091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VkFormat stencilFormat, 1329091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkStencilOpState& stencilOpStatesFront, 1339091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkStencilOpState& stencilOpStatesBack); 1349091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim virtual ~StencilTestInstance (void); 1359091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim virtual tcu::TestStatus iterate (void); 1369091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 1379091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimprivate: 1389091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim tcu::TestStatus verifyImage (void); 1399091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 1409091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VkStencilOpState m_stencilOpStateFront; 1419091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VkStencilOpState m_stencilOpStateBack; 142689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos const tcu::UVec2 m_renderSize; 1439091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkFormat m_colorFormat; 1449091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkFormat m_stencilFormat; 1451d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski VkImageSubresourceRange m_stencilImageSubresourceRange; 1469091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 1479091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VkImageCreateInfo m_colorImageCreateInfo; 1489091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim Move<VkImage> m_colorImage; 1499091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim de::MovePtr<Allocation> m_colorImageAlloc; 1509091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim Move<VkImage> m_stencilImage; 1519091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim de::MovePtr<Allocation> m_stencilImageAlloc; 1529091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim Move<VkImageView> m_colorAttachmentView; 1539091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim Move<VkImageView> m_stencilAttachmentView; 1549091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim Move<VkRenderPass> m_renderPass; 1559091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim Move<VkFramebuffer> m_framebuffer; 1569091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 1579091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim Move<VkShaderModule> m_vertexShaderModule; 1589091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim Move<VkShaderModule> m_fragmentShaderModule; 1599091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 1609091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim Move<VkBuffer> m_vertexBuffer; 1619091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim std::vector<Vertex4RGBA> m_vertices; 1629091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim de::MovePtr<Allocation> m_vertexBufferAlloc; 1639091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 1649091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim Move<VkPipelineLayout> m_pipelineLayout; 1659091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim Move<VkPipeline> m_graphicsPipelines[StencilTest::QUAD_COUNT]; 1669091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 167120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim Move<VkCommandPool> m_cmdPool; 168120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim Move<VkCommandBuffer> m_cmdBuffer; 1699091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 1709091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim Move<VkFence> m_fence; 1719091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim}; 1729091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 1730fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessiconst VkStencilOp stencilOps[] = 1749091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{ 1759091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_STENCIL_OP_KEEP, 1769091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_STENCIL_OP_ZERO, 1779091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_STENCIL_OP_REPLACE, 178120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_STENCIL_OP_INCREMENT_AND_CLAMP, 179120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_STENCIL_OP_DECREMENT_AND_CLAMP, 1809091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_STENCIL_OP_INVERT, 181120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_STENCIL_OP_INCREMENT_AND_WRAP, 182120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_STENCIL_OP_DECREMENT_AND_WRAP 1839091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim}; 1849091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 1850fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessiconst VkCompareOp compareOps[] = 1869091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{ 1879091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_COMPARE_OP_NEVER, 1889091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_COMPARE_OP_LESS, 1899091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_COMPARE_OP_EQUAL, 190120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_COMPARE_OP_LESS_OR_EQUAL, 1919091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_COMPARE_OP_GREATER, 1929091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_COMPARE_OP_NOT_EQUAL, 193120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_COMPARE_OP_GREATER_OR_EQUAL, 1949091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_COMPARE_OP_ALWAYS 1959091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim}; 1969091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 1970fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi// StencilOpStateUniqueRandomIterator 1980fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi 1990fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessiconst deUint32 StencilOpStateUniqueRandomIterator::s_stencilOpsLength = DE_LENGTH_OF_ARRAY(stencilOps); 2000fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessiconst deUint32 StencilOpStateUniqueRandomIterator::s_stencilOpsLength2 = s_stencilOpsLength * s_stencilOpsLength; 2010fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessiconst deUint32 StencilOpStateUniqueRandomIterator::s_stencilOpsLength3 = s_stencilOpsLength2 * s_stencilOpsLength; 2020fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessiconst deUint32 StencilOpStateUniqueRandomIterator::s_compareOpsLength = DE_LENGTH_OF_ARRAY(compareOps); 2030fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessiconst deUint32 StencilOpStateUniqueRandomIterator::s_totalStencilOpStates = s_stencilOpsLength3 * s_compareOpsLength; 2049091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 2059091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae KimStencilOpStateUniqueRandomIterator::StencilOpStateUniqueRandomIterator (int seed) 2060fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi : UniqueRandomIterator<VkStencilOpState>(s_totalStencilOpStates, s_totalStencilOpStates, seed) 2079091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{ 2089091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim} 2099091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 2109091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae KimVkStencilOpState StencilOpStateUniqueRandomIterator::getIndexedValue (deUint32 index) 2119091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{ 2120fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi const deUint32 stencilCompareOpIndex = index / s_stencilOpsLength3; 2130fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi const deUint32 stencilCompareOpSeqIndex = stencilCompareOpIndex * s_stencilOpsLength3; 2149091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 2150fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi const deUint32 stencilDepthFailOpIndex = (index - stencilCompareOpSeqIndex) / s_stencilOpsLength2; 2160fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi const deUint32 stencilDepthFailOpSeqIndex = stencilDepthFailOpIndex * s_stencilOpsLength2; 2179091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 2180fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi const deUint32 stencilPassOpIndex = (index - stencilCompareOpSeqIndex - stencilDepthFailOpSeqIndex) / s_stencilOpsLength; 2190fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi const deUint32 stencilPassOpSeqIndex = stencilPassOpIndex * s_stencilOpsLength; 2209091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 2219091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const deUint32 stencilFailOpIndex = index - stencilCompareOpSeqIndex - stencilDepthFailOpSeqIndex - stencilPassOpSeqIndex; 2229091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 2239091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkStencilOpState stencilOpState = 2249091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 2250fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi stencilOps[stencilFailOpIndex], // VkStencilOp failOp; 2260fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi stencilOps[stencilPassOpIndex], // VkStencilOp passOp; 2270fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi stencilOps[stencilDepthFailOpIndex], // VkStencilOp depthFailOp; 2280fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi compareOps[stencilCompareOpIndex], // VkCompareOp compareOp; 229120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0x0, // deUint32 compareMask; 230120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0x0, // deUint32 writeMask; 231120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0x0 // deUint32 reference; 2329091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 2339091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 2349091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim return stencilOpState; 2359091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim} 2369091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 2379091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 2389091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim// StencilTest 2399091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 2409091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimconst StencilTest::StencilStateConfig StencilTest::s_stencilStateConfigs[QUAD_COUNT] = 2419091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{ 2429091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim // frontReadMask frontWriteMask frontRef backReadMask backWriteMask backRef 2439091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 0xFF, 0xFF, 0xAB, 0xF0, 0xFF, 0xFF }, 2449091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 0xFF, 0xF0, 0xCD, 0xF0, 0xF0, 0xEF }, 2459091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 0xF0, 0x0F, 0xEF, 0xFF, 0x0F, 0xCD }, 2469091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 0xF0, 0x01, 0xFF, 0xFF, 0x01, 0xAB } 2479091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim}; 2489091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 2499091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimconst float StencilTest::s_quadDepths[QUAD_COUNT] = 2509091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{ 2519091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 0.1f, 2529091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 0.0f, 2539091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 0.3f, 2549091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 0.2f 2559091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim}; 2569091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 2579091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae KimStencilTest::StencilTest (tcu::TestContext& testContext, 2589091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const std::string& name, 2599091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const std::string& description, 2609091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VkFormat stencilFormat, 2619091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkStencilOpState& stencilOpStateFront, 2629091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkStencilOpState& stencilOpStateBack) 2639091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim : vkt::TestCase (testContext, name, description) 2649091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim , m_stencilFormat (stencilFormat) 2659091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim , m_stencilOpStateFront (stencilOpStateFront) 2669091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim , m_stencilOpStateBack (stencilOpStateBack) 2679091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{ 2689091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim} 2699091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 2709091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae KimStencilTest::~StencilTest (void) 2719091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{ 2729091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim} 2739091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 2749091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae KimTestInstance* StencilTest::createInstance (Context& context) const 2759091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{ 2769091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim return new StencilTestInstance(context, m_stencilFormat, m_stencilOpStateFront, m_stencilOpStateBack); 2779091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim} 2789091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 2799091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimvoid StencilTest::initPrograms (SourceCollections& sourceCollections) const 2809091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{ 2819091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim sourceCollections.glslSources.add("color_vert") << glu::VertexSource( 2829091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim "#version 310 es\n" 2839091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim "layout(location = 0) in vec4 position;\n" 2849091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim "layout(location = 1) in vec4 color;\n" 2859091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim "layout(location = 0) out highp vec4 vtxColor;\n" 2869091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim "void main (void)\n" 2879091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim "{\n" 2889091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim " gl_Position = position;\n" 2899091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim " vtxColor = color;\n" 2909091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim "}\n"); 2919091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 2929091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim sourceCollections.glslSources.add("color_frag") << glu::FragmentSource( 2939091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim "#version 310 es\n" 2949091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim "layout(location = 0) in highp vec4 vtxColor;\n" 2959091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim "layout(location = 0) out highp vec4 fragColor;\n" 2969091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim "void main (void)\n" 2979091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim "{\n" 2989091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim " fragColor = vtxColor;\n" 2999091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim "}\n"); 3009091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim} 3019091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 3029091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 3039091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim// StencilTestInstance 3049091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 3059091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae KimStencilTestInstance::StencilTestInstance (Context& context, 3069091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VkFormat stencilFormat, 3079091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkStencilOpState& stencilOpStateFront, 3089091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkStencilOpState& stencilOpStateBack) 3099091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim : vkt::TestInstance (context) 3109091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim , m_stencilOpStateFront (stencilOpStateFront) 3119091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim , m_stencilOpStateBack (stencilOpStateBack) 3129091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim , m_renderSize (32, 32) 3139091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim , m_colorFormat (VK_FORMAT_R8G8B8A8_UNORM) 3149091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim , m_stencilFormat (stencilFormat) 3159091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{ 316120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim const DeviceInterface& vk = context.getDeviceInterface(); 317120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim const VkDevice vkDevice = context.getDevice(); 318120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex(); 319120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim SimpleAllocator memAlloc (vk, vkDevice, getPhysicalDeviceMemoryProperties(context.getInstanceInterface(), context.getPhysicalDevice())); 320120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim const VkComponentMapping componentMappingRGBA = { VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A }; 3219091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 3229091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim // Create color image 3239091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 3249091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkImageCreateInfo colorImageParams = 3259091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 326120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, // VkStructureType sType; 327120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim DE_NULL, // const void* pNext; 328120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // VkImageCreateFlags flags; 329120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_IMAGE_TYPE_2D, // VkImageType imageType; 330120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim m_colorFormat, // VkFormat format; 331120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim { m_renderSize.x(), m_renderSize.y(), 1u }, // VkExtent3D extent; 332120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 1u, // deUint32 mipLevels; 333120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 1u, // deUint32 arrayLayers; 334120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits samples; 335120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_IMAGE_TILING_OPTIMAL, // VkImageTiling tiling; 336120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT, // VkImageUsageFlags usage; 337120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode; 338120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 1u, // deUint32 queueFamilyIndexCount; 339120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim &queueFamilyIndex, // const deUint32* pQueueFamilyIndices; 340120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_IMAGE_LAYOUT_UNDEFINED // VkImageLayout initialLayout; 3419091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 3429091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 3439091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim m_colorImageCreateInfo = colorImageParams; 3449091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim m_colorImage = createImage(vk, vkDevice, &m_colorImageCreateInfo); 3459091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 3469091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim // Allocate and bind color image memory 3479091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim m_colorImageAlloc = memAlloc.allocate(getImageMemoryRequirements(vk, vkDevice, *m_colorImage), MemoryRequirement::Any); 3489091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_CHECK(vk.bindImageMemory(vkDevice, *m_colorImage, m_colorImageAlloc->getMemory(), m_colorImageAlloc->getOffset())); 3499091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim } 3509091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 3519091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim // Create stencil image 3529091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 3539091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim // Check format support 3549091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim if (!isSupportedDepthStencilFormat(context.getInstanceInterface(), context.getPhysicalDevice(), m_stencilFormat)) 3559091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim throw tcu::NotSupportedError(std::string("Unsupported depth/stencil format: ") + getFormatName(m_stencilFormat)); 3569091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 3579091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkImageCreateInfo stencilImageParams = 3589091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 359120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, // VkStructureType sType; 360120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim DE_NULL, // const void* pNext; 361120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // VkImageCreateFlags flags; 362120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_IMAGE_TYPE_2D, // VkImageType imageType; 363120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim m_stencilFormat, // VkFormat format; 364120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim { m_renderSize.x(), m_renderSize.y(), 1u }, // VkExtent3D extent; 365120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 1u, // deUint32 mipLevels; 366120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 1u, // deUint32 arrayLayers; 367120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits samples; 368120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_IMAGE_TILING_OPTIMAL, // VkImageTiling tiling; 369120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, // VkImageUsageFlags usage; 370120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode; 371120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 1u, // deUint32 queueFamilyIndexCount; 372120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim &queueFamilyIndex, // const deUint32* pQueueFamilyIndices; 373120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_IMAGE_LAYOUT_UNDEFINED // VkImageLayout initialLayout; 3749091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 3759091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 3769091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim m_stencilImage = createImage(vk, vkDevice, &stencilImageParams); 3779091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 3789091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim // Allocate and bind stencil image memory 3799091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim m_stencilImageAlloc = memAlloc.allocate(getImageMemoryRequirements(vk, vkDevice, *m_stencilImage), MemoryRequirement::Any); 3809091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_CHECK(vk.bindImageMemory(vkDevice, *m_stencilImage, m_stencilImageAlloc->getMemory(), m_stencilImageAlloc->getOffset())); 3811d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski 3821d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski const VkImageAspectFlags aspect = (mapVkFormat(m_stencilFormat).order == tcu::TextureFormat::DS ? VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_DEPTH_BIT 3831d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski : VK_IMAGE_ASPECT_STENCIL_BIT); 3841d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski m_stencilImageSubresourceRange = makeImageSubresourceRange(aspect, 0u, stencilImageParams.mipLevels, 0u, stencilImageParams.arrayLayers); 3859091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim } 3869091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 3879091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim // Create color attachment view 3889091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 3899091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkImageViewCreateInfo colorAttachmentViewParams = 3909091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 391120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, // VkStructureType sType; 392120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim DE_NULL, // const void* pNext; 393120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // VkImageViewCreateFlags flags; 394120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim *m_colorImage, // VkImage image; 395120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_IMAGE_VIEW_TYPE_2D, // VkImageViewType viewType; 396120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim m_colorFormat, // VkFormat format; 397120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim componentMappingRGBA, // VkComponentMapping components; 398120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim { VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u } // VkImageSubresourceRange subresourceRange; 3999091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 4009091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 4019091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim m_colorAttachmentView = createImageView(vk, vkDevice, &colorAttachmentViewParams); 4029091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim } 4039091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 4049091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim // Create stencil attachment view 4059091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 4069091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkImageViewCreateInfo stencilAttachmentViewParams = 4079091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 408120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, // VkStructureType sType; 409120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim DE_NULL, // const void* pNext; 410120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // VkImageViewCreateFlags flags; 411120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim *m_stencilImage, // VkImage image; 412120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_IMAGE_VIEW_TYPE_2D, // VkImageViewType viewType; 413120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim m_stencilFormat, // VkFormat format; 414120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim componentMappingRGBA, // VkComponentMapping components; 4151d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski m_stencilImageSubresourceRange, // VkImageSubresourceRange subresourceRange; 4169091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 4179091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 4189091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim m_stencilAttachmentView = createImageView(vk, vkDevice, &stencilAttachmentViewParams); 4199091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim } 4209091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 4219091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim // Create render pass 4229091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 4239091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkAttachmentDescription colorAttachmentDescription = 4249091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 42594128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos 0u, // VkAttachmentDescriptionFlags flags; 4269091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim m_colorFormat, // VkFormat format; 427120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits samples; 4289091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_ATTACHMENT_LOAD_OP_CLEAR, // VkAttachmentLoadOp loadOp; 4299091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_ATTACHMENT_STORE_OP_STORE, // VkAttachmentStoreOp storeOp; 4309091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_ATTACHMENT_LOAD_OP_DONT_CARE, // VkAttachmentLoadOp stencilLoadOp; 4319091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_ATTACHMENT_STORE_OP_DONT_CARE, // VkAttachmentStoreOp stencilStoreOp; 4329091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // VkImageLayout initialLayout; 4339091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // VkImageLayout finalLayout; 4349091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 4359091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 4369091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkAttachmentDescription stencilAttachmentDescription = 4379091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 438120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // VkAttachmentDescriptionFlags flags; 4399091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim m_stencilFormat, // VkFormat format; 440120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits samples; 4419091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_ATTACHMENT_LOAD_OP_CLEAR, // VkAttachmentLoadOp loadOp; 4429091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_ATTACHMENT_STORE_OP_DONT_CARE, // VkAttachmentStoreOp storeOp; 4439091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_ATTACHMENT_LOAD_OP_CLEAR, // VkAttachmentLoadOp stencilLoadOp; 4449091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_ATTACHMENT_STORE_OP_DONT_CARE, // VkAttachmentStoreOp stencilStoreOp; 4459091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, // VkImageLayout initialLayout; 4469091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, // VkImageLayout finalLayout; 4479091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 4489091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 4499091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkAttachmentDescription attachments[2] = 4509091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 4519091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim colorAttachmentDescription, 4529091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim stencilAttachmentDescription 4539091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 4549091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 4559091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkAttachmentReference colorAttachmentReference = 4569091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 4579091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 0u, // deUint32 attachment; 4589091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL // VkImageLayout layout; 4599091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 4609091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 4619091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkAttachmentReference stencilAttachmentReference = 4629091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 4639091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 1u, // deUint32 attachment; 4649091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL // VkImageLayout layout; 4659091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 4669091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 4679091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkSubpassDescription subpassDescription = 4689091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 4699091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 0u, // VkSubpassDescriptionFlags flags; 470120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_PIPELINE_BIND_POINT_GRAPHICS, // VkPipelineBindPoint pipelineBindPoint; 471120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // deUint32 inputAttachmentCount; 4729091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim DE_NULL, // const VkAttachmentReference* pInputAttachments; 473120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 1u, // deUint32 colorAttachmentCount; 4749091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim &colorAttachmentReference, // const VkAttachmentReference* pColorAttachments; 475120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim DE_NULL, // const VkAttachmentReference* pResolveAttachments; 476120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim &stencilAttachmentReference, // const VkAttachmentReference* pDepthStencilAttachment; 477120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // deUint32 preserveAttachmentCount; 4789091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim DE_NULL // const VkAttachmentReference* pPreserveAttachments; 4799091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 4809091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 4819091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkRenderPassCreateInfo renderPassParams = 4829091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 4839091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, // VkStructureType sType; 4849091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim DE_NULL, // const void* pNext; 485120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // VkRenderPassCreateFlags flags; 4869091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 2u, // deUint32 attachmentCount; 4879091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim attachments, // const VkAttachmentDescription* pAttachments; 4889091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 1u, // deUint32 subpassCount; 4899091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim &subpassDescription, // const VkSubpassDescription* pSubpasses; 4909091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 0u, // deUint32 dependencyCount; 4919091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim DE_NULL // const VkSubpassDependency* pDependencies; 4929091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 4939091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 4949091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim m_renderPass = createRenderPass(vk, vkDevice, &renderPassParams); 4959091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim } 4969091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 4979091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim // Create framebuffer 4989091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 4999091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkImageView attachmentBindInfos[2] = { *m_colorAttachmentView, *m_stencilAttachmentView }; 5009091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 5019091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkFramebufferCreateInfo framebufferParams = 5029091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 503120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, // VkStructureType sType; 504120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim DE_NULL, // const void* pNext; 505120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // VkFramebufferCreateFlags flags; 506120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim *m_renderPass, // VkRenderPass renderPass; 507120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 2u, // deUint32 attachmentCount; 508120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim attachmentBindInfos, // const VkImageView* pAttachments; 509120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim (deUint32)m_renderSize.x(), // deUint32 width; 510120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim (deUint32)m_renderSize.y(), // deUint32 height; 511120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 1u // deUint32 layers; 5129091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 5139091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 5149091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim m_framebuffer = createFramebuffer(vk, vkDevice, &framebufferParams); 5159091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim } 5169091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 5179091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim // Create pipeline layout 5189091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 5199091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkPipelineLayoutCreateInfo pipelineLayoutParams = 5209091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 5219091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, // VkStructureType sType; 5229091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim DE_NULL, // const void* pNext; 523120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // VkPipelineLayoutCreateFlags flags; 524120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // deUint32 setLayoutCount; 5259091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim DE_NULL, // const VkDescriptorSetLayout* pSetLayouts; 5269091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 0u, // deUint32 pushConstantRangeCount; 5279091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim DE_NULL // const VkPushConstantRange* pPushConstantRanges; 5289091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 5299091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 5309091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim m_pipelineLayout = createPipelineLayout(vk, vkDevice, &pipelineLayoutParams); 5319091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim } 5329091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 533120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim m_vertexShaderModule = createShaderModule(vk, vkDevice, m_context.getBinaryCollection().get("color_vert"), 0); 534120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim m_fragmentShaderModule = createShaderModule(vk, vkDevice, m_context.getBinaryCollection().get("color_frag"), 0); 5359091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 5369091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim // Create pipeline 5379091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 538120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim const VkPipelineShaderStageCreateInfo shaderStages[2] = 5399091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 5409091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 541120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, // VkStructureType sType; 542120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim DE_NULL, // const void* pNext; 543120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // VkPipelineShaderStageCreateFlags flags; 544120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_SHADER_STAGE_VERTEX_BIT, // VkShaderStageFlagBits stage; 545120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim *m_vertexShaderModule, // VkShaderModule module; 546120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim "main", // const char* pName; 547120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim DE_NULL // const VkSpecializationInfo* pSpecializationInfo; 5489091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }, 5499091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 550120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, // VkStructureType sType; 551120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim DE_NULL, // const void* pNext; 552120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // VkPipelineShaderStageCreateFlags flags; 553120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_SHADER_STAGE_FRAGMENT_BIT, // VkShaderStageFlagBits stage; 554120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim *m_fragmentShaderModule, // VkShaderModule module; 555120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim "main", // const char* pName; 556120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim DE_NULL // const VkSpecializationInfo* pSpecializationInfo; 5579091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim } 5589091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 5599091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 5609091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkVertexInputBindingDescription vertexInputBindingDescription = 5619091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 5629091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 0u, // deUint32 binding; 5639091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim sizeof(Vertex4RGBA), // deUint32 strideInBytes; 564120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_VERTEX_INPUT_RATE_VERTEX // VkVertexInputStepRate inputRate; 5659091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 5669091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 5679091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkVertexInputAttributeDescription vertexInputAttributeDescriptions[2] = 5689091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 5699091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 5709091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 0u, // deUint32 location; 5719091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 0u, // deUint32 binding; 5729091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_FORMAT_R32G32B32A32_SFLOAT, // VkFormat format; 5739091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 0u // deUint32 offsetInBytes; 5749091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }, 5759091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 5769091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 1u, // deUint32 location; 5779091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 0u, // deUint32 binding; 5789091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_FORMAT_R32G32B32A32_SFLOAT, // VkFormat format; 5799091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim DE_OFFSET_OF(Vertex4RGBA, color), // deUint32 offsetInBytes; 5809091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim } 5819091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 5829091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 5839091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkPipelineVertexInputStateCreateInfo vertexInputStateParams = 5849091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 5859091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO, // VkStructureType sType; 5869091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim DE_NULL, // const void* pNext; 587120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // VkPipelineVertexInputStateCreateFlags flags; 588120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 1u, // deUint32 vertexBindingDescriptionCount; 5899091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim &vertexInputBindingDescription, // const VkVertexInputBindingDescription* pVertexBindingDescriptions; 590120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 2u, // deUint32 vertexAttributeDescriptionCount; 5919091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim vertexInputAttributeDescriptions // const VkVertexInputAttributeDescription* pVertexAttributeDescriptions; 5929091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 5939091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 5949091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkPipelineInputAssemblyStateCreateInfo inputAssemblyStateParams = 5959091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 596120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, // VkStructureType sType; 597120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim DE_NULL, // const void* pNext; 598120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // VkPipelineInputAssemblyStateCreateFlags flags; 599120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, // VkPrimitiveTopology topology; 600120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim false // VkBool32 primitiveRestartEnable; 6019091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 6029091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 6039091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkViewport viewport = 6049091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 605120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0.0f, // float x; 606120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0.0f, // float y; 6079091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim (float)m_renderSize.x(), // float width; 6089091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim (float)m_renderSize.y(), // float height; 6099091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 0.0f, // float minDepth; 6109091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 1.0f // float maxDepth; 6119091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 6129091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 6139091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkRect2D scissor = { { 0, 0 }, { m_renderSize.x(), m_renderSize.y() } }; 6149091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 6159091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkPipelineViewportStateCreateInfo viewportStateParams = 6169091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 617120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO, // VkStructureType sType; 618120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim DE_NULL, // const void* pNext; 619120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // VkPipelineViewportStateCreateFlags flags; 620120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 1u, // deUint32 viewportCount; 621120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim &viewport, // const VkViewport* pViewports; 622120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 1u, // deUint32 scissorCount; 623120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim &scissor, // const VkRect2D* pScissors; 6249091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 6259091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 626120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim const VkPipelineRasterizationStateCreateInfo rasterStateParams = 6279091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 628120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO, // VkStructureType sType; 629120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim DE_NULL, // const void* pNext; 630120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // VkPipelineRasterizationStateCreateFlags flags; 631120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim false, // VkBool32 depthClampEnable; 632120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim false, // VkBool32 rasterizerDiscardEnable; 633120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_POLYGON_MODE_FILL, // VkPolygonMode polygonMode; 634120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_CULL_MODE_NONE, // VkCullModeFlags cullMode; 635120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_FRONT_FACE_COUNTER_CLOCKWISE, // VkFrontFace frontFace; 636120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim false, // VkBool32 depthBiasEnable; 637120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0.0f, // float depthBiasConstantFactor; 638120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0.0f, // float depthBiasClamp; 639120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0.0f, // float depthBiasSlopeFactor; 640120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 1.0f // float lineWidth; 6419091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 6429091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 6439091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkPipelineColorBlendAttachmentState colorBlendAttachmentState = 6449091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 645120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim false, // VkBool32 blendEnable; 646120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_BLEND_FACTOR_ONE, // VkBlendFactor srcColorBlendFactor; 647120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_BLEND_FACTOR_ZERO, // VkBlendFactor dstColorBlendFactor; 648120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_BLEND_OP_ADD, // VkBlendOp colorBlendOp; 649120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_BLEND_FACTOR_ONE, // VKBLENDFACTOR SRCALPHABLENDFACTOR; 650120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_BLEND_FACTOR_ZERO, // VkBlendFactor dstAlphaBlendFactor; 651120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_BLEND_OP_ADD, // VkBlendOp alphaBlendOp; 652120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | // VkColorComponentFlags colorWriteMask; 653120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT 6549091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 6559091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 6569091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkPipelineColorBlendStateCreateInfo colorBlendStateParams = 6579091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 6589091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO, // VkStructureType sType; 6599091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim DE_NULL, // const void* pNext; 660120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // VkPipelineColorBlendStateCreateFlags flags; 6619091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim false, // VkBool32 logicOpEnable; 6629091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_LOGIC_OP_COPY, // VkLogicOp logicOp; 6639091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 1u, // deUint32 attachmentCount; 6649091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim &colorBlendAttachmentState, // const VkPipelineColorBlendAttachmentState* pAttachments; 665120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim { 0.0f, 0.0f, 0.0f, 0.0f } // float blendConstants[4]; 6669091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 6679091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 6689091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkPipelineMultisampleStateCreateInfo multisampleStateParams = 6699091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 670120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO, // VkStructureType sType; 671120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim DE_NULL, // const void* pNext; 672120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // VkPipelineMultisampleStateCreateFlags flags; 673120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits rasterizationSamples; 674120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim false, // VkBool32 sampleShadingEnable; 675120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0.0f, // float minSampleShading; 676120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim DE_NULL, // const VkSampleMask* pSampleMask; 677120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim false, // VkBool32 alphaToCoverageEnable; 678120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim false // VkBool32 alphaToOneEnable; 6799091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 6809091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 6819091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const bool isDepthEnabled = (vk::mapVkFormat(m_stencilFormat).order != tcu::TextureFormat::S); 6829091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 6839091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VkPipelineDepthStencilStateCreateInfo depthStencilStateParams = 6849091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 685120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO, // VkStructureType sType; 686120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim DE_NULL, // const void* pNext; 687120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // VkPipelineDepthStencilStateCreateFlags flags; 688120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim isDepthEnabled, // VkBool32 depthTestEnable; 689120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim isDepthEnabled, // VkBool32 depthWriteEnable; 690120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_COMPARE_OP_LESS, // VkCompareOp depthCompareOp; 691120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim false, // VkBool32 depthBoundsTestEnable; 692120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim true, // VkBool32 stencilTestEnable; 693120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim m_stencilOpStateFront, // VkStencilOpState front; 694120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim m_stencilOpStateBack, // VkStencilOpState back; 6951d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski 0.0f, // float minDepthBounds; 6961d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski 1.0f // float maxDepthBounds; 6979091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 6989091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 6999091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkGraphicsPipelineCreateInfo graphicsPipelineParams = 7009091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 7019091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO, // VkStructureType sType; 7029091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim DE_NULL, // const void* pNext; 703120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // VkPipelineCreateFlags flags; 7049091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 2u, // deUint32 stageCount; 705120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim shaderStages, // const VkPipelineShaderStageCreateInfo* pStages; 7069091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim &vertexInputStateParams, // const VkPipelineVertexInputStateCreateInfo* pVertexInputState; 7079091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim &inputAssemblyStateParams, // const VkPipelineInputAssemblyStateCreateInfo* pInputAssemblyState; 7089091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim DE_NULL, // const VkPipelineTessellationStateCreateInfo* pTessellationState; 7099091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim &viewportStateParams, // const VkPipelineViewportStateCreateInfo* pViewportState; 710120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim &rasterStateParams, // const VkPipelineRasterizationStateCreateInfo* pRasterizationState; 7119091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim &multisampleStateParams, // const VkPipelineMultisampleStateCreateInfo* pMultisampleState; 7129091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim &depthStencilStateParams, // const VkPipelineDepthStencilStateCreateInfo* pDepthStencilState; 7139091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim &colorBlendStateParams, // const VkPipelineColorBlendStateCreateInfo* pColorBlendState; 71486a8ae9e0d61bbfe1f1e273fdbb026369bdb5f29Pyry Haulos (const VkPipelineDynamicStateCreateInfo*)DE_NULL, // const VkPipelineDynamicStateCreateInfo* pDynamicState; 7159091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim *m_pipelineLayout, // VkPipelineLayout layout; 7169091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim *m_renderPass, // VkRenderPass renderPass; 7179091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 0u, // deUint32 subpass; 7189091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 0u, // VkPipeline basePipelineHandle; 7199091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 0u // deInt32 basePipelineIndex; 7209091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 7219091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 7229091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim // Setup different stencil masks and refs in each quad 7239091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim for (int quadNdx = 0; quadNdx < StencilTest::QUAD_COUNT; quadNdx++) 7249091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 7259091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const StencilTest::StencilStateConfig& config = StencilTest::s_stencilStateConfigs[quadNdx]; 7269091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VkStencilOpState& front = depthStencilStateParams.front; 7279091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VkStencilOpState& back = depthStencilStateParams.back; 7289091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 729120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim front.compareMask = config.frontReadMask; 730120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim front.writeMask = config.frontWriteMask; 731120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim front.reference = config.frontRef; 7329091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 733120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim back.compareMask = config.backReadMask; 734120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim back.writeMask = config.backWriteMask; 735120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim back.reference = config.backRef; 7369091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 7379091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim m_graphicsPipelines[quadNdx] = createGraphicsPipeline(vk, vkDevice, DE_NULL, &graphicsPipelineParams); 7389091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim } 7399091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim } 7409091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 7419091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 7429091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim // Create vertex buffer 7439091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 7449091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkBufferCreateInfo vertexBufferParams = 7459091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 7469091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, // VkStructureType sType; 7479091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim DE_NULL, // const void* pNext; 748120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // VkBufferCreateFlags flags; 7499091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 1024u, // VkDeviceSize size; 7509091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, // VkBufferUsageFlags usage; 7519091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode; 752120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 1u, // deUint32 queueFamilyIndexCount; 7539091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim &queueFamilyIndex // const deUint32* pQueueFamilyIndices; 7549091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 7559091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 7569091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim m_vertices = createOverlappingQuads(); 7579091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim m_vertexBuffer = createBuffer(vk, vkDevice, &vertexBufferParams); 7589091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim m_vertexBufferAlloc = memAlloc.allocate(getBufferMemoryRequirements(vk, vkDevice, *m_vertexBuffer), MemoryRequirement::HostVisible); 7599091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 7609091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_CHECK(vk.bindBufferMemory(vkDevice, *m_vertexBuffer, m_vertexBufferAlloc->getMemory(), m_vertexBufferAlloc->getOffset())); 7619091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 7629091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim // Adjust depths 7639091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim for (int quadNdx = 0; quadNdx < 4; quadNdx++) 7649091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim for (int vertexNdx = 0; vertexNdx < 6; vertexNdx++) 7659091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim m_vertices[quadNdx * 6 + vertexNdx].position.z() = StencilTest::s_quadDepths[quadNdx]; 7669091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 7679091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim // Load vertices into vertex buffer 7689091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim deMemcpy(m_vertexBufferAlloc->getHostPtr(), m_vertices.data(), m_vertices.size() * sizeof(Vertex4RGBA)); 7699091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 7709091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkMappedMemoryRange flushRange = 7719091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 7729091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE, // VkStructureType sType; 7739091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim DE_NULL, // const void* pNext; 774120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim m_vertexBufferAlloc->getMemory(), // VkDeviceMemory memory; 7759091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim m_vertexBufferAlloc->getOffset(), // VkDeviceSize offset; 7769091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim vertexBufferParams.size // VkDeviceSize size; 7779091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 7789091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 7799091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim vk.flushMappedMemoryRanges(vkDevice, 1, &flushRange); 7809091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim } 7819091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 7829091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim // Create command pool 783da03200a87f51bed33b3c3030ecbb6df06ff4f60Mika Isojärvi m_cmdPool = createCommandPool(vk, vkDevice, VK_COMMAND_POOL_CREATE_TRANSIENT_BIT, queueFamilyIndex); 7849091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 7859091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim // Create command buffer 7869091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 787120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim const VkCommandBufferBeginInfo cmdBufferBeginInfo = 7889091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 789120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // VkStructureType sType; 790120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim DE_NULL, // const void* pNext; 791120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // VkCommandBufferUsageFlags flags; 792689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (const VkCommandBufferInheritanceInfo*)DE_NULL, 7939091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 7949091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 7959091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkClearValue attachmentClearValues[2] = 7969091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 7979091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim defaultClearValue(m_colorFormat), 7989091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim defaultClearValue(m_stencilFormat) 7999091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 8009091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 8019091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkRenderPassBeginInfo renderPassBeginInfo = 8029091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 8039091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, // VkStructureType sType; 8049091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim DE_NULL, // const void* pNext; 8059091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim *m_renderPass, // VkRenderPass renderPass; 8069091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim *m_framebuffer, // VkFramebuffer framebuffer; 8079091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { { 0, 0 } , { m_renderSize.x(), m_renderSize.y() } }, // VkRect2D renderArea; 8089091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 2, // deUint32 clearValueCount; 8099091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim attachmentClearValues // const VkClearValue* pClearValues; 8109091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 8119091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 8121d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski const VkImageMemoryBarrier imageLayoutBarriers[] = 8131d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski { 8141d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski // color image layout transition 8151d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski { 8161d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // VkStructureType sType; 8171d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski DE_NULL, // const void* pNext; 8181d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski (VkAccessFlags)0, // VkAccessFlags srcAccessMask; 8191d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, // VkAccessFlags dstAccessMask; 8201d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout oldLayout; 8211d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // VkImageLayout newLayout; 8221d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski VK_QUEUE_FAMILY_IGNORED, // uint32_t srcQueueFamilyIndex; 8231d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski VK_QUEUE_FAMILY_IGNORED, // uint32_t dstQueueFamilyIndex; 8241d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski *m_colorImage, // VkImage image; 8251d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski { VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u } // VkImageSubresourceRange subresourceRange; 8261d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski }, 8271d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski // stencil image layout transition 8281d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski { 8291d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // VkStructureType sType; 8301d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski DE_NULL, // const void* pNext; 8311d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski (VkAccessFlags)0, // VkAccessFlags srcAccessMask; 8321d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT, // VkAccessFlags dstAccessMask; 8331d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout oldLayout; 8341d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, // VkImageLayout newLayout; 8351d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski VK_QUEUE_FAMILY_IGNORED, // uint32_t srcQueueFamilyIndex; 8361d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski VK_QUEUE_FAMILY_IGNORED, // uint32_t dstQueueFamilyIndex; 8371d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski *m_stencilImage, // VkImage image; 8381d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski m_stencilImageSubresourceRange, // VkImageSubresourceRange subresourceRange; 8391d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski }, 8401d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski }; 8411d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski 842da03200a87f51bed33b3c3030ecbb6df06ff4f60Mika Isojärvi m_cmdBuffer = allocateCommandBuffer(vk, vkDevice, *m_cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY); 8439091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 8449091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_CHECK(vk.beginCommandBuffer(*m_cmdBuffer, &cmdBufferBeginInfo)); 8451d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski 8461d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski vk.cmdPipelineBarrier(*m_cmdBuffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, (VkDependencyFlags)0, 8471d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski 0u, DE_NULL, 0u, DE_NULL, DE_LENGTH_OF_ARRAY(imageLayoutBarriers), imageLayoutBarriers); 8481d3585c5ec71cf90d6519913db6a01ef2c0f840cMaciej Jesionowski 849120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim vk.cmdBeginRenderPass(*m_cmdBuffer, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE); 8509091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 8519091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkDeviceSize quadOffset = (m_vertices.size() / StencilTest::QUAD_COUNT) * sizeof(Vertex4RGBA); 8529091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 8539091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim for (int quadNdx = 0; quadNdx < StencilTest::QUAD_COUNT; quadNdx++) 8549091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 8559091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VkDeviceSize vertexBufferOffset = quadOffset * quadNdx; 8569091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 8579091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim vk.cmdBindPipeline(*m_cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *m_graphicsPipelines[quadNdx]); 8589091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim vk.cmdBindVertexBuffers(*m_cmdBuffer, 0, 1, &m_vertexBuffer.get(), &vertexBufferOffset); 8599091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim vk.cmdDraw(*m_cmdBuffer, (deUint32)(m_vertices.size() / StencilTest::QUAD_COUNT), 1, 0, 0); 8609091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim } 8619091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 8629091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim vk.cmdEndRenderPass(*m_cmdBuffer); 8639091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer)); 8649091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim } 8659091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 8669091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim // Create fence 867da03200a87f51bed33b3c3030ecbb6df06ff4f60Mika Isojärvi m_fence = createFence(vk, vkDevice); 8689091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim} 8699091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 8709091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae KimStencilTestInstance::~StencilTestInstance (void) 8719091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{ 8729091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim} 8739091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 8749091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimtcu::TestStatus StencilTestInstance::iterate (void) 8759091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{ 8769091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const DeviceInterface& vk = m_context.getDeviceInterface(); 8779091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkDevice vkDevice = m_context.getDevice(); 8789091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkQueue queue = m_context.getUniversalQueue(); 879120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim const VkSubmitInfo submitInfo = 880120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim { 881120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_STRUCTURE_TYPE_SUBMIT_INFO, // VkStructureType sType; 882120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim DE_NULL, // const void* pNext; 883120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // deUint32 waitSemaphoreCount; 884120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim DE_NULL, // const VkSemaphore* pWaitSemaphores; 885689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (const VkPipelineStageFlags*)DE_NULL, 886120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 1u, // deUint32 commandBufferCount; 887120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim &m_cmdBuffer.get(), // const VkCommandBuffer* pCommandBuffers; 888120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim 0u, // deUint32 signalSemaphoreCount; 889120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim DE_NULL // const VkSemaphore* pSignalSemaphores; 890120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim }; 8919091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 8929091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_CHECK(vk.resetFences(vkDevice, 1, &m_fence.get())); 893120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim VK_CHECK(vk.queueSubmit(queue, 1, &submitInfo, *m_fence)); 8949091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_CHECK(vk.waitForFences(vkDevice, 1, &m_fence.get(), true, ~(0ull) /* infinity*/)); 8959091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 8969091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim return verifyImage(); 8979091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim} 8989091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 8999091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimtcu::TestStatus StencilTestInstance::verifyImage (void) 9009091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{ 9019091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const tcu::TextureFormat tcuColorFormat = mapVkFormat(m_colorFormat); 9029091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const tcu::TextureFormat tcuStencilFormat = mapVkFormat(m_stencilFormat); 9039091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const ColorVertexShader vertexShader; 9049091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const ColorFragmentShader fragmentShader (tcuColorFormat, tcuStencilFormat); 9059091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const rr::Program program (&vertexShader, &fragmentShader); 9069091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim ReferenceRenderer refRenderer (m_renderSize.x(), m_renderSize.y(), 1, tcuColorFormat, tcuStencilFormat, &program); 9079091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim bool compareOk = false; 9089091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 9099091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim // Render reference image 9109091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 9119091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim // Set depth state 9129091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim rr::RenderState renderState(refRenderer.getViewportState()); 9139091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 9149091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim renderState.fragOps.depthTestEnabled = true; 9159091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim renderState.fragOps.depthFunc = mapVkCompareOp(VK_COMPARE_OP_LESS); 9169091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim renderState.fragOps.stencilTestEnabled = true; 9179091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 9189091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim rr::StencilState& refStencilFront = renderState.fragOps.stencilStates[rr::FACETYPE_FRONT]; 9199091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim rr::StencilState& refStencilBack = renderState.fragOps.stencilStates[rr::FACETYPE_BACK]; 9209091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 921120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim refStencilFront.sFail = mapVkStencilOp(m_stencilOpStateFront.failOp); 922120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim refStencilFront.dpFail = mapVkStencilOp(m_stencilOpStateFront.depthFailOp); 923120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim refStencilFront.dpPass = mapVkStencilOp(m_stencilOpStateFront.passOp); 924120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim refStencilFront.func = mapVkCompareOp(m_stencilOpStateFront.compareOp); 9259091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 926120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim refStencilBack.sFail = mapVkStencilOp(m_stencilOpStateBack.failOp); 927120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim refStencilBack.dpPass = mapVkStencilOp(m_stencilOpStateBack.passOp); 9280fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi refStencilBack.dpFail = mapVkStencilOp(m_stencilOpStateBack.depthFailOp); 929120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim refStencilBack.func = mapVkCompareOp(m_stencilOpStateBack.compareOp); 9309091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 9319091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim // Reverse winding of vertices, as Vulkan screen coordinates start at upper left 9329091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim std::vector<Vertex4RGBA> cwVertices(m_vertices); 9339091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim for (size_t vertexNdx = 0; vertexNdx < cwVertices.size() - 2; vertexNdx += 3) 9349091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 9359091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const Vertex4RGBA cwVertex1 = cwVertices[vertexNdx + 1]; 9369091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 9379091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim cwVertices[vertexNdx + 1] = cwVertices[vertexNdx + 2]; 9389091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim cwVertices[vertexNdx + 2] = cwVertex1; 9399091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim } 9409091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 9419091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim for (int quadNdx = 0; quadNdx < StencilTest::QUAD_COUNT; quadNdx++) 9429091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 9439091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim refStencilFront.ref = (int)StencilTest::s_stencilStateConfigs[quadNdx].frontRef; 9449091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim refStencilFront.compMask = StencilTest::s_stencilStateConfigs[quadNdx].frontReadMask; 9459091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim refStencilFront.writeMask = StencilTest::s_stencilStateConfigs[quadNdx].frontWriteMask; 9469091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 9479091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim refStencilBack.ref = (int)StencilTest::s_stencilStateConfigs[quadNdx].backRef; 9489091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim refStencilBack.compMask = StencilTest::s_stencilStateConfigs[quadNdx].backReadMask; 9499091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim refStencilBack.writeMask = StencilTest::s_stencilStateConfigs[quadNdx].backWriteMask; 9509091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 9519091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim refRenderer.draw(renderState, 9529091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim rr::PRIMITIVETYPE_TRIANGLES, 9539091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim std::vector<Vertex4RGBA>(cwVertices.begin() + quadNdx * 6, 9549091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim cwVertices.begin() + (quadNdx + 1) * 6)); 9559091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim } 9569091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim } 9579091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 9589091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim // Compare result with reference image 9599091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 9609091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const DeviceInterface& vk = m_context.getDeviceInterface(); 9619091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkDevice vkDevice = m_context.getDevice(); 9629091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkQueue queue = m_context.getUniversalQueue(); 9639091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const deUint32 queueFamilyIndex = m_context.getUniversalQueueFamilyIndex(); 9649091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim SimpleAllocator allocator (vk, vkDevice, getPhysicalDeviceMemoryProperties(m_context.getInstanceInterface(), m_context.getPhysicalDevice())); 9659091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim de::UniquePtr<tcu::TextureLevel> result (readColorAttachment(vk, vkDevice, queue, queueFamilyIndex, allocator, *m_colorImage, m_colorFormat, m_renderSize).release()); 9669091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 9679091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim compareOk = tcu::intThresholdPositionDeviationCompare(m_context.getTestContext().getLog(), 9689091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim "IntImageCompare", 9699091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim "Image comparison", 9709091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim refRenderer.getAccess(), 9719091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim result->getAccess(), 9729091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim tcu::UVec4(2, 2, 2, 2), 9739091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim tcu::IVec3(1, 1, 0), 9749091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim true, 9759091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim tcu::COMPARE_LOG_RESULT); 9769091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim } 9779091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 9789091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim if (compareOk) 9799091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim return tcu::TestStatus::pass("Result image matches reference"); 9809091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim else 9819091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim return tcu::TestStatus::fail("Image mismatch"); 9829091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim} 9839091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 9849091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 9859091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim// Utilities for test names 9869091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 9879091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimstd::string getShortName (VkCompareOp compareOp) 9889091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{ 9899091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const std::string fullName = getCompareOpName(compareOp); 9909091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 9919091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim DE_ASSERT(de::beginsWith(fullName, "VK_COMPARE_OP_")); 9929091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 9939091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim return de::toLower(fullName.substr(14)); 9949091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim} 9959091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 9969091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimconst char* getShortName (VkStencilOp stencilOp) 9979091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{ 9989091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim switch (stencilOp) 9999091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 1000120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_STENCIL_OP_KEEP: return "keep"; 1001120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_STENCIL_OP_ZERO: return "zero"; 1002120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_STENCIL_OP_REPLACE: return "repl"; 1003120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_STENCIL_OP_INCREMENT_AND_CLAMP: return "incc"; 1004120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_STENCIL_OP_DECREMENT_AND_CLAMP: return "decc"; 1005120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_STENCIL_OP_INVERT: return "inv"; 1006120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_STENCIL_OP_INCREMENT_AND_WRAP: return "wrap"; 1007120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim case VK_STENCIL_OP_DECREMENT_AND_WRAP: return "decw"; 10089091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 10099091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim default: 10109091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim DE_FATAL("Invalid VkStencilOpState value"); 10119091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim } 10129091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim return DE_NULL; 10139091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim} 10149091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 10159091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimstd::string getStencilStateSetDescription(const VkStencilOpState& stencilOpStateFront, 10169091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkStencilOpState& stencilOpStateBack) 10179091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{ 10189091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim std::ostringstream desc; 10199091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 10209091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim desc << "\nFront faces:\n" << stencilOpStateFront; 10219091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim desc << "Back faces:\n" << stencilOpStateBack; 10229091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 10239091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim return desc.str(); 10249091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim} 10259091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 10269091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimstd::string getFormatCaseName (VkFormat format) 10279091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{ 10289091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const std::string fullName = getFormatName(format); 10299091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 10309091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim DE_ASSERT(de::beginsWith(fullName, "VK_FORMAT_")); 10319091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 10329091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim return de::toLower(fullName.substr(10)); 10339091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim} 10349091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 10359091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim} // anonymous 10369091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 10379091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kimtcu::TestCaseGroup* createStencilTests (tcu::TestContext& testCtx) 10389091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim{ 10399091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkFormat stencilFormats[] = 10409091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 10419091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_FORMAT_S8_UINT, 10429091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_FORMAT_D16_UNORM_S8_UINT, 10439091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_FORMAT_D24_UNORM_S8_UINT, 10449091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim VK_FORMAT_D32_SFLOAT_S8_UINT 10459091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim }; 10469091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 10479091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim de::MovePtr<tcu::TestCaseGroup> stencilTests (new tcu::TestCaseGroup(testCtx, "stencil", "Stencil tests")); 10489091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim de::MovePtr<tcu::TestCaseGroup> formatTests (new tcu::TestCaseGroup(testCtx, "format", "Uses different stencil formats")); 10499091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim StencilOpStateUniqueRandomIterator stencilOpItr (123); 10509091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 10519091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim for (size_t formatNdx = 0; formatNdx < DE_LENGTH_OF_ARRAY(stencilFormats); formatNdx++) 10529091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 10539091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const VkFormat stencilFormat = stencilFormats[formatNdx]; 10549091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim de::MovePtr<tcu::TestCaseGroup> formatTest (new tcu::TestCaseGroup(testCtx, 10559091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim getFormatCaseName(stencilFormat).c_str(), 10569091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim (std::string("Uses format ") + getFormatName(stencilFormat)).c_str())); 10579091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 10589091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim de::MovePtr<tcu::TestCaseGroup> stencilStateTests; 10599091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 10609091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim std::ostringstream desc; 10619091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim desc << "Draws 4 quads with the following depths and dynamic stencil states: "; 10629091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim for (int quadNdx = 0; quadNdx < StencilTest::QUAD_COUNT; quadNdx++) 10639091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 10649091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim const StencilTest::StencilStateConfig& stencilConfig = StencilTest::s_stencilStateConfigs[quadNdx]; 10659091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 10669091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim desc << "(" << quadNdx << ") " 10679091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim << "z = " << StencilTest::s_quadDepths[quadNdx] << ", " 10689091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim << "frontReadMask = " << stencilConfig.frontReadMask << ", " 10699091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim << "frontWriteMask = " << stencilConfig.frontWriteMask << ", " 10709091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim << "frontRef = " << stencilConfig.frontRef << ", " 10719091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim << "backReadMask = " << stencilConfig.backReadMask << ", " 10729091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim << "backWriteMask = " << stencilConfig.backWriteMask << ", " 10739091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim << "backRef = " << stencilConfig.backRef; 10749091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim } 10759091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 10769091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim stencilStateTests = de::MovePtr<tcu::TestCaseGroup>(new tcu::TestCaseGroup(testCtx, "states", desc.str().c_str())); 10779091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim } 10789091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 10799091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim stencilOpItr.reset(); 10809091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 10810fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi for (deUint32 failOpNdx = 0u; failOpNdx < DE_LENGTH_OF_ARRAY(stencilOps); failOpNdx++) 10829091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim { 10830fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi const std::string failOpName = std::string("fail_") + getShortName(stencilOps[failOpNdx]); 10840fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi de::MovePtr<tcu::TestCaseGroup> failOpTest (new tcu::TestCaseGroup(testCtx, failOpName.c_str(), "")); 10859091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 10860fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi for (deUint32 passOpNdx = 0u; passOpNdx < DE_LENGTH_OF_ARRAY(stencilOps); passOpNdx++) 10870fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi { 10880fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi const std::string passOpName = std::string("pass_") + getShortName(stencilOps[passOpNdx]); 10890fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi de::MovePtr<tcu::TestCaseGroup> passOpTest (new tcu::TestCaseGroup(testCtx, passOpName.c_str(), "")); 10900fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi 10910fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi for (deUint32 dFailOpNdx = 0u; dFailOpNdx < DE_LENGTH_OF_ARRAY(stencilOps); dFailOpNdx++) 10920fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi { 10930fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi const std::string dFailOpName = std::string("dfail_") + getShortName(stencilOps[dFailOpNdx]); 10940fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi de::MovePtr<tcu::TestCaseGroup> dFailOpTest (new tcu::TestCaseGroup(testCtx, dFailOpName.c_str(), "")); 10950fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi 10960fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi for (deUint32 compareOpNdx = 0u; compareOpNdx < DE_LENGTH_OF_ARRAY(compareOps); compareOpNdx++) 10970fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi { 10980fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi // Iterate front set of stencil state in ascending order 10990fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi const VkStencilOpState stencilStateFront = 11000fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi { 11010fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi stencilOps[failOpNdx], // failOp 11020fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi stencilOps[passOpNdx], // passOp 11030fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi stencilOps[dFailOpNdx], // depthFailOp 11040fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi compareOps[compareOpNdx], // compareOp 11050fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi 0x0, // compareMask 11060fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi 0x0, // writeMask 11070fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi 0x0 // reference 11080fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi }; 11090fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi 11100fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi // Iterate back set of stencil state in random order 11110fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi const VkStencilOpState stencilStateBack = stencilOpItr.next(); 11120fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi const std::string caseName = std::string("comp_") + getShortName(compareOps[compareOpNdx]); 11130fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi const std::string caseDesc = getStencilStateSetDescription(stencilStateFront, stencilStateBack); 11140fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi 11150fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi dFailOpTest->addChild(new StencilTest(testCtx, caseName, caseDesc, stencilFormat, stencilStateFront, stencilStateBack)); 11160fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi } 11170fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi passOpTest->addChild(dFailOpTest.release()); 11180fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi } 11190fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi failOpTest->addChild(passOpTest.release()); 11200fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi } 11210fe7f04e2aefb289e052e82f71ab8d2a1f41dd76Paavo Pessi stencilStateTests->addChild(failOpTest.release()); 11229091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim } 11239091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 11249091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim formatTest->addChild(stencilStateTests.release()); 11259091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim formatTests->addChild(formatTest.release()); 11269091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim } 11279091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim stencilTests->addChild(formatTests.release()); 11289091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 11299091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim return stencilTests.release(); 11309091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim} 11319091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim 11329091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim} // pipeline 11339091e6865c1dff4d5fa0b5345c0d9f1cb080aab1Dae Kim} // vkt 1134