120c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski#ifndef _VKTSYNCHRONIZATIONOPERATION_HPP 220c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski#define _VKTSYNCHRONIZATIONOPERATION_HPP 320c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski/*------------------------------------------------------------------------ 420c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski * Vulkan Conformance Tests 520c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski * ------------------------ 620c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski * 720c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski * Copyright (c) 2016 The Khronos Group Inc. 820c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski * 920c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski * Licensed under the Apache License, Version 2.0 (the "License"); 1020c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski * you may not use this file except in compliance with the License. 1120c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski * You may obtain a copy of the License at 1220c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski * 1320c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski * http://www.apache.org/licenses/LICENSE-2.0 1420c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski * 1520c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski * Unless required by applicable law or agreed to in writing, software 1620c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski * distributed under the License is distributed on an "AS IS" BASIS, 1720c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1820c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski * See the License for the specific language governing permissions and 1920c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski * limitations under the License. 2020c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski * 2120c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski *//*! 2220c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski * \file 2320c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski * \brief Synchronization operation abstraction 2420c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski *//*--------------------------------------------------------------------*/ 2520c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski 2620c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski#include "tcuDefs.hpp" 2720c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski#include "vkDefs.hpp" 2820c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski#include "vkPrograms.hpp" 2920c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski#include "vktTestCase.hpp" 3020c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski#include "vktSynchronizationUtil.hpp" 3120c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski#include "tcuVector.hpp" 3220c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski#include "deUniquePtr.hpp" 3320c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski#include <string> 3420c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski 3520c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowskinamespace vkt 3620c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski{ 3720c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowskinamespace synchronization 3820c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski{ 3920c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski 4020c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowskienum OperationName 4120c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski{ 4220c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski // Write operations 4320c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski OPERATION_NAME_WRITE_FILL_BUFFER, 4420c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski OPERATION_NAME_WRITE_UPDATE_BUFFER, 4520c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski OPERATION_NAME_WRITE_COPY_BUFFER, 4620c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski OPERATION_NAME_WRITE_COPY_BUFFER_TO_IMAGE, 4720c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski OPERATION_NAME_WRITE_COPY_IMAGE_TO_BUFFER, 4820c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski OPERATION_NAME_WRITE_COPY_IMAGE, 4920c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski OPERATION_NAME_WRITE_BLIT_IMAGE, 5020c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski OPERATION_NAME_WRITE_SSBO_VERTEX, 5120c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski OPERATION_NAME_WRITE_SSBO_TESSELLATION_CONTROL, 5220c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski OPERATION_NAME_WRITE_SSBO_TESSELLATION_EVALUATION, 5320c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski OPERATION_NAME_WRITE_SSBO_GEOMETRY, 5420c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski OPERATION_NAME_WRITE_SSBO_FRAGMENT, 5520c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski OPERATION_NAME_WRITE_SSBO_COMPUTE, 5620c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski OPERATION_NAME_WRITE_SSBO_COMPUTE_INDIRECT, 5720c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski OPERATION_NAME_WRITE_IMAGE_VERTEX, 5820c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski OPERATION_NAME_WRITE_IMAGE_TESSELLATION_CONTROL, 5920c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski OPERATION_NAME_WRITE_IMAGE_TESSELLATION_EVALUATION, 6020c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski OPERATION_NAME_WRITE_IMAGE_GEOMETRY, 6120c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski OPERATION_NAME_WRITE_IMAGE_FRAGMENT, 6220c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski OPERATION_NAME_WRITE_IMAGE_COMPUTE, 6320c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski OPERATION_NAME_WRITE_IMAGE_COMPUTE_INDIRECT, 6420c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski OPERATION_NAME_WRITE_CLEAR_COLOR_IMAGE, 6520c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski OPERATION_NAME_WRITE_CLEAR_DEPTH_STENCIL_IMAGE, 6620c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski OPERATION_NAME_WRITE_DRAW, 6720c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski OPERATION_NAME_WRITE_DRAW_INDEXED, 6820c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski OPERATION_NAME_WRITE_DRAW_INDIRECT, 6920c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski OPERATION_NAME_WRITE_DRAW_INDEXED_INDIRECT, 7020c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski OPERATION_NAME_WRITE_CLEAR_ATTACHMENTS, 7120c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski OPERATION_NAME_WRITE_INDIRECT_BUFFER_DRAW, 7220c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski OPERATION_NAME_WRITE_INDIRECT_BUFFER_DRAW_INDEXED, 7320c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski OPERATION_NAME_WRITE_INDIRECT_BUFFER_DISPATCH, 7420c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski 7520c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski // Read operations 7620c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski OPERATION_NAME_READ_COPY_BUFFER, 7720c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski OPERATION_NAME_READ_COPY_BUFFER_TO_IMAGE, 7820c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski OPERATION_NAME_READ_COPY_IMAGE_TO_BUFFER, 7920c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski OPERATION_NAME_READ_COPY_IMAGE, 8020c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski OPERATION_NAME_READ_BLIT_IMAGE, 8120c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski OPERATION_NAME_READ_UBO_VERTEX, 8220c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski OPERATION_NAME_READ_UBO_TESSELLATION_CONTROL, 8320c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski OPERATION_NAME_READ_UBO_TESSELLATION_EVALUATION, 8420c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski OPERATION_NAME_READ_UBO_GEOMETRY, 8520c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski OPERATION_NAME_READ_UBO_FRAGMENT, 8620c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski OPERATION_NAME_READ_UBO_COMPUTE, 8720c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski OPERATION_NAME_READ_UBO_COMPUTE_INDIRECT, 8820c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski OPERATION_NAME_READ_SSBO_VERTEX, 8920c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski OPERATION_NAME_READ_SSBO_TESSELLATION_CONTROL, 9020c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski OPERATION_NAME_READ_SSBO_TESSELLATION_EVALUATION, 9120c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski OPERATION_NAME_READ_SSBO_GEOMETRY, 9220c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski OPERATION_NAME_READ_SSBO_FRAGMENT, 9320c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski OPERATION_NAME_READ_SSBO_COMPUTE, 9420c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski OPERATION_NAME_READ_SSBO_COMPUTE_INDIRECT, 9520c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski OPERATION_NAME_READ_IMAGE_VERTEX, 9620c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski OPERATION_NAME_READ_IMAGE_TESSELLATION_CONTROL, 9720c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski OPERATION_NAME_READ_IMAGE_TESSELLATION_EVALUATION, 9820c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski OPERATION_NAME_READ_IMAGE_GEOMETRY, 9920c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski OPERATION_NAME_READ_IMAGE_FRAGMENT, 10020c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski OPERATION_NAME_READ_IMAGE_COMPUTE, 10120c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski OPERATION_NAME_READ_IMAGE_COMPUTE_INDIRECT, 10220c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski OPERATION_NAME_READ_INDIRECT_BUFFER_DRAW, 10320c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski OPERATION_NAME_READ_INDIRECT_BUFFER_DRAW_INDEXED, 10420c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski OPERATION_NAME_READ_INDIRECT_BUFFER_DISPATCH, 10520c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski OPERATION_NAME_READ_VERTEX_INPUT, 10620c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski}; 10720c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski 1089d154edc6a44aaccd0a913a17d44689cfe472ab2Mika Isojärvi// Similar to Context, but allows test instance to decide which resources are used by the operation. 1099d154edc6a44aaccd0a913a17d44689cfe472ab2Mika Isojärvi// E.g. this is needed when we want operation to work on a particular queue instead of the universal queue. 11020c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowskiclass OperationContext 11120c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski{ 11220c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowskipublic: 113d784ada312e9c0f2d0262a87402e2ff6c6160a66Boris Zanin OperationContext (Context& context, 114d784ada312e9c0f2d0262a87402e2ff6c6160a66Boris Zanin PipelineCacheData& pipelineCacheData); 1159d154edc6a44aaccd0a913a17d44689cfe472ab2Mika Isojärvi 116d784ada312e9c0f2d0262a87402e2ff6c6160a66Boris Zanin OperationContext (Context& context, 117d784ada312e9c0f2d0262a87402e2ff6c6160a66Boris Zanin PipelineCacheData& pipelineCacheData, 118d784ada312e9c0f2d0262a87402e2ff6c6160a66Boris Zanin const vk::DeviceInterface& vk, 119d784ada312e9c0f2d0262a87402e2ff6c6160a66Boris Zanin const vk::VkDevice device, 120d784ada312e9c0f2d0262a87402e2ff6c6160a66Boris Zanin vk::Allocator& allocator); 1219d154edc6a44aaccd0a913a17d44689cfe472ab2Mika Isojärvi 122d784ada312e9c0f2d0262a87402e2ff6c6160a66Boris Zanin OperationContext (const deUint32 apiVersion, 123d784ada312e9c0f2d0262a87402e2ff6c6160a66Boris Zanin const vk::InstanceInterface& vki, 124d784ada312e9c0f2d0262a87402e2ff6c6160a66Boris Zanin const vk::DeviceInterface& vkd, 125d784ada312e9c0f2d0262a87402e2ff6c6160a66Boris Zanin vk::VkPhysicalDevice physicalDevice, 126d784ada312e9c0f2d0262a87402e2ff6c6160a66Boris Zanin vk::VkDevice device, 127d784ada312e9c0f2d0262a87402e2ff6c6160a66Boris Zanin vk::Allocator& allocator, 128d784ada312e9c0f2d0262a87402e2ff6c6160a66Boris Zanin const std::vector<std::string>& deviceExtensions, 129d784ada312e9c0f2d0262a87402e2ff6c6160a66Boris Zanin vk::BinaryCollection& programCollection, 130d784ada312e9c0f2d0262a87402e2ff6c6160a66Boris Zanin PipelineCacheData& pipelineCacheData); 131d784ada312e9c0f2d0262a87402e2ff6c6160a66Boris Zanin 132d784ada312e9c0f2d0262a87402e2ff6c6160a66Boris Zanin const vk::InstanceInterface& getInstanceInterface (void) const { return m_vki; } 133d784ada312e9c0f2d0262a87402e2ff6c6160a66Boris Zanin const vk::DeviceInterface& getDeviceInterface (void) const { return m_vk; } 134d784ada312e9c0f2d0262a87402e2ff6c6160a66Boris Zanin vk::VkPhysicalDevice getPhysicalDevice (void) const { return m_physicalDevice; } 135d784ada312e9c0f2d0262a87402e2ff6c6160a66Boris Zanin vk::VkDevice getDevice (void) const { return m_device; } 136d784ada312e9c0f2d0262a87402e2ff6c6160a66Boris Zanin vk::Allocator& getAllocator (void) const { return m_allocator; } 137d784ada312e9c0f2d0262a87402e2ff6c6160a66Boris Zanin vk::BinaryCollection& getBinaryCollection (void) const { return m_progCollection; } 138d784ada312e9c0f2d0262a87402e2ff6c6160a66Boris Zanin PipelineCacheData& getPipelineCacheData (void) const { return m_pipelineCacheData; } 139d784ada312e9c0f2d0262a87402e2ff6c6160a66Boris Zanin const std::vector<std::string>& getDeviceExtensions (void) const { return m_deviceExtensions;} 140d784ada312e9c0f2d0262a87402e2ff6c6160a66Boris Zanin deUint32 getUsedApiVersion (void) const { return m_usedApiVersion; } 1419d154edc6a44aaccd0a913a17d44689cfe472ab2Mika Isojärvi 14220c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski 14320c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowskiprivate: 144d784ada312e9c0f2d0262a87402e2ff6c6160a66Boris Zanin const vk::InstanceInterface& m_vki; 145d784ada312e9c0f2d0262a87402e2ff6c6160a66Boris Zanin const vk::DeviceInterface& m_vk; 146d784ada312e9c0f2d0262a87402e2ff6c6160a66Boris Zanin const vk::VkPhysicalDevice m_physicalDevice; 147d784ada312e9c0f2d0262a87402e2ff6c6160a66Boris Zanin const vk::VkDevice m_device; 148d784ada312e9c0f2d0262a87402e2ff6c6160a66Boris Zanin vk::Allocator& m_allocator; 149d784ada312e9c0f2d0262a87402e2ff6c6160a66Boris Zanin vk::BinaryCollection& m_progCollection; 150d784ada312e9c0f2d0262a87402e2ff6c6160a66Boris Zanin PipelineCacheData& m_pipelineCacheData; 151d784ada312e9c0f2d0262a87402e2ff6c6160a66Boris Zanin const std::vector<std::string>& m_deviceExtensions; 152d784ada312e9c0f2d0262a87402e2ff6c6160a66Boris Zanin const deUint32 m_usedApiVersion; 15320c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski 1549d154edc6a44aaccd0a913a17d44689cfe472ab2Mika Isojärvi // Disabled 155d784ada312e9c0f2d0262a87402e2ff6c6160a66Boris Zanin OperationContext (const OperationContext&); 156d784ada312e9c0f2d0262a87402e2ff6c6160a66Boris Zanin OperationContext& operator= (const OperationContext&); 15720c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski}; 15820c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski 1599d154edc6a44aaccd0a913a17d44689cfe472ab2Mika Isojärvi// Common interface to images and buffers used by operations. 16020c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowskiclass Resource 16120c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski{ 16220c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowskipublic: 1639d154edc6a44aaccd0a913a17d44689cfe472ab2Mika Isojärvi Resource (OperationContext& context, 1649d154edc6a44aaccd0a913a17d44689cfe472ab2Mika Isojärvi const ResourceDescription& desc, 1659d154edc6a44aaccd0a913a17d44689cfe472ab2Mika Isojärvi const deUint32 usage, 1669d154edc6a44aaccd0a913a17d44689cfe472ab2Mika Isojärvi const vk::VkSharingMode sharingMode = vk::VK_SHARING_MODE_EXCLUSIVE, 1679d154edc6a44aaccd0a913a17d44689cfe472ab2Mika Isojärvi const std::vector<deUint32>& queueFamilyIndex = std::vector<deUint32>()); 1689d154edc6a44aaccd0a913a17d44689cfe472ab2Mika Isojärvi 1699d154edc6a44aaccd0a913a17d44689cfe472ab2Mika Isojärvi Resource (ResourceType type, 1709d154edc6a44aaccd0a913a17d44689cfe472ab2Mika Isojärvi vk::Move<vk::VkBuffer> buffer, 1719d154edc6a44aaccd0a913a17d44689cfe472ab2Mika Isojärvi de::MovePtr<vk::Allocation> allocation, 1729d154edc6a44aaccd0a913a17d44689cfe472ab2Mika Isojärvi vk::VkDeviceSize offset, 1739d154edc6a44aaccd0a913a17d44689cfe472ab2Mika Isojärvi vk::VkDeviceSize size); 1749d154edc6a44aaccd0a913a17d44689cfe472ab2Mika Isojärvi 1759d154edc6a44aaccd0a913a17d44689cfe472ab2Mika Isojärvi Resource (vk::Move<vk::VkImage> image, 1769d154edc6a44aaccd0a913a17d44689cfe472ab2Mika Isojärvi de::MovePtr<vk::Allocation> allocation, 1779d154edc6a44aaccd0a913a17d44689cfe472ab2Mika Isojärvi const vk::VkExtent3D& extent, 1789d154edc6a44aaccd0a913a17d44689cfe472ab2Mika Isojärvi vk::VkImageType imageType, 1799d154edc6a44aaccd0a913a17d44689cfe472ab2Mika Isojärvi vk::VkFormat format, 1809d154edc6a44aaccd0a913a17d44689cfe472ab2Mika Isojärvi vk::VkImageSubresourceRange subresourceRange, 1819d154edc6a44aaccd0a913a17d44689cfe472ab2Mika Isojärvi vk::VkImageSubresourceLayers subresourceLayers); 1829d154edc6a44aaccd0a913a17d44689cfe472ab2Mika Isojärvi 1839d154edc6a44aaccd0a913a17d44689cfe472ab2Mika Isojärvi ResourceType getType (void) const { return m_type; } 1849d154edc6a44aaccd0a913a17d44689cfe472ab2Mika Isojärvi const BufferResource& getBuffer (void) const { return m_bufferData; } 1859d154edc6a44aaccd0a913a17d44689cfe472ab2Mika Isojärvi const ImageResource& getImage (void) const { return m_imageData; } 1869d154edc6a44aaccd0a913a17d44689cfe472ab2Mika Isojärvi 1879d154edc6a44aaccd0a913a17d44689cfe472ab2Mika Isojärvi vk::VkDeviceMemory getMemory (void) const; 18820c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski 18920c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowskiprivate: 1909d154edc6a44aaccd0a913a17d44689cfe472ab2Mika Isojärvi const ResourceType m_type; 1919d154edc6a44aaccd0a913a17d44689cfe472ab2Mika Isojärvi de::MovePtr<Buffer> m_buffer; 1929d154edc6a44aaccd0a913a17d44689cfe472ab2Mika Isojärvi BufferResource m_bufferData; 1939d154edc6a44aaccd0a913a17d44689cfe472ab2Mika Isojärvi de::MovePtr<Image> m_image; 1949d154edc6a44aaccd0a913a17d44689cfe472ab2Mika Isojärvi ImageResource m_imageData; 19520c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski}; 19620c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski 1979d154edc6a44aaccd0a913a17d44689cfe472ab2Mika Isojärvi// \note Meaning of image layout is different for read and write types of operations: 1989d154edc6a44aaccd0a913a17d44689cfe472ab2Mika Isojärvi// read - the layout image must be in before being passed to the read operation 1999d154edc6a44aaccd0a913a17d44689cfe472ab2Mika Isojärvi// write - the layout image will be in after the write operation has finished 20020c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowskistruct SyncInfo 20120c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski{ 2029d154edc6a44aaccd0a913a17d44689cfe472ab2Mika Isojärvi vk::VkPipelineStageFlags stageMask; // pipeline stage where read/write takes place 2039d154edc6a44aaccd0a913a17d44689cfe472ab2Mika Isojärvi vk::VkAccessFlags accessMask; // type of access that is performed 2049d154edc6a44aaccd0a913a17d44689cfe472ab2Mika Isojärvi vk::VkImageLayout imageLayout; // src (for reads) or dst (for writes) image layout 20520c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski}; 20620c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski 20720c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowskistruct Data 20820c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski{ 20920c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski std::size_t size; 21020c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski const deUint8* data; 21120c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski}; 21220c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski 2139d154edc6a44aaccd0a913a17d44689cfe472ab2Mika Isojärvi// Abstract operation on a resource 2149d154edc6a44aaccd0a913a17d44689cfe472ab2Mika Isojärvi// \note Meaning of getData is different for read and write operations: 2159d154edc6a44aaccd0a913a17d44689cfe472ab2Mika Isojärvi// read - data actually read by the operation 2169d154edc6a44aaccd0a913a17d44689cfe472ab2Mika Isojärvi// write - expected data that operation was supposed to write 2179d154edc6a44aaccd0a913a17d44689cfe472ab2Mika Isojärvi// \note It's assumed that recordCommands is called only once (i.e. no multiple command buffers are using these commands). 21820c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowskiclass Operation 21920c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski{ 22020c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowskipublic: 2219d154edc6a44aaccd0a913a17d44689cfe472ab2Mika Isojärvi Operation (void) {} 2229d154edc6a44aaccd0a913a17d44689cfe472ab2Mika Isojärvi virtual ~Operation (void) {} 22320c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski 2249d154edc6a44aaccd0a913a17d44689cfe472ab2Mika Isojärvi virtual void recordCommands (const vk::VkCommandBuffer cmdBuffer) = 0; // commands that carry out this operation 2259d154edc6a44aaccd0a913a17d44689cfe472ab2Mika Isojärvi virtual SyncInfo getSyncInfo (void) const = 0; // data required to properly synchronize this operation 2269d154edc6a44aaccd0a913a17d44689cfe472ab2Mika Isojärvi virtual Data getData (void) const = 0; // get raw data that was written to or read from actual resource 22720c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski 22820c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowskiprivate: 2299d154edc6a44aaccd0a913a17d44689cfe472ab2Mika Isojärvi Operation (const Operation&); 2309d154edc6a44aaccd0a913a17d44689cfe472ab2Mika Isojärvi Operation& operator= (const Operation&); 23120c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski}; 23220c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski 2339d154edc6a44aaccd0a913a17d44689cfe472ab2Mika Isojärvi// A helper class to init programs and create the operation when context becomes available. 2349d154edc6a44aaccd0a913a17d44689cfe472ab2Mika Isojärvi// Throws OperationInvalidResourceError when resource and operation combination is not possible (e.g. buffer-specific op on an image). 23520c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowskiclass OperationSupport 23620c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski{ 23720c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowskipublic: 23820c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski OperationSupport (void) {} 23920c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski virtual ~OperationSupport (void) {} 24020c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski 24120c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski virtual deUint32 getResourceUsageFlags (void) const = 0; 24264f2647ef4a31e7e307c1fe22f7c6c688363c6d9Arkadiusz Sarwa virtual vk::VkQueueFlags getQueueFlags (const OperationContext& context) const = 0; 24320c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski virtual void initPrograms (vk::SourceCollections&) const {} //!< empty by default 24420c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski 24520c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski virtual de::MovePtr<Operation> build (OperationContext& context, Resource& resource) const = 0; 24620c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski 24720c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowskiprivate: 2489d154edc6a44aaccd0a913a17d44689cfe472ab2Mika Isojärvi OperationSupport (const OperationSupport&); 2499d154edc6a44aaccd0a913a17d44689cfe472ab2Mika Isojärvi OperationSupport& operator= (const OperationSupport&); 25020c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski}; 25120c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski 25220c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowskibool isResourceSupported (const OperationName opName, const ResourceDescription& resourceDesc); 25320c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowskide::MovePtr<OperationSupport> makeOperationSupport (const OperationName opName, const ResourceDescription& resourceDesc); 25420c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowskistd::string getOperationName (const OperationName opName); 25520c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski 25620c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski} // synchronization 25720c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski} // vkt 25820c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski 25920c5775979ddc85b7c32c6fb73c22ccf0f57f625Maciej Jesionowski#endif // _VKTSYNCHRONIZATIONOPERATION_HPP 260