1f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal/*------------------------------------------------------------------------ 23c17bc60af5c131488c834c64851a00449e4ef59Peter Gal * Vulkan Conformance Tests 33c17bc60af5c131488c834c64851a00449e4ef59Peter Gal * ------------------------ 43c17bc60af5c131488c834c64851a00449e4ef59Peter Gal * 5f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal * Copyright (c) 2015 The Khronos Group Inc. 6f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal * Copyright (c) 2015 Samsung Electronics Co., Ltd. 7c05b7f1437e619205c96eaa31c0b79ec97a0d47dPyry Haulos * Copyright (c) 2016 The Android Open Source Project 8f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal * 9978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * Licensed under the Apache License, Version 2.0 (the "License"); 10978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * you may not use this file except in compliance with the License. 11978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * You may obtain a copy of the License at 12f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal * 13978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * http://www.apache.org/licenses/LICENSE-2.0 14f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal * 15978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * Unless required by applicable law or agreed to in writing, software 16978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * distributed under the License is distributed on an "AS IS" BASIS, 17978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 18978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * See the License for the specific language governing permissions and 19978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * limitations under the License. 20f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal * 21f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal *//*! 22f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal * \file 23f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal * \brief Vulkan ShaderRenderCase 24f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal *//*--------------------------------------------------------------------*/ 25f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal 26c5a432af8404a1620230c8b0f31bc9a469196726Peter Gal#include "vktShaderRender.hpp" 27f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal 28e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal#include "tcuImageCompare.hpp" 29baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal#include "tcuImageIO.hpp" 30f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal#include "tcuTestLog.hpp" 31ee06c6e532c43240a33f7f75e4762af6e179421aPeter Gal#include "tcuTextureUtil.hpp" 328e402b8483bcea7ffdd8d3f75569fc8f98a7be4aPeter Gal#include "tcuSurface.hpp" 338e402b8483bcea7ffdd8d3f75569fc8f98a7be4aPeter Gal#include "tcuVector.hpp" 34f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal 35baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal#include "deFilePath.hpp" 368e402b8483bcea7ffdd8d3f75569fc8f98a7be4aPeter Gal#include "deMath.h" 378bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal#include "deUniquePtr.hpp" 388bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal 398e402b8483bcea7ffdd8d3f75569fc8f98a7be4aPeter Gal#include "vkDeviceUtil.hpp" 408e402b8483bcea7ffdd8d3f75569fc8f98a7be4aPeter Gal#include "vkImageUtil.hpp" 418bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal#include "vkPlatform.hpp" 428e402b8483bcea7ffdd8d3f75569fc8f98a7be4aPeter Gal#include "vkQueryUtil.hpp" 438bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal#include "vkRef.hpp" 448bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal#include "vkRefUtil.hpp" 458e402b8483bcea7ffdd8d3f75569fc8f98a7be4aPeter Gal#include "vkStrUtil.hpp" 46e8849a85b21e64ece65abc17248f01a9591784fePyry Haulos#include "vkTypeUtil.hpp" 478bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal 48f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal#include <vector> 49f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal#include <string> 50f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal 51f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Galnamespace vkt 52f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal{ 53c5a432af8404a1620230c8b0f31bc9a469196726Peter Galnamespace sr 54f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal{ 55f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal 568bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Galusing namespace vk; 57e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal 58e9cfcc2d64981354e86833e6e7d4063267ce786cPeter Galnamespace 59e9cfcc2d64981354e86833e6e7d4063267ce786cPeter Gal{ 60e9cfcc2d64981354e86833e6e7d4063267ce786cPeter Gal 61689c095f881a410da6a315795452a8e00ad95a9dPyry Haulosstatic const int GRID_SIZE = 2; 62689c095f881a410da6a315795452a8e00ad95a9dPyry Haulosstatic const deUint32 MAX_RENDER_WIDTH = 128; 63689c095f881a410da6a315795452a8e00ad95a9dPyry Haulosstatic const deUint32 MAX_RENDER_HEIGHT = 128; 64689c095f881a410da6a315795452a8e00ad95a9dPyry Haulosstatic const tcu::Vec4 DEFAULT_CLEAR_COLOR = tcu::Vec4(0.125f, 0.25f, 0.5f, 1.0f); 65e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal 660d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Galstatic bool isSupportedLinearTilingFormat (const InstanceInterface& instanceInterface, VkPhysicalDevice device, VkFormat format) 670d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal{ 680d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal VkFormatProperties formatProps; 690d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal 7068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos instanceInterface.getPhysicalDeviceFormatProperties(device, format, &formatProps); 710d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal 720d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal return (formatProps.linearTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT) != 0u; 730d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal} 740d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal 750d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Galstatic bool isSupportedOptimalTilingFormat (const InstanceInterface& instanceInterface, VkPhysicalDevice device, VkFormat format) 760d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal{ 770d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal VkFormatProperties formatProps; 780d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal 7968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos instanceInterface.getPhysicalDeviceFormatProperties(device, format, &formatProps); 800d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal 81af0ed8fd53c287873e7cbbc9ad582529c62b4805Pyry Haulos return (formatProps.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT) != 0u; 820d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal} 830d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal 8468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulosstatic VkImageMemoryBarrier createImageMemoryBarrier (const VkImage& image, 8568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkAccessFlags srcAccessMask, 8668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkAccessFlags dstAccessMask, 8768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkImageLayout oldLayout, 8868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkImageLayout newLayout) 890d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal{ 900d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal VkImageMemoryBarrier imageMemoryBarrier = 910d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal { 920d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // VkStructureType sType; 930d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal DE_NULL, // const void* pNext; 9468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos srcAccessMask, // VkAccessFlags srcAccessMask; 9568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos dstAccessMask, // VkAccessFlags dstAccessMask; 960d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal oldLayout, // VkImageLayout oldLayout; 970d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal newLayout, // VkImageLayout newLayout; 980d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal VK_QUEUE_FAMILY_IGNORED, // deUint32 srcQueueFamilyIndex; 990d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal VK_QUEUE_FAMILY_IGNORED, // deUint32 dstQueueFamilyIndex; 1000d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal image, // VkImage image; 1010d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal { 1020d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal VK_IMAGE_ASPECT_COLOR_BIT, // VkImageAspectFlags aspectMask; 1030d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal 0, // deUint32 baseMipLevel; 1040d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal 1, // deUint32 mipLevels; 1050d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal 0, // deUint32 baseArrayLayer; 1060d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal 1 // deUint32 arraySize; 1070d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal } // VkImageSubresourceRange subresourceRange; 1080d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal }; 1090d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal return imageMemoryBarrier; 1100d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal} 1110d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal 112e9cfcc2d64981354e86833e6e7d4063267ce786cPeter Gal} // anonymous 113e9cfcc2d64981354e86833e6e7d4063267ce786cPeter Gal 114f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal// QuadGrid. 115f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal 116f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Galclass QuadGrid 117f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal{ 118f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Galpublic: 1193038af220852000e643054412d14679c61d58838Peter Gal QuadGrid (int gridSize, 1203038af220852000e643054412d14679c61d58838Peter Gal int screenWidth, 1213038af220852000e643054412d14679c61d58838Peter Gal int screenHeight, 1223038af220852000e643054412d14679c61d58838Peter Gal const tcu::Vec4& constCoords, 1233038af220852000e643054412d14679c61d58838Peter Gal const std::vector<tcu::Mat4>& userAttribTransforms, 1243038af220852000e643054412d14679c61d58838Peter Gal const std::vector<TextureBindingSp>& textures); 1253038af220852000e643054412d14679c61d58838Peter Gal ~QuadGrid (void); 1263038af220852000e643054412d14679c61d58838Peter Gal 1273038af220852000e643054412d14679c61d58838Peter Gal int getGridSize (void) const { return m_gridSize; } 1283038af220852000e643054412d14679c61d58838Peter Gal int getNumVertices (void) const { return m_numVertices; } 1293038af220852000e643054412d14679c61d58838Peter Gal int getNumTriangles (void) const { return m_numTriangles; } 1303038af220852000e643054412d14679c61d58838Peter Gal const tcu::Vec4& getConstCoords (void) const { return m_constCoords; } 1313038af220852000e643054412d14679c61d58838Peter Gal const std::vector<tcu::Mat4> getUserAttribTransforms (void) const { return m_userAttribTransforms; } 1323038af220852000e643054412d14679c61d58838Peter Gal const std::vector<TextureBindingSp>& getTextures (void) const { return m_textures; } 1333038af220852000e643054412d14679c61d58838Peter Gal 1343038af220852000e643054412d14679c61d58838Peter Gal const tcu::Vec4* getPositions (void) const { return &m_positions[0]; } 1353038af220852000e643054412d14679c61d58838Peter Gal const float* getAttribOne (void) const { return &m_attribOne[0]; } 1363038af220852000e643054412d14679c61d58838Peter Gal const tcu::Vec4* getCoords (void) const { return &m_coords[0]; } 1373038af220852000e643054412d14679c61d58838Peter Gal const tcu::Vec4* getUnitCoords (void) const { return &m_unitCoords[0]; } 1383038af220852000e643054412d14679c61d58838Peter Gal 1393038af220852000e643054412d14679c61d58838Peter Gal const tcu::Vec4* getUserAttrib (int attribNdx) const { return &m_userAttribs[attribNdx][0]; } 1403038af220852000e643054412d14679c61d58838Peter Gal const deUint16* getIndices (void) const { return &m_indices[0]; } 1413038af220852000e643054412d14679c61d58838Peter Gal 1423038af220852000e643054412d14679c61d58838Peter Gal tcu::Vec4 getCoords (float sx, float sy) const; 1433038af220852000e643054412d14679c61d58838Peter Gal tcu::Vec4 getUnitCoords (float sx, float sy) const; 1443038af220852000e643054412d14679c61d58838Peter Gal 1453038af220852000e643054412d14679c61d58838Peter Gal int getNumUserAttribs (void) const { return (int)m_userAttribTransforms.size(); } 1463038af220852000e643054412d14679c61d58838Peter Gal tcu::Vec4 getUserAttrib (int attribNdx, float sx, float sy) const; 147f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal 148f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Galprivate: 1493038af220852000e643054412d14679c61d58838Peter Gal const int m_gridSize; 1503038af220852000e643054412d14679c61d58838Peter Gal const int m_numVertices; 1513038af220852000e643054412d14679c61d58838Peter Gal const int m_numTriangles; 1523038af220852000e643054412d14679c61d58838Peter Gal const tcu::Vec4 m_constCoords; 1533038af220852000e643054412d14679c61d58838Peter Gal const std::vector<tcu::Mat4> m_userAttribTransforms; 1543038af220852000e643054412d14679c61d58838Peter Gal 1553038af220852000e643054412d14679c61d58838Peter Gal const std::vector<TextureBindingSp>& m_textures; 1563038af220852000e643054412d14679c61d58838Peter Gal 1573038af220852000e643054412d14679c61d58838Peter Gal std::vector<tcu::Vec4> m_screenPos; 1583038af220852000e643054412d14679c61d58838Peter Gal std::vector<tcu::Vec4> m_positions; 1593038af220852000e643054412d14679c61d58838Peter Gal std::vector<tcu::Vec4> m_coords; //!< Near-unit coordinates, roughly [-2.0 .. 2.0]. 1603038af220852000e643054412d14679c61d58838Peter Gal std::vector<tcu::Vec4> m_unitCoords; //!< Positive-only coordinates [0.0 .. 1.5]. 1613038af220852000e643054412d14679c61d58838Peter Gal std::vector<float> m_attribOne; 1623038af220852000e643054412d14679c61d58838Peter Gal std::vector<tcu::Vec4> m_userAttribs[ShaderEvalContext::MAX_TEXTURES]; 1633038af220852000e643054412d14679c61d58838Peter Gal std::vector<deUint16> m_indices; 164f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal}; 165f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal 1663038af220852000e643054412d14679c61d58838Peter GalQuadGrid::QuadGrid (int gridSize, 1673038af220852000e643054412d14679c61d58838Peter Gal int width, 1683038af220852000e643054412d14679c61d58838Peter Gal int height, 1693038af220852000e643054412d14679c61d58838Peter Gal const tcu::Vec4& constCoords, 1703038af220852000e643054412d14679c61d58838Peter Gal const std::vector<tcu::Mat4>& userAttribTransforms, 1713038af220852000e643054412d14679c61d58838Peter Gal const std::vector<TextureBindingSp>& textures) 172e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal : m_gridSize (gridSize) 173e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal , m_numVertices ((gridSize + 1) * (gridSize + 1)) 174e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal , m_numTriangles (gridSize * gridSize * 2) 175e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal , m_constCoords (constCoords) 176e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal , m_userAttribTransforms (userAttribTransforms) 177e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal , m_textures (textures) 178f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal{ 179fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal const tcu::Vec4 viewportScale ((float)width, (float)height, 0.0f, 0.0f); 180f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal 181e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal // Compute vertices. 182e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal m_screenPos.resize(m_numVertices); 183c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal m_positions.resize(m_numVertices); 184c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal m_coords.resize(m_numVertices); 185c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal m_unitCoords.resize(m_numVertices); 186c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal m_attribOne.resize(m_numVertices); 187f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal 188e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal // User attributes. 1893c17bc60af5c131488c834c64851a00449e4ef59Peter Gal for (int attrNdx = 0; attrNdx < DE_LENGTH_OF_ARRAY(m_userAttribs); attrNdx++) 1903c17bc60af5c131488c834c64851a00449e4ef59Peter Gal m_userAttribs[attrNdx].resize(m_numVertices); 191f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal 192e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal for (int y = 0; y < gridSize+1; y++) 193e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal for (int x = 0; x < gridSize+1; x++) 194e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal { 195e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal float sx = (float)x / (float)gridSize; 196e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal float sy = (float)y / (float)gridSize; 197e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal float fx = 2.0f * sx - 1.0f; 198e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal float fy = 2.0f * sy - 1.0f; 199e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal int vtxNdx = ((y * (gridSize+1)) + x); 200f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal 20194128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos m_positions[vtxNdx] = tcu::Vec4(fx, fy, 0.0f, 1.0f); 20294128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos m_coords[vtxNdx] = getCoords(sx, sy); 203c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal m_unitCoords[vtxNdx] = getUnitCoords(sx, sy); 20494128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos m_attribOne[vtxNdx] = 1.0f; 205107dd14dc168c363321247d56044f5037e9a51d1Peter Gal 206e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal m_screenPos[vtxNdx] = tcu::Vec4(sx, sy, 0.0f, 1.0f) * viewportScale; 207e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal 208e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal for (int attribNdx = 0; attribNdx < getNumUserAttribs(); attribNdx++) 209e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal m_userAttribs[attribNdx][vtxNdx] = getUserAttrib(attribNdx, sx, sy); 210e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal } 211e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal 212e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal // Compute indices. 213e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal m_indices.resize(3 * m_numTriangles); 214e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal for (int y = 0; y < gridSize; y++) 215e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal for (int x = 0; x < gridSize; x++) 216e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal { 21794128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos int stride = gridSize + 1; 21894128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos int v00 = (y * stride) + x; 21994128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos int v01 = (y * stride) + x + 1; 22094128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos int v10 = ((y+1) * stride) + x; 22194128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos int v11 = ((y+1) * stride) + x + 1; 222e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal 22394128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos int baseNdx = ((y * gridSize) + x) * 6; 224e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal m_indices[baseNdx + 0] = (deUint16)v10; 225e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal m_indices[baseNdx + 1] = (deUint16)v00; 226e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal m_indices[baseNdx + 2] = (deUint16)v01; 227e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal 228e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal m_indices[baseNdx + 3] = (deUint16)v10; 229e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal m_indices[baseNdx + 4] = (deUint16)v01; 230e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal m_indices[baseNdx + 5] = (deUint16)v11; 231e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal } 232f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal} 233f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal 234f520162e23ff1304a0d3a7148774b4d7f15056e8Peter GalQuadGrid::~QuadGrid (void) 235f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal{ 236f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal} 237f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal 238e8694a658f24ec536ab5373cca3fc898a07225cfPeter Galinline tcu::Vec4 QuadGrid::getCoords (float sx, float sy) const 239f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal{ 240fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal const float fx = 2.0f * sx - 1.0f; 241fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal const float fy = 2.0f * sy - 1.0f; 242e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal return tcu::Vec4(fx, fy, -fx + 0.33f*fy, -0.275f*fx - fy); 243f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal} 244f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal 245e8694a658f24ec536ab5373cca3fc898a07225cfPeter Galinline tcu::Vec4 QuadGrid::getUnitCoords (float sx, float sy) const 246f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal{ 247e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal return tcu::Vec4(sx, sy, 0.33f*sx + 0.5f*sy, 0.5f*sx + 0.25f*sy); 248f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal} 249f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal 250e8694a658f24ec536ab5373cca3fc898a07225cfPeter Galinline tcu::Vec4 QuadGrid::getUserAttrib (int attribNdx, float sx, float sy) const 251f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal{ 252e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal // homogeneous normalized screen-space coordinates 253e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal return m_userAttribTransforms[attribNdx] * tcu::Vec4(sx, sy, 0.0f, 1.0f); 254f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal} 255f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal 256fad070c442e5230420cafdf5c98d35e9fd5f3676Peter Gal// TextureBinding 257fad070c442e5230420cafdf5c98d35e9fd5f3676Peter Gal 258baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter GalTextureBinding::TextureBinding (const tcu::Archive& archive, 259baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal const char* filename, 260baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal const Type type, 261baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal const tcu::Sampler& sampler) 262baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal : m_type (type) 263fad070c442e5230420cafdf5c98d35e9fd5f3676Peter Gal , m_sampler (sampler) 264fad070c442e5230420cafdf5c98d35e9fd5f3676Peter Gal{ 265baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal switch(m_type) 266baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal { 2673038af220852000e643054412d14679c61d58838Peter Gal case TYPE_2D: m_binding.tex2D = loadTexture2D(archive, filename).release(); break; 268baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal default: 269e9cfcc2d64981354e86833e6e7d4063267ce786cPeter Gal DE_FATAL("Unsupported texture type"); 270baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal } 271baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal} 272baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal 2733038af220852000e643054412d14679c61d58838Peter GalTextureBinding::~TextureBinding (void) 274baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal{ 2753038af220852000e643054412d14679c61d58838Peter Gal switch(m_type) 276baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal { 2773038af220852000e643054412d14679c61d58838Peter Gal case TYPE_2D: delete m_binding.tex2D; break; 2783038af220852000e643054412d14679c61d58838Peter Gal default: break; 2793038af220852000e643054412d14679c61d58838Peter Gal } 2803038af220852000e643054412d14679c61d58838Peter Gal} 281baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal 282baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal 2833038af220852000e643054412d14679c61d58838Peter Galde::MovePtr<tcu::Texture2D> TextureBinding::loadTexture2D (const tcu::Archive& archive, const char* filename) 2843038af220852000e643054412d14679c61d58838Peter Gal{ 2853038af220852000e643054412d14679c61d58838Peter Gal tcu::TextureLevel level; 2863038af220852000e643054412d14679c61d58838Peter Gal tcu::ImageIO::loadImage(level, archive, filename); 287baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal 2883038af220852000e643054412d14679c61d58838Peter Gal TCU_CHECK_INTERNAL(level.getFormat() == tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8) || 2893038af220852000e643054412d14679c61d58838Peter Gal level.getFormat() == tcu::TextureFormat(tcu::TextureFormat::RGB, tcu::TextureFormat::UNORM_INT8)); 290baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal 2913038af220852000e643054412d14679c61d58838Peter Gal // \todo [2015-10-08 elecro] for some reason we get better when using RGBA texture even in RGB case, this needs to be investigated 2923038af220852000e643054412d14679c61d58838Peter Gal de::MovePtr<tcu::Texture2D> texture(new tcu::Texture2D(tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8), level.getWidth(), level.getHeight())); 293baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal 2943038af220852000e643054412d14679c61d58838Peter Gal // Fill level 0. 2953038af220852000e643054412d14679c61d58838Peter Gal texture->allocLevel(0); 2963038af220852000e643054412d14679c61d58838Peter Gal tcu::copy(texture->getLevel(0), level.getAccess()); 2973038af220852000e643054412d14679c61d58838Peter Gal 2983038af220852000e643054412d14679c61d58838Peter Gal return texture; 299fad070c442e5230420cafdf5c98d35e9fd5f3676Peter Gal} 300fad070c442e5230420cafdf5c98d35e9fd5f3676Peter Gal 301f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal// ShaderEvalContext. 302f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal 3033c17bc60af5c131488c834c64851a00449e4ef59Peter GalShaderEvalContext::ShaderEvalContext (const QuadGrid& quadGrid) 3043c17bc60af5c131488c834c64851a00449e4ef59Peter Gal : constCoords (quadGrid.getConstCoords()) 3053c17bc60af5c131488c834c64851a00449e4ef59Peter Gal , isDiscarded (false) 3063c17bc60af5c131488c834c64851a00449e4ef59Peter Gal , m_quadGrid (quadGrid) 307f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal{ 3083038af220852000e643054412d14679c61d58838Peter Gal const std::vector<TextureBindingSp>& bindings = m_quadGrid.getTextures(); 309e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal DE_ASSERT((int)bindings.size() <= MAX_TEXTURES); 310f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal 311e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal // Fill in texture array. 312e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal for (int ndx = 0; ndx < (int)bindings.size(); ndx++) 313e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal { 3143038af220852000e643054412d14679c61d58838Peter Gal const TextureBinding& binding = *bindings[ndx]; 315f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal 316e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal if (binding.getType() == TextureBinding::TYPE_NONE) 317e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal continue; 318f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal 319e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal textures[ndx].sampler = binding.getSampler(); 320f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal 321e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal switch (binding.getType()) 322e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal { 3233038af220852000e643054412d14679c61d58838Peter Gal case TextureBinding::TYPE_2D: textures[ndx].tex2D = &binding.get2D(); break; 324ee5edfc74c4eb51834aaa87e2d9db56fef27454cPeter Gal // \todo [2015-09-07 elecro] Add support for the other binding types 325ee5edfc74c4eb51834aaa87e2d9db56fef27454cPeter Gal /* 3268e402b8483bcea7ffdd8d3f75569fc8f98a7be4aPeter Gal case TextureBinding::TYPE_CUBE_MAP: textures[ndx].texCube = binding.getCube(); break; 3278e402b8483bcea7ffdd8d3f75569fc8f98a7be4aPeter Gal case TextureBinding::TYPE_2D_ARRAY: textures[ndx].tex2DArray = binding.get2DArray(); break; 3288e402b8483bcea7ffdd8d3f75569fc8f98a7be4aPeter Gal case TextureBinding::TYPE_3D: textures[ndx].tex3D = binding.get3D(); break; 329ee5edfc74c4eb51834aaa87e2d9db56fef27454cPeter Gal */ 330e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal default: 331ee5edfc74c4eb51834aaa87e2d9db56fef27454cPeter Gal TCU_THROW(InternalError, "Handling of texture binding type not implemented"); 332e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal } 333e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal } 334f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal} 335f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal 336e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter GalShaderEvalContext::~ShaderEvalContext (void) 337e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal{ 338e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal} 339e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal 340f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Galvoid ShaderEvalContext::reset (float sx, float sy) 341f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal{ 342e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal // Clear old values 343e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal color = tcu::Vec4(0.0f, 0.0f, 0.0f, 1.0f); 344e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal isDiscarded = false; 345e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal 346e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal // Compute coords 3473c17bc60af5c131488c834c64851a00449e4ef59Peter Gal coords = m_quadGrid.getCoords(sx, sy); 3483c17bc60af5c131488c834c64851a00449e4ef59Peter Gal unitCoords = m_quadGrid.getUnitCoords(sx, sy); 349e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal 350e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal // Compute user attributes. 351fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal const int numAttribs = m_quadGrid.getNumUserAttribs(); 352e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal DE_ASSERT(numAttribs <= MAX_USER_ATTRIBS); 353e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal for (int attribNdx = 0; attribNdx < numAttribs; attribNdx++) 3543c17bc60af5c131488c834c64851a00449e4ef59Peter Gal in[attribNdx] = m_quadGrid.getUserAttrib(attribNdx, sx, sy); 355f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal} 356f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal 357fad070c442e5230420cafdf5c98d35e9fd5f3676Peter Galtcu::Vec4 ShaderEvalContext::texture2D (int unitNdx, const tcu::Vec2& texCoords) 358f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal{ 359e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal if (textures[unitNdx].tex2D) 360e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal return textures[unitNdx].tex2D->sample(textures[unitNdx].sampler, texCoords.x(), texCoords.y(), 0.0f); 361e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal else 3628e402b8483bcea7ffdd8d3f75569fc8f98a7be4aPeter Gal return tcu::Vec4(0.0f, 0.0f, 0.0f, 1.0f); 363f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal} 364f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal 365f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal// ShaderEvaluator. 366f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal 367f520162e23ff1304a0d3a7148774b4d7f15056e8Peter GalShaderEvaluator::ShaderEvaluator (void) 368e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal : m_evalFunc(DE_NULL) 369f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal{ 370f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal} 371f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal 372f520162e23ff1304a0d3a7148774b4d7f15056e8Peter GalShaderEvaluator::ShaderEvaluator (ShaderEvalFunc evalFunc) 373e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal : m_evalFunc(evalFunc) 374f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal{ 375f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal} 376f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal 377f520162e23ff1304a0d3a7148774b4d7f15056e8Peter GalShaderEvaluator::~ShaderEvaluator (void) 378f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal{ 379f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal} 380f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal 381fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Galvoid ShaderEvaluator::evaluate (ShaderEvalContext& ctx) const 382f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal{ 383e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal DE_ASSERT(m_evalFunc); 384e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal m_evalFunc(ctx); 385f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal} 386f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal 38702297b806657cc6311a7ff5f5cc4976e91abbb83Peter Gal// UniformSetup. 38802297b806657cc6311a7ff5f5cc4976e91abbb83Peter Gal 38902297b806657cc6311a7ff5f5cc4976e91abbb83Peter GalUniformSetup::UniformSetup (void) 39002297b806657cc6311a7ff5f5cc4976e91abbb83Peter Gal : m_setupFunc(DE_NULL) 39102297b806657cc6311a7ff5f5cc4976e91abbb83Peter Gal{ 39202297b806657cc6311a7ff5f5cc4976e91abbb83Peter Gal} 39302297b806657cc6311a7ff5f5cc4976e91abbb83Peter Gal 39402297b806657cc6311a7ff5f5cc4976e91abbb83Peter GalUniformSetup::UniformSetup (UniformSetupFunc setupFunc) 39502297b806657cc6311a7ff5f5cc4976e91abbb83Peter Gal : m_setupFunc(setupFunc) 39602297b806657cc6311a7ff5f5cc4976e91abbb83Peter Gal{ 39702297b806657cc6311a7ff5f5cc4976e91abbb83Peter Gal} 39802297b806657cc6311a7ff5f5cc4976e91abbb83Peter Gal 39902297b806657cc6311a7ff5f5cc4976e91abbb83Peter GalUniformSetup::~UniformSetup (void) 40002297b806657cc6311a7ff5f5cc4976e91abbb83Peter Gal{ 40102297b806657cc6311a7ff5f5cc4976e91abbb83Peter Gal} 40202297b806657cc6311a7ff5f5cc4976e91abbb83Peter Gal 403fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Galvoid UniformSetup::setup (ShaderRenderCaseInstance& instance, const tcu::Vec4& constCoords) const 40402297b806657cc6311a7ff5f5cc4976e91abbb83Peter Gal{ 40502297b806657cc6311a7ff5f5cc4976e91abbb83Peter Gal if (m_setupFunc) 40602297b806657cc6311a7ff5f5cc4976e91abbb83Peter Gal m_setupFunc(instance, constCoords); 40702297b806657cc6311a7ff5f5cc4976e91abbb83Peter Gal} 40802297b806657cc6311a7ff5f5cc4976e91abbb83Peter Gal 4093bb836ef57cb5b8ddd048eec9817acd9f6ea2d26Peter Gal// ShaderRenderCase. 4103bb836ef57cb5b8ddd048eec9817acd9f6ea2d26Peter Gal 411fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter GalShaderRenderCase::ShaderRenderCase (tcu::TestContext& testCtx, 412fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal const std::string& name, 413fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal const std::string& description, 414fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal const bool isVertexCase, 415fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal const ShaderEvalFunc evalFunc, 416fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal const UniformSetup* uniformSetup, 417fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal const AttributeSetupFunc attribFunc) 4183c17bc60af5c131488c834c64851a00449e4ef59Peter Gal : vkt::TestCase (testCtx, name, description) 4193c17bc60af5c131488c834c64851a00449e4ef59Peter Gal , m_isVertexCase (isVertexCase) 4203c17bc60af5c131488c834c64851a00449e4ef59Peter Gal , m_evaluator (new ShaderEvaluator(evalFunc)) 4213c17bc60af5c131488c834c64851a00449e4ef59Peter Gal , m_uniformSetup (uniformSetup ? uniformSetup : new UniformSetup()) 4223c17bc60af5c131488c834c64851a00449e4ef59Peter Gal , m_attribFunc (attribFunc) 4233bb836ef57cb5b8ddd048eec9817acd9f6ea2d26Peter Gal{} 4243bb836ef57cb5b8ddd048eec9817acd9f6ea2d26Peter Gal 425fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter GalShaderRenderCase::ShaderRenderCase (tcu::TestContext& testCtx, 426fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal const std::string& name, 427fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal const std::string& description, 428fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal const bool isVertexCase, 429fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal const ShaderEvaluator* evaluator, 430fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal const UniformSetup* uniformSetup, 431fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal const AttributeSetupFunc attribFunc) 4323c17bc60af5c131488c834c64851a00449e4ef59Peter Gal : vkt::TestCase (testCtx, name, description) 4333c17bc60af5c131488c834c64851a00449e4ef59Peter Gal , m_isVertexCase (isVertexCase) 4343c17bc60af5c131488c834c64851a00449e4ef59Peter Gal , m_evaluator (evaluator) 4353c17bc60af5c131488c834c64851a00449e4ef59Peter Gal , m_uniformSetup (uniformSetup ? uniformSetup : new UniformSetup()) 4363c17bc60af5c131488c834c64851a00449e4ef59Peter Gal , m_attribFunc (attribFunc) 4373bb836ef57cb5b8ddd048eec9817acd9f6ea2d26Peter Gal{} 4383bb836ef57cb5b8ddd048eec9817acd9f6ea2d26Peter Gal 4393bb836ef57cb5b8ddd048eec9817acd9f6ea2d26Peter GalShaderRenderCase::~ShaderRenderCase (void) 4403bb836ef57cb5b8ddd048eec9817acd9f6ea2d26Peter Gal{ 4413bb836ef57cb5b8ddd048eec9817acd9f6ea2d26Peter Gal} 4423bb836ef57cb5b8ddd048eec9817acd9f6ea2d26Peter Gal 4435f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Galvoid ShaderRenderCase::initPrograms (vk::SourceCollections& programCollection) const 4443bb836ef57cb5b8ddd048eec9817acd9f6ea2d26Peter Gal{ 4455f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal programCollection.glslSources.add("vert") << glu::VertexSource(m_vertShaderSource); 4465f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal programCollection.glslSources.add("frag") << glu::FragmentSource(m_fragShaderSource); 4473bb836ef57cb5b8ddd048eec9817acd9f6ea2d26Peter Gal} 4483bb836ef57cb5b8ddd048eec9817acd9f6ea2d26Peter Gal 4493bb836ef57cb5b8ddd048eec9817acd9f6ea2d26Peter GalTestInstance* ShaderRenderCase::createInstance (Context& context) const 4503bb836ef57cb5b8ddd048eec9817acd9f6ea2d26Peter Gal{ 4513bb836ef57cb5b8ddd048eec9817acd9f6ea2d26Peter Gal DE_ASSERT(m_evaluator != DE_NULL); 4523bb836ef57cb5b8ddd048eec9817acd9f6ea2d26Peter Gal DE_ASSERT(m_uniformSetup != DE_NULL); 4533bb836ef57cb5b8ddd048eec9817acd9f6ea2d26Peter Gal return new ShaderRenderCaseInstance(context, m_isVertexCase, *m_evaluator, *m_uniformSetup, m_attribFunc); 4543bb836ef57cb5b8ddd048eec9817acd9f6ea2d26Peter Gal} 4553bb836ef57cb5b8ddd048eec9817acd9f6ea2d26Peter Gal 456f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal// ShaderRenderCaseInstance. 457f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal 458fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter GalShaderRenderCaseInstance::ShaderRenderCaseInstance (Context& context, 459fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal const bool isVertexCase, 460fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal const ShaderEvaluator& evaluator, 461fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal const UniformSetup& uniformSetup, 462fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal const AttributeSetupFunc attribFunc) 4633c17bc60af5c131488c834c64851a00449e4ef59Peter Gal : vkt::TestInstance (context) 464689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos , m_clearColor (DEFAULT_CLEAR_COLOR) 465db2888538b477baf488001c9c0ab294c848183ebPeter Gal , m_memAlloc (context.getDefaultAllocator()) 4663c17bc60af5c131488c834c64851a00449e4ef59Peter Gal , m_isVertexCase (isVertexCase) 4673c17bc60af5c131488c834c64851a00449e4ef59Peter Gal , m_evaluator (evaluator) 4683c17bc60af5c131488c834c64851a00449e4ef59Peter Gal , m_uniformSetup (uniformSetup) 4693c17bc60af5c131488c834c64851a00449e4ef59Peter Gal , m_attribFunc (attribFunc) 4703bc29b613dfc3842a5a90d7deb0b062869033230Jeff Bolz , m_renderSize (128, 128) 4713c17bc60af5c131488c834c64851a00449e4ef59Peter Gal , m_colorFormat (VK_FORMAT_R8G8B8A8_UNORM) 472f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal{ 473f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal} 474f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal 475f520162e23ff1304a0d3a7148774b4d7f15056e8Peter GalShaderRenderCaseInstance::~ShaderRenderCaseInstance (void) 476f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal{ 477f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal} 478f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal 479f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Galtcu::TestStatus ShaderRenderCaseInstance::iterate (void) 480f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal{ 481fad070c442e5230420cafdf5c98d35e9fd5f3676Peter Gal setup(); 482fad070c442e5230420cafdf5c98d35e9fd5f3676Peter Gal 483e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal // Create quad grid. 484689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos const tcu::UVec2 viewportSize = getViewportSize(); 485fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal const int width = viewportSize.x(); 48694128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos const int height = viewportSize.y(); 487e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal 488689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos QuadGrid quadGrid (m_isVertexCase ? GRID_SIZE : 4, width, height, tcu::Vec4(0.125f, 0.25f, 0.5f, 1.0f), m_userAttribTransforms, m_textures); 489e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal 490e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal // Render result. 491fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal tcu::Surface resImage (width, height); 492e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal render(resImage, quadGrid); 493e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal 494e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal // Compute reference. 495fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal tcu::Surface refImage (width, height); 496e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal if (m_isVertexCase) 497e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal computeVertexReference(refImage, quadGrid); 498e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal else 499e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal computeFragmentReference(refImage, quadGrid); 500e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal 501e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal // Compare. 50294128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos const bool compareOk = compareImages(resImage, refImage, 0.05f); 503e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal 504e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal if (compareOk) 505e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal return tcu::TestStatus::pass("Result image matches reference"); 506e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal else 507e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal return tcu::TestStatus::fail("Image mismatch"); 508e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal} 509e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal 5102fefaff91934f41ff34328c6e6b95ed24892b5a4Pyry Haulosvoid ShaderRenderCaseInstance::setupUniformData (deUint32 bindingLocation, size_t size, const void* dataPtr) 511da90931967434116522be552f82c8bc164a835bfPeter Gal{ 512e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal const VkDevice vkDevice = m_context.getDevice(); 513e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal const DeviceInterface& vk = m_context.getDeviceInterface(); 514e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal const deUint32 queueFamilyIndex = m_context.getUniversalQueueFamilyIndex(); 515da90931967434116522be552f82c8bc164a835bfPeter Gal 51694128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos const VkBufferCreateInfo uniformBufferParams = 517da90931967434116522be552f82c8bc164a835bfPeter Gal { 518da90931967434116522be552f82c8bc164a835bfPeter Gal VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, // VkStructureType sType; 519da90931967434116522be552f82c8bc164a835bfPeter Gal DE_NULL, // const void* pNext; 52068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0u, // VkBufferCreateFlags flags; 521da90931967434116522be552f82c8bc164a835bfPeter Gal size, // VkDeviceSize size; 522da90931967434116522be552f82c8bc164a835bfPeter Gal VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, // VkBufferUsageFlags usage; 523da90931967434116522be552f82c8bc164a835bfPeter Gal VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode; 524da90931967434116522be552f82c8bc164a835bfPeter Gal 1u, // deUint32 queueFamilyCount; 525da90931967434116522be552f82c8bc164a835bfPeter Gal &queueFamilyIndex // const deUint32* pQueueFamilyIndices; 526da90931967434116522be552f82c8bc164a835bfPeter Gal }; 527da90931967434116522be552f82c8bc164a835bfPeter Gal 528e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal Move<VkBuffer> buffer = createBuffer(vk, vkDevice, &uniformBufferParams); 52994128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos de::MovePtr<Allocation> alloc = m_memAlloc.allocate(getBufferMemoryRequirements(vk, vkDevice, *buffer), MemoryRequirement::HostVisible); 5308e402b8483bcea7ffdd8d3f75569fc8f98a7be4aPeter Gal VK_CHECK(vk.bindBufferMemory(vkDevice, *buffer, alloc->getMemory(), alloc->getOffset())); 531da90931967434116522be552f82c8bc164a835bfPeter Gal 532d76e073d542f11e430b3c1884f0777272d61291aPeter Gal deMemcpy(alloc->getHostPtr(), dataPtr, size); 5330d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal flushMappedMemoryRange(vk, vkDevice, alloc->getMemory(), alloc->getOffset(), size); 534da90931967434116522be552f82c8bc164a835bfPeter Gal 5354ccb48ac2f145d675648098906ddd252bbc0c63bPeter Gal de::MovePtr<BufferUniform> uniformInfo(new BufferUniform()); 5364ccb48ac2f145d675648098906ddd252bbc0c63bPeter Gal uniformInfo->type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; 5370bf51e2a309ddd9ba301fa96248d3889ed1600a7Gabor Abraham uniformInfo->descriptor = makeDescriptorBufferInfo(*buffer, 0u, size); 5384ccb48ac2f145d675648098906ddd252bbc0c63bPeter Gal uniformInfo->location = bindingLocation; 5394ccb48ac2f145d675648098906ddd252bbc0c63bPeter Gal uniformInfo->buffer = VkBufferSp(new vk::Unique<VkBuffer>(buffer)); 5400a4b8faafc7ea9160867de01d209e505c70a660aPeter Gal uniformInfo->alloc = AllocationSp(alloc.release()); 541da90931967434116522be552f82c8bc164a835bfPeter Gal 5424ccb48ac2f145d675648098906ddd252bbc0c63bPeter Gal m_uniformInfos.push_back(UniformInfoSp(new de::UniquePtr<UniformInfo>(uniformInfo))); 543da90931967434116522be552f82c8bc164a835bfPeter Gal} 544da90931967434116522be552f82c8bc164a835bfPeter Gal 5452fefaff91934f41ff34328c6e6b95ed24892b5a4Pyry Haulosvoid ShaderRenderCaseInstance::addUniform (deUint32 bindingLocation, vk::VkDescriptorType descriptorType, size_t dataSize, const void* data) 54602297b806657cc6311a7ff5f5cc4976e91abbb83Peter Gal{ 547d32acc9c110ed77b5aac8583f1d3b9ab3ebe05a9Peter Gal m_descriptorSetLayoutBuilder.addSingleBinding(descriptorType, vk::VK_SHADER_STAGE_ALL); 54802297b806657cc6311a7ff5f5cc4976e91abbb83Peter Gal m_descriptorPoolBuilder.addType(descriptorType); 54902297b806657cc6311a7ff5f5cc4976e91abbb83Peter Gal 55002297b806657cc6311a7ff5f5cc4976e91abbb83Peter Gal setupUniformData(bindingLocation, dataSize, data); 55102297b806657cc6311a7ff5f5cc4976e91abbb83Peter Gal} 552da90931967434116522be552f82c8bc164a835bfPeter Gal 5538e402b8483bcea7ffdd8d3f75569fc8f98a7be4aPeter Galvoid ShaderRenderCaseInstance::addAttribute (deUint32 bindingLocation, 5548e402b8483bcea7ffdd8d3f75569fc8f98a7be4aPeter Gal vk::VkFormat format, 5558e402b8483bcea7ffdd8d3f75569fc8f98a7be4aPeter Gal deUint32 sizePerElement, 5568e402b8483bcea7ffdd8d3f75569fc8f98a7be4aPeter Gal deUint32 count, 55794128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos const void* dataPtr) 558c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal{ 559c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal // Add binding specification 56094128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos const deUint32 binding = (deUint32)m_vertexBindingDescription.size(); 561e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal const VkVertexInputBindingDescription bindingDescription = 562c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal { 56394128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos binding, // deUint32 binding; 56468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos sizePerElement, // deUint32 stride; 56568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_VERTEX_INPUT_RATE_VERTEX // VkVertexInputRate stepRate; 566c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal }; 567c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal 568c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal m_vertexBindingDescription.push_back(bindingDescription); 569c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal 570c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal // Add location and format specification 571e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal const VkVertexInputAttributeDescription attributeDescription = 572c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal { 573c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal bindingLocation, // deUint32 location; 574c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal binding, // deUint32 binding; 575c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal format, // VkFormat format; 57668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0u, // deUint32 offset; 577c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal }; 578c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal 579c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal m_vertexattributeDescription.push_back(attributeDescription); 580c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal 581c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal // Upload data to buffer 582e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal const VkDevice vkDevice = m_context.getDevice(); 583e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal const DeviceInterface& vk = m_context.getDeviceInterface(); 584e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal const deUint32 queueFamilyIndex = m_context.getUniversalQueueFamilyIndex(); 585c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal 58694128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos const VkDeviceSize inputSize = sizePerElement * count; 587e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal const VkBufferCreateInfo vertexBufferParams = 588c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal { 589c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, // VkStructureType sType; 590c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal DE_NULL, // const void* pNext; 59168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0u, // VkBufferCreateFlags flags; 592c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal inputSize, // VkDeviceSize size; 593c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, // VkBufferUsageFlags usage; 594c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode; 595c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal 1u, // deUint32 queueFamilyCount; 596c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal &queueFamilyIndex // const deUint32* pQueueFamilyIndices; 597c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal }; 598c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal 59994128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos Move<VkBuffer> buffer = createBuffer(vk, vkDevice, &vertexBufferParams); 6000d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal de::MovePtr<vk::Allocation> alloc = m_memAlloc.allocate(getBufferMemoryRequirements(vk, vkDevice, *buffer), MemoryRequirement::HostVisible); 6018e402b8483bcea7ffdd8d3f75569fc8f98a7be4aPeter Gal VK_CHECK(vk.bindBufferMemory(vkDevice, *buffer, alloc->getMemory(), alloc->getOffset())); 602c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal 6037617e1896b93e92cce0214dfbdcd864b8cfbe144Pyry Haulos deMemcpy(alloc->getHostPtr(), dataPtr, (size_t)inputSize); 6040d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal flushMappedMemoryRange(vk, vkDevice, alloc->getMemory(), alloc->getOffset(), inputSize); 605c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal 606fed10ac2196b9f764eb9c365afee4d73dcbf7768Peter Gal m_vertexBuffers.push_back(VkBufferSp(new vk::Unique<VkBuffer>(buffer))); 6070a4b8faafc7ea9160867de01d209e505c70a660aPeter Gal m_vertexBufferAllocs.push_back(AllocationSp(alloc.release())); 608c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal} 609c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal 61023597067ccf919c019f237c49dd153d1ea502efcPeter Galvoid ShaderRenderCaseInstance::useAttribute (deUint32 bindingLocation, BaseAttributeType type) 61123597067ccf919c019f237c49dd153d1ea502efcPeter Gal{ 61223597067ccf919c019f237c49dd153d1ea502efcPeter Gal const EnabledBaseAttribute attribute = 61323597067ccf919c019f237c49dd153d1ea502efcPeter Gal { 6148e402b8483bcea7ffdd8d3f75569fc8f98a7be4aPeter Gal bindingLocation, // deUint32 location; 6158e402b8483bcea7ffdd8d3f75569fc8f98a7be4aPeter Gal type // BaseAttributeType type; 61623597067ccf919c019f237c49dd153d1ea502efcPeter Gal }; 61723597067ccf919c019f237c49dd153d1ea502efcPeter Gal m_enabledBaseAttributes.push_back(attribute); 61823597067ccf919c019f237c49dd153d1ea502efcPeter Gal} 61923597067ccf919c019f237c49dd153d1ea502efcPeter Gal 620e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Galvoid ShaderRenderCaseInstance::setup (void) 621e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal{ 622e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal} 623e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal 624e8694a658f24ec536ab5373cca3fc898a07225cfPeter Galvoid ShaderRenderCaseInstance::setupUniforms (const tcu::Vec4& constCoords) 625e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal{ 62602297b806657cc6311a7ff5f5cc4976e91abbb83Peter Gal m_uniformSetup.setup(*this, constCoords); 627e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal} 628e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal 629657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Galvoid ShaderRenderCaseInstance::useUniform (deUint32 bindingLocation, BaseUniformType type) 630657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal{ 631e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal #define UNIFORM_CASE(type, value) case type: addUniform(bindingLocation, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, value); break 632657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal 633657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal switch(type) 634657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal { 635657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal // Bool 636e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal UNIFORM_CASE(UB_FALSE, 0); 637e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal UNIFORM_CASE(UB_TRUE, 1); 638657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal 639657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal // BVec4 640e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal UNIFORM_CASE(UB4_FALSE, tcu::Vec4(0)); 641e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal UNIFORM_CASE(UB4_TRUE, tcu::Vec4(1)); 642657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal 643657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal // Integer 64494128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos UNIFORM_CASE(UI_ZERO, 0); 64594128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos UNIFORM_CASE(UI_ONE, 1); 64694128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos UNIFORM_CASE(UI_TWO, 2); 64794128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos UNIFORM_CASE(UI_THREE, 3); 64894128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos UNIFORM_CASE(UI_FOUR, 4); 64994128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos UNIFORM_CASE(UI_FIVE, 5); 65094128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos UNIFORM_CASE(UI_SIX, 6); 65194128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos UNIFORM_CASE(UI_SEVEN, 7); 65294128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos UNIFORM_CASE(UI_EIGHT, 8); 653e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal UNIFORM_CASE(UI_ONEHUNDREDONE, 101); 654657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal 655657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal // IVec2 65694128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos UNIFORM_CASE(UI2_MINUS_ONE, tcu::IVec2(-1)); 657e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal UNIFORM_CASE(UI2_ZERO, tcu::IVec2(0)); 658e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal UNIFORM_CASE(UI2_ONE, tcu::IVec2(1)); 659e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal UNIFORM_CASE(UI2_TWO, tcu::IVec2(2)); 660e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal UNIFORM_CASE(UI2_THREE, tcu::IVec2(3)); 661e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal UNIFORM_CASE(UI2_FOUR, tcu::IVec2(4)); 662e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal UNIFORM_CASE(UI2_FIVE, tcu::IVec2(5)); 663657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal 664657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal // IVec3 665e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal UNIFORM_CASE(UI3_MINUS_ONE, tcu::IVec3(-1)); 666e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal UNIFORM_CASE(UI3_ZERO, tcu::IVec3(0)); 667e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal UNIFORM_CASE(UI3_ONE, tcu::IVec3(1)); 668e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal UNIFORM_CASE(UI3_TWO, tcu::IVec3(2)); 669e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal UNIFORM_CASE(UI3_THREE, tcu::IVec3(3)); 670e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal UNIFORM_CASE(UI3_FOUR, tcu::IVec3(4)); 671e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal UNIFORM_CASE(UI3_FIVE, tcu::IVec3(5)); 672657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal 673657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal // IVec4 674e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal UNIFORM_CASE(UI4_MINUS_ONE, tcu::IVec4(-1)); 675e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal UNIFORM_CASE(UI4_ZERO, tcu::IVec4(0)); 676e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal UNIFORM_CASE(UI4_ONE, tcu::IVec4(1)); 677e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal UNIFORM_CASE(UI4_TWO, tcu::IVec4(2)); 678e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal UNIFORM_CASE(UI4_THREE, tcu::IVec4(3)); 679e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal UNIFORM_CASE(UI4_FOUR, tcu::IVec4(4)); 680e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal UNIFORM_CASE(UI4_FIVE, tcu::IVec4(5)); 681657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal 682657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal // Float 683e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal UNIFORM_CASE(UF_ZERO, 0.0f); 684e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal UNIFORM_CASE(UF_ONE, 1.0f); 685e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal UNIFORM_CASE(UF_TWO, 2.0f); 686e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal UNIFORM_CASE(UF_THREE, 3.0f); 687e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal UNIFORM_CASE(UF_FOUR, 4.0f); 688e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal UNIFORM_CASE(UF_FIVE, 5.0f); 689e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal UNIFORM_CASE(UF_SIX, 6.0f); 690e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal UNIFORM_CASE(UF_SEVEN, 7.0f); 6918de9729b70dce1afe01b302d07daee35a25baec7Peter Gal UNIFORM_CASE(UF_EIGHT, 8.0f); 692e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal 693e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal UNIFORM_CASE(UF_HALF, 1.0f / 2.0f); 694e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal UNIFORM_CASE(UF_THIRD, 1.0f / 3.0f); 695e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal UNIFORM_CASE(UF_FOURTH, 1.0f / 4.0f); 696e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal UNIFORM_CASE(UF_FIFTH, 1.0f / 5.0f); 697e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal UNIFORM_CASE(UF_SIXTH, 1.0f / 6.0f); 698e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal UNIFORM_CASE(UF_SEVENTH, 1.0f / 7.0f); 699e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal UNIFORM_CASE(UF_EIGHTH, 1.0f / 8.0f); 700657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal 701657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal // Vec2 702e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal UNIFORM_CASE(UV2_MINUS_ONE, tcu::Vec2(-1.0f)); 703e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal UNIFORM_CASE(UV2_ZERO, tcu::Vec2(0.0f)); 704e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal UNIFORM_CASE(UV2_ONE, tcu::Vec2(1.0f)); 705e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal UNIFORM_CASE(UV2_TWO, tcu::Vec2(2.0f)); 706e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal UNIFORM_CASE(UV2_THREE, tcu::Vec2(3.0f)); 707657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal 708e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal UNIFORM_CASE(UV2_HALF, tcu::Vec2(1.0f / 2.0f)); 709657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal 710657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal // Vec3 711e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal UNIFORM_CASE(UV3_MINUS_ONE, tcu::Vec3(-1.0f)); 712e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal UNIFORM_CASE(UV3_ZERO, tcu::Vec3(0.0f)); 713e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal UNIFORM_CASE(UV3_ONE, tcu::Vec3(1.0f)); 714e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal UNIFORM_CASE(UV3_TWO, tcu::Vec3(2.0f)); 715e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal UNIFORM_CASE(UV3_THREE, tcu::Vec3(3.0f)); 716657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal 717e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal UNIFORM_CASE(UV3_HALF, tcu::Vec3(1.0f / 2.0f)); 718657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal 719657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal // Vec4 720e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal UNIFORM_CASE(UV4_MINUS_ONE, tcu::Vec4(-1.0f)); 721e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal UNIFORM_CASE(UV4_ZERO, tcu::Vec4(0.0f)); 722e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal UNIFORM_CASE(UV4_ONE, tcu::Vec4(1.0f)); 723e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal UNIFORM_CASE(UV4_TWO, tcu::Vec4(2.0f)); 724e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal UNIFORM_CASE(UV4_THREE, tcu::Vec4(3.0f)); 725657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal 726e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal UNIFORM_CASE(UV4_HALF, tcu::Vec4(1.0f / 2.0f)); 727657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal 728e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal UNIFORM_CASE(UV4_BLACK, tcu::Vec4(0.0f, 0.0f, 0.0f, 1.0f)); 729e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal UNIFORM_CASE(UV4_GRAY, tcu::Vec4(0.5f, 0.5f, 0.5f, 1.0f)); 730e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal UNIFORM_CASE(UV4_WHITE, tcu::Vec4(1.0f, 1.0f, 1.0f, 1.0f)); 731657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal 732657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal default: 733e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal m_context.getTestContext().getLog() << tcu::TestLog::Message << "Unknown Uniform type: " << type << tcu::TestLog::EndMessage; 734657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal break; 735657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal } 736657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal 737e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal #undef UNIFORM_CASE 738657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal} 739657538108bc5d1c30e2b7c1caa3d0eee9ab7602dPeter Gal 740689c095f881a410da6a315795452a8e00ad95a9dPyry Haulosconst tcu::UVec2 ShaderRenderCaseInstance::getViewportSize (void) const 741e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal{ 742689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos return tcu::UVec2(de::min(m_renderSize.x(), MAX_RENDER_WIDTH), 743689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos de::min(m_renderSize.y(), MAX_RENDER_HEIGHT)); 744e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal} 745e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal 7460d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter GalMove<VkImage> ShaderRenderCaseInstance::createImage2D (const tcu::Texture2D& texture, 7470d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal const VkFormat format, 7480d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal const VkImageUsageFlags usage, 7490d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal const VkImageTiling tiling) 750baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal{ 751baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal const VkDevice vkDevice = m_context.getDevice(); 752baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal const DeviceInterface& vk = m_context.getDeviceInterface(); 753baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal const deUint32 queueFamilyIndex = m_context.getUniversalQueueFamilyIndex(); 754baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal 7550298a1c8dad636a147e387c26cfa578b7aef7973Peter Gal const VkImageCreateInfo imageCreateInfo = 756baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal { 757baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, // VkStructureType sType; 75868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos DE_NULL, // const void* pNext; 75968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0, // VkImageCreateFlags flags; 760baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal VK_IMAGE_TYPE_2D, // VkImageType imageType; 761baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal format, // VkFormat format; 762689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos { 763689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (deUint32)texture.getWidth(), 764689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (deUint32)texture.getHeight(), 765689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos 1u 766689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos }, // VkExtend3D extent; 767baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal 1u, // deUint32 mipLevels; 768baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal 1u, // deUint32 arraySize; 76968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_SAMPLE_COUNT_1_BIT, // deUint32 samples; 7700d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal tiling, // VkImageTiling tiling; 7710d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal usage, // VkImageUsageFlags usage; 772baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode; 773baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal 1, // deuint32 queueFamilyCount; 7745f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal &queueFamilyIndex, // const deUint32* pQueueFamilyIndices; 7758e402b8483bcea7ffdd8d3f75569fc8f98a7be4aPeter Gal VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout initialLayout; 776baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal }; 777baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal 7780298a1c8dad636a147e387c26cfa578b7aef7973Peter Gal Move<VkImage> vkTexture = createImage(vk, vkDevice, &imageCreateInfo); 779baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal return vkTexture; 780baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal} 781baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal 7820d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Galde::MovePtr<Allocation> ShaderRenderCaseInstance::uploadImage2D (const tcu::Texture2D& refTexture, 7830d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal const VkImage& vkTexture) 784fad070c442e5230420cafdf5c98d35e9fd5f3676Peter Gal{ 7850298a1c8dad636a147e387c26cfa578b7aef7973Peter Gal const VkDevice vkDevice = m_context.getDevice(); 7860298a1c8dad636a147e387c26cfa578b7aef7973Peter Gal const DeviceInterface& vk = m_context.getDeviceInterface(); 787baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal 7880298a1c8dad636a147e387c26cfa578b7aef7973Peter Gal de::MovePtr<Allocation> allocation = m_memAlloc.allocate(getImageMemoryRequirements(vk, vkDevice, vkTexture), MemoryRequirement::HostVisible); 7890d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal VK_CHECK(vk.bindImageMemory(vkDevice, vkTexture, allocation->getMemory(), allocation->getOffset())); 790baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal 7918e402b8483bcea7ffdd8d3f75569fc8f98a7be4aPeter Gal const VkImageSubresource subres = 792baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal { 79368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_IMAGE_ASPECT_COLOR_BIT, // VkImageAspectFlags aspectMask; 79468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0u, // deUint32 mipLevel; 79568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0u // deUint32 arraySlice 796baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal }; 797baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal 798baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal VkSubresourceLayout layout; 79968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos vk.getImageSubresourceLayout(vkDevice, vkTexture, &subres, &layout); 800baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal 80194128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos tcu::ConstPixelBufferAccess access = refTexture.getLevel(0); 8020298a1c8dad636a147e387c26cfa578b7aef7973Peter Gal tcu::PixelBufferAccess destAccess (refTexture.getFormat(), refTexture.getWidth(), refTexture.getHeight(), 1, allocation->getHostPtr()); 803baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal 804baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal tcu::copy(destAccess, access); 805baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal 8069931d9632ce1e900213ddd41ebd25a36cc93536eMark Adams flushMappedMemoryRange(vk, vkDevice, allocation->getMemory(), allocation->getOffset(), layout.size); 8070d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal 8080d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal return allocation; 8090d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal} 8100d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal 8110d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Galvoid ShaderRenderCaseInstance::copyTilingImageToOptimal (const vk::VkImage& srcImage, 8120d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal const vk::VkImage& dstImage, 813689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos deUint32 width, 814689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos deUint32 height) 8150d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal{ 81668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const VkDevice vkDevice = m_context.getDevice(); 81768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const DeviceInterface& vk = m_context.getDeviceInterface(); 81868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const VkQueue queue = m_context.getUniversalQueue(); 81968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const deUint32 queueFamilyIndex = m_context.getUniversalQueueFamilyIndex(); 8200d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal 8210d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal // Create command pool 82268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const VkCommandPoolCreateInfo cmdPoolParams = 823baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal { 82468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // VkStructureType sType; 8250d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal DE_NULL, // const void* pNext; 82668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_COMMAND_POOL_CREATE_TRANSIENT_BIT, // VkCmdPoolCreateFlags flags; 8270d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal queueFamilyIndex, // deUint32 queueFamilyIndex; 828baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal }; 829baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal 83068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos Move<VkCommandPool> cmdPool = createCommandPool(vk, vkDevice, &cmdPoolParams); 8310d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal 8320d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal // Create command buffer 83394128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos const VkCommandBufferAllocateInfo cmdBufferParams = 8340d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal { 83568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType; 83668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos DE_NULL, // const void* pNext; 83768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos *cmdPool, // VkCommandPool commandPool; 83868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_COMMAND_BUFFER_LEVEL_PRIMARY, // VkCommandBufferLevel level; 839ee90522bd5381c8444ef615f5350d8fd50c34a4bMika Isojärvi 1u // deUint32 bufferCount; 8400d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal }; 8410d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal 84268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const VkCommandBufferUsageFlags usageFlags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT; 84368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const VkCommandBufferBeginInfo cmdBufferBeginInfo = 8440d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal { 84568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // VkStructureType sType; 84668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos DE_NULL, // const void* pNext; 84768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos usageFlags, // VkCommandBufferUsageFlags flags; 848689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (const VkCommandBufferInheritanceInfo*)DE_NULL, 8490d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal }; 8500d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal 85168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos Move<VkCommandBuffer> cmdBuffer = allocateCommandBuffer(vk, vkDevice, &cmdBufferParams); 8520d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal 8530d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal VK_CHECK(vk.beginCommandBuffer(*cmdBuffer, &cmdBufferBeginInfo)); 8540d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal 8550d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal // Add image barriers 85668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const VkImageMemoryBarrier layoutBarriers[2] = 8570d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal { 85868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos createImageMemoryBarrier(srcImage, (VkAccessFlags)0u, (VkAccessFlags)0u, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL), 85968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos createImageMemoryBarrier(dstImage, (VkAccessFlags)0u, VK_ACCESS_TRANSFER_WRITE_BIT, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL) 8600d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal }; 8610d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal 862689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, (VkDependencyFlags)0, 863689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos 0, (const VkMemoryBarrier*)DE_NULL, 864689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos 0, (const VkBufferMemoryBarrier*)DE_NULL, 865689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos DE_LENGTH_OF_ARRAY(layoutBarriers), layoutBarriers); 8660d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal 8670d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal // Add image copy 8680d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal const VkImageCopy imageCopy = 8690d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal { 8700d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal { 87168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_IMAGE_ASPECT_COLOR_BIT, // VkImageAspect aspect; 8720d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal 0u, // deUint32 mipLevel; 8730d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal 0u, // deUint32 arrayLayer; 8740d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal 1u // deUint32 arraySize; 8750d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal }, // VkImageSubresourceCopy srcSubresource; 8760d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal { 8770d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal 0, // int32 x; 8780d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal 0, // int32 y; 8790d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal 0 // int32 z; 8800d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal }, // VkOffset3D srcOffset; 8810d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal { 88268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_IMAGE_ASPECT_COLOR_BIT, // VkImageAspect aspect; 8830d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal 0u, // deUint32 mipLevel; 8840d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal 0u, // deUint32 arrayLayer; 8850d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal 1u // deUint32 arraySize; 8860d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal }, // VkImageSubresourceCopy destSubResource; 8870d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal { 8880d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal 0, // int32 x; 8890d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal 0, // int32 y; 8900d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal 0 // int32 z; 8910d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal }, // VkOffset3D dstOffset; 8920d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal { 8930d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal width, // int32 width; 8940d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal height, // int32 height; 8950d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal 1, // int32 depth 8960d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal } // VkExtent3D extent; 8970d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal }; 8980d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal 89968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos vk.cmdCopyImage(*cmdBuffer, srcImage, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dstImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &imageCopy); 9000d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal 9010d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal // Add destination barrier 9020d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal const VkImageMemoryBarrier dstBarrier = 90368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos createImageMemoryBarrier(dstImage, VK_ACCESS_HOST_WRITE_BIT | VK_ACCESS_TRANSFER_WRITE_BIT, 0u, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); 9040d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal 905689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, (VkDependencyFlags)0, 906689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos 0, (const VkMemoryBarrier*)DE_NULL, 907689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos 0, (const VkBufferMemoryBarrier*)DE_NULL, 908689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos 1, &dstBarrier); 9090d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal 9100d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal VK_CHECK(vk.endCommandBuffer(*cmdBuffer)); 9110d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal 9120d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal const VkFenceCreateInfo fenceParams = 9130d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal { 9140d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, // VkStructureType sType; 9150d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal DE_NULL, // const void* pNext; 9160d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal 0u // VkFenceCreateFlags flags; 9170d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal }; 91868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const Unique<VkFence> fence (createFence(vk, vkDevice, &fenceParams)); 91968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const VkSubmitInfo submitInfo = 92068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos { 92168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_STRUCTURE_TYPE_SUBMIT_INFO, 92268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos DE_NULL, 92368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0u, 92468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (const VkSemaphore*)DE_NULL, 925689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (const VkPipelineStageFlags*)DE_NULL, 92668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 1u, 92768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos &cmdBuffer.get(), 92868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0u, 92968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (const VkSemaphore*)DE_NULL, 93068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos }; 93168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 9320d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal 9330d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal // Execute copy 9340d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal VK_CHECK(vk.resetFences(vkDevice, 1, &fence.get())); 93568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_CHECK(vk.queueSubmit(queue, 1, &submitInfo, *fence)); 9360d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), true, ~(0ull) /* infinity*/)); 9370d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal} 9380d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal 9390d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Galvoid ShaderRenderCaseInstance::useSampler2D (deUint32 bindingLocation, deUint32 textureID) 9400d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal{ 9410d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal DE_ASSERT(textureID < m_textures.size()); 9420d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal 9430d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal const VkDevice vkDevice = m_context.getDevice(); 9440d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal const DeviceInterface& vk = m_context.getDeviceInterface(); 9453038af220852000e643054412d14679c61d58838Peter Gal const TextureBinding& textureBinding = *m_textures[textureID]; 9463038af220852000e643054412d14679c61d58838Peter Gal const tcu::Texture2D& refTexture = textureBinding.get2D(); 9470d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal const tcu::Sampler& refSampler = textureBinding.getSampler(); 9483038af220852000e643054412d14679c61d58838Peter Gal const VkFormat format = refTexture.getFormat() == tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8) 9490d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal ? VK_FORMAT_R8G8B8A8_UNORM 9500d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal : VK_FORMAT_R8G8B8_UNORM; 9510d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal 9520d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal // Create & alloc the image 9530d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal Move<VkImage> vkTexture; 95494128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos de::MovePtr<Allocation> allocation; 9550d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal 9560d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal if (isSupportedLinearTilingFormat(m_context.getInstanceInterface(), m_context.getPhysicalDevice(), format)) 9570d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal { 9583038af220852000e643054412d14679c61d58838Peter Gal vkTexture = createImage2D(refTexture, format, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_LINEAR); 9593038af220852000e643054412d14679c61d58838Peter Gal allocation = uploadImage2D(refTexture, *vkTexture); 9600d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal } 9610d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal else if (isSupportedOptimalTilingFormat(m_context.getInstanceInterface(), m_context.getPhysicalDevice(), format)) 9620d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal { 96368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos Move<VkImage> stagingTexture (createImage2D(refTexture, format, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_LINEAR)); 9643038af220852000e643054412d14679c61d58838Peter Gal de::MovePtr<Allocation> stagingAlloc (uploadImage2D(refTexture, *stagingTexture)); 9650d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal 96668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const VkImageUsageFlags dstUsageFlags = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT; 9673038af220852000e643054412d14679c61d58838Peter Gal vkTexture = createImage2D(refTexture, format, dstUsageFlags, VK_IMAGE_TILING_OPTIMAL); 9680d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal allocation = m_memAlloc.allocate(getImageMemoryRequirements(vk, vkDevice, *vkTexture), MemoryRequirement::Any); 9690d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal VK_CHECK(vk.bindImageMemory(vkDevice, *vkTexture, allocation->getMemory(), allocation->getOffset())); 9700d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal 9713038af220852000e643054412d14679c61d58838Peter Gal copyTilingImageToOptimal(*stagingTexture, *vkTexture, refTexture.getWidth(), refTexture.getHeight()); 9720d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal } 9730d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal else 9740d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal { 9750d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal TCU_THROW(InternalError, "Unable to create 2D image"); 9760d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal } 977baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal 978fad070c442e5230420cafdf5c98d35e9fd5f3676Peter Gal // Create sampler 979689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos const VkSamplerCreateInfo samplerParams = mapSampler(refSampler, refTexture.getFormat()); 9808e402b8483bcea7ffdd8d3f75569fc8f98a7be4aPeter Gal Move<VkSampler> sampler = createSampler(vk, vkDevice, &samplerParams); 981fad070c442e5230420cafdf5c98d35e9fd5f3676Peter Gal 9828e402b8483bcea7ffdd8d3f75569fc8f98a7be4aPeter Gal const VkImageViewCreateInfo viewParams = 983fad070c442e5230420cafdf5c98d35e9fd5f3676Peter Gal { 9845caef6c545f2079afd0cb173f258eabf6929c0fcPeter Gal VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, // VkStructureType sType; 98568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos NULL, // const voide* pNext; 98668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0u, // VkImageViewCreateFlags flags; 987baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal *vkTexture, // VkImage image; 9885caef6c545f2079afd0cb173f258eabf6929c0fcPeter Gal VK_IMAGE_VIEW_TYPE_2D, // VkImageViewType viewType; 989baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal format, // VkFormat format; 9905caef6c545f2079afd0cb173f258eabf6929c0fcPeter Gal { 99168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_COMPONENT_SWIZZLE_R, // VkChannelSwizzle r; 99268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_COMPONENT_SWIZZLE_G, // VkChannelSwizzle g; 99368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_COMPONENT_SWIZZLE_B, // VkChannelSwizzle b; 99468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_COMPONENT_SWIZZLE_A // VkChannelSwizzle a; 9955caef6c545f2079afd0cb173f258eabf6929c0fcPeter Gal }, // VkChannelMapping channels; 9965caef6c545f2079afd0cb173f258eabf6929c0fcPeter Gal { 9975f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal VK_IMAGE_ASPECT_COLOR_BIT, // VkImageAspectFlags aspectMask; 9985f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal 0, // deUint32 baseMipLevel; 9995f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal 1, // deUint32 mipLevels; 10005f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal 0, // deUint32 baseArraySlice; 10015f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal 1 // deUint32 arraySize; 10025caef6c545f2079afd0cb173f258eabf6929c0fcPeter Gal }, // VkImageSubresourceRange subresourceRange; 1003fad070c442e5230420cafdf5c98d35e9fd5f3676Peter Gal }; 1004fad070c442e5230420cafdf5c98d35e9fd5f3676Peter Gal 10058e402b8483bcea7ffdd8d3f75569fc8f98a7be4aPeter Gal Move<VkImageView> imageView = createImageView(vk, vkDevice, &viewParams); 1006fad070c442e5230420cafdf5c98d35e9fd5f3676Peter Gal 100768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const vk::VkDescriptorImageInfo descriptor = 1008fad070c442e5230420cafdf5c98d35e9fd5f3676Peter Gal { 10095f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal sampler.get(), // VkSampler sampler; 10105f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal imageView.get(), // VkImageView imageView; 10115f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal VK_IMAGE_LAYOUT_GENERAL, // VkImageLayout imageLayout; 1012fad070c442e5230420cafdf5c98d35e9fd5f3676Peter Gal }; 1013fad070c442e5230420cafdf5c98d35e9fd5f3676Peter Gal 10144ccb48ac2f145d675648098906ddd252bbc0c63bPeter Gal de::MovePtr<SamplerUniform> uniform(new SamplerUniform()); 10154ccb48ac2f145d675648098906ddd252bbc0c63bPeter Gal uniform->type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; 10164ccb48ac2f145d675648098906ddd252bbc0c63bPeter Gal uniform->descriptor = descriptor; 10174ccb48ac2f145d675648098906ddd252bbc0c63bPeter Gal uniform->location = bindingLocation; 1018baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal uniform->image = VkImageSp(new vk::Unique<VkImage>(vkTexture)); 10194ccb48ac2f145d675648098906ddd252bbc0c63bPeter Gal uniform->imageView = VkImageViewSp(new vk::Unique<VkImageView>(imageView)); 10204ccb48ac2f145d675648098906ddd252bbc0c63bPeter Gal uniform->sampler = VkSamplerSp(new vk::Unique<VkSampler>(sampler)); 10210a4b8faafc7ea9160867de01d209e505c70a660aPeter Gal uniform->alloc = AllocationSp(allocation.release()); 1022fad070c442e5230420cafdf5c98d35e9fd5f3676Peter Gal 1023d32acc9c110ed77b5aac8583f1d3b9ab3ebe05a9Peter Gal m_descriptorSetLayoutBuilder.addSingleSamplerBinding(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, vk::VK_SHADER_STAGE_ALL, &uniform->descriptor.sampler); 1024fad070c442e5230420cafdf5c98d35e9fd5f3676Peter Gal m_descriptorPoolBuilder.addType(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER); 10254ccb48ac2f145d675648098906ddd252bbc0c63bPeter Gal 10264ccb48ac2f145d675648098906ddd252bbc0c63bPeter Gal m_uniformInfos.push_back(UniformInfoSp(new de::UniquePtr<UniformInfo>(uniform))); 1027fad070c442e5230420cafdf5c98d35e9fd5f3676Peter Gal} 1028fad070c442e5230420cafdf5c98d35e9fd5f3676Peter Gal 1029c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Galvoid ShaderRenderCaseInstance::setupDefaultInputs (const QuadGrid& quadGrid) 1030e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal{ 1031c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal /* Configuration of the vertex input attributes: 1032c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal a_position is at location 0 1033c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal a_coords is at location 1 1034c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal a_unitCoords is at location 2 1035c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal a_one is at location 3 1036c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal 1037c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal User attributes starts from at the location 4. 1038c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal */ 1039e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal addAttribute(0u, VK_FORMAT_R32G32B32A32_SFLOAT, sizeof(tcu::Vec4), quadGrid.getNumVertices(), quadGrid.getPositions()); 1040e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal addAttribute(1u, VK_FORMAT_R32G32B32A32_SFLOAT, sizeof(tcu::Vec4), quadGrid.getNumVertices(), quadGrid.getCoords()); 1041e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal addAttribute(2u, VK_FORMAT_R32G32B32A32_SFLOAT, sizeof(tcu::Vec4), quadGrid.getNumVertices(), quadGrid.getUnitCoords()); 1042c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal addAttribute(3u, VK_FORMAT_R32_SFLOAT, sizeof(float), quadGrid.getNumVertices(), quadGrid.getAttribOne()); 104323597067ccf919c019f237c49dd153d1ea502efcPeter Gal 104423597067ccf919c019f237c49dd153d1ea502efcPeter Gal static const struct 104523597067ccf919c019f237c49dd153d1ea502efcPeter Gal { 104623597067ccf919c019f237c49dd153d1ea502efcPeter Gal BaseAttributeType type; 104723597067ccf919c019f237c49dd153d1ea502efcPeter Gal int userNdx; 104823597067ccf919c019f237c49dd153d1ea502efcPeter Gal } userAttributes[] = 104923597067ccf919c019f237c49dd153d1ea502efcPeter Gal { 105023597067ccf919c019f237c49dd153d1ea502efcPeter Gal { A_IN0, 0 }, 105123597067ccf919c019f237c49dd153d1ea502efcPeter Gal { A_IN1, 1 }, 105223597067ccf919c019f237c49dd153d1ea502efcPeter Gal { A_IN2, 2 }, 105323597067ccf919c019f237c49dd153d1ea502efcPeter Gal { A_IN3, 3 } 105423597067ccf919c019f237c49dd153d1ea502efcPeter Gal }; 105523597067ccf919c019f237c49dd153d1ea502efcPeter Gal 105623597067ccf919c019f237c49dd153d1ea502efcPeter Gal static const struct 105723597067ccf919c019f237c49dd153d1ea502efcPeter Gal { 105823597067ccf919c019f237c49dd153d1ea502efcPeter Gal BaseAttributeType matrixType; 105923597067ccf919c019f237c49dd153d1ea502efcPeter Gal int numCols; 106023597067ccf919c019f237c49dd153d1ea502efcPeter Gal int numRows; 106123597067ccf919c019f237c49dd153d1ea502efcPeter Gal } matrices[] = 106223597067ccf919c019f237c49dd153d1ea502efcPeter Gal { 106323597067ccf919c019f237c49dd153d1ea502efcPeter Gal { MAT2, 2, 2 }, 106423597067ccf919c019f237c49dd153d1ea502efcPeter Gal { MAT2x3, 2, 3 }, 106523597067ccf919c019f237c49dd153d1ea502efcPeter Gal { MAT2x4, 2, 4 }, 10663c17bc60af5c131488c834c64851a00449e4ef59Peter Gal { MAT3x2, 3, 2 }, 106723597067ccf919c019f237c49dd153d1ea502efcPeter Gal { MAT3, 3, 3 }, 106823597067ccf919c019f237c49dd153d1ea502efcPeter Gal { MAT3x4, 3, 4 }, 106923597067ccf919c019f237c49dd153d1ea502efcPeter Gal { MAT4x2, 4, 2 }, 107023597067ccf919c019f237c49dd153d1ea502efcPeter Gal { MAT4x3, 4, 3 }, 107123597067ccf919c019f237c49dd153d1ea502efcPeter Gal { MAT4, 4, 4 } 107223597067ccf919c019f237c49dd153d1ea502efcPeter Gal }; 107323597067ccf919c019f237c49dd153d1ea502efcPeter Gal 1074fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal for (size_t attrNdx = 0; attrNdx < m_enabledBaseAttributes.size(); attrNdx++) 107523597067ccf919c019f237c49dd153d1ea502efcPeter Gal { 107623597067ccf919c019f237c49dd153d1ea502efcPeter Gal for (int userNdx = 0; userNdx < DE_LENGTH_OF_ARRAY(userAttributes); userNdx++) 107723597067ccf919c019f237c49dd153d1ea502efcPeter Gal { 1078fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal if (userAttributes[userNdx].type != m_enabledBaseAttributes[attrNdx].type) 107923597067ccf919c019f237c49dd153d1ea502efcPeter Gal continue; 108023597067ccf919c019f237c49dd153d1ea502efcPeter Gal 1081fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal addAttribute(m_enabledBaseAttributes[attrNdx].location, VK_FORMAT_R32G32B32A32_SFLOAT, sizeof(tcu::Vec4), quadGrid.getNumVertices(), quadGrid.getUserAttrib(userNdx)); 108223597067ccf919c019f237c49dd153d1ea502efcPeter Gal } 108323597067ccf919c019f237c49dd153d1ea502efcPeter Gal 108423597067ccf919c019f237c49dd153d1ea502efcPeter Gal for (int matNdx = 0; matNdx < DE_LENGTH_OF_ARRAY(matrices); matNdx++) 108523597067ccf919c019f237c49dd153d1ea502efcPeter Gal { 108623597067ccf919c019f237c49dd153d1ea502efcPeter Gal 1087fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal if (matrices[matNdx].matrixType != m_enabledBaseAttributes[attrNdx].type) 108823597067ccf919c019f237c49dd153d1ea502efcPeter Gal continue; 108923597067ccf919c019f237c49dd153d1ea502efcPeter Gal 1090fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal const int numCols = matrices[matNdx].numCols; 109123597067ccf919c019f237c49dd153d1ea502efcPeter Gal 109223597067ccf919c019f237c49dd153d1ea502efcPeter Gal for (int colNdx = 0; colNdx < numCols; colNdx++) 109323597067ccf919c019f237c49dd153d1ea502efcPeter Gal { 10947617e1896b93e92cce0214dfbdcd864b8cfbe144Pyry Haulos addAttribute(m_enabledBaseAttributes[attrNdx].location + colNdx, VK_FORMAT_R32G32B32A32_SFLOAT, (deUint32)(4 * sizeof(float)), quadGrid.getNumVertices(), quadGrid.getUserAttrib(colNdx)); 109523597067ccf919c019f237c49dd153d1ea502efcPeter Gal } 109623597067ccf919c019f237c49dd153d1ea502efcPeter Gal } 109723597067ccf919c019f237c49dd153d1ea502efcPeter Gal } 1098f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal} 1099f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal 1100e8694a658f24ec536ab5373cca3fc898a07225cfPeter Galvoid ShaderRenderCaseInstance::render (tcu::Surface& result, const QuadGrid& quadGrid) 1101e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal{ 11020298a1c8dad636a147e387c26cfa578b7aef7973Peter Gal const VkDevice vkDevice = m_context.getDevice(); 11030298a1c8dad636a147e387c26cfa578b7aef7973Peter Gal const DeviceInterface& vk = m_context.getDeviceInterface(); 11040298a1c8dad636a147e387c26cfa578b7aef7973Peter Gal const VkQueue queue = m_context.getUniversalQueue(); 11050298a1c8dad636a147e387c26cfa578b7aef7973Peter Gal const deUint32 queueFamilyIndex = m_context.getUniversalQueueFamilyIndex(); 11068bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal 11078bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal // Create color image 11088bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal { 11090298a1c8dad636a147e387c26cfa578b7aef7973Peter Gal const VkImageCreateInfo colorImageParams = 11108bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal { 11118bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, // VkStructureType sType; 11128bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal DE_NULL, // const void* pNext; 111368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0u, // VkImageCreateFlags flags; 11148bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal VK_IMAGE_TYPE_2D, // VkImageType imageType; 11158bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal m_colorFormat, // VkFormat format; 11168bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal { m_renderSize.x(), m_renderSize.y(), 1u }, // VkExtent3D extent; 11178bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal 1u, // deUint32 mipLevels; 11188bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal 1u, // deUint32 arraySize; 111968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_SAMPLE_COUNT_1_BIT, // deUint32 samples; 11208bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal VK_IMAGE_TILING_OPTIMAL, // VkImageTiling tiling; 112168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT, // VkImageUsageFlags usage; 11228bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode; 11238bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal 1u, // deUint32 queueFamilyCount; 11245f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal &queueFamilyIndex, // const deUint32* pQueueFamilyIndices; 11255f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout initialLayout; 11268bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal }; 11278bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal 1128e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal m_colorImage = createImage(vk, vkDevice, &colorImageParams); 11298bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal 11308bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal // Allocate and bind color image memory 11318e402b8483bcea7ffdd8d3f75569fc8f98a7be4aPeter Gal m_colorImageAlloc = m_memAlloc.allocate(getImageMemoryRequirements(vk, vkDevice, *m_colorImage), MemoryRequirement::Any); 11328e402b8483bcea7ffdd8d3f75569fc8f98a7be4aPeter Gal VK_CHECK(vk.bindImageMemory(vkDevice, *m_colorImage, m_colorImageAlloc->getMemory(), m_colorImageAlloc->getOffset())); 11338bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal } 11348bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal 11358bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal // Create color attachment view 11368bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal { 11370298a1c8dad636a147e387c26cfa578b7aef7973Peter Gal const VkImageViewCreateInfo colorImageViewParams = 11388bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal { 11395f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, // VkStructureType sType; 11405f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal DE_NULL, // const void* pNext; 114168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0u, // VkImageViewCreateFlags flags; 11425f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal *m_colorImage, // VkImage image; 11435f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal VK_IMAGE_VIEW_TYPE_2D, // VkImageViewType viewType; 11445f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal m_colorFormat, // VkFormat format; 11455f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal { 114668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_COMPONENT_SWIZZLE_R, // VkChannelSwizzle r; 114768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_COMPONENT_SWIZZLE_G, // VkChannelSwizzle g; 114868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_COMPONENT_SWIZZLE_B, // VkChannelSwizzle b; 114968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_COMPONENT_SWIZZLE_A // VkChannelSwizzle a; 11505f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal }, // VkChannelMapping channels; 11515f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal { 11525f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal VK_IMAGE_ASPECT_COLOR_BIT, // VkImageAspectFlags aspectMask; 11535f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal 0, // deUint32 baseMipLevel; 11545f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal 1, // deUint32 mipLevels; 11555f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal 0, // deUint32 baseArraySlice; 11565f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal 1 // deUint32 arraySize; 11575f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal }, // VkImageSubresourceRange subresourceRange; 11588bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal }; 11598bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal 11605f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal m_colorImageView = createImageView(vk, vkDevice, &colorImageViewParams); 11618bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal } 11628bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal 11638bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal // Create render pass 11648bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal { 11650298a1c8dad636a147e387c26cfa578b7aef7973Peter Gal const VkAttachmentDescription attachmentDescription = 11668bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal { 116768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (VkAttachmentDescriptionFlags)0, 11685f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal m_colorFormat, // VkFormat format; 116968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_SAMPLE_COUNT_1_BIT, // deUint32 samples; 11705f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal VK_ATTACHMENT_LOAD_OP_CLEAR, // VkAttachmentLoadOp loadOp; 11715f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal VK_ATTACHMENT_STORE_OP_STORE, // VkAttachmentStoreOp storeOp; 11725f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal VK_ATTACHMENT_LOAD_OP_DONT_CARE, // VkAttachmentLoadOp stencilLoadOp; 11735f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal VK_ATTACHMENT_STORE_OP_DONT_CARE, // VkAttachmentStoreOp stencilStoreOp; 11743d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout initialLayout; 11755f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // VkImageLayout finalLayout; 11768bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal }; 11778bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal 11780298a1c8dad636a147e387c26cfa578b7aef7973Peter Gal const VkAttachmentReference attachmentReference = 11798bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal { 11808bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal 0u, // deUint32 attachment; 11818bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL // VkImageLayout layout; 11828bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal }; 11838bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal 11840298a1c8dad636a147e387c26cfa578b7aef7973Peter Gal const VkSubpassDescription subpassDescription = 11858bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal { 11868bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal 0u, // VkSubpassDescriptionFlags flags; 118768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_PIPELINE_BIND_POINT_GRAPHICS, // VkPipelineBindPoint pipelineBindPoint; 11888bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal 0u, // deUint32 inputCount; 11895f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal DE_NULL, // constVkAttachmentReference* pInputAttachments; 11908bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal 1u, // deUint32 colorCount; 11910298a1c8dad636a147e387c26cfa578b7aef7973Peter Gal &attachmentReference, // constVkAttachmentReference* pColorAttachments; 11925f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal DE_NULL, // constVkAttachmentReference* pResolveAttachments; 119368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos DE_NULL, // VkAttachmentReference depthStencilAttachment; 11948bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal 0u, // deUint32 preserveCount; 11955f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal DE_NULL // constVkAttachmentReference* pPreserveAttachments; 11968bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal }; 11978bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal 11980298a1c8dad636a147e387c26cfa578b7aef7973Peter Gal const VkRenderPassCreateInfo renderPassParams = 11998bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal { 12008bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, // VkStructureType sType; 12018bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal DE_NULL, // const void* pNext; 120268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (VkRenderPassCreateFlags)0, 12038bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal 1u, // deUint32 attachmentCount; 12040298a1c8dad636a147e387c26cfa578b7aef7973Peter Gal &attachmentDescription, // const VkAttachmentDescription* pAttachments; 12058bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal 1u, // deUint32 subpassCount; 12068bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal &subpassDescription, // const VkSubpassDescription* pSubpasses; 12078bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal 0u, // deUint32 dependencyCount; 12088bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal DE_NULL // const VkSubpassDependency* pDependencies; 12098bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal }; 12108bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal 12118bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal m_renderPass = createRenderPass(vk, vkDevice, &renderPassParams); 12128bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal } 12138bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal 12148bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal // Create framebuffer 12158bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal { 12160298a1c8dad636a147e387c26cfa578b7aef7973Peter Gal const VkFramebufferCreateInfo framebufferParams = 12178bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal { 12188bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, // VkStructureType sType; 12198bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal DE_NULL, // const void* pNext; 122068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (VkFramebufferCreateFlags)0, 12218bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal *m_renderPass, // VkRenderPass renderPass; 12228bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal 1u, // deUint32 attachmentCount; 12235f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal &*m_colorImageView, // const VkImageView* pAttachments; 12248bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal (deUint32)m_renderSize.x(), // deUint32 width; 12258bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal (deUint32)m_renderSize.y(), // deUint32 height; 12268bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal 1u // deUint32 layers; 12278bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal }; 12288bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal 12298bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal m_framebuffer = createFramebuffer(vk, vkDevice, &framebufferParams); 12308bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal } 12318bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal 12328c371469948c4b289e8c0af949026e3be894d294Peter Gal // Create descriptors 12338c371469948c4b289e8c0af949026e3be894d294Peter Gal { 1234da90931967434116522be552f82c8bc164a835bfPeter Gal setupUniforms(quadGrid.getConstCoords()); 12358c371469948c4b289e8c0af949026e3be894d294Peter Gal 1236da90931967434116522be552f82c8bc164a835bfPeter Gal m_descriptorSetLayout = m_descriptorSetLayoutBuilder.build(vk, vkDevice); 1237eec2930556edeec10ef243488843b42a91dff9dbbpkowali if (!m_uniformInfos.empty()) 123868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos { 1239eec2930556edeec10ef243488843b42a91dff9dbbpkowali m_descriptorPool = m_descriptorPoolBuilder.build(vk, vkDevice, VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 1u); 124068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const VkDescriptorSetAllocateInfo allocInfo = 124168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos { 124268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO, 124368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos DE_NULL, 124468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos *m_descriptorPool, 124568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 1u, 124668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos &m_descriptorSetLayout.get(), 124768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos }; 124868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 124968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos m_descriptorSet = allocateDescriptorSet(vk, vkDevice, &allocInfo); 125068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos } 125168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 125268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos for (deUint32 i = 0; i < m_uniformInfos.size(); i++) 12538c371469948c4b289e8c0af949026e3be894d294Peter Gal { 12544ccb48ac2f145d675648098906ddd252bbc0c63bPeter Gal const UniformInfo* uniformInfo = m_uniformInfos[i].get()->get(); 12554ccb48ac2f145d675648098906ddd252bbc0c63bPeter Gal deUint32 location = uniformInfo->location; 125668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 125768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos if (uniformInfo->type == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER) 125868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos { 125968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const BufferUniform* bufferInfo = dynamic_cast<const BufferUniform*>(uniformInfo); 126068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 126168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos m_descriptorSetUpdateBuilder.writeSingle(*m_descriptorSet, DescriptorSetUpdateBuilder::Location::binding(location), uniformInfo->type, &bufferInfo->descriptor); 126268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos } 126368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos else if (uniformInfo->type == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER) 126468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos { 126568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const SamplerUniform* samplerInfo = dynamic_cast<const SamplerUniform*>(uniformInfo); 126668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 126768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos m_descriptorSetUpdateBuilder.writeSingle(*m_descriptorSet, DescriptorSetUpdateBuilder::Location::binding(location), uniformInfo->type, &samplerInfo->descriptor); 126868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos } 126968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos else 127068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos DE_FATAL("Impossible"); 1271da90931967434116522be552f82c8bc164a835bfPeter Gal } 12728c371469948c4b289e8c0af949026e3be894d294Peter Gal 1273da90931967434116522be552f82c8bc164a835bfPeter Gal m_descriptorSetUpdateBuilder.update(vk, vkDevice); 12748c371469948c4b289e8c0af949026e3be894d294Peter Gal } 12758c371469948c4b289e8c0af949026e3be894d294Peter Gal 12768bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal // Create pipeline layout 12778bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal { 12780298a1c8dad636a147e387c26cfa578b7aef7973Peter Gal const VkPipelineLayoutCreateInfo pipelineLayoutParams = 12798bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal { 12808bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, // VkStructureType sType; 12818bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal DE_NULL, // const void* pNext; 128268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (VkPipelineLayoutCreateFlags)0, 12838c371469948c4b289e8c0af949026e3be894d294Peter Gal 1u, // deUint32 descriptorSetCount; 12848c371469948c4b289e8c0af949026e3be894d294Peter Gal &*m_descriptorSetLayout, // const VkDescriptorSetLayout* pSetLayouts; 12858bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal 0u, // deUint32 pushConstantRangeCount; 12868bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal DE_NULL // const VkPushConstantRange* pPushConstantRanges; 12878bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal }; 12888bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal 12898bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal m_pipelineLayout = createPipelineLayout(vk, vkDevice, &pipelineLayoutParams); 12908bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal } 12918bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal 12928bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal // Create shaders 12938bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal { 1294546e25812b194adf4e7c4caa3173c3698fa8c418Peter Gal m_vertexShaderModule = createShaderModule(vk, vkDevice, m_context.getBinaryCollection().get("vert"), 0); 1295546e25812b194adf4e7c4caa3173c3698fa8c418Peter Gal m_fragmentShaderModule = createShaderModule(vk, vkDevice, m_context.getBinaryCollection().get("frag"), 0); 12968bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal } 12978bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal 12988bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal // Create pipeline 12998bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal { 13000298a1c8dad636a147e387c26cfa578b7aef7973Peter Gal const VkPipelineShaderStageCreateInfo shaderStageParams[2] = 13018bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal { 13028bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal { 13038bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, // VkStructureType sType; 13048bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal DE_NULL, // const void* pNext; 130568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (VkPipelineShaderStageCreateFlags)0, 130668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_SHADER_STAGE_VERTEX_BIT, // VkShaderStage stage; 130768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos *m_vertexShaderModule, // VkShader shader; 130868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos "main", 13098bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal DE_NULL // const VkSpecializationInfo* pSpecializationInfo; 13108bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal }, 13118bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal { 13128bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, // VkStructureType sType; 13138bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal DE_NULL, // const void* pNext; 131468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (VkPipelineShaderStageCreateFlags)0, 131568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_SHADER_STAGE_FRAGMENT_BIT, // VkShaderStage stage; 131668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos *m_fragmentShaderModule, // VkShader shader; 131768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos "main", 13188bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal DE_NULL // const VkSpecializationInfo* pSpecializationInfo; 13198bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal } 13208bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal }; 13218bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal 1322c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal // Add test case specific attributes 1323c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal if (m_attribFunc) 1324c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal m_attribFunc(*this, quadGrid.getNumVertices()); 1325107dd14dc168c363321247d56044f5037e9a51d1Peter Gal 13268e402b8483bcea7ffdd8d3f75569fc8f98a7be4aPeter Gal // Add base attributes 132723597067ccf919c019f237c49dd153d1ea502efcPeter Gal setupDefaultInputs(quadGrid); 13288bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal 13290298a1c8dad636a147e387c26cfa578b7aef7973Peter Gal const VkPipelineVertexInputStateCreateInfo vertexInputStateParams = 13308bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal { 13318bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO, // VkStructureType sType; 13328bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal DE_NULL, // const void* pNext; 133368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (VkPipelineVertexInputStateCreateFlags)0, 1334c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal (deUint32)m_vertexBindingDescription.size(), // deUint32 bindingCount; 1335c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal &m_vertexBindingDescription[0], // const VkVertexInputBindingDescription* pVertexBindingDescriptions; 1336c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal (deUint32)m_vertexattributeDescription.size(), // deUint32 attributeCount; 1337c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal &m_vertexattributeDescription[0], // const VkVertexInputAttributeDescription* pVertexAttributeDescriptions; 13388bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal }; 13398bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal 13400298a1c8dad636a147e387c26cfa578b7aef7973Peter Gal const VkPipelineInputAssemblyStateCreateInfo inputAssemblyStateParams = 13418bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal { 13428bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, // VkStructureType sType; 13438bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal DE_NULL, // const void* pNext; 134468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (VkPipelineInputAssemblyStateCreateFlags)0, 13458bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, // VkPrimitiveTopology topology; 13468bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal false // VkBool32 primitiveRestartEnable; 13478bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal }; 13488bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal 13490298a1c8dad636a147e387c26cfa578b7aef7973Peter Gal const VkViewport viewport = 13505f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal { 13515f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal 0.0f, // float originX; 13525f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal 0.0f, // float originY; 13535f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal (float)m_renderSize.x(), // float width; 13545f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal (float)m_renderSize.y(), // float height; 13555f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal 0.0f, // float minDepth; 13565f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal 1.0f // float maxDepth; 13575f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal }; 13585f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal 13590298a1c8dad636a147e387c26cfa578b7aef7973Peter Gal const VkRect2D scissor = 13605f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal { 13615f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal { 13625f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal 0u, // deUint32 x; 13635f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal 0u, // deUint32 y; 13645f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal }, // VkOffset2D offset; 13655f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal { 13665f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal m_renderSize.x(), // deUint32 width; 13675f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal m_renderSize.y(), // deUint32 height; 13685f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal }, // VkExtent2D extent; 13695f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal }; 13705f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal 13710298a1c8dad636a147e387c26cfa578b7aef7973Peter Gal const VkPipelineViewportStateCreateInfo viewportStateParams = 13728bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal { 13735f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO, // VkStructureType sType; 13745f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal DE_NULL, // const void* pNext; 137568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (VkPipelineViewportStateCreateFlags)0, 13765f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal 1u, // deUint32 viewportCount; 13775f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal &viewport, // const VkViewport* pViewports; 13785f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal 1u, // deUint32 scissorsCount; 13795f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal &scissor, // const VkRect2D* pScissors; 13808bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal }; 13818bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal 138268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const VkPipelineRasterizationStateCreateInfo rasterStateParams = 13838bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal { 138468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO, // VkStructureType sType; 13858bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal DE_NULL, // const void* pNext; 138668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (VkPipelineRasterizationStateCreateFlags)0, 13878bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal false, // VkBool32 depthClipEnable; 13888bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal false, // VkBool32 rasterizerDiscardEnable; 138968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_POLYGON_MODE_FILL, // VkFillMode fillMode; 13908bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal VK_CULL_MODE_NONE, // VkCullMode cullMode; 13911d7b621b1d86ec78d73744c72bbc02629c21f904Daniel Hegedus VK_FRONT_FACE_COUNTER_CLOCKWISE, // VkFrontFace frontFace; 13925f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal false, // VkBool32 depthBiasEnable; 13935f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal 0.0f, // float depthBias; 13945f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal 0.0f, // float depthBiasClamp; 13955f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal 0.0f, // float slopeScaledDepthBias; 13965f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal 1.0f, // float lineWidth; 13978bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal }; 13988bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal 1399e148980e7f95d8a113a7dc84b13ca9906f33869fPyry Haulos const VkPipelineMultisampleStateCreateInfo multisampleStateParams = 14001d7b621b1d86ec78d73744c72bbc02629c21f904Daniel Hegedus { 14011d7b621b1d86ec78d73744c72bbc02629c21f904Daniel Hegedus VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO, // VkStructureType sType; 14021d7b621b1d86ec78d73744c72bbc02629c21f904Daniel Hegedus DE_NULL, // const void* pNext; 14031d7b621b1d86ec78d73744c72bbc02629c21f904Daniel Hegedus 0u, // VkPipelineMultisampleStateCreateFlags flags; 14041d7b621b1d86ec78d73744c72bbc02629c21f904Daniel Hegedus VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits rasterizationSamples; 14051d7b621b1d86ec78d73744c72bbc02629c21f904Daniel Hegedus VK_FALSE, // VkBool32 sampleShadingEnable; 14061d7b621b1d86ec78d73744c72bbc02629c21f904Daniel Hegedus 0.0f, // float minSampleShading; 14071d7b621b1d86ec78d73744c72bbc02629c21f904Daniel Hegedus DE_NULL, // const VkSampleMask* pSampleMask; 14081d7b621b1d86ec78d73744c72bbc02629c21f904Daniel Hegedus VK_FALSE, // VkBool32 alphaToCoverageEnable; 14091d7b621b1d86ec78d73744c72bbc02629c21f904Daniel Hegedus VK_FALSE // VkBool32 alphaToOneEnable; 14101d7b621b1d86ec78d73744c72bbc02629c21f904Daniel Hegedus }; 1411e148980e7f95d8a113a7dc84b13ca9906f33869fPyry Haulos 14120298a1c8dad636a147e387c26cfa578b7aef7973Peter Gal const VkPipelineColorBlendAttachmentState colorBlendAttachmentState = 14138bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal { 141468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos false, // VkBool32 blendEnable; 141568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_BLEND_FACTOR_ONE, // VkBlend srcBlendColor; 141668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_BLEND_FACTOR_ZERO, // VkBlend destBlendColor; 141768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_BLEND_OP_ADD, // VkBlendOp blendOpColor; 141868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_BLEND_FACTOR_ONE, // VkBlend srcBlendAlpha; 141968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_BLEND_FACTOR_ZERO, // VkBlend destBlendAlpha; 142068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_BLEND_OP_ADD, // VkBlendOp blendOpAlpha; 142168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (VK_COLOR_COMPONENT_R_BIT | 142268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_COLOR_COMPONENT_G_BIT | 142368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_COLOR_COMPONENT_B_BIT | 142468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_COLOR_COMPONENT_A_BIT), // VkChannelFlags channelWriteMask; 14258bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal }; 14268bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal 14270298a1c8dad636a147e387c26cfa578b7aef7973Peter Gal const VkPipelineColorBlendStateCreateInfo colorBlendStateParams = 14288bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal { 14298bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO, // VkStructureType sType; 14308bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal DE_NULL, // const void* pNext; 143168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (VkPipelineColorBlendStateCreateFlags)0, 14328bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal false, // VkBool32 logicOpEnable; 14338bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal VK_LOGIC_OP_COPY, // VkLogicOp logicOp; 14348bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal 1u, // deUint32 attachmentCount; 14355f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal &colorBlendAttachmentState, // const VkPipelineColorBlendAttachmentState* pAttachments; 14365f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal { 0.0f, 0.0f, 0.0f, 0.0f }, // float blendConst[4]; 14375f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal }; 14385f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal 14390298a1c8dad636a147e387c26cfa578b7aef7973Peter Gal const VkGraphicsPipelineCreateInfo graphicsPipelineParams = 14408bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal { 14418bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO, // VkStructureType sType; 14428bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal DE_NULL, // const void* pNext; 144368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0u, // VkPipelineCreateFlags flags; 14448bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal 2u, // deUint32 stageCount; 14458bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal shaderStageParams, // const VkPipelineShaderStageCreateInfo* pStages; 14468bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal &vertexInputStateParams, // const VkPipelineVertexInputStateCreateInfo* pVertexInputState; 14478bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal &inputAssemblyStateParams, // const VkPipelineInputAssemblyStateCreateInfo* pInputAssemblyState; 14488bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal DE_NULL, // const VkPipelineTessellationStateCreateInfo* pTessellationState; 14498bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal &viewportStateParams, // const VkPipelineViewportStateCreateInfo* pViewportState; 14508bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal &rasterStateParams, // const VkPipelineRasterStateCreateInfo* pRasterState; 14511d7b621b1d86ec78d73744c72bbc02629c21f904Daniel Hegedus &multisampleStateParams, // const VkPipelineMultisampleStateCreateInfo* pMultisampleState; 14528bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal DE_NULL, // const VkPipelineDepthStencilStateCreateInfo* pDepthStencilState; 14538bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal &colorBlendStateParams, // const VkPipelineColorBlendStateCreateInfo* pColorBlendState; 145486a8ae9e0d61bbfe1f1e273fdbb026369bdb5f29Pyry Haulos (const VkPipelineDynamicStateCreateInfo*)DE_NULL, // const VkPipelineDynamicStateCreateInfo* pDynamicState; 14558bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal *m_pipelineLayout, // VkPipelineLayout layout; 14568bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal *m_renderPass, // VkRenderPass renderPass; 14578bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal 0u, // deUint32 subpass; 14588bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal 0u, // VkPipeline basePipelineHandle; 14598bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal 0u // deInt32 basePipelineIndex; 14608bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal }; 14618bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal 14628bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal m_graphicsPipeline = createGraphicsPipeline(vk, vkDevice, DE_NULL, &graphicsPipelineParams); 14638bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal } 14648bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal 14658bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal // Create vertex indices buffer 14668bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal { 14670298a1c8dad636a147e387c26cfa578b7aef7973Peter Gal const VkDeviceSize indiceBufferSize = quadGrid.getNumTriangles() * 3 * sizeof(deUint16); 14680298a1c8dad636a147e387c26cfa578b7aef7973Peter Gal const VkBufferCreateInfo indiceBufferParams = 14698bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal { 14708bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, // VkStructureType sType; 14718bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal DE_NULL, // const void* pNext; 147268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0u, // VkBufferCreateFlags flags; 14738bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal indiceBufferSize, // VkDeviceSize size; 14748bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal VK_BUFFER_USAGE_INDEX_BUFFER_BIT, // VkBufferUsageFlags usage; 14758bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode; 14768bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal 1u, // deUint32 queueFamilyCount; 14778bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal &queueFamilyIndex // const deUint32* pQueueFamilyIndices; 14788bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal }; 14798bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal 14808bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal m_indiceBuffer = createBuffer(vk, vkDevice, &indiceBufferParams); 14810d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal m_indiceBufferAlloc = m_memAlloc.allocate(getBufferMemoryRequirements(vk, vkDevice, *m_indiceBuffer), MemoryRequirement::HostVisible); 14828bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal 14838e402b8483bcea7ffdd8d3f75569fc8f98a7be4aPeter Gal VK_CHECK(vk.bindBufferMemory(vkDevice, *m_indiceBuffer, m_indiceBufferAlloc->getMemory(), m_indiceBufferAlloc->getOffset())); 14848bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal 14858bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal // Load vertice indices into buffer 14867617e1896b93e92cce0214dfbdcd864b8cfbe144Pyry Haulos deMemcpy(m_indiceBufferAlloc->getHostPtr(), quadGrid.getIndices(), (size_t)indiceBufferSize); 14870d978e5f907c8a3be619ca09f66605b1bdbfe8a5Peter Gal flushMappedMemoryRange(vk, vkDevice, m_indiceBufferAlloc->getMemory(), m_indiceBufferAlloc->getOffset(), indiceBufferSize); 14888bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal } 14898bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal 14908bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal // Create command pool 14918bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal { 149268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const VkCommandPoolCreateInfo cmdPoolParams = 14938bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal { 149468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // VkStructureType sType; 149568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos DE_NULL, // const void* pNext; 149668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_COMMAND_POOL_CREATE_TRANSIENT_BIT, // VkCmdPoolCreateFlags flags; 149768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos queueFamilyIndex, // deUint32 queueFamilyIndex; 14988bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal }; 14998bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal 15008bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal m_cmdPool = createCommandPool(vk, vkDevice, &cmdPoolParams); 15018bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal } 15028bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal 15038bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal // Create command buffer 15048bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal { 150568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const VkCommandBufferAllocateInfo cmdBufferParams = 15068bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal { 150768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType; 150868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos DE_NULL, // const void* pNext; 150968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos *m_cmdPool, // VkCmdPool cmdPool; 151068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_COMMAND_BUFFER_LEVEL_PRIMARY, // VkCmdBufferLevel level; 151168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 1u // deUint32 bufferCount; 15128bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal }; 15138bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal 151468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const VkCommandBufferBeginInfo cmdBufferBeginInfo = 15158bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal { 151668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // VkStructureType sType; 151768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos DE_NULL, // const void* pNext; 151868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0u, // VkCmdBufferOptimizeFlags flags; 1519689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (const VkCommandBufferInheritanceInfo*)DE_NULL, 15208bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal }; 15218bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal 1522e8849a85b21e64ece65abc17248f01a9591784fePyry Haulos const VkClearValue clearValues = makeClearValueColorF32(m_clearColor.x(), 1523e8849a85b21e64ece65abc17248f01a9591784fePyry Haulos m_clearColor.y(), 1524e8849a85b21e64ece65abc17248f01a9591784fePyry Haulos m_clearColor.z(), 1525e8849a85b21e64ece65abc17248f01a9591784fePyry Haulos m_clearColor.w()); 15268bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal 15270298a1c8dad636a147e387c26cfa578b7aef7973Peter Gal const VkRenderPassBeginInfo renderPassBeginInfo = 15288bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal { 1529e8849a85b21e64ece65abc17248f01a9591784fePyry Haulos VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, // VkStructureType sType; 1530e8849a85b21e64ece65abc17248f01a9591784fePyry Haulos DE_NULL, // const void* pNext; 1531e8849a85b21e64ece65abc17248f01a9591784fePyry Haulos *m_renderPass, // VkRenderPass renderPass; 1532e8849a85b21e64ece65abc17248f01a9591784fePyry Haulos *m_framebuffer, // VkFramebuffer framebuffer; 1533e8849a85b21e64ece65abc17248f01a9591784fePyry Haulos { { 0, 0 }, {m_renderSize.x(), m_renderSize.y() } }, // VkRect2D renderArea; 1534e8849a85b21e64ece65abc17248f01a9591784fePyry Haulos 1, // deUint32 clearValueCount; 1535e8849a85b21e64ece65abc17248f01a9591784fePyry Haulos &clearValues, // const VkClearValue* pClearValues; 15368bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal }; 15378bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal 153868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos m_cmdBuffer = allocateCommandBuffer(vk, vkDevice, &cmdBufferParams); 15398bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal 15408bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal VK_CHECK(vk.beginCommandBuffer(*m_cmdBuffer, &cmdBufferBeginInfo)); 1541fad070c442e5230420cafdf5c98d35e9fd5f3676Peter Gal 1542e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal // Add texture barriers 1543fad070c442e5230420cafdf5c98d35e9fd5f3676Peter Gal std::vector<VkImageMemoryBarrier> barriers; 1544fad070c442e5230420cafdf5c98d35e9fd5f3676Peter Gal 1545baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal for(deUint32 i = 0; i < m_uniformInfos.size(); i++) 1546fad070c442e5230420cafdf5c98d35e9fd5f3676Peter Gal { 1547baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal const UniformInfo* uniformInfo = m_uniformInfos[i].get()->get(); 1548baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal 1549baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal if (uniformInfo->type != VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER) 1550baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal { 1551baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal continue; 1552baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal } 1553baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal 155468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const SamplerUniform* sampler = static_cast<const SamplerUniform*>(uniformInfo); 15553d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos const VkImageMemoryBarrier textureBarrier = createImageMemoryBarrier(sampler->image->get(), 0u, VK_ACCESS_SHADER_READ_BIT, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); 1556fad070c442e5230420cafdf5c98d35e9fd5f3676Peter Gal 1557fad070c442e5230420cafdf5c98d35e9fd5f3676Peter Gal barriers.push_back(textureBarrier); 1558fad070c442e5230420cafdf5c98d35e9fd5f3676Peter Gal } 1559fad070c442e5230420cafdf5c98d35e9fd5f3676Peter Gal 1560689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos vk.cmdPipelineBarrier(*m_cmdBuffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, (VkDependencyFlags)0, 1561689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos 0, (const VkMemoryBarrier*)DE_NULL, 1562689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos 0, (const VkBufferMemoryBarrier*)DE_NULL, 1563689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (deUint32)barriers.size(), (barriers.empty() ? (const VkImageMemoryBarrier*)DE_NULL : &barriers[0])); 1564fad070c442e5230420cafdf5c98d35e9fd5f3676Peter Gal 156568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos vk.cmdBeginRenderPass(*m_cmdBuffer, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE); 15668bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal 15678bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal vk.cmdBindPipeline(*m_cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *m_graphicsPipeline); 15685dd012fb2f776e0724c1ba51f5b658883bd6fc9cJeff Bolz if (!m_uniformInfos.empty()) 15695dd012fb2f776e0724c1ba51f5b658883bd6fc9cJeff Bolz vk.cmdBindDescriptorSets(*m_cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *m_pipelineLayout, 0u, 1, &*m_descriptorSet, 0u, DE_NULL); 15708bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal vk.cmdBindIndexBuffer(*m_cmdBuffer, *m_indiceBuffer, 0, VK_INDEX_TYPE_UINT16); 15718bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal 1572ee5edfc74c4eb51834aaa87e2d9db56fef27454cPeter Gal const deUint32 numberOfVertexAttributes = (deUint32)m_vertexBuffers.size(); 1573fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal const std::vector<VkDeviceSize> offsets(numberOfVertexAttributes, 0); 1574c42d55f61c1476f3f6cb425d7c81a62c035f6dc7Peter Gal 1575fed10ac2196b9f764eb9c365afee4d73dcbf7768Peter Gal std::vector<VkBuffer> buffers(numberOfVertexAttributes); 1576fed10ac2196b9f764eb9c365afee4d73dcbf7768Peter Gal for (size_t i = 0; i < numberOfVertexAttributes; i++) 1577fed10ac2196b9f764eb9c365afee4d73dcbf7768Peter Gal { 1578fed10ac2196b9f764eb9c365afee4d73dcbf7768Peter Gal buffers[i] = m_vertexBuffers[i].get()->get(); 1579fed10ac2196b9f764eb9c365afee4d73dcbf7768Peter Gal } 1580fed10ac2196b9f764eb9c365afee4d73dcbf7768Peter Gal 1581fed10ac2196b9f764eb9c365afee4d73dcbf7768Peter Gal vk.cmdBindVertexBuffers(*m_cmdBuffer, 0, numberOfVertexAttributes, &buffers[0], &offsets[0]); 15825f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal vk.cmdDrawIndexed(*m_cmdBuffer, quadGrid.getNumTriangles() * 3, 1, 0, 0, 0); 15838bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal 15848bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal vk.cmdEndRenderPass(*m_cmdBuffer); 15858bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer)); 15868bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal } 15878bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal 15888bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal // Create fence 15898bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal { 15900298a1c8dad636a147e387c26cfa578b7aef7973Peter Gal const VkFenceCreateInfo fenceParams = 15918bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal { 15928bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, // VkStructureType sType; 15938bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal DE_NULL, // const void* pNext; 15948bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal 0u // VkFenceCreateFlags flags; 15958bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal }; 15968bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal m_fence = createFence(vk, vkDevice, &fenceParams); 15978bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal } 15988bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal 15998bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal // Execute Draw 16008bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal { 160168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const VkSubmitInfo submitInfo = 160268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos { 160368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_STRUCTURE_TYPE_SUBMIT_INFO, 160468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos DE_NULL, 160568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0u, 160668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (const VkSemaphore*)DE_NULL, 1607689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (const VkPipelineStageFlags*)DE_NULL, 160868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 1u, 160968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos &m_cmdBuffer.get(), 161068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0u, 161168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (const VkSemaphore*)DE_NULL, 161268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos }; 161368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 16148bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal VK_CHECK(vk.resetFences(vkDevice, 1, &m_fence.get())); 161568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_CHECK(vk.queueSubmit(queue, 1, &submitInfo, *m_fence)); 16168bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal VK_CHECK(vk.waitForFences(vkDevice, 1, &m_fence.get(), true, ~(0ull) /* infinity*/)); 16178bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal } 16188bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal 16198bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal // Read back the result 16208bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal { 16210298a1c8dad636a147e387c26cfa578b7aef7973Peter Gal const VkDeviceSize imageSizeBytes = (VkDeviceSize)(sizeof(deUint32) * m_renderSize.x() * m_renderSize.y()); 162294128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos const VkBufferCreateInfo readImageBufferParams = 16238bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal { 16248bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, // VkStructureType sType; 16258bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal DE_NULL, // const void* pNext; 16268bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal 0u, // VkBufferCreateFlags flags; 162768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos imageSizeBytes, // VkDeviceSize size; 162868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_BUFFER_USAGE_TRANSFER_DST_BIT, // VkBufferUsageFlags usage; 16298bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode; 16308bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal 1u, // deUint32 queueFamilyCount; 16318bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal &queueFamilyIndex, // const deUint32* pQueueFamilyIndices; 16328bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal }; 16330298a1c8dad636a147e387c26cfa578b7aef7973Peter Gal const Unique<VkBuffer> readImageBuffer (createBuffer(vk, vkDevice, &readImageBufferParams)); 16340298a1c8dad636a147e387c26cfa578b7aef7973Peter Gal const de::UniquePtr<Allocation> readImageBufferMemory (m_memAlloc.allocate(getBufferMemoryRequirements(vk, vkDevice, *readImageBuffer), MemoryRequirement::HostVisible)); 16358bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal 16368bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal VK_CHECK(vk.bindBufferMemory(vkDevice, *readImageBuffer, readImageBufferMemory->getMemory(), readImageBufferMemory->getOffset())); 16378bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal 16388bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal // Copy image to buffer 163968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const VkCommandBufferAllocateInfo cmdBufferParams = 1640e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal { 164168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType; 164268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos DE_NULL, // const void* pNext; 164368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos *m_cmdPool, // VkCmdPool cmdPool; 164468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_COMMAND_BUFFER_LEVEL_PRIMARY, // VkCmdBufferLevel level; 164568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 1u // deUint32 bufferCount; 1646e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal }; 16478bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal 164868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const VkCommandBufferBeginInfo cmdBufferBeginInfo = 1649e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal { 165068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // VkStructureType sType; 165168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos DE_NULL, // const void* pNext; 165268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0u, // VkCmdBufferOptimizeFlags flags; 1653689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (const VkCommandBufferInheritanceInfo*)DE_NULL, 1654e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal }; 16558bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal 165668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const Move<VkCommandBuffer> cmdBuffer = allocateCommandBuffer(vk, vkDevice, &cmdBufferParams); 16578bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal 16580298a1c8dad636a147e387c26cfa578b7aef7973Peter Gal const VkBufferImageCopy copyParams = 1659e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal { 1660e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal 0u, // VkDeviceSize bufferOffset; 16610015a6211ba70667113c970a818e3f041e74e500Peter Gal (deUint32)m_renderSize.x(), // deUint32 bufferRowLength; 16620015a6211ba70667113c970a818e3f041e74e500Peter Gal (deUint32)m_renderSize.y(), // deUint32 bufferImageHeight; 16638bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal { 166468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_IMAGE_ASPECT_COLOR_BIT, // VkImageAspect aspect; 16655f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal 0u, // deUint32 mipLevel; 16665f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal 0u, // deUint32 arraySlice; 16675f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal 1u, // deUint32 arraySize; 16685f4b0799f9c405085259d5f6c3800c5ed22c141bPeter Gal }, // VkImageSubresourceCopy imageSubresource; 1669e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal { 0u, 0u, 0u }, // VkOffset3D imageOffset; 1670e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal { m_renderSize.x(), m_renderSize.y(), 1u } // VkExtent3D imageExtent; 1671e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal }; 167268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const VkSubmitInfo submitInfo = 167368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos { 167468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_STRUCTURE_TYPE_SUBMIT_INFO, 167568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos DE_NULL, 167668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0u, 167768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (const VkSemaphore*)DE_NULL, 1678689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (const VkPipelineStageFlags*)DE_NULL, 167968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 1u, 168068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos &cmdBuffer.get(), 168168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0u, 168268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (const VkSemaphore*)DE_NULL, 168368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos }; 16848bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal 1685e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal VK_CHECK(vk.beginCommandBuffer(*cmdBuffer, &cmdBufferBeginInfo)); 1686f8922e6b5eeea5be513b8682197c78295c5108a4Mais Alnasser 1687f8922e6b5eeea5be513b8682197c78295c5108a4Mais Alnasser const VkImageMemoryBarrier imageBarrier = 1688f8922e6b5eeea5be513b8682197c78295c5108a4Mais Alnasser { 1689f8922e6b5eeea5be513b8682197c78295c5108a4Mais Alnasser VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // VkStructureType sType; 1690f8922e6b5eeea5be513b8682197c78295c5108a4Mais Alnasser DE_NULL, // const void* pNext; 16913d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, // VkAccessFlags srcAccessMask; 1692f8922e6b5eeea5be513b8682197c78295c5108a4Mais Alnasser VK_ACCESS_TRANSFER_READ_BIT, // VkAccessFlags dstAccessMask; 1693f8922e6b5eeea5be513b8682197c78295c5108a4Mais Alnasser VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // VkImageLayout oldLayout; 1694f8922e6b5eeea5be513b8682197c78295c5108a4Mais Alnasser VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, // VkImageLayout newLayout; 1695f8922e6b5eeea5be513b8682197c78295c5108a4Mais Alnasser VK_QUEUE_FAMILY_IGNORED, // deUint32 srcQueueFamilyIndex; 1696f8922e6b5eeea5be513b8682197c78295c5108a4Mais Alnasser VK_QUEUE_FAMILY_IGNORED, // deUint32 dstQueueFamilyIndex; 1697f8922e6b5eeea5be513b8682197c78295c5108a4Mais Alnasser *m_colorImage, // VkImage image; 1698f8922e6b5eeea5be513b8682197c78295c5108a4Mais Alnasser { // VkImageSubresourceRange subresourceRange; 1699f8922e6b5eeea5be513b8682197c78295c5108a4Mais Alnasser VK_IMAGE_ASPECT_COLOR_BIT, // VkImageAspectFlags aspectMask; 1700f8922e6b5eeea5be513b8682197c78295c5108a4Mais Alnasser 0u, // deUint32 baseMipLevel; 1701f8922e6b5eeea5be513b8682197c78295c5108a4Mais Alnasser 1u, // deUint32 mipLevels; 1702f8922e6b5eeea5be513b8682197c78295c5108a4Mais Alnasser 0u, // deUint32 baseArraySlice; 1703f8922e6b5eeea5be513b8682197c78295c5108a4Mais Alnasser 1u // deUint32 arraySize; 1704f8922e6b5eeea5be513b8682197c78295c5108a4Mais Alnasser } 1705f8922e6b5eeea5be513b8682197c78295c5108a4Mais Alnasser }; 1706f8922e6b5eeea5be513b8682197c78295c5108a4Mais Alnasser 1707f8922e6b5eeea5be513b8682197c78295c5108a4Mais Alnasser const VkBufferMemoryBarrier bufferBarrier = 1708f8922e6b5eeea5be513b8682197c78295c5108a4Mais Alnasser { 1709f8922e6b5eeea5be513b8682197c78295c5108a4Mais Alnasser VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER, // VkStructureType sType; 1710f8922e6b5eeea5be513b8682197c78295c5108a4Mais Alnasser DE_NULL, // const void* pNext; 1711f8922e6b5eeea5be513b8682197c78295c5108a4Mais Alnasser VK_ACCESS_TRANSFER_WRITE_BIT, // VkAccessFlags srcAccessMask; 1712f8922e6b5eeea5be513b8682197c78295c5108a4Mais Alnasser VK_ACCESS_HOST_READ_BIT, // VkAccessFlags dstAccessMask; 1713f8922e6b5eeea5be513b8682197c78295c5108a4Mais Alnasser VK_QUEUE_FAMILY_IGNORED, // deUint32 srcQueueFamilyIndex; 1714f8922e6b5eeea5be513b8682197c78295c5108a4Mais Alnasser VK_QUEUE_FAMILY_IGNORED, // deUint32 dstQueueFamilyIndex; 1715f8922e6b5eeea5be513b8682197c78295c5108a4Mais Alnasser *readImageBuffer, // VkBuffer buffer; 1716f8922e6b5eeea5be513b8682197c78295c5108a4Mais Alnasser 0u, // VkDeviceSize offset; 1717f8922e6b5eeea5be513b8682197c78295c5108a4Mais Alnasser imageSizeBytes // VkDeviceSize size; 1718f8922e6b5eeea5be513b8682197c78295c5108a4Mais Alnasser }; 1719f8922e6b5eeea5be513b8682197c78295c5108a4Mais Alnasser 1720f8922e6b5eeea5be513b8682197c78295c5108a4Mais Alnasser vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 0, (const VkBufferMemoryBarrier*)DE_NULL, 1, &imageBarrier); 172168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos vk.cmdCopyImageToBuffer(*cmdBuffer, *m_colorImage, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, *readImageBuffer, 1u, ©Params); 1722f8922e6b5eeea5be513b8682197c78295c5108a4Mais Alnasser vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_HOST_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 1, &bufferBarrier, 0, (const VkImageMemoryBarrier*)DE_NULL); 1723f8922e6b5eeea5be513b8682197c78295c5108a4Mais Alnasser 1724e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal VK_CHECK(vk.endCommandBuffer(*cmdBuffer)); 17258bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal 1726e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal VK_CHECK(vk.resetFences(vkDevice, 1, &m_fence.get())); 172768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_CHECK(vk.queueSubmit(queue, 1, &submitInfo, *m_fence)); 1728e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal VK_CHECK(vk.waitForFences(vkDevice, 1, &m_fence.get(), true, ~(0ull) /* infinity */)); 17298bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal 1730220bdc217a3c721edd01df7172366fbbfcf334b1Peter Gal invalidateMappedMemoryRange(vk, vkDevice, readImageBufferMemory->getMemory(), readImageBufferMemory->getOffset(), imageSizeBytes); 17318bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal 17320298a1c8dad636a147e387c26cfa578b7aef7973Peter Gal const tcu::TextureFormat resultFormat (tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8); 17330298a1c8dad636a147e387c26cfa578b7aef7973Peter Gal const tcu::ConstPixelBufferAccess resultAccess (resultFormat, m_renderSize.x(), m_renderSize.y(), 1, readImageBufferMemory->getHostPtr()); 1734ee06c6e532c43240a33f7f75e4762af6e179421aPeter Gal 1735ee06c6e532c43240a33f7f75e4762af6e179421aPeter Gal tcu::copy(result.getAccess(), resultAccess); 17368bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal } 1737e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal} 1738e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal 1739e8694a658f24ec536ab5373cca3fc898a07225cfPeter Galvoid ShaderRenderCaseInstance::computeVertexReference (tcu::Surface& result, const QuadGrid& quadGrid) 1740e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal{ 1741e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal // Buffer info. 1742fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal const int width = result.getWidth(); 1743fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal const int height = result.getHeight(); 1744fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal const int gridSize = quadGrid.getGridSize(); 1745fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal const int stride = gridSize + 1; 1746fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal const bool hasAlpha = true; // \todo [2015-09-07 elecro] add correct alpha check 1747e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal ShaderEvalContext evalCtx (quadGrid); 1748e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal 1749e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal // Evaluate color for each vertex. 1750e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal std::vector<tcu::Vec4> colors ((gridSize + 1) * (gridSize + 1)); 1751e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal for (int y = 0; y < gridSize+1; y++) 1752e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal for (int x = 0; x < gridSize+1; x++) 1753e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal { 1754fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal const float sx = (float)x / (float)gridSize; 1755fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal const float sy = (float)y / (float)gridSize; 1756fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal const int vtxNdx = ((y * (gridSize+1)) + x); 1757e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal 1758e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal evalCtx.reset(sx, sy); 1759e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal m_evaluator.evaluate(evalCtx); 1760e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal DE_ASSERT(!evalCtx.isDiscarded); // Discard is not available in vertex shader. 1761e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal tcu::Vec4 color = evalCtx.color; 1762e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal 1763e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal if (!hasAlpha) 1764e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal color.w() = 1.0f; 1765e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal 1766e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal colors[vtxNdx] = color; 1767e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal } 1768e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal 1769e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal // Render quads. 1770e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal for (int y = 0; y < gridSize; y++) 1771e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal for (int x = 0; x < gridSize; x++) 1772e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal { 1773fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal const float x0 = (float)x / (float)gridSize; 1774fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal const float x1 = (float)(x + 1) / (float)gridSize; 1775fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal const float y0 = (float)y / (float)gridSize; 1776fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal const float y1 = (float)(y + 1) / (float)gridSize; 1777fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal 1778fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal const float sx0 = x0 * (float)width; 1779fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal const float sx1 = x1 * (float)width; 1780fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal const float sy0 = y0 * (float)height; 1781fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal const float sy1 = y1 * (float)height; 1782fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal const float oosx = 1.0f / (sx1 - sx0); 1783fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal const float oosy = 1.0f / (sy1 - sy0); 1784fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal 1785fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal const int ix0 = deCeilFloatToInt32(sx0 - 0.5f); 1786fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal const int ix1 = deCeilFloatToInt32(sx1 - 0.5f); 1787fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal const int iy0 = deCeilFloatToInt32(sy0 - 0.5f); 1788fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal const int iy1 = deCeilFloatToInt32(sy1 - 0.5f); 1789fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal 1790fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal const int v00 = (y * stride) + x; 1791fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal const int v01 = (y * stride) + x + 1; 1792fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal const int v10 = ((y + 1) * stride) + x; 1793fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal const int v11 = ((y + 1) * stride) + x + 1; 1794fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal const tcu::Vec4 c00 = colors[v00]; 1795fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal const tcu::Vec4 c01 = colors[v01]; 1796fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal const tcu::Vec4 c10 = colors[v10]; 1797fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal const tcu::Vec4 c11 = colors[v11]; 1798e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal 1799e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal //printf("(%d,%d) -> (%f..%f, %f..%f) (%d..%d, %d..%d)\n", x, y, sx0, sx1, sy0, sy1, ix0, ix1, iy0, iy1); 1800e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal 1801e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal for (int iy = iy0; iy < iy1; iy++) 1802e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal for (int ix = ix0; ix < ix1; ix++) 1803e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal { 1804e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal DE_ASSERT(deInBounds32(ix, 0, width)); 1805e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal DE_ASSERT(deInBounds32(iy, 0, height)); 1806e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal 1807fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal const float sfx = (float)ix + 0.5f; 1808fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal const float sfy = (float)iy + 0.5f; 1809fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal const float fx1 = deFloatClamp((sfx - sx0) * oosx, 0.0f, 1.0f); 1810fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal const float fy1 = deFloatClamp((sfy - sy0) * oosy, 0.0f, 1.0f); 1811e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal 1812e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal // Triangle quad interpolation. 1813fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal const bool tri = fx1 + fy1 <= 1.0f; 1814fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal const float tx = tri ? fx1 : (1.0f-fx1); 1815fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal const float ty = tri ? fy1 : (1.0f-fy1); 1816e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal const tcu::Vec4& t0 = tri ? c00 : c11; 1817e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal const tcu::Vec4& t1 = tri ? c01 : c10; 1818e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal const tcu::Vec4& t2 = tri ? c10 : c01; 1819fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal const tcu::Vec4 color = t0 + (t1-t0)*tx + (t2-t0)*ty; 1820e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal 1821e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal result.setPixel(ix, iy, tcu::RGBA(color)); 1822e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal } 1823e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal } 1824e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal} 1825e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal 1826e8694a658f24ec536ab5373cca3fc898a07225cfPeter Galvoid ShaderRenderCaseInstance::computeFragmentReference (tcu::Surface& result, const QuadGrid& quadGrid) 1827e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal{ 18288bf213587134990dfac34fac8da2e3b3ee4c4f5aPeter Gal // Buffer info. 1829fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal const int width = result.getWidth(); 1830fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal const int height = result.getHeight(); 1831fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal const bool hasAlpha = true; // \todo [2015-09-07 elecro] add correct alpha check 1832e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal ShaderEvalContext evalCtx (quadGrid); 1833e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal 1834e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal // Render. 1835e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal for (int y = 0; y < height; y++) 1836e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal for (int x = 0; x < width; x++) 1837e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal { 1838fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal const float sx = ((float)x + 0.5f) / (float)width; 1839fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal const float sy = ((float)y + 0.5f) / (float)height; 1840e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal 1841e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal evalCtx.reset(sx, sy); 1842e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal m_evaluator.evaluate(evalCtx); 1843e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal // Select either clear color or computed color based on discarded bit. 1844e8694a658f24ec536ab5373cca3fc898a07225cfPeter Gal tcu::Vec4 color = evalCtx.isDiscarded ? m_clearColor : evalCtx.color; 1845e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal 1846e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal if (!hasAlpha) 1847e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal color.w() = 1.0f; 1848e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal 1849e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal result.setPixel(x, y, tcu::RGBA(color)); 1850e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal } 1851e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal} 1852e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal 1853e8694a658f24ec536ab5373cca3fc898a07225cfPeter Galbool ShaderRenderCaseInstance::compareImages (const tcu::Surface& resImage, const tcu::Surface& refImage, float errorThreshold) 1854e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal{ 1855e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal return tcu::fuzzyCompare(m_context.getTestContext().getLog(), "ComparisonResult", "Image comparison result", refImage, resImage, errorThreshold, tcu::COMPARE_LOG_RESULT); 1856e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal} 1857e66ed84fc26170ce1c07b0c3eeda03bf8e87bcdePeter Gal 1858c5a432af8404a1620230c8b0f31bc9a469196726Peter Gal} // sr 1859f520162e23ff1304a0d3a7148774b4d7f15056e8Peter Gal} // vkt 1860