Divide Framework 0.1
A free and open-source 3D Framework under heavy development
Loading...
Searching...
No Matches
vkResources.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 VK_RESOURCES_H
34#define VK_RESOURCES_H
35
37
38#include "vkInitializers.h"
43
44namespace vke
45{
47};
48
49VK_DEFINE_HANDLE( VmaAllocator )
50
51namespace NS_GLIM {
52 enum class GLIM_ENUM : int;
53}; //namespace NS_GLIM
54
55// Custom define for better code readability
56#define VK_FLAGS_NONE 0
57
58// Default fence timeout in nanoseconds
59#define DEFAULT_FENCE_TIMEOUT 100000000000
60
61
62namespace Divide {
63
64class VKDevice;
65class vkShaderProgram;
66enum class DescriptorSetBindingType : U8;
67
69
70
71namespace Debug {
72 extern PFN_vkCmdBeginDebugUtilsLabelEXT vkCmdBeginDebugUtilsLabelEXT;
73 extern PFN_vkCmdEndDebugUtilsLabelEXT vkCmdEndDebugUtilsLabelEXT;
74 extern PFN_vkCmdInsertDebugUtilsLabelEXT vkCmdInsertDebugUtilsLabelEXT;
75 extern PFN_vkSetDebugUtilsObjectNameEXT vkSetDebugUtilsObjectNameEXT;
76 extern PFN_vkSetDebugUtilsObjectTagEXT vkSetDebugUtilsObjectTagEXT;
77
78 void SetObjectName(VkDevice device, uint64_t object, VkObjectType objectType, const char* name);
79 void SetObjectTag(VkDevice device, uint64_t object, const VkObjectType objectType, size_t tagSize, void* tagData, uint64_t tagName);
80};
81
83
84enum class QueueType : U8
85{
87 COMPUTE,
89 COUNT
90};
91
92struct VKQueue {
93 VkQueue _queue{};
94 VkCommandPool _pool{ VK_NULL_HANDLE };
97};
98
100{
101 VkPipelineBindPoint _bindPoint{ VK_PIPELINE_BIND_POINT_MAX_ENUM };
103 VkPipeline _vkPipeline{ VK_NULL_HANDLE };
104 VkPipeline _vkPipelineWireframe{ VK_NULL_HANDLE };
105 VkPipelineLayout _vkPipelineLayout{ VK_NULL_HANDLE };
108 VkDescriptorSetLayout* _descriptorSetlayout{ nullptr };
109 bool _isValid{false};
110};
111
113{
114 std::vector<VkPipelineShaderStageCreateInfo> _shaderStages;
115 VkPipelineVertexInputStateCreateInfo _vertexInputInfo;
116 VkPipelineInputAssemblyStateCreateInfo _inputAssembly;
117 VkViewport _viewport;
118 VkRect2D _scissor;
119 VkPipelineRasterizationStateCreateInfo _rasterizer;
120 eastl::fixed_vector<VkPipelineColorBlendAttachmentState, to_base( RTColourAttachmentSlot::COUNT ), false> _colorBlendAttachments;
121 VkPipelineMultisampleStateCreateInfo _multisampling;
122 VkPipelineLayout _pipelineLayout;
123 VkPipelineDepthStencilStateCreateInfo _depthStencil;
124 VkPipelineTessellationStateCreateInfo _tessellation;
125
126 VkPipeline build_pipeline( VkDevice device, VkPipelineCache pipelineCache, bool graphics );
127
128 private:
129 VkPipeline build_compute_pipeline( VkDevice device, VkPipelineCache pipelineCache );
130 VkPipeline build_graphics_pipeline( VkDevice device, VkPipelineCache pipelineCache );
131};
132
134{
135 VkPipeline _pipeline{ VK_NULL_HANDLE };
136 VkPipelineLayout _layout{ VK_NULL_HANDLE };
137};
138
140{
143};
144
145using DynamicBindings = eastl::fixed_vector<DynamicBinding, MAX_BINDINGS_PER_DESCRIPTOR_SET, false>;
146
148{
149 static constexpr U8 BUFFER_COUNT = 4u;
150
151 using FlushCallback = std::function<void( VkCommandBuffer cmd, QueueType queue, U32 queueIndex )>;
152 explicit VKImmediateCmdContext( VKDevice& context, QueueType type );
154
155 void flushCommandBuffer( FlushCallback&& function, const char* scopeName );
156
157 private:
158
162
163 VkCommandPool _commandPool;
165
166
167 std::array<VkFence, BUFFER_COUNT> _bufferFences;
168 std::array<VkCommandBuffer, BUFFER_COUNT> _commandBuffers;
171};
172
174
176{
177 VmaAllocator* _allocator{ nullptr };
179};
180
182{
185 vke::DescriptorAllocatorPool_uptr _allocatorPool{ nullptr };
186};
187
189{
191 VKSwapChain_uptr _swapChain{ nullptr };
192 VkSurfaceKHR _surface{ VK_NULL_HANDLE }; // Vulkan window surface
193
194 VkExtent2D _windowExtents{};
195 bool _skipEndFrame{ false };
196
198 {
201 bool _isSet{ false };
202
204};
205
207{
208 void init( VKDevice* device, VKPerWindowState* mainWindow );
209 void reset();
210 void setDefaultState();
211
213
214 VKDevice* _device{ nullptr };
216
217
221
222 VkPipelineRenderingCreateInfo _pipelineRenderInfo{};
223
224 VkBuffer _drawIndirectBuffer{ VK_NULL_HANDLE };
226
228
232
235
237
239 bool _pushConstantsValid{ false };
240
243
244
245 private:
246 std::array<VKImmediateCmdContext_uptr, to_base( QueueType::COUNT )> _cmdContexts{ nullptr };
247};
248
250
251
253{
255
256 enum class Flags : U8
257 {
259 COUNT = 1
260 };
261
262 void push( QueuedItem&& function );
263 void flush( VkDevice device, bool force = false );
264 void onFrameEnd();
265
266 [[nodiscard]] bool empty() const;
267
269 std::deque<std::pair<QueuedItem, U8>> _deletionQueue;
270 PROPERTY_RW( U32, flags, 0u );
271};
272
274{
276 {
277 VkDeviceSize srcOffset{ 0u };
278 VkDeviceSize dstOffset{ 0u };
279 VkDeviceSize size{ 0u };
280 VkBuffer srcBuffer{ VK_NULL_HANDLE };
281 VkBuffer dstBuffer{ VK_NULL_HANDLE };
282
283 VkAccessFlags2 dstAccessMask{ VK_ACCESS_2_NONE };
284 VkPipelineStageFlags2 dstStageMask{ VK_PIPELINE_STAGE_2_NONE };
285 };
286
287 mutable Mutex _lock;
288 std::deque<TransferRequest> _requests;
289 std::atomic_bool _dirty;
290};
291
292//ref: SaschaWillems / Vulkan / VulkanTools
293inline std::string VKErrorString(VkResult errorCode)
294{
295 switch (errorCode)
296 {
297#define STR(r) case VK_ ##r: return #r
298 STR(NOT_READY);
299 STR(TIMEOUT);
300 STR(EVENT_SET);
301 STR(EVENT_RESET);
302 STR(INCOMPLETE);
303 STR(ERROR_OUT_OF_HOST_MEMORY);
304 STR(ERROR_OUT_OF_DEVICE_MEMORY);
305 STR(ERROR_INITIALIZATION_FAILED);
306 STR(ERROR_DEVICE_LOST);
307 STR(ERROR_MEMORY_MAP_FAILED);
308 STR(ERROR_LAYER_NOT_PRESENT);
309 STR(ERROR_EXTENSION_NOT_PRESENT);
310 STR(ERROR_FEATURE_NOT_PRESENT);
311 STR(ERROR_INCOMPATIBLE_DRIVER);
312 STR(ERROR_TOO_MANY_OBJECTS);
313 STR(ERROR_FORMAT_NOT_SUPPORTED);
314 STR(ERROR_SURFACE_LOST_KHR);
315 STR(ERROR_NATIVE_WINDOW_IN_USE_KHR);
316 STR(SUBOPTIMAL_KHR);
317 STR(ERROR_OUT_OF_DATE_KHR);
318 STR(ERROR_INCOMPATIBLE_DISPLAY_KHR);
319 STR(ERROR_VALIDATION_FAILED_EXT);
320 STR(ERROR_INVALID_SHADER_NV);
321#undef STR
322 default:
323 return "UNKNOWN_ERROR";
324 }
325}
326#ifndef VK_CHECK
327#define VK_CHECK(x) \
328 do \
329 { \
330 VkResult err = x; \
331 if (err) \
332 { \
333 Console::errorfn(LOCALE_STR("ERROR_GENERIC_VK"), VKErrorString(err).c_str());\
334 DIVIDE_UNEXPECTED_CALL(); \
335 } \
336 } while (0)
337#endif //VK_CHECK
338
339#ifndef VK_PROFILE
340#define VK_PROFILE(FUNCTION, ...) \
341do \
342{ \
343 PROFILE_VK_EVENT(#FUNCTION); \
344 FUNCTION(__VA_ARGS__); \
345} while ( 0 )
346
347#endif //VK_PROFILE
349 {
350 VkQueryType _queryType { VK_QUERY_TYPE_MAX_ENUM };
351 VkQueryPipelineStatisticFlagBits _statistics { VK_QUERY_PIPELINE_STATISTIC_FLAG_BITS_MAX_ENUM };
352 bool _accurate{false};
353 };
354 extern std::array<VkBlendFactor, to_base(BlendProperty::COUNT)> vkBlendTable;
355 extern std::array<VkBlendOp, to_base(BlendOperation::COUNT)> vkBlendOpTable;
356 extern std::array<VkCompareOp, to_base(ComparisonFunction::COUNT)> vkCompareFuncTable;
357 extern std::array<VkStencilOp, to_base(StencilOperation::COUNT)> vkStencilOpTable;
358 extern std::array<VkCullModeFlags, to_base(CullMode::COUNT)> vkCullModeTable;
359 extern std::array<VkPolygonMode, to_base(FillMode::COUNT)> vkFillModeTable;
360 extern std::array<VkImageType, to_base(TextureType::COUNT)> vkTextureTypeTable;
361 extern std::array<VkImageViewType, to_base(TextureType::COUNT)> vkTextureViewTypeTable;
362 extern std::array<VkPrimitiveTopology, to_base(PrimitiveTopology::COUNT)> vkPrimitiveTypeTable;
363 extern std::array<VkSamplerAddressMode, to_base(TextureWrap::COUNT)> vkWrapTable;
364 extern std::array<VkShaderStageFlagBits, to_base(ShaderType::COUNT)> vkShaderStageTable;
365 extern std::array<VulkanQueryType, to_base( QueryType::COUNT )> vkQueryTypeTable;
366
367 struct GenericDrawCommand;
368namespace VKUtil {
370
372 void SubmitRenderCommand( const GenericDrawCommand& drawCommand,
373 const VkCommandBuffer commandBuffer,
374 bool indexed );
375
376
377 void OnStartup(VkDevice device);
378
379 [[nodiscard]] VkFormat InternalFormat(GFXImageFormat baseFormat, GFXDataFormat dataType, GFXImagePacking packing) noexcept;
380 [[nodiscard]] VkFormat InternalFormat(GFXDataFormat format, U8 componentCount, bool normalized) noexcept;
381 [[nodiscard]] VkDescriptorType vkDescriptorType(DescriptorSetBindingType type, bool isPushDescriptor) noexcept;
382}; //namespace VKUtil
383}; //namespace Divide
384
385inline bool operator==(const VkDescriptorSetLayoutBinding& lhs, const VkDescriptorSetLayoutBinding& rhs) noexcept
386{
387 return lhs.binding == rhs.binding &&
388 lhs.descriptorType == rhs.descriptorType &&
389 lhs.descriptorCount == rhs.descriptorCount &&
390 lhs.stageFlags == rhs.stageFlags &&
391 lhs.pImmutableSamplers == rhs.pImmutableSamplers;
392}
393
394inline bool operator!=( const VkDescriptorSetLayoutBinding& lhs, const VkDescriptorSetLayoutBinding& rhs ) noexcept
395{
396 return lhs.binding != rhs.binding ||
397 lhs.descriptorType != rhs.descriptorType ||
398 lhs.descriptorCount != rhs.descriptorCount ||
399 lhs.stageFlags != rhs.stageFlags ||
400 lhs.pImmutableSamplers != rhs.pImmutableSamplers;
401}
402
403inline bool operator==(const VkViewport& lhs, const VkViewport& rhs) noexcept
404{
405 return lhs.x == rhs.x &&
406 lhs.y == rhs.y &&
407 lhs.width == rhs.width &&
408 lhs.height == rhs.height &&
409 lhs.minDepth == rhs.minDepth &&
410 lhs.maxDepth == rhs.maxDepth;
411}
412inline bool operator!=(const VkViewport& lhs, const VkViewport& rhs) noexcept
413{
414 return lhs.x != rhs.x ||
415 lhs.y != rhs.y ||
416 lhs.width != rhs.width ||
417 lhs.height != rhs.height ||
418 lhs.minDepth != rhs.minDepth ||
419 lhs.maxDepth != rhs.maxDepth;
420}
421inline bool operator==(const VkRect2D& lhs, const VkRect2D& rhs) noexcept
422{
423 return lhs.offset.x == rhs.offset.x &&
424 lhs.offset.y == rhs.offset.y &&
425 lhs.extent.width == rhs.extent.width &&
426 lhs.extent.height == rhs.extent.height;
427}
428inline bool operator!=(const VkRect2D& lhs, const VkRect2D& rhs) noexcept
429{
430 return lhs.offset.x != rhs.offset.x ||
431 lhs.offset.y != rhs.offset.y ||
432 lhs.extent.width != rhs.extent.width ||
433 lhs.extent.height != rhs.extent.height;
434}
435#endif //VK_RESOURCES_H
VkFlags VkShaderStageFlags
Definition: GLSLToSPIRV.h:37
#define FWD_DECLARE_MANAGED_STRUCT(T)
#define FWD_DECLARE_MANAGED_CLASS(T)
constexpr U8 MAX_DEBUG_SCOPE_DEPTH
Maximum number of nested debug scopes we support in the renderer.
Definition: config.h:147
void SetObjectName(VkDevice device, uint64_t object, VkObjectType objectType, const char *name)
Definition: vkResources.cpp:35
PFN_vkSetDebugUtilsObjectNameEXT vkSetDebugUtilsObjectNameEXT
Definition: vkResources.cpp:31
PFN_vkSetDebugUtilsObjectTagEXT vkSetDebugUtilsObjectTagEXT
Definition: vkResources.cpp:32
PFN_vkCmdInsertDebugUtilsLabelEXT vkCmdInsertDebugUtilsLabelEXT
Definition: vkResources.cpp:30
PFN_vkCmdBeginDebugUtilsLabelEXT vkCmdBeginDebugUtilsLabelEXT
Definition: vkResources.cpp:28
PFN_vkCmdEndDebugUtilsLabelEXT vkCmdEndDebugUtilsLabelEXT
Definition: vkResources.cpp:29
void SetObjectTag(VkDevice device, uint64_t object, const VkObjectType objectType, size_t tagSize, void *tagData, uint64_t tagName)
Definition: vkResources.cpp:48
VkDescriptorType vkDescriptorType(DescriptorSetBindingType type, bool isPushDescriptor) noexcept
VkFormat InternalFormat(GFXImageFormat baseFormat, GFXDataFormat dataType, GFXImagePacking packing) noexcept
void SubmitRenderCommand(const GenericDrawCommand &drawCommand, const VkCommandBuffer commandBuffer, bool indexed)
Note: If internal format is not GL_NONE, an indexed draw is issued!
Definition: vkResources.cpp:67
void OnStartup(VkDevice device)
constexpr U8 k_invalidSyncID
Definition: vkResources.h:369
Handle console commands that start with a forward slash.
Definition: AIProcessor.cpp:7
std::array< VkBlendFactor, to_base(BlendProperty::COUNT)> vkBlendTable
Definition: vkResources.cpp:13
DELEGATE_STD< Ret, Args... > DELEGATE
std::array< VkPolygonMode, to_base(FillMode::COUNT)> vkFillModeTable
Definition: vkResources.cpp:18
std::array< VkBlendOp, to_base(BlendOperation::COUNT)> vkBlendOpTable
Definition: vkResources.cpp:14
std::mutex Mutex
Definition: SharedMutex.h:40
eastl::fixed_vector< DynamicBinding, MAX_BINDINGS_PER_DESCRIPTOR_SET, false > DynamicBindings
Definition: vkResources.h:145
std::array< VkImageViewType, to_base(TextureType::COUNT)> vkTextureViewTypeTable
Definition: vkResources.cpp:20
uint8_t U8
@ COUNT
Place all properties above this.
std::array< VkCompareOp, to_base(ComparisonFunction::COUNT)> vkCompareFuncTable
Definition: vkResources.cpp:15
@ COUNT
Place all properties above this.
@ COUNT
Place all properties above this.
DescriptorSetBindingType
@ COUNT
Place all properties above this.
std::array< VkImageType, to_base(TextureType::COUNT)> vkTextureTypeTable
Definition: vkResources.cpp:19
constexpr RenderTargetID INVALID_RENDER_TARGET_ID
@ COUNT
Place all properties above this.
constexpr U8 U8_MAX
constexpr U32 U32_MAX
std::string VKErrorString(VkResult errorCode)
Definition: vkResources.h:293
std::array< VkSamplerAddressMode, to_base(TextureWrap::COUNT)> vkWrapTable
Definition: vkResources.cpp:22
std::array< VkPrimitiveTopology, to_base(PrimitiveTopology::COUNT)> vkPrimitiveTypeTable
Definition: vkResources.cpp:21
constexpr U32 INVALID_VK_QUEUE_INDEX
Definition: vkResources.h:82
std::array< VkCullModeFlags, to_base(CullMode::COUNT)> vkCullModeTable
Definition: vkResources.cpp:17
@ COUNT
Place all properties above this.
U32 RenderTargetID
std::array< VulkanQueryType, to_base(QueryType::COUNT)> vkQueryTypeTable
Definition: vkResources.cpp:24
uint32_t U32
uint64_t U64
constexpr T toBit(const T X)
Converts an arbitrary positive integer value to a bitwise value used for masks.
std::array< VkShaderStageFlagBits, to_base(ShaderType::COUNT)> vkShaderStageTable
Definition: vkResources.cpp:23
std::array< VkStencilOp, to_base(StencilOperation::COUNT)> vkStencilOpTable
Definition: vkResources.cpp:16
constexpr auto to_base(const Type value) -> Type
GLIM_ENUM
The enum holding all important GLIM configuration values.
Definition: Declarations.h:17
vkShaderProgram * _program
Definition: vkResources.h:102
VkPipeline _vkPipelineWireframe
Definition: vkResources.h:104
PrimitiveTopology _topology
Definition: vkResources.h:106
VkDescriptorSetLayout * _descriptorSetlayout
Definition: vkResources.h:108
VkShaderStageFlags _stageFlags
Definition: vkResources.h:107
VkPipelineLayout _vkPipelineLayout
Definition: vkResources.h:105
VkPipelineBindPoint _bindPoint
Definition: vkResources.h:101
vke::DescriptorAllocatorPool_uptr _allocatorPool
Definition: vkResources.h:185
vke::DescriptorAllocatorHandle _handle
Definition: vkResources.h:184
VkPipelineLayout _pipelineLayout
Definition: vkResources.h:122
VkPipelineMultisampleStateCreateInfo _multisampling
Definition: vkResources.h:121
VkPipelineInputAssemblyStateCreateInfo _inputAssembly
Definition: vkResources.h:116
std::vector< VkPipelineShaderStageCreateInfo > _shaderStages
Definition: vkResources.h:114
VkPipeline build_graphics_pipeline(VkDevice device, VkPipelineCache pipelineCache)
Definition: VKWrapper.cpp:305
VkPipelineTessellationStateCreateInfo _tessellation
Definition: vkResources.h:124
eastl::fixed_vector< VkPipelineColorBlendAttachmentState, to_base(RTColourAttachmentSlot::COUNT), false > _colorBlendAttachments
Definition: vkResources.h:120
VkPipelineVertexInputStateCreateInfo _vertexInputInfo
Definition: vkResources.h:115
VkPipelineDepthStencilStateCreateInfo _depthStencil
Definition: vkResources.h:123
VkPipeline build_compute_pipeline(VkDevice device, VkPipelineCache pipelineCache)
Definition: VKWrapper.cpp:288
VkPipelineRasterizationStateCreateInfo _rasterizer
Definition: vkResources.h:119
VkPipeline build_pipeline(VkDevice device, VkPipelineCache pipelineCache, bool graphics)
Definition: VKWrapper.cpp:278
DELEGATE< void, VkDevice > QueuedItem
Definition: vkResources.h:254
std::deque< std::pair< QueuedItem, U8 > > _deletionQueue
Definition: vkResources.h:269
void push(QueuedItem &&function)
Definition: VKWrapper.cpp:378
PROPERTY_RW(U32, flags, 0u)
void flush(VkDevice device, bool force=false)
Definition: VKWrapper.cpp:384
static constexpr U8 BUFFER_COUNT
Definition: vkResources.h:149
void flushCommandBuffer(FlushCallback &&function, const char *scopeName)
Definition: VKWrapper.cpp:459
std::function< void(VkCommandBuffer cmd, QueueType queue, U32 queueIndex)> FlushCallback
Definition: vkResources.h:151
std::array< VkCommandBuffer, BUFFER_COUNT > _commandBuffers
Definition: vkResources.h:168
std::array< VkFence, BUFFER_COUNT > _bufferFences
Definition: vkResources.h:167
struct Divide::VKPerWindowState::VKDynamicState _activeState
DisplayWindow * _window
Definition: vkResources.h:190
VKSwapChain_uptr _swapChain
Definition: vkResources.h:191
QueueType _type
Definition: vkResources.h:96
VkQueue _queue
Definition: vkResources.h:93
VkCommandPool _pool
Definition: vkResources.h:94
VkBuffer _drawIndirectBuffer
Definition: vkResources.h:224
CompiledPipeline _pipeline
Definition: vkResources.h:220
DebugScope _lastInsertedDebugMessage
Definition: vkResources.h:234
VKImmediateCmdContext * IMCmdContext(QueueType type) const
Definition: VKWrapper.cpp:532
VkShaderStageFlags _pipelineStageMask
Definition: vkResources.h:227
vec2< U16 > _activeRenderTargetDimensions
Definition: vkResources.h:231
size_t _drawIndirectBufferOffset
Definition: vkResources.h:225
std::array< VKImmediateCmdContext_uptr, to_base(QueueType::COUNT)> _cmdContexts
Definition: vkResources.h:246
RenderTargetID _activeRenderTargetID
Definition: vkResources.h:229
void init(VKDevice *device, VKPerWindowState *mainWindow)
Definition: VKWrapper.cpp:498
std::array< DescriptorAllocator, to_base(DescriptorSetUsage::COUNT)> _descriptorAllocators
Definition: vkResources.h:219
VKPerWindowState * _activeWindow
Definition: vkResources.h:215
VMAAllocatorInstance _allocatorInstance
Definition: vkResources.h:218
DebugScope _debugScope[Config::MAX_DEBUG_SCOPE_DEPTH]
Definition: vkResources.h:233
VkPipelineRenderingCreateInfo _pipelineRenderInfo
Definition: vkResources.h:222
std::deque< TransferRequest > _requests
Definition: vkResources.h:288
std::atomic_bool _dirty
Definition: vkResources.h:289
Definition: vkResources.h:134
VkPipeline _pipeline
Definition: vkResources.h:135
VkPipelineLayout _layout
Definition: vkResources.h:136
VkQueryPipelineStatisticFlagBits _statistics
Definition: vkResources.h:351
bool operator!=(const VkDescriptorSetLayoutBinding &lhs, const VkDescriptorSetLayoutBinding &rhs) noexcept
Definition: vkResources.h:394
#define STR(r)
#define VK_FLAGS_NONE
Definition: vkResources.h:56
VK_DEFINE_HANDLE(VmaAllocator) namespace NS_GLIM
Definition: vkResources.h:49
bool operator==(const VkDescriptorSetLayoutBinding &lhs, const VkDescriptorSetLayoutBinding &rhs) noexcept
Definition: vkResources.h:385