Divide Framework 0.1
A free and open-source 3D Framework under heavy development
Loading...
Searching...
No Matches
VKWrapper.h
Go to the documentation of this file.
1/*
2 Copyright (c) 2018 DIVIDE-Studio
3 Copyright (c) 2009 Ionut Cava
4
5 This file is part of DIVIDE Framework.
6
7 Permission is hereby granted, free of charge, to any person obtaining a copy
8 of this software
9 and associated documentation files (the "Software"), to deal in the Software
10 without restriction,
11 including without limitation the rights to use, copy, modify, merge, publish,
12 distribute, sublicense,
13 and/or sell copies of the Software, and to permit persons to whom the
14 Software is furnished to do so,
15 subject to the following conditions:
16
17 The above copyright notice and this permission notice shall be included in
18 all copies or substantial portions of the Software.
19
20 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21 IMPLIED,
22 INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
23 PARTICULAR PURPOSE AND NONINFRINGEMENT.
24 IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
25 DAMAGES OR OTHER LIABILITY,
26 WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
27 IN CONNECTION WITH THE SOFTWARE
28 OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
29
30 */
31
32#pragma once
33#ifndef DVD_VK_WRAPPER_H_
34#define DVD_VK_WRAPPER_H_
35
36#include "vkDevice.h"
37#include "vkSwapChain.h"
39
44
45#include "vkDescriptors.h"
46
47namespace Divide
48{
49
50class Pipeline;
51enum class ShaderResult : U8;
52
54{
55VkCommandBuffer* _cmdBuffer = nullptr;
56};
57
58class VK_API final : public RenderAPIWrapper {
59public:
60 static constexpr VkPipelineStageFlagBits2 ALL_SHADER_STAGES = VK_PIPELINE_STAGE_2_VERTEX_SHADER_BIT |
61 VK_PIPELINE_STAGE_2_TESSELLATION_CONTROL_SHADER_BIT |
62 VK_PIPELINE_STAGE_2_TESSELLATION_EVALUATION_SHADER_BIT |
63 VK_PIPELINE_STAGE_2_GEOMETRY_SHADER_BIT |
64 VK_PIPELINE_STAGE_2_FRAGMENT_SHADER_BIT |
65 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT;
66public:
67
68 VK_API(GFXDevice& context) noexcept;
69
70 [[nodiscard]] VKDevice* getDevice() { return _device.get(); }
71
72 [[nodiscard]] GFXDevice& context() noexcept { return _context; }
73 [[nodiscard]] const GFXDevice& context() const noexcept { return _context; }
74
75protected:
76 [[nodiscard]] VkCommandBuffer getCurrentCommandBuffer() const noexcept;
77
78 void idle(bool fast) noexcept override;
79
80 [[nodiscard]] bool drawToWindow( DisplayWindow& window ) override;
81 void onRenderThreadLoopStart() override;
82 void onRenderThreadLoopEnd() override;
83 void prepareFlushWindow( DisplayWindow& window ) override;
84 void flushWindow( DisplayWindow& window ) override;
85 [[nodiscard]] bool frameStarted() override;
86 [[nodiscard]] bool frameEnded() override;
87
88 [[nodiscard]] ErrorCode initRenderingAPI(I32 argc, char** argv, Configuration& config) noexcept override;
89 void closeRenderingAPI() override;
90 void preFlushCommandBuffer( Handle<GFX::CommandBuffer> commandBuffer) override;
91 void flushCommand( GFX::CommandBase* cmd ) noexcept override;
92 void postFlushCommandBuffer( Handle<GFX::CommandBuffer> commandBuffer) noexcept override;
93 bool setViewportInternal(const Rect<I32>& newViewport) noexcept override;
94 bool setScissorInternal(const Rect<I32>& newScissor) noexcept override;
95
96 void onThreadCreated(const std::thread::id& threadID, bool isMainRenderThread ) noexcept override;
97 void initDescriptorSets() override;
98
99 [[nodiscard]] RenderTarget_uptr newRT( const RenderTargetDescriptor& descriptor ) const override;
100 [[nodiscard]] GenericVertexData_ptr newGVD( U32 ringBufferLength, const std::string_view name ) const override;
101 [[nodiscard]] ShaderBuffer_uptr newSB( const ShaderBufferDescriptor& descriptor ) const override;
102
103private:
104 void initStatePerWindow( VKPerWindowState& windowState );
105 void destroyStatePerWindow( VKPerWindowState& windowState );
106 void recreateSwapChain( VKPerWindowState& windowState );
107
108 bool setViewportInternal( const Rect<I32>& newViewport, VkCommandBuffer cmdBuffer ) noexcept;
109 bool setScissorInternal( const Rect<I32>& newScissor, VkCommandBuffer cmdBuffer ) noexcept;
111 void destroyPipeline( CompiledPipeline& pipeline, bool defer );
113 VkDescriptorSetLayout createLayoutFromBindings( const DescriptorSetUsage usage, const ShaderProgram::BindingsPerSetArray& bindings, DynamicBindings& dynamicBindings );
114
115 ShaderResult bindPipeline(const Pipeline& pipeline, VkCommandBuffer cmdBuffer);
116 void bindDynamicState(const RenderStateBlock& currentState, const RTBlendStates& blendStates, VkCommandBuffer cmdBuffer) noexcept;
117 [[nodiscard]] bool bindShaderResources( const DescriptorSetEntries& descriptorSetEntries ) override;
118
119
120
121 static bool Draw(const GenericDrawCommand& cmd, VkCommandBuffer cmdBuffer);
122public:
123 [[nodiscard]] static VKStateTracker& GetStateTracker() noexcept;
124 [[nodiscard]] static VkSampler GetSamplerHandle(SamplerDescriptor sampler, size_t& samplerHashInOut);
125
126 static void RegisterCustomAPIDelete(DELEGATE<void, VkDevice>&& cbk, bool isResourceTransient);
127 static void RegisterTransferRequest(const VKTransferQueue::TransferRequest& request);
128 static void FlushBufferTransferRequests( VkCommandBuffer cmdBuffer );
129 static void FlushBufferTransferRequests( );
130 static void SubmitTransferRequest(const VKTransferQueue::TransferRequest& request, VkCommandBuffer cmd);
131
132 static void InsertDebugMessage(VkCommandBuffer cmdBuffer, const char* message, U32 id = U32_MAX);
133 static void PushDebugMessage(VkCommandBuffer cmdBuffer, const char* message, U32 id = U32_MAX);
134 static void PopDebugMessage(VkCommandBuffer cmdBuffer);
135
136 static void OnShaderReloaded( vkShaderProgram* program);
137private:
139 vkb::Instance _vkbInstance;
140 VKDevice_uptr _device{ nullptr };
141 VmaAllocator _allocator{VK_NULL_HANDLE};
142 VkPipelineCache _pipelineCache{ VK_NULL_HANDLE };
143 VkDescriptorSet _dummyDescriptorSet{VK_NULL_HANDLE};
144
146 DescriptorLayoutCache_uptr _descriptorLayoutCache{nullptr};
147
150
151 std::array<VkDescriptorSet, to_base( DescriptorSetUsage::COUNT )> _descriptorSets;
153 std::array<VkDescriptorSetLayout, to_base( DescriptorSetUsage::COUNT )> _descriptorSetLayouts;
154
155
156 bool _uniformsNeedLock{ false };
157
158private:
160
167
168 static eastl::stack<vkShaderProgram*> s_reloadedShaders;
169
170public:
172 {
173 bool _d24s8Supported{false};
174 bool _d32s8Supported{false};
175 bool _d24x8Supported{false};
176 bool _d32FSupported{false};
177 };
178
185};
186
187}; // namespace Divide
188
189#endif //DVD_VK_WRAPPER_H_
char * argv[]
Definition: main.cpp:8
Rough around the edges Adapter pattern abstracting the actual rendering API and access to the GPU.
Definition: GFXDevice.h:215
Renderer Programming Interface.
static DepthFormatInformation s_depthFormatInformation
Definition: VKWrapper.h:184
static bool s_hasDescriptorBufferSupport
Definition: VKWrapper.h:181
static void PushDebugMessage(VkCommandBuffer cmdBuffer, const char *message, U32 id=U32_MAX)
Definition: VKWrapper.cpp:3112
static void RegisterTransferRequest(const VKTransferQueue::TransferRequest &request)
Definition: VKWrapper.cpp:549
static void PopDebugMessage(VkCommandBuffer cmdBuffer)
Definition: VKWrapper.cpp:3131
bool drawToWindow(DisplayWindow &window) override
Definition: VKWrapper.cpp:571
void closeRenderingAPI() override
Definition: VKWrapper.cpp:1178
static void RegisterCustomAPIDelete(DELEGATE< void, VkDevice > &&cbk, bool isResourceTransient)
Definition: VKWrapper.cpp:537
static bool s_hasValidationFeaturesSupport
Definition: VKWrapper.h:183
static bool s_hasDynamicBlendStateSupport
Definition: VKWrapper.h:182
bool frameStarted() override
Definition: VKWrapper.cpp:660
static eastl::stack< vkShaderProgram * > s_reloadedShaders
Definition: VKWrapper.h:168
void flushCommand(GFX::CommandBase *cmd) noexcept override
Definition: VKWrapper.cpp:2215
void idle(bool fast) noexcept override
Definition: VKWrapper.cpp:566
static SamplerObjectMap s_samplerMap
Definition: VKWrapper.h:162
static constexpr VkPipelineStageFlagBits2 ALL_SHADER_STAGES
Definition: VKWrapper.h:60
hashMap< size_t, CompiledPipeline > _compiledPipelines
Definition: VKWrapper.h:149
static VKStateTracker & GetStateTracker() noexcept
Definition: VKWrapper.cpp:3088
static void OnShaderReloaded(vkShaderProgram *program)
Definition: VKWrapper.cpp:3078
static VKDeletionQueue s_transientDeleteQueue
Definition: VKWrapper.h:164
void destroyStatePerWindow(VKPerWindowState &windowState)
Definition: VKWrapper.cpp:752
std::array< VkDescriptorSetLayout, to_base(DescriptorSetUsage::COUNT)> _descriptorSetLayouts
Definition: VKWrapper.h:153
bool setScissorInternal(const Rect< I32 > &newScissor) noexcept override
Definition: VKWrapper.cpp:2968
void onThreadCreated(const std::thread::id &threadID, bool isMainRenderThread) noexcept override
Definition: VKWrapper.cpp:3074
GenericVertexData_ptr newGVD(U32 ringBufferLength, const std::string_view name) const override
Definition: VKWrapper.cpp:3203
ErrorCode initRenderingAPI(I32 argc, char **argv, Configuration &config) noexcept override
Definition: VKWrapper.cpp:764
bool bindShaderResources(const DescriptorSetEntries &descriptorSetEntries) override
Definition: VKWrapper.cpp:1320
void destroyPipeline(CompiledPipeline &pipeline, bool defer)
Definition: VKWrapper.cpp:1129
static void SubmitTransferRequest(const VKTransferQueue::TransferRequest &request, VkCommandBuffer cmd)
Definition: VKWrapper.cpp:2149
VkCommandBuffer getCurrentCommandBuffer() const noexcept
Definition: VKWrapper.cpp:561
GFXDevice & _context
Definition: VKWrapper.h:138
void postFlushCommandBuffer(Handle< GFX::CommandBuffer > commandBuffer) noexcept override
Definition: VKWrapper.cpp:2929
void preFlushCommandBuffer(Handle< GFX::CommandBuffer > commandBuffer) override
Definition: VKWrapper.cpp:2917
static VKStateTracker s_stateTracker
Definition: VKWrapper.h:163
bool _uniformsNeedLock
Definition: VKWrapper.h:156
std::array< VkDescriptorSet, to_base(DescriptorSetUsage::COUNT)> _descriptorSets
Definition: VKWrapper.h:151
static void FlushBufferTransferRequests()
Definition: VKWrapper.cpp:2180
void prepareFlushWindow(DisplayWindow &window) override
Definition: VKWrapper.cpp:618
const GFXDevice & context() const noexcept
Definition: VKWrapper.h:73
vkb::Instance _vkbInstance
Definition: VKWrapper.h:139
std::array< DynamicBindings, to_base(DescriptorSetUsage::COUNT)> _descriptorDynamicBindings
Definition: VKWrapper.h:152
bool setViewportInternal(const Rect< I32 > &newViewport) noexcept override
Definition: VKWrapper.cpp:2939
void flushPushConstantsLocks()
Definition: VKWrapper.cpp:1985
hashMap< I64, VKPerWindowState > _perWindowState
Definition: VKWrapper.h:148
bool frameEnded() override
Definition: VKWrapper.cpp:680
static bool s_hasDebugMarkerSupport
Definition: VKWrapper.h:179
VKDevice * getDevice()
Definition: VKWrapper.h:70
void initStatePerWindow(VKPerWindowState &windowState)
Definition: VKWrapper.cpp:739
VkDescriptorSetLayout createLayoutFromBindings(const DescriptorSetUsage usage, const ShaderProgram::BindingsPerSetArray &bindings, DynamicBindings &dynamicBindings)
Definition: VKWrapper.cpp:2984
GFXDevice & context() noexcept
Definition: VKWrapper.h:72
VkPipelineCache _pipelineCache
Definition: VKWrapper.h:142
static VkSampler GetSamplerHandle(SamplerDescriptor sampler, size_t &samplerHashInOut)
Return the Vulkan sampler object's handle for the given hash value.
Definition: VKWrapper.cpp:3145
ShaderResult bindPipeline(const Pipeline &pipeline, VkCommandBuffer cmdBuffer)
Definition: VKWrapper.cpp:1774
RenderTarget_uptr newRT(const RenderTargetDescriptor &descriptor) const override
Definition: VKWrapper.cpp:3198
GFX::MemoryBarrierCommand _uniformsMemCommand
Definition: VKWrapper.h:145
void onRenderThreadLoopStart() override
Definition: VKWrapper.cpp:610
void bindDynamicState(const RenderStateBlock &currentState, const RTBlendStates &blendStates, VkCommandBuffer cmdBuffer) noexcept
Definition: VKWrapper.cpp:1608
static bool s_hasPushDescriptorSupport
Definition: VKWrapper.h:180
void flushWindow(DisplayWindow &window) override
Definition: VKWrapper.cpp:622
static VKTransferQueue s_transferQueue
Definition: VKWrapper.h:166
DescriptorLayoutCache_uptr _descriptorLayoutCache
Definition: VKWrapper.h:146
void initDescriptorSets() override
Definition: VKWrapper.cpp:3028
ShaderBuffer_uptr newSB(const ShaderBufferDescriptor &descriptor) const override
Definition: VKWrapper.cpp:3208
hashMap< size_t, VkSampler, NoHash< size_t > > SamplerObjectMap
Definition: VKWrapper.h:159
VkDescriptorSet _dummyDescriptorSet
Definition: VKWrapper.h:143
static SharedMutex s_samplerMapLock
Definition: VKWrapper.h:161
void recreateSwapChain(VKPerWindowState &windowState)
Definition: VKWrapper.cpp:710
VKDevice_uptr _device
Definition: VKWrapper.h:140
static VKDeletionQueue s_deviceDeleteQueue
Definition: VKWrapper.h:165
VmaAllocator _allocator
Definition: VKWrapper.h:141
void onRenderThreadLoopEnd() override
Definition: VKWrapper.cpp:614
static void InsertDebugMessage(VkCommandBuffer cmdBuffer, const char *message, U32 id=U32_MAX)
Definition: VKWrapper.cpp:3093
void destroyPipelineCache()
Definition: VKWrapper.cpp:1168
Handle console commands that start with a forward slash.
Definition: AIProcessor.cpp:7
std::array< DescriptorSetEntry, to_base(DescriptorSetUsage::COUNT)> DescriptorSetEntries
DELEGATE_STD< Ret, Args... > DELEGATE
void Draw()
eastl::fixed_vector< DynamicBinding, MAX_BINDINGS_PER_DESCRIPTOR_SET, false > DynamicBindings
Definition: vkResources.h:145
int32_t I32
uint8_t U8
std::shared_mutex SharedMutex
Definition: SharedMutex.h:43
hashAlg::unordered_map< K, V, HashFun, Predicate > hashMap
Definition: HashMap.h:55
constexpr U32 U32_MAX
DescriptorSetUsage
uint32_t U32
constexpr auto to_base(const Type value) -> Type
VkCommandBuffer * _cmdBuffer
Definition: VKWrapper.h:55