diff options
| -rw-r--r-- | src/video_core/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | src/video_core/buffer_cache/buffer_cache.h | 1 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_fence_manager.cpp | 101 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_fence_manager.h | 74 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_rasterizer.cpp | 16 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_rasterizer.h | 2 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/wrapper.cpp | 18 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/wrapper.h | 20 |
8 files changed, 222 insertions, 12 deletions
diff --git a/src/video_core/CMakeLists.txt b/src/video_core/CMakeLists.txt index 9a3f568f9..55047dde4 100644 --- a/src/video_core/CMakeLists.txt +++ b/src/video_core/CMakeLists.txt | |||
| @@ -177,6 +177,8 @@ if (ENABLE_VULKAN) | |||
| 177 | renderer_vulkan/vk_descriptor_pool.h | 177 | renderer_vulkan/vk_descriptor_pool.h |
| 178 | renderer_vulkan/vk_device.cpp | 178 | renderer_vulkan/vk_device.cpp |
| 179 | renderer_vulkan/vk_device.h | 179 | renderer_vulkan/vk_device.h |
| 180 | renderer_vulkan/vk_fence_manager.cpp | ||
| 181 | renderer_vulkan/vk_fence_manager.h | ||
| 180 | renderer_vulkan/vk_graphics_pipeline.cpp | 182 | renderer_vulkan/vk_graphics_pipeline.cpp |
| 181 | renderer_vulkan/vk_graphics_pipeline.h | 183 | renderer_vulkan/vk_graphics_pipeline.h |
| 182 | renderer_vulkan/vk_image.cpp | 184 | renderer_vulkan/vk_image.cpp |
diff --git a/src/video_core/buffer_cache/buffer_cache.h b/src/video_core/buffer_cache/buffer_cache.h index 54c75ca4e..372545080 100644 --- a/src/video_core/buffer_cache/buffer_cache.h +++ b/src/video_core/buffer_cache/buffer_cache.h | |||
| @@ -19,6 +19,7 @@ | |||
| 19 | 19 | ||
| 20 | #include "common/alignment.h" | 20 | #include "common/alignment.h" |
| 21 | #include "common/common_types.h" | 21 | #include "common/common_types.h" |
| 22 | #include "common/logging/log.h" | ||
| 22 | #include "core/core.h" | 23 | #include "core/core.h" |
| 23 | #include "core/memory.h" | 24 | #include "core/memory.h" |
| 24 | #include "core/settings.h" | 25 | #include "core/settings.h" |
diff --git a/src/video_core/renderer_vulkan/vk_fence_manager.cpp b/src/video_core/renderer_vulkan/vk_fence_manager.cpp new file mode 100644 index 000000000..a2b2bc408 --- /dev/null +++ b/src/video_core/renderer_vulkan/vk_fence_manager.cpp | |||
| @@ -0,0 +1,101 @@ | |||
| 1 | // Copyright 2020 yuzu Emulator Project | ||
| 2 | // Licensed under GPLv2 or any later version | ||
| 3 | // Refer to the license.txt file included. | ||
| 4 | |||
| 5 | #include <memory> | ||
| 6 | #include <thread> | ||
| 7 | |||
| 8 | #include "video_core/renderer_vulkan/vk_buffer_cache.h" | ||
| 9 | #include "video_core/renderer_vulkan/vk_device.h" | ||
| 10 | #include "video_core/renderer_vulkan/vk_fence_manager.h" | ||
| 11 | #include "video_core/renderer_vulkan/vk_scheduler.h" | ||
| 12 | #include "video_core/renderer_vulkan/vk_texture_cache.h" | ||
| 13 | #include "video_core/renderer_vulkan/wrapper.h" | ||
| 14 | |||
| 15 | namespace Vulkan { | ||
| 16 | |||
| 17 | InnerFence::InnerFence(const VKDevice& device, VKScheduler& scheduler, u32 payload, bool is_stubbed) | ||
| 18 | : VideoCommon::FenceBase(payload, is_stubbed), device{device}, scheduler{scheduler} {} | ||
| 19 | |||
| 20 | InnerFence::InnerFence(const VKDevice& device, VKScheduler& scheduler, GPUVAddr address, | ||
| 21 | u32 payload, bool is_stubbed) | ||
| 22 | : VideoCommon::FenceBase(address, payload, is_stubbed), device{device}, scheduler{scheduler} {} | ||
| 23 | |||
| 24 | InnerFence::~InnerFence() = default; | ||
| 25 | |||
| 26 | void InnerFence::Queue() { | ||
| 27 | if (is_stubbed) { | ||
| 28 | return; | ||
| 29 | } | ||
| 30 | ASSERT(!event); | ||
| 31 | |||
| 32 | event = device.GetLogical().CreateEvent(); | ||
| 33 | ticks = scheduler.Ticks(); | ||
| 34 | |||
| 35 | scheduler.RequestOutsideRenderPassOperationContext(); | ||
| 36 | scheduler.Record([event = *event](vk::CommandBuffer cmdbuf) { | ||
| 37 | cmdbuf.SetEvent(event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT); | ||
| 38 | }); | ||
| 39 | } | ||
| 40 | |||
| 41 | bool InnerFence::IsSignaled() const { | ||
| 42 | if (is_stubbed) { | ||
| 43 | return true; | ||
| 44 | } | ||
| 45 | ASSERT(event); | ||
| 46 | return IsEventSignalled(); | ||
| 47 | } | ||
| 48 | |||
| 49 | void InnerFence::Wait() { | ||
| 50 | if (is_stubbed) { | ||
| 51 | return; | ||
| 52 | } | ||
| 53 | ASSERT(event); | ||
| 54 | |||
| 55 | if (ticks >= scheduler.Ticks()) { | ||
| 56 | scheduler.Flush(); | ||
| 57 | } | ||
| 58 | while (!IsEventSignalled()) { | ||
| 59 | std::this_thread::yield(); | ||
| 60 | } | ||
| 61 | } | ||
| 62 | |||
| 63 | bool InnerFence::IsEventSignalled() const { | ||
| 64 | switch (const VkResult result = event.GetStatus()) { | ||
| 65 | case VK_EVENT_SET: | ||
| 66 | return true; | ||
| 67 | case VK_EVENT_RESET: | ||
| 68 | return false; | ||
| 69 | default: | ||
| 70 | throw vk::Exception(result); | ||
| 71 | } | ||
| 72 | } | ||
| 73 | |||
| 74 | VKFenceManager::VKFenceManager(Core::System& system, VideoCore::RasterizerInterface& rasterizer, | ||
| 75 | const VKDevice& device, VKScheduler& scheduler, | ||
| 76 | VKTextureCache& texture_cache, VKBufferCache& buffer_cache, | ||
| 77 | VKQueryCache& query_cache) | ||
| 78 | : GenericFenceManager(system, rasterizer, texture_cache, buffer_cache, query_cache), | ||
| 79 | device{device}, scheduler{scheduler} {} | ||
| 80 | |||
| 81 | Fence VKFenceManager::CreateFence(u32 value, bool is_stubbed) { | ||
| 82 | return std::make_shared<InnerFence>(device, scheduler, value, is_stubbed); | ||
| 83 | } | ||
| 84 | |||
| 85 | Fence VKFenceManager::CreateFence(GPUVAddr addr, u32 value, bool is_stubbed) { | ||
| 86 | return std::make_shared<InnerFence>(device, scheduler, addr, value, is_stubbed); | ||
| 87 | } | ||
| 88 | |||
| 89 | void VKFenceManager::QueueFence(Fence& fence) { | ||
| 90 | fence->Queue(); | ||
| 91 | } | ||
| 92 | |||
| 93 | bool VKFenceManager::IsFenceSignaled(Fence& fence) { | ||
| 94 | return fence->IsSignaled(); | ||
| 95 | } | ||
| 96 | |||
| 97 | void VKFenceManager::WaitFence(Fence& fence) { | ||
| 98 | fence->Wait(); | ||
| 99 | } | ||
| 100 | |||
| 101 | } // namespace Vulkan | ||
diff --git a/src/video_core/renderer_vulkan/vk_fence_manager.h b/src/video_core/renderer_vulkan/vk_fence_manager.h new file mode 100644 index 000000000..30651e9c7 --- /dev/null +++ b/src/video_core/renderer_vulkan/vk_fence_manager.h | |||
| @@ -0,0 +1,74 @@ | |||
| 1 | // Copyright 2020 yuzu Emulator Project | ||
| 2 | // Licensed under GPLv2 or any later version | ||
| 3 | // Refer to the license.txt file included. | ||
| 4 | |||
| 5 | #pragma once | ||
| 6 | |||
| 7 | #include <memory> | ||
| 8 | |||
| 9 | #include "video_core/fence_manager.h" | ||
| 10 | #include "video_core/renderer_vulkan/wrapper.h" | ||
| 11 | |||
| 12 | namespace Core { | ||
| 13 | class System; | ||
| 14 | } | ||
| 15 | |||
| 16 | namespace VideoCore { | ||
| 17 | class RasterizerInterface; | ||
| 18 | } | ||
| 19 | |||
| 20 | namespace Vulkan { | ||
| 21 | |||
| 22 | class VKBufferCache; | ||
| 23 | class VKDevice; | ||
| 24 | class VKQueryCache; | ||
| 25 | class VKScheduler; | ||
| 26 | class VKTextureCache; | ||
| 27 | |||
| 28 | class InnerFence : public VideoCommon::FenceBase { | ||
| 29 | public: | ||
| 30 | explicit InnerFence(const VKDevice& device, VKScheduler& scheduler, u32 payload, | ||
| 31 | bool is_stubbed); | ||
| 32 | explicit InnerFence(const VKDevice& device, VKScheduler& scheduler, GPUVAddr address, | ||
| 33 | u32 payload, bool is_stubbed); | ||
| 34 | ~InnerFence(); | ||
| 35 | |||
| 36 | void Queue(); | ||
| 37 | |||
| 38 | bool IsSignaled() const; | ||
| 39 | |||
| 40 | void Wait(); | ||
| 41 | |||
| 42 | private: | ||
| 43 | bool IsEventSignalled() const; | ||
| 44 | |||
| 45 | const VKDevice& device; | ||
| 46 | VKScheduler& scheduler; | ||
| 47 | vk::Event event; | ||
| 48 | u64 ticks = 0; | ||
| 49 | }; | ||
| 50 | using Fence = std::shared_ptr<InnerFence>; | ||
| 51 | |||
| 52 | using GenericFenceManager = | ||
| 53 | VideoCommon::FenceManager<Fence, VKTextureCache, VKBufferCache, VKQueryCache>; | ||
| 54 | |||
| 55 | class VKFenceManager final : public GenericFenceManager { | ||
| 56 | public: | ||
| 57 | explicit VKFenceManager(Core::System& system, VideoCore::RasterizerInterface& rasterizer, | ||
| 58 | const VKDevice& device, VKScheduler& scheduler, | ||
| 59 | VKTextureCache& texture_cache, VKBufferCache& buffer_cache, | ||
| 60 | VKQueryCache& query_cache); | ||
| 61 | |||
| 62 | protected: | ||
| 63 | Fence CreateFence(u32 value, bool is_stubbed) override; | ||
| 64 | Fence CreateFence(GPUVAddr addr, u32 value, bool is_stubbed) override; | ||
| 65 | void QueueFence(Fence& fence) override; | ||
| 66 | bool IsFenceSignaled(Fence& fence) override; | ||
| 67 | void WaitFence(Fence& fence) override; | ||
| 68 | |||
| 69 | private: | ||
| 70 | const VKDevice& device; | ||
| 71 | VKScheduler& scheduler; | ||
| 72 | }; | ||
| 73 | |||
| 74 | } // namespace Vulkan | ||
diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index f8b5a5a92..4dc7555aa 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp | |||
| @@ -299,7 +299,9 @@ RasterizerVulkan::RasterizerVulkan(Core::System& system, Core::Frontend::EmuWind | |||
| 299 | pipeline_cache(system, *this, device, scheduler, descriptor_pool, update_descriptor_queue, | 299 | pipeline_cache(system, *this, device, scheduler, descriptor_pool, update_descriptor_queue, |
| 300 | renderpass_cache), | 300 | renderpass_cache), |
| 301 | buffer_cache(*this, system, device, memory_manager, scheduler, staging_pool), | 301 | buffer_cache(*this, system, device, memory_manager, scheduler, staging_pool), |
| 302 | sampler_cache(device), query_cache(system, *this, device, scheduler) { | 302 | sampler_cache(device), |
| 303 | fence_manager(system, *this, device, scheduler, texture_cache, buffer_cache, query_cache), | ||
| 304 | query_cache(system, *this, device, scheduler) { | ||
| 303 | scheduler.SetQueryCache(query_cache); | 305 | scheduler.SetQueryCache(query_cache); |
| 304 | } | 306 | } |
| 305 | 307 | ||
| @@ -547,38 +549,28 @@ void RasterizerVulkan::SyncGuestHost() { | |||
| 547 | 549 | ||
| 548 | void RasterizerVulkan::SignalSemaphore(GPUVAddr addr, u32 value) { | 550 | void RasterizerVulkan::SignalSemaphore(GPUVAddr addr, u32 value) { |
| 549 | auto& gpu{system.GPU()}; | 551 | auto& gpu{system.GPU()}; |
| 550 | auto& memory_manager{gpu.MemoryManager()}; | ||
| 551 | memory_manager.Write<u32>(addr, value); | ||
| 552 | /* | ||
| 553 | if (!gpu.IsAsync()) { | 552 | if (!gpu.IsAsync()) { |
| 554 | auto& memory_manager{gpu.MemoryManager()}; | 553 | gpu.MemoryManager().Write<u32>(addr, value); |
| 555 | memory_manager.Write<u32>(addr, value); | ||
| 556 | return; | 554 | return; |
| 557 | } | 555 | } |
| 558 | fence_manager.SignalSemaphore(addr, value); | 556 | fence_manager.SignalSemaphore(addr, value); |
| 559 | */ | ||
| 560 | } | 557 | } |
| 561 | 558 | ||
| 562 | void RasterizerVulkan::SignalSyncPoint(u32 value) { | 559 | void RasterizerVulkan::SignalSyncPoint(u32 value) { |
| 563 | auto& gpu{system.GPU()}; | 560 | auto& gpu{system.GPU()}; |
| 564 | gpu.IncrementSyncPoint(value); | ||
| 565 | /* | ||
| 566 | if (!gpu.IsAsync()) { | 561 | if (!gpu.IsAsync()) { |
| 567 | gpu.IncrementSyncPoint(value); | 562 | gpu.IncrementSyncPoint(value); |
| 568 | return; | 563 | return; |
| 569 | } | 564 | } |
| 570 | fence_manager.SignalSyncPoint(value); | 565 | fence_manager.SignalSyncPoint(value); |
| 571 | */ | ||
| 572 | } | 566 | } |
| 573 | 567 | ||
| 574 | void RasterizerVulkan::ReleaseFences() { | 568 | void RasterizerVulkan::ReleaseFences() { |
| 575 | /* | ||
| 576 | auto& gpu{system.GPU()}; | 569 | auto& gpu{system.GPU()}; |
| 577 | if (!gpu.IsAsync()) { | 570 | if (!gpu.IsAsync()) { |
| 578 | return; | 571 | return; |
| 579 | } | 572 | } |
| 580 | fence_manager.WaitPendingFences(); | 573 | fence_manager.WaitPendingFences(); |
| 581 | */ | ||
| 582 | } | 574 | } |
| 583 | 575 | ||
| 584 | void RasterizerVulkan::FlushAndInvalidateRegion(VAddr addr, u64 size) { | 576 | void RasterizerVulkan::FlushAndInvalidateRegion(VAddr addr, u64 size) { |
diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.h b/src/video_core/renderer_vulkan/vk_rasterizer.h index 145bdf899..2fa46b0cc 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.h +++ b/src/video_core/renderer_vulkan/vk_rasterizer.h | |||
| @@ -21,6 +21,7 @@ | |||
| 21 | #include "video_core/renderer_vulkan/vk_buffer_cache.h" | 21 | #include "video_core/renderer_vulkan/vk_buffer_cache.h" |
| 22 | #include "video_core/renderer_vulkan/vk_compute_pass.h" | 22 | #include "video_core/renderer_vulkan/vk_compute_pass.h" |
| 23 | #include "video_core/renderer_vulkan/vk_descriptor_pool.h" | 23 | #include "video_core/renderer_vulkan/vk_descriptor_pool.h" |
| 24 | #include "video_core/renderer_vulkan/vk_fence_manager.h" | ||
| 24 | #include "video_core/renderer_vulkan/vk_memory_manager.h" | 25 | #include "video_core/renderer_vulkan/vk_memory_manager.h" |
| 25 | #include "video_core/renderer_vulkan/vk_pipeline_cache.h" | 26 | #include "video_core/renderer_vulkan/vk_pipeline_cache.h" |
| 26 | #include "video_core/renderer_vulkan/vk_query_cache.h" | 27 | #include "video_core/renderer_vulkan/vk_query_cache.h" |
| @@ -267,6 +268,7 @@ private: | |||
| 267 | VKPipelineCache pipeline_cache; | 268 | VKPipelineCache pipeline_cache; |
| 268 | VKBufferCache buffer_cache; | 269 | VKBufferCache buffer_cache; |
| 269 | VKSamplerCache sampler_cache; | 270 | VKSamplerCache sampler_cache; |
| 271 | VKFenceManager fence_manager; | ||
| 270 | VKQueryCache query_cache; | 272 | VKQueryCache query_cache; |
| 271 | 273 | ||
| 272 | std::array<View, Maxwell::NumRenderTargets> color_attachments; | 274 | std::array<View, Maxwell::NumRenderTargets> color_attachments; |
diff --git a/src/video_core/renderer_vulkan/wrapper.cpp b/src/video_core/renderer_vulkan/wrapper.cpp index 9b94dfff1..5e24b8f05 100644 --- a/src/video_core/renderer_vulkan/wrapper.cpp +++ b/src/video_core/renderer_vulkan/wrapper.cpp | |||
| @@ -64,6 +64,7 @@ void Load(VkDevice device, DeviceDispatch& dld) noexcept { | |||
| 64 | X(vkCmdSetCheckpointNV); | 64 | X(vkCmdSetCheckpointNV); |
| 65 | X(vkCmdSetDepthBias); | 65 | X(vkCmdSetDepthBias); |
| 66 | X(vkCmdSetDepthBounds); | 66 | X(vkCmdSetDepthBounds); |
| 67 | X(vkCmdSetEvent); | ||
| 67 | X(vkCmdSetScissor); | 68 | X(vkCmdSetScissor); |
| 68 | X(vkCmdSetStencilCompareMask); | 69 | X(vkCmdSetStencilCompareMask); |
| 69 | X(vkCmdSetStencilReference); | 70 | X(vkCmdSetStencilReference); |
| @@ -76,6 +77,7 @@ void Load(VkDevice device, DeviceDispatch& dld) noexcept { | |||
| 76 | X(vkCreateDescriptorPool); | 77 | X(vkCreateDescriptorPool); |
| 77 | X(vkCreateDescriptorSetLayout); | 78 | X(vkCreateDescriptorSetLayout); |
| 78 | X(vkCreateDescriptorUpdateTemplateKHR); | 79 | X(vkCreateDescriptorUpdateTemplateKHR); |
| 80 | X(vkCreateEvent); | ||
| 79 | X(vkCreateFence); | 81 | X(vkCreateFence); |
| 80 | X(vkCreateFramebuffer); | 82 | X(vkCreateFramebuffer); |
| 81 | X(vkCreateGraphicsPipelines); | 83 | X(vkCreateGraphicsPipelines); |
| @@ -94,6 +96,7 @@ void Load(VkDevice device, DeviceDispatch& dld) noexcept { | |||
| 94 | X(vkDestroyDescriptorPool); | 96 | X(vkDestroyDescriptorPool); |
| 95 | X(vkDestroyDescriptorSetLayout); | 97 | X(vkDestroyDescriptorSetLayout); |
| 96 | X(vkDestroyDescriptorUpdateTemplateKHR); | 98 | X(vkDestroyDescriptorUpdateTemplateKHR); |
| 99 | X(vkDestroyEvent); | ||
| 97 | X(vkDestroyFence); | 100 | X(vkDestroyFence); |
| 98 | X(vkDestroyFramebuffer); | 101 | X(vkDestroyFramebuffer); |
| 99 | X(vkDestroyImage); | 102 | X(vkDestroyImage); |
| @@ -113,6 +116,7 @@ void Load(VkDevice device, DeviceDispatch& dld) noexcept { | |||
| 113 | X(vkFreeMemory); | 116 | X(vkFreeMemory); |
| 114 | X(vkGetBufferMemoryRequirements); | 117 | X(vkGetBufferMemoryRequirements); |
| 115 | X(vkGetDeviceQueue); | 118 | X(vkGetDeviceQueue); |
| 119 | X(vkGetEventStatus); | ||
| 116 | X(vkGetFenceStatus); | 120 | X(vkGetFenceStatus); |
| 117 | X(vkGetImageMemoryRequirements); | 121 | X(vkGetImageMemoryRequirements); |
| 118 | X(vkGetQueryPoolResults); | 122 | X(vkGetQueryPoolResults); |
| @@ -271,6 +275,10 @@ void Destroy(VkDevice device, VkDeviceMemory handle, const DeviceDispatch& dld) | |||
| 271 | dld.vkFreeMemory(device, handle, nullptr); | 275 | dld.vkFreeMemory(device, handle, nullptr); |
| 272 | } | 276 | } |
| 273 | 277 | ||
| 278 | void Destroy(VkDevice device, VkEvent handle, const DeviceDispatch& dld) noexcept { | ||
| 279 | dld.vkDestroyEvent(device, handle, nullptr); | ||
| 280 | } | ||
| 281 | |||
| 274 | void Destroy(VkDevice device, VkFence handle, const DeviceDispatch& dld) noexcept { | 282 | void Destroy(VkDevice device, VkFence handle, const DeviceDispatch& dld) noexcept { |
| 275 | dld.vkDestroyFence(device, handle, nullptr); | 283 | dld.vkDestroyFence(device, handle, nullptr); |
| 276 | } | 284 | } |
| @@ -613,6 +621,16 @@ ShaderModule Device::CreateShaderModule(const VkShaderModuleCreateInfo& ci) cons | |||
| 613 | return ShaderModule(object, handle, *dld); | 621 | return ShaderModule(object, handle, *dld); |
| 614 | } | 622 | } |
| 615 | 623 | ||
| 624 | Event Device::CreateEvent() const { | ||
| 625 | VkEventCreateInfo ci; | ||
| 626 | ci.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO; | ||
| 627 | ci.pNext = nullptr; | ||
| 628 | ci.flags = 0; | ||
| 629 | VkEvent object; | ||
| 630 | Check(dld->vkCreateEvent(handle, &ci, nullptr, &object)); | ||
| 631 | return Event(object, handle, *dld); | ||
| 632 | } | ||
| 633 | |||
| 616 | SwapchainKHR Device::CreateSwapchainKHR(const VkSwapchainCreateInfoKHR& ci) const { | 634 | SwapchainKHR Device::CreateSwapchainKHR(const VkSwapchainCreateInfoKHR& ci) const { |
| 617 | VkSwapchainKHR object; | 635 | VkSwapchainKHR object; |
| 618 | Check(dld->vkCreateSwapchainKHR(handle, &ci, nullptr, &object)); | 636 | Check(dld->vkCreateSwapchainKHR(handle, &ci, nullptr, &object)); |
diff --git a/src/video_core/renderer_vulkan/wrapper.h b/src/video_core/renderer_vulkan/wrapper.h index fb3657819..cd2b8e6c9 100644 --- a/src/video_core/renderer_vulkan/wrapper.h +++ b/src/video_core/renderer_vulkan/wrapper.h | |||
| @@ -200,6 +200,7 @@ struct DeviceDispatch : public InstanceDispatch { | |||
| 200 | PFN_vkCmdSetCheckpointNV vkCmdSetCheckpointNV; | 200 | PFN_vkCmdSetCheckpointNV vkCmdSetCheckpointNV; |
| 201 | PFN_vkCmdSetDepthBias vkCmdSetDepthBias; | 201 | PFN_vkCmdSetDepthBias vkCmdSetDepthBias; |
| 202 | PFN_vkCmdSetDepthBounds vkCmdSetDepthBounds; | 202 | PFN_vkCmdSetDepthBounds vkCmdSetDepthBounds; |
| 203 | PFN_vkCmdSetEvent vkCmdSetEvent; | ||
| 203 | PFN_vkCmdSetScissor vkCmdSetScissor; | 204 | PFN_vkCmdSetScissor vkCmdSetScissor; |
| 204 | PFN_vkCmdSetStencilCompareMask vkCmdSetStencilCompareMask; | 205 | PFN_vkCmdSetStencilCompareMask vkCmdSetStencilCompareMask; |
| 205 | PFN_vkCmdSetStencilReference vkCmdSetStencilReference; | 206 | PFN_vkCmdSetStencilReference vkCmdSetStencilReference; |
| @@ -212,6 +213,7 @@ struct DeviceDispatch : public InstanceDispatch { | |||
| 212 | PFN_vkCreateDescriptorPool vkCreateDescriptorPool; | 213 | PFN_vkCreateDescriptorPool vkCreateDescriptorPool; |
| 213 | PFN_vkCreateDescriptorSetLayout vkCreateDescriptorSetLayout; | 214 | PFN_vkCreateDescriptorSetLayout vkCreateDescriptorSetLayout; |
| 214 | PFN_vkCreateDescriptorUpdateTemplateKHR vkCreateDescriptorUpdateTemplateKHR; | 215 | PFN_vkCreateDescriptorUpdateTemplateKHR vkCreateDescriptorUpdateTemplateKHR; |
| 216 | PFN_vkCreateEvent vkCreateEvent; | ||
| 215 | PFN_vkCreateFence vkCreateFence; | 217 | PFN_vkCreateFence vkCreateFence; |
| 216 | PFN_vkCreateFramebuffer vkCreateFramebuffer; | 218 | PFN_vkCreateFramebuffer vkCreateFramebuffer; |
| 217 | PFN_vkCreateGraphicsPipelines vkCreateGraphicsPipelines; | 219 | PFN_vkCreateGraphicsPipelines vkCreateGraphicsPipelines; |
| @@ -230,6 +232,7 @@ struct DeviceDispatch : public InstanceDispatch { | |||
| 230 | PFN_vkDestroyDescriptorPool vkDestroyDescriptorPool; | 232 | PFN_vkDestroyDescriptorPool vkDestroyDescriptorPool; |
| 231 | PFN_vkDestroyDescriptorSetLayout vkDestroyDescriptorSetLayout; | 233 | PFN_vkDestroyDescriptorSetLayout vkDestroyDescriptorSetLayout; |
| 232 | PFN_vkDestroyDescriptorUpdateTemplateKHR vkDestroyDescriptorUpdateTemplateKHR; | 234 | PFN_vkDestroyDescriptorUpdateTemplateKHR vkDestroyDescriptorUpdateTemplateKHR; |
| 235 | PFN_vkDestroyEvent vkDestroyEvent; | ||
| 233 | PFN_vkDestroyFence vkDestroyFence; | 236 | PFN_vkDestroyFence vkDestroyFence; |
| 234 | PFN_vkDestroyFramebuffer vkDestroyFramebuffer; | 237 | PFN_vkDestroyFramebuffer vkDestroyFramebuffer; |
| 235 | PFN_vkDestroyImage vkDestroyImage; | 238 | PFN_vkDestroyImage vkDestroyImage; |
| @@ -249,6 +252,7 @@ struct DeviceDispatch : public InstanceDispatch { | |||
| 249 | PFN_vkFreeMemory vkFreeMemory; | 252 | PFN_vkFreeMemory vkFreeMemory; |
| 250 | PFN_vkGetBufferMemoryRequirements vkGetBufferMemoryRequirements; | 253 | PFN_vkGetBufferMemoryRequirements vkGetBufferMemoryRequirements; |
| 251 | PFN_vkGetDeviceQueue vkGetDeviceQueue; | 254 | PFN_vkGetDeviceQueue vkGetDeviceQueue; |
| 255 | PFN_vkGetEventStatus vkGetEventStatus; | ||
| 252 | PFN_vkGetFenceStatus vkGetFenceStatus; | 256 | PFN_vkGetFenceStatus vkGetFenceStatus; |
| 253 | PFN_vkGetImageMemoryRequirements vkGetImageMemoryRequirements; | 257 | PFN_vkGetImageMemoryRequirements vkGetImageMemoryRequirements; |
| 254 | PFN_vkGetQueryPoolResults vkGetQueryPoolResults; | 258 | PFN_vkGetQueryPoolResults vkGetQueryPoolResults; |
| @@ -281,6 +285,7 @@ void Destroy(VkDevice, VkDescriptorPool, const DeviceDispatch&) noexcept; | |||
| 281 | void Destroy(VkDevice, VkDescriptorSetLayout, const DeviceDispatch&) noexcept; | 285 | void Destroy(VkDevice, VkDescriptorSetLayout, const DeviceDispatch&) noexcept; |
| 282 | void Destroy(VkDevice, VkDescriptorUpdateTemplateKHR, const DeviceDispatch&) noexcept; | 286 | void Destroy(VkDevice, VkDescriptorUpdateTemplateKHR, const DeviceDispatch&) noexcept; |
| 283 | void Destroy(VkDevice, VkDeviceMemory, const DeviceDispatch&) noexcept; | 287 | void Destroy(VkDevice, VkDeviceMemory, const DeviceDispatch&) noexcept; |
| 288 | void Destroy(VkDevice, VkEvent, const DeviceDispatch&) noexcept; | ||
| 284 | void Destroy(VkDevice, VkFence, const DeviceDispatch&) noexcept; | 289 | void Destroy(VkDevice, VkFence, const DeviceDispatch&) noexcept; |
| 285 | void Destroy(VkDevice, VkFramebuffer, const DeviceDispatch&) noexcept; | 290 | void Destroy(VkDevice, VkFramebuffer, const DeviceDispatch&) noexcept; |
| 286 | void Destroy(VkDevice, VkImage, const DeviceDispatch&) noexcept; | 291 | void Destroy(VkDevice, VkImage, const DeviceDispatch&) noexcept; |
| @@ -654,6 +659,15 @@ public: | |||
| 654 | std::vector<VkImage> GetImages() const; | 659 | std::vector<VkImage> GetImages() const; |
| 655 | }; | 660 | }; |
| 656 | 661 | ||
| 662 | class Event : public Handle<VkEvent, VkDevice, DeviceDispatch> { | ||
| 663 | using Handle<VkEvent, VkDevice, DeviceDispatch>::Handle; | ||
| 664 | |||
| 665 | public: | ||
| 666 | VkResult GetStatus() const noexcept { | ||
| 667 | return dld->vkGetEventStatus(owner, handle); | ||
| 668 | } | ||
| 669 | }; | ||
| 670 | |||
| 657 | class Device : public Handle<VkDevice, NoOwner, DeviceDispatch> { | 671 | class Device : public Handle<VkDevice, NoOwner, DeviceDispatch> { |
| 658 | using Handle<VkDevice, NoOwner, DeviceDispatch>::Handle; | 672 | using Handle<VkDevice, NoOwner, DeviceDispatch>::Handle; |
| 659 | 673 | ||
| @@ -702,6 +716,8 @@ public: | |||
| 702 | 716 | ||
| 703 | ShaderModule CreateShaderModule(const VkShaderModuleCreateInfo& ci) const; | 717 | ShaderModule CreateShaderModule(const VkShaderModuleCreateInfo& ci) const; |
| 704 | 718 | ||
| 719 | Event CreateEvent() const; | ||
| 720 | |||
| 705 | SwapchainKHR CreateSwapchainKHR(const VkSwapchainCreateInfoKHR& ci) const; | 721 | SwapchainKHR CreateSwapchainKHR(const VkSwapchainCreateInfoKHR& ci) const; |
| 706 | 722 | ||
| 707 | DeviceMemory TryAllocateMemory(const VkMemoryAllocateInfo& ai) const noexcept; | 723 | DeviceMemory TryAllocateMemory(const VkMemoryAllocateInfo& ai) const noexcept; |
| @@ -956,6 +972,10 @@ public: | |||
| 956 | dld->vkCmdSetDepthBounds(handle, min_depth_bounds, max_depth_bounds); | 972 | dld->vkCmdSetDepthBounds(handle, min_depth_bounds, max_depth_bounds); |
| 957 | } | 973 | } |
| 958 | 974 | ||
| 975 | void SetEvent(VkEvent event, VkPipelineStageFlags stage_flags) const noexcept { | ||
| 976 | dld->vkCmdSetEvent(handle, event, stage_flags); | ||
| 977 | } | ||
| 978 | |||
| 959 | void BindTransformFeedbackBuffersEXT(u32 first, u32 count, const VkBuffer* buffers, | 979 | void BindTransformFeedbackBuffersEXT(u32 first, u32 count, const VkBuffer* buffers, |
| 960 | const VkDeviceSize* offsets, | 980 | const VkDeviceSize* offsets, |
| 961 | const VkDeviceSize* sizes) const noexcept { | 981 | const VkDeviceSize* sizes) const noexcept { |