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:
parent
8b209012b1
commit
fcc44dc107
1931
src/renderer_vk.cpp
1931
src/renderer_vk.cpp
File diff suppressed because it is too large
Load Diff
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user