Vulkan sync rewrite (#2402)

* Vulkan: allow setting image debug name

* Vulkan: record multiple frames ahead of the GPU

...instead of stalling on the CPU after each submit. Controllable with init.resolution.maxFrameLatency, same as the D3D11/12 backends.

* Vulkan: some additional checks at swapchain creation

* Vulkan: stall for screenshot

* Vulkan: move blit out of render pass

* Vulkan: deferred framebuffer deletion

* Vulkan: fix cubemap blit

* Cleanup

* Vulkan: storage image must have GENERAL layout and has no sampler

* Vulkan: use slightly more fine-grained barriers

* Vulkan: readTexture should stall, too

* Cleanup

* Vulkan: selective acquire

Don't acquire a swapchain image if no view renders to the backbuffer, avoiding stalls due to vsync or reaching the backbuffer limit

* Vulkan: deferred program and state cache deletion

* Vulkan: fix debug blit
This commit is contained in:
pezcode 2021-02-23 21:53:12 +01:00 committed by GitHub
parent 8b209012b1
commit fcc44dc107
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 1033 additions and 981 deletions

File diff suppressed because it is too large Load Diff

View File

@ -174,6 +174,7 @@
VK_IMPORT_DEVICE_FUNC(false, vkCmdCopyBuffer); \
VK_IMPORT_DEVICE_FUNC(false, vkCmdCopyBufferToImage); \
VK_IMPORT_DEVICE_FUNC(false, vkCmdCopyImage); \
VK_IMPORT_DEVICE_FUNC(false, vkCmdCopyImageToBuffer); \
VK_IMPORT_DEVICE_FUNC(false, vkCmdBlitImage); \
VK_IMPORT_DEVICE_FUNC(false, vkMapMemory); \
VK_IMPORT_DEVICE_FUNC(false, vkUnmapMemory); \
@ -330,7 +331,7 @@ VK_DESTROY
typename HashMap::iterator it = m_hashMap.find(_key);
if (it != m_hashMap.end() )
{
vkDestroy(it->second);
destroy(it->second);
m_hashMap.erase(it);
}
}
@ -339,7 +340,7 @@ VK_DESTROY
{
for (typename HashMap::iterator it = m_hashMap.begin(), itEnd = m_hashMap.end(); it != itEnd; ++it)
{
vkDestroy(it->second);
destroy(it->second);
}
m_hashMap.clear();
@ -351,6 +352,8 @@ VK_DESTROY
}
private:
void destroy(Ty handle);
typedef stl::unordered_map<uint64_t, Ty> HashMap;
HashMap m_hashMap;
};
@ -369,6 +372,7 @@ VK_DESTROY
void create(uint32_t _size, uint32_t _maxDescriptors);
void destroy();
void reset();
void flush();
VkDescriptorSet& getCurrentDS()
{
@ -413,7 +417,7 @@ VK_DESTROY
{
}
void create(uint32_t _size, void* _data, uint16_t _flags, bool _vertex, uint32_t _stride = 0);
void create(VkCommandBuffer _commandBuffer, uint32_t _size, void* _data, uint16_t _flags, bool _vertex, uint32_t _stride = 0);
void update(VkCommandBuffer _commandBuffer, uint32_t _offset, uint32_t _size, void* _data, bool _discard = false);
void destroy();
@ -434,7 +438,7 @@ VK_DESTROY
struct VertexBufferVK : public BufferVK
{
void create(uint32_t _size, void* _data, VertexLayoutHandle _layoutHandle, uint16_t _flags);
void create(VkCommandBuffer _commandBuffer, uint32_t _size, void* _data, VertexLayoutHandle _layoutHandle, uint16_t _flags);
VertexLayoutHandle m_layoutHandle;
};
@ -582,6 +586,20 @@ VK_DESTROY
bx::RingBufferControl m_control;
};
struct ReadbackVK
{
void create(VkImage _image, uint32_t _width, uint32_t _height, bimg::TextureFormat::Enum _format);
void destroy();
uint32_t pitch(uint8_t _mip = 0) const;
void copyImageToBuffer(VkCommandBuffer _commandBuffer, VkBuffer _buffer, VkImageLayout _layout, VkImageAspectFlags _aspect, uint8_t _mip = 0) const;
void readback(VkDeviceMemory _memory, VkDeviceSize _offset, void* _data, uint8_t _mip = 0) const;
VkImage m_image;
uint32_t m_width;
uint32_t m_height;
bimg::TextureFormat::Enum m_format;
};
struct TextureVK
{
TextureVK()
@ -600,13 +618,13 @@ VK_DESTROY
{
}
void* create(const Memory* _mem, uint64_t _flags, uint8_t _skip);
void* create(VkCommandBuffer _commandBuffer, const Memory* _mem, uint64_t _flags, uint8_t _skip);
void destroy();
void update(VkCommandPool commandPool, uint8_t _side, uint8_t _mip, const Rect& _rect, uint16_t _z, uint16_t _depth, uint16_t _pitch, const Memory* _mem);
void resolve(uint8_t _resolve);
void update(VkCommandBuffer _commandBuffer, uint8_t _side, uint8_t _mip, const Rect& _rect, uint16_t _z, uint16_t _depth, uint16_t _pitch, const Memory* _mem);
void resolve(VkCommandBuffer _commandBuffer, uint8_t _resolve);
void copyBufferToTexture(VkBuffer stagingBuffer, uint32_t bufferImageCopyCount, VkBufferImageCopy* bufferImageCopy);
void setImageMemoryBarrier(VkCommandBuffer commandBuffer, VkImageLayout newImageLayout);
void copyBufferToTexture(VkCommandBuffer _commandBuffer, VkBuffer _stagingBuffer, uint32_t _bufferImageCopyCount, VkBufferImageCopy* _bufferImageCopy);
void setImageMemoryBarrier(VkCommandBuffer _commandBuffer, VkImageLayout _newImageLayout);
void* m_directAccessPtr;
uint64_t m_flags;
@ -636,6 +654,8 @@ VK_DESTROY
VkImage m_singleMsaaImage;
VkDeviceMemory m_singleMsaaDeviceMem;
VkImageView m_singleMsaaImageView;
ReadbackVK m_readback;
};
struct FrameBufferVK
@ -657,7 +677,6 @@ VK_DESTROY
TextureHandle m_texture[BGFX_CONFIG_MAX_FRAME_BUFFER_ATTACHMENTS];
TextureHandle m_depth;
// IDXGISwapChain* m_swapChain;
uint32_t m_width;
uint32_t m_height;
uint16_t m_denseIdx;
@ -669,6 +688,50 @@ VK_DESTROY
VkRenderPass m_renderPass;
};
struct CommandQueueVK
{
void init(uint32_t _queueFamily, VkQueue _queue, uint32_t _numFramesInFlight);
void reset();
void shutdown();
VkCommandBuffer alloc();
void kick(VkSemaphore _waitSemaphore = VK_NULL_HANDLE, VkSemaphore _signalSemaphore = VK_NULL_HANDLE, bool _wait = false);
void finish(bool _finishAll = false);
void release(uint64_t _handle, VkObjectType _type);
void consume();
uint32_t m_queueFamily;
VkQueue m_queue;
uint32_t m_numFramesInFlight;
uint32_t m_currentFrameInFlight = 0;
uint32_t m_consumeIndex = 0;
VkCommandBuffer m_activeCommandBuffer;
VkSemaphore m_kickedSemaphore;
VkFence m_kickedFence;
struct CommandList
{
VkCommandPool m_commandPool = VK_NULL_HANDLE;
VkCommandBuffer m_commandBuffer = VK_NULL_HANDLE;
VkSemaphore m_semaphore = VK_NULL_HANDLE;
VkFence m_fence = VK_NULL_HANDLE;
};
CommandList m_commandList[BGFX_CONFIG_MAX_FRAME_LATENCY];
struct Resource
{
VkObjectType m_type;
uint64_t m_handle;
};
typedef stl::vector<Resource> ResourceArray;
ResourceArray m_release[BGFX_CONFIG_MAX_FRAME_LATENCY];
};
} /* namespace bgfx */ } // namespace vk
#endif // BGFX_RENDERER_VK_H_HEADER_GUARD