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