Project
Loading...
Searching...
No Matches
GPUDisplayBackendVulkan.h
Go to the documentation of this file.
1// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3// All rights not expressly granted are reserved.
4//
5// This software is distributed under the terms of the GNU General Public
6// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7//
8// In applying this license CERN does not waive the privileges and immunities
9// granted to it by virtue of its status as an Intergovernmental Organization
10// or submit itself to any jurisdiction.
11
14
15#ifndef GPUDISPLAYBACKENDVULKAN_H
16#define GPUDISPLAYBACKENDVULKAN_H
17
18#include "GPUDisplayBackend.h"
19#include <vulkan/vulkan.hpp>
20
21#include <vector>
22#include <unordered_map>
23#include <utils/vecpod.h>
24
25namespace o2::gpu
26{
27
29{
30 public:
33
34 uint32_t DepthBits() override;
35
36 protected:
38 vk::SurfaceCapabilitiesKHR capabilities;
39 std::vector<vk::SurfaceFormatKHR> formats;
40 std::vector<vk::PresentModeKHR> presentModes;
41 };
42 struct VulkanBuffer {
43 vk::Buffer buffer;
44 vk::DeviceMemory memory;
45 size_t size = 0;
46 int32_t deviceMemory;
47 };
48 struct VulkanImage {
49 vk::Image image;
50 vk::ImageView view;
51 vk::DeviceMemory memory;
52 uint32_t sizex = 0, sizey = 0;
53 vk::Format format;
54 };
56 std::unique_ptr<char[]> data;
57 float x0, x1, y0, y1;
58 };
61 size_t nVertices;
62 float color[4];
63 };
64
65 uint32_t drawVertices(const vboList& v, const drawType t) override;
66 void ActivateColor(std::array<float, 4>& color) override;
67 void SetVSync(bool enable) override { mMustUpdateSwapChain = true; };
68 void setDepthBuffer() override {};
69 bool backendNeedRedraw() override;
70 int32_t InitBackendA() override;
71 void ExitBackendA() override;
72 void loadDataToGPU(size_t totalVertizes) override;
73 void prepareDraw(const hmm_mat4& proj, const hmm_mat4& view, bool requestScreenshot, bool toMixBuffer, float includeMixImage) override;
74 void finishDraw(bool doScreenshot, bool toMixBuffer, float includeMixImage) override;
75 void finishFrame(bool doScreenshot, bool toMixBuffer, float includeMixImage) override;
76 void prepareText() override;
77 void finishText() override;
78 void mixImages(vk::CommandBuffer cmdBuffer, float mixSlaveImage);
79 void setMixDescriptor(int32_t descriptorIndex, int32_t imageIndex);
80 void pointSizeFactor(float factor) override;
81 void lineWidthFactor(float factor) override;
82 void resizeScene(uint32_t width, uint32_t height) override;
83 float getYFactor() const override { return -1.0f; }
84 int32_t getMaxMSAA() const override { return mMaxMSAAsupported; }
85
86 double checkDevice(vk::PhysicalDevice device, const std::vector<const char*>& reqDeviceExtensions);
87 vk::Extent2D chooseSwapExtent(const vk::SurfaceCapabilitiesKHR& capabilities);
88 void transitionImageLayout(vk::CommandBuffer commandBuffer, vk::Image image, vk::Format format, vk::ImageLayout oldLayout, vk::ImageLayout newLayout);
89 VulkanBuffer createBuffer(size_t size, const void* srcData = nullptr, vk::BufferUsageFlags type = vk::BufferUsageFlagBits::eVertexBuffer, int32_t deviceMemory = 1);
90 void writeToBuffer(VulkanBuffer& buffer, size_t size, const void* srcData);
92 VulkanImage createImage(uint32_t sizex, uint32_t sizey, const void* srcData = nullptr, size_t srcSize = 0, vk::Format format = vk::Format::eR8G8B8A8Srgb);
93 void writeToImage(VulkanImage& image, const void* srcData, size_t srcSize);
95 void clearVertexBuffers();
96
97 void startFillCommandBuffer(vk::CommandBuffer& commandBuffer, uint32_t imageIndex, bool toMixBuffer = false);
98 void endFillCommandBuffer(vk::CommandBuffer& commandBuffer);
99 vk::CommandBuffer getSingleTimeCommandBuffer();
100 void submitSingleTimeCommandBuffer(vk::CommandBuffer commandBuffer);
101 void readImageToPixels(vk::Image image, vk::ImageLayout layout, std::vector<char>& pixels);
102 void downsampleToFramebuffer(vk::CommandBuffer& commandBuffer);
103
104 void updateSwapChainDetails(const vk::PhysicalDevice& device);
106 void createDevice();
107 void createShaders();
112 void createSwapChain(bool forScreenshot = false, bool forMixing = false);
113 void createOffscreenBuffers(bool forScreenshot = false, bool forMixing = false);
114 void createPipeline();
115 void clearDevice();
116 void clearShaders();
117 void clearTextureSampler();
118 void clearCommandBuffers();
122 void clearSwapChain();
123 void clearPipeline();
124 void recreateRendering(bool forScreenshot = false, bool forMixing = false);
126
127 void addFontSymbol(int32_t symbol, int32_t sizex, int32_t sizey, int32_t offsetx, int32_t offsety, int32_t advance, void* data) override;
128 void initializeTextDrawing() override;
129 void OpenGLPrint(const char* s, float x, float y, float* color, float scale) override;
130
134
135 vk::Instance mInstance;
136 vk::DebugUtilsMessengerEXT mDebugMessenger;
137 vk::PhysicalDevice mPhysicalDevice;
138 vk::Device mDevice;
139 vk::Queue mGraphicsQueue;
140 vk::SurfaceKHR mSurface;
141 vk::SurfaceFormatKHR mSurfaceFormat;
142 vk::PresentModeKHR mPresentMode;
143 vk::SwapchainKHR mSwapChain;
145 std::vector<vk::Image> mSwapChainImages;
146 std::vector<vk::ImageView> mSwapChainImageViews;
147 std::vector<vk::ImageView*> mRenderTargetView;
148 std::vector<VulkanImage> mMSAAImages;
149 std::vector<VulkanImage> mDownsampleImages;
150 std::vector<VulkanImage> mZImages;
151 std::vector<VulkanImage> mMixImages;
152 std::unordered_map<std::string, vk::ShaderModule> mShaders;
153 vk::PipelineLayout mPipelineLayout;
154 vk::PipelineLayout mPipelineLayoutTexture;
155 vk::RenderPass mRenderPass;
156 vk::RenderPass mRenderPassText;
157 vk::RenderPass mRenderPassTexture;
158 std::vector<vk::Pipeline> mPipelines;
159 std::vector<vk::Framebuffer> mFramebuffers;
160 std::vector<vk::Framebuffer> mFramebuffersText;
161 std::vector<vk::Framebuffer> mFramebuffersTexture;
162 vk::CommandPool mCommandPool;
163
166 uint32_t mImageCount = 0;
167 uint32_t mFramesInFlight = 0;
168 int32_t mCurrentFrame = 0;
169 uint32_t mCurrentImageIndex = 0;
170 int32_t mCurrentBufferSet = 0;
171 vk::CommandBuffer mCurrentCommandBuffer;
173
174 std::vector<vk::CommandBuffer> mCommandBuffers;
175 std::vector<vk::CommandBuffer> mCommandBuffersDownsample;
176 std::vector<vk::CommandBuffer> mCommandBuffersText;
177 std::vector<vk::CommandBuffer> mCommandBuffersTexture;
178 std::vector<vk::CommandBuffer> mCommandBuffersMix;
179 std::vector<bool> mCommandBufferUpToDate;
180 std::vector<vk::Semaphore> mImageAvailableSemaphore;
181 std::vector<vk::Semaphore> mRenderFinishedSemaphore;
182 std::vector<vk::Semaphore> mTextFinishedSemaphore;
183 std::vector<vk::Semaphore> mMixFinishedSemaphore;
184 std::vector<vk::Semaphore> mDownsampleFinishedSemaphore;
185 std::vector<vk::Fence> mInFlightFence;
186 std::vector<VulkanBuffer> mUniformBuffersMat[3];
187 std::vector<VulkanBuffer> mUniformBuffersCol[3];
188 std::vector<vk::DescriptorSet> mDescriptorSets[3];
189 vk::DescriptorSetLayout mUniformDescriptor;
190 vk::DescriptorSetLayout mUniformDescriptorTexture;
191 vk::DescriptorPool mDescriptorPool;
192
195
196 std::vector<FontSymbolVulkan> mFontSymbols;
198 std::vector<VulkanBuffer> mFontVertexBuffer;
199 std::vector<TextDrawCommand> mTextDrawCommands;
200 vk::Sampler mTextureSampler;
202 bool mHasDrawnText = false;
203
205 vk::SampleCountFlagBits mMSAASampleCount = vk::SampleCountFlagBits::e16;
206 uint32_t mMaxMSAAsupported = 0;
207 bool mZActive = false;
208 bool mZSupported = false;
209 bool mStencilSupported = false;
211 bool mDownsampleFSAA = false;
213
215
217};
218} // namespace o2::gpu
219
220#endif
void OpenGLPrint(const char *s, float x, float y, float *color, float scale) override
std::vector< vk::CommandBuffer > mCommandBuffersMix
std::vector< vk::CommandBuffer > mCommandBuffers
void setMixDescriptor(int32_t descriptorIndex, int32_t imageIndex)
std::vector< vk::Semaphore > mRenderFinishedSemaphore
void prepareDraw(const hmm_mat4 &proj, const hmm_mat4 &view, bool requestScreenshot, bool toMixBuffer, float includeMixImage) override
std::vector< vk::Pipeline > mPipelines
void resizeScene(uint32_t width, uint32_t height) override
void submitSingleTimeCommandBuffer(vk::CommandBuffer commandBuffer)
std::vector< VulkanImage > mDownsampleImages
void writeToBuffer(VulkanBuffer &buffer, size_t size, const void *srcData)
std::vector< vk::ImageView > mSwapChainImageViews
void pointSizeFactor(float factor) override
std::vector< FontSymbolVulkan > mFontSymbols
std::vector< vk::ImageView * > mRenderTargetView
std::vector< vk::Framebuffer > mFramebuffersTexture
void addFontSymbol(int32_t symbol, int32_t sizex, int32_t sizey, int32_t offsetx, int32_t offsety, int32_t advance, void *data) override
std::vector< vk::Framebuffer > mFramebuffersText
void mixImages(vk::CommandBuffer cmdBuffer, float mixSlaveImage)
void recreateRendering(bool forScreenshot=false, bool forMixing=false)
std::vector< VulkanBuffer > mFontVertexBuffer
void endFillCommandBuffer(vk::CommandBuffer &commandBuffer)
uint32_t drawVertices(const vboList &v, const drawType t) override
std::vector< vk::CommandBuffer > mCommandBuffersDownsample
void ActivateColor(std::array< float, 4 > &color) override
std::vector< vk::Semaphore > mMixFinishedSemaphore
std::vector< vk::Semaphore > mTextFinishedSemaphore
void transitionImageLayout(vk::CommandBuffer commandBuffer, vk::Image image, vk::Format format, vk::ImageLayout oldLayout, vk::ImageLayout newLayout)
std::vector< VulkanBuffer > mUniformBuffersMat[3]
double checkDevice(vk::PhysicalDevice device, const std::vector< const char * > &reqDeviceExtensions)
void updateSwapChainDetails(const vk::PhysicalDevice &device)
void finishDraw(bool doScreenshot, bool toMixBuffer, float includeMixImage) override
void writeToImage(VulkanImage &image, const void *srcData, size_t srcSize)
std::vector< vk::DescriptorSet > mDescriptorSets[3]
vk::DescriptorSetLayout mUniformDescriptorTexture
void downsampleToFramebuffer(vk::CommandBuffer &commandBuffer)
vk::Extent2D chooseSwapExtent(const vk::SurfaceCapabilitiesKHR &capabilities)
std::vector< vk::Framebuffer > mFramebuffers
void readImageToPixels(vk::Image image, vk::ImageLayout layout, std::vector< char > &pixels)
VulkanImage createImage(uint32_t sizex, uint32_t sizey, const void *srcData=nullptr, size_t srcSize=0, vk::Format format=vk::Format::eR8G8B8A8Srgb)
std::vector< vk::Semaphore > mDownsampleFinishedSemaphore
std::vector< TextDrawCommand > mTextDrawCommands
std::unordered_map< std::string, vk::ShaderModule > mShaders
void finishFrame(bool doScreenshot, bool toMixBuffer, float includeMixImage) override
void createSwapChain(bool forScreenshot=false, bool forMixing=false)
std::vector< vk::Semaphore > mImageAvailableSemaphore
void startFillCommandBuffer(vk::CommandBuffer &commandBuffer, uint32_t imageIndex, bool toMixBuffer=false)
std::vector< vk::CommandBuffer > mCommandBuffersTexture
vk::DebugUtilsMessengerEXT mDebugMessenger
VulkanBuffer createBuffer(size_t size, const void *srcData=nullptr, vk::BufferUsageFlags type=vk::BufferUsageFlagBits::eVertexBuffer, int32_t deviceMemory=1)
void createOffscreenBuffers(bool forScreenshot=false, bool forMixing=false)
void lineWidthFactor(float factor) override
std::vector< vk::CommandBuffer > mCommandBuffersText
void loadDataToGPU(size_t totalVertizes) override
std::vector< VulkanBuffer > mUniformBuffersCol[3]
std::tuple< uint32_t, uint32_t, int32_t > vboList
GLeglImageOES image
Definition glcorearb.h:4021
GLint GLenum GLint x
Definition glcorearb.h:403
GLuint buffer
Definition glcorearb.h:655
GLsizeiptr size
Definition glcorearb.h:659
GLuint color
Definition glcorearb.h:1272
const GLdouble * v
Definition glcorearb.h:832
GLint GLsizei GLsizei height
Definition glcorearb.h:270
GLint GLsizei width
Definition glcorearb.h:270
GLint GLint GLsizei GLint GLenum GLenum type
Definition glcorearb.h:275
GLboolean * data
Definition glcorearb.h:298
GLint GLint GLsizei GLint GLenum GLenum const void * pixels
Definition glcorearb.h:275
GLboolean enable
Definition glcorearb.h:3991
GLint GLint GLsizei GLint GLenum format
Definition glcorearb.h:275
typename std::vector< T, vecpod_allocator< T > > vecpod
Definition vecpod.h:31