summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar ReinUsesLisp2020-03-16 21:43:05 -0300
committerGravatar Fernando Sahmkow2020-04-22 11:36:19 -0400
commitb752faf2d3aae882a1a35a3aec393ef5765c035f (patch)
tree84089c7f583cb8d2e2a44821d0e0a25d70d3ed50 /src
parentQueryCache: Implement Async Flushes. (diff)
downloadyuzu-b752faf2d3aae882a1a35a3aec393ef5765c035f.tar.gz
yuzu-b752faf2d3aae882a1a35a3aec393ef5765c035f.tar.xz
yuzu-b752faf2d3aae882a1a35a3aec393ef5765c035f.zip
vk_fence_manager: Initial implementation
Diffstat (limited to 'src')
-rw-r--r--src/video_core/CMakeLists.txt2
-rw-r--r--src/video_core/buffer_cache/buffer_cache.h1
-rw-r--r--src/video_core/renderer_vulkan/vk_fence_manager.cpp101
-rw-r--r--src/video_core/renderer_vulkan/vk_fence_manager.h74
-rw-r--r--src/video_core/renderer_vulkan/vk_rasterizer.cpp16
-rw-r--r--src/video_core/renderer_vulkan/vk_rasterizer.h2
-rw-r--r--src/video_core/renderer_vulkan/wrapper.cpp18
-rw-r--r--src/video_core/renderer_vulkan/wrapper.h20
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
15namespace Vulkan {
16
17InnerFence::InnerFence(const VKDevice& device, VKScheduler& scheduler, u32 payload, bool is_stubbed)
18 : VideoCommon::FenceBase(payload, is_stubbed), device{device}, scheduler{scheduler} {}
19
20InnerFence::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
24InnerFence::~InnerFence() = default;
25
26void 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
41bool InnerFence::IsSignaled() const {
42 if (is_stubbed) {
43 return true;
44 }
45 ASSERT(event);
46 return IsEventSignalled();
47}
48
49void 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
63bool 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
74VKFenceManager::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
81Fence VKFenceManager::CreateFence(u32 value, bool is_stubbed) {
82 return std::make_shared<InnerFence>(device, scheduler, value, is_stubbed);
83}
84
85Fence VKFenceManager::CreateFence(GPUVAddr addr, u32 value, bool is_stubbed) {
86 return std::make_shared<InnerFence>(device, scheduler, addr, value, is_stubbed);
87}
88
89void VKFenceManager::QueueFence(Fence& fence) {
90 fence->Queue();
91}
92
93bool VKFenceManager::IsFenceSignaled(Fence& fence) {
94 return fence->IsSignaled();
95}
96
97void 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
12namespace Core {
13class System;
14}
15
16namespace VideoCore {
17class RasterizerInterface;
18}
19
20namespace Vulkan {
21
22class VKBufferCache;
23class VKDevice;
24class VKQueryCache;
25class VKScheduler;
26class VKTextureCache;
27
28class InnerFence : public VideoCommon::FenceBase {
29public:
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
42private:
43 bool IsEventSignalled() const;
44
45 const VKDevice& device;
46 VKScheduler& scheduler;
47 vk::Event event;
48 u64 ticks = 0;
49};
50using Fence = std::shared_ptr<InnerFence>;
51
52using GenericFenceManager =
53 VideoCommon::FenceManager<Fence, VKTextureCache, VKBufferCache, VKQueryCache>;
54
55class VKFenceManager final : public GenericFenceManager {
56public:
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
62protected:
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
69private:
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
548void RasterizerVulkan::SignalSemaphore(GPUVAddr addr, u32 value) { 550void 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
562void RasterizerVulkan::SignalSyncPoint(u32 value) { 559void 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
574void RasterizerVulkan::ReleaseFences() { 568void 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
584void RasterizerVulkan::FlushAndInvalidateRegion(VAddr addr, u64 size) { 576void 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
278void Destroy(VkDevice device, VkEvent handle, const DeviceDispatch& dld) noexcept {
279 dld.vkDestroyEvent(device, handle, nullptr);
280}
281
274void Destroy(VkDevice device, VkFence handle, const DeviceDispatch& dld) noexcept { 282void 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
624Event 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
616SwapchainKHR Device::CreateSwapchainKHR(const VkSwapchainCreateInfoKHR& ci) const { 634SwapchainKHR 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;
281void Destroy(VkDevice, VkDescriptorSetLayout, const DeviceDispatch&) noexcept; 285void Destroy(VkDevice, VkDescriptorSetLayout, const DeviceDispatch&) noexcept;
282void Destroy(VkDevice, VkDescriptorUpdateTemplateKHR, const DeviceDispatch&) noexcept; 286void Destroy(VkDevice, VkDescriptorUpdateTemplateKHR, const DeviceDispatch&) noexcept;
283void Destroy(VkDevice, VkDeviceMemory, const DeviceDispatch&) noexcept; 287void Destroy(VkDevice, VkDeviceMemory, const DeviceDispatch&) noexcept;
288void Destroy(VkDevice, VkEvent, const DeviceDispatch&) noexcept;
284void Destroy(VkDevice, VkFence, const DeviceDispatch&) noexcept; 289void Destroy(VkDevice, VkFence, const DeviceDispatch&) noexcept;
285void Destroy(VkDevice, VkFramebuffer, const DeviceDispatch&) noexcept; 290void Destroy(VkDevice, VkFramebuffer, const DeviceDispatch&) noexcept;
286void Destroy(VkDevice, VkImage, const DeviceDispatch&) noexcept; 291void 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
662class Event : public Handle<VkEvent, VkDevice, DeviceDispatch> {
663 using Handle<VkEvent, VkDevice, DeviceDispatch>::Handle;
664
665public:
666 VkResult GetStatus() const noexcept {
667 return dld->vkGetEventStatus(owner, handle);
668 }
669};
670
657class Device : public Handle<VkDevice, NoOwner, DeviceDispatch> { 671class 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 {