CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutSign UpSign In
hrydgard

CoCalc provides the best real-time collaborative environment for Jupyter Notebooks, LaTeX documents, and SageMath, scalable from individual users to large groups and classes!

GitHub Repository: hrydgard/ppsspp
Path: blob/master/Common/GPU/Vulkan/VulkanBarrier.h
Views: 1401
1
#pragma once
2
3
#include <string>
4
#include <vector>
5
6
#include "Common/GPU/Vulkan/VulkanLoader.h"
7
#include "Common/Data/Collections/FastVec.h"
8
#include "Common/Data/Collections/TinySet.h"
9
10
class VulkanContext;
11
struct VKRImage;
12
13
class VulkanBarrierBatch {
14
public:
15
VulkanBarrierBatch() : imageBarriers_(4) {}
16
~VulkanBarrierBatch();
17
18
bool empty() const { return imageBarriers_.empty(); }
19
20
// TODO: Replace this with TransitionImage.
21
VkImageMemoryBarrier *Add(VkImage image, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags) {
22
srcStageMask_ |= srcStageMask;
23
dstStageMask_ |= dstStageMask;
24
dependencyFlags_ |= dependencyFlags;
25
VkImageMemoryBarrier &barrier = imageBarriers_.push_uninitialized();
26
// Initialize good defaults for the usual things.
27
barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
28
barrier.pNext = nullptr;
29
barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
30
barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
31
barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
32
barrier.subresourceRange.baseArrayLayer = 0;
33
barrier.subresourceRange.baseMipLevel = 0;
34
barrier.subresourceRange.layerCount = 1;
35
barrier.subresourceRange.levelCount = 1;
36
barrier.image = image;
37
return &barrier;
38
}
39
40
void TransitionImage(
41
VkImage image, int baseMip, int numMipLevels, int numLayers, VkImageAspectFlags aspectMask,
42
VkImageLayout oldImageLayout, VkImageLayout newImageLayout,
43
VkAccessFlags srcAccessMask, VkAccessFlags dstAccessMask,
44
VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask
45
);
46
47
// Automatically determines access and stage masks from layouts.
48
// Not universally usable, but works for PPSSPP's use.
49
void TransitionColorImageAuto(VkImage image, VkImageLayout *imageLayout, VkImageLayout newImageLayout, int baseMip, int numMipLevels, int numLayers);
50
void TransitionDepthStencilImageAuto(VkImage image, VkImageLayout *imageLayout, VkImageLayout newImageLayout, int baseMip, int numMipLevels, int numLayers);
51
52
void TransitionColorImageAuto(VKRImage *image, VkImageLayout newImageLayout);
53
void TransitionDepthStencilImageAuto(VKRImage *image, VkImageLayout newImageLayout);
54
55
void Flush(VkCommandBuffer cmd);
56
57
private:
58
FastVec<VkImageMemoryBarrier> imageBarriers_;
59
VkPipelineStageFlags srcStageMask_ = 0;
60
VkPipelineStageFlags dstStageMask_ = 0;
61
VkDependencyFlags dependencyFlags_ = 0;
62
};
63
64