Skip to content

Commit bbd21e5

Browse files
committed
working on events
1 parent 86e1e8a commit bbd21e5

5 files changed

Lines changed: 136 additions & 33 deletions

File tree

src/soft/SoftCommandBuffer.zig

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,9 @@ pub fn create(device: *base.Device, allocator: std.mem.Allocator, info: *const v
2828
.end = end,
2929
.fillBuffer = fillBuffer,
3030
.reset = reset,
31+
.resetEvent = resetEvent,
32+
.setEvent = setEvent,
33+
.waitEvents = waitEvents,
3134
};
3235

3336
self.* = .{
@@ -93,3 +96,28 @@ pub fn copyImage(interface: *Interface, src: *base.Image, dst: *base.Image, regi
9396
_ = dst;
9497
_ = regions;
9598
}
99+
100+
pub fn resetEvent(interface: *Interface, event: *base.Event, stage: vk.PipelineStageFlags) VkError!void {
101+
// No-op
102+
_ = interface;
103+
_ = event;
104+
_ = stage;
105+
}
106+
107+
pub fn setEvent(interface: *Interface, event: *base.Event, stage: vk.PipelineStageFlags) VkError!void {
108+
// No-op
109+
_ = interface;
110+
_ = event;
111+
_ = stage;
112+
}
113+
114+
pub fn waitEvents(interface: *Interface, events: []*const base.Event, src_stage: vk.PipelineStageFlags, dst_stage: vk.PipelineStageFlags, memory_barriers: []const vk.MemoryBarrier, buffer_barriers: []const vk.BufferMemoryBarrier, image_barriers: []const vk.ImageMemoryBarrier) VkError!void {
115+
// No-op
116+
_ = interface;
117+
_ = events;
118+
_ = src_stage;
119+
_ = dst_stage;
120+
_ = memory_barriers;
121+
_ = buffer_barriers;
122+
_ = image_barriers;
123+
}

src/soft/SoftEvent.zig

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ const Self = @This();
99
pub const Interface = base.Event;
1010

1111
interface: Interface,
12+
mutex: std.Thread.Mutex,
13+
condition: std.Thread.Condition,
14+
is_signaled: bool,
1215

1316
pub fn create(device: *base.Device, allocator: std.mem.Allocator, info: *const vk.EventCreateInfo) VkError!*Self {
1417
const self = allocator.create(Self) catch return VkError.OutOfHostMemory;
@@ -18,10 +21,17 @@ pub fn create(device: *base.Device, allocator: std.mem.Allocator, info: *const v
1821

1922
interface.vtable = &.{
2023
.destroy = destroy,
24+
.getStatus = getStatus,
25+
.reset = reset,
26+
.signal = signal,
27+
.wait = wait,
2128
};
2229

2330
self.* = .{
2431
.interface = interface,
32+
.mutex = std.Thread.Mutex{},
33+
.condition = std.Thread.Condition{},
34+
.is_signaled = false,
2535
};
2636
return self;
2737
}
@@ -30,3 +40,49 @@ pub fn destroy(interface: *Interface, allocator: std.mem.Allocator) void {
3040
const self: *Self = @alignCast(@fieldParentPtr("interface", interface));
3141
allocator.destroy(self);
3242
}
43+
44+
pub fn getStatus(interface: *Interface) VkError!void {
45+
const self: *Self = @alignCast(@fieldParentPtr("interface", interface));
46+
47+
self.mutex.lock();
48+
defer self.mutex.unlock();
49+
50+
if (!self.is_signaled) {
51+
return VkError.EventReset;
52+
}
53+
}
54+
55+
pub fn reset(interface: *Interface) VkError!void {
56+
const self: *Self = @alignCast(@fieldParentPtr("interface", interface));
57+
58+
self.mutex.lock();
59+
defer self.mutex.unlock();
60+
61+
self.is_signaled = false;
62+
}
63+
64+
pub fn signal(interface: *Interface) VkError!void {
65+
const self: *Self = @alignCast(@fieldParentPtr("interface", interface));
66+
67+
self.mutex.lock();
68+
defer self.mutex.unlock();
69+
70+
self.is_signaled = true;
71+
self.condition.broadcast();
72+
}
73+
74+
pub fn wait(interface: *Interface, timeout: u64) VkError!void {
75+
const self: *Self = @alignCast(@fieldParentPtr("interface", interface));
76+
77+
self.mutex.lock();
78+
defer self.mutex.unlock();
79+
80+
if (self.is_signaled) return;
81+
if (timeout == 0) return VkError.Timeout;
82+
83+
if (timeout == std.math.maxInt(@TypeOf(timeout))) {
84+
self.condition.wait(&self.mutex);
85+
} else {
86+
self.condition.timedWait(&self.mutex, timeout) catch return VkError.Timeout;
87+
}
88+
}

src/vulkan/CommandBuffer.zig

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ const Device = @import("Device.zig");
1111

1212
const Buffer = @import("Buffer.zig");
1313
const CommandPool = @import("CommandPool.zig");
14+
const Event = @import("Event.zig");
1415
const Image = @import("Image.zig");
1516

1617
const COMMAND_BUFFER_BASE_CAPACITY = 256;
@@ -45,6 +46,9 @@ pub const DispatchTable = struct {
4546
end: *const fn (*Self) VkError!void,
4647
fillBuffer: *const fn (*Self, *Buffer, vk.DeviceSize, vk.DeviceSize, u32) VkError!void,
4748
reset: *const fn (*Self, vk.CommandBufferResetFlags) VkError!void,
49+
resetEvent: *const fn (*Self, *Event, vk.PipelineStageFlags) VkError!void,
50+
setEvent: *const fn (*Self, *Event, vk.PipelineStageFlags) VkError!void,
51+
waitEvents: *const fn (*Self, []*const Event, vk.PipelineStageFlags, vk.PipelineStageFlags, []const vk.MemoryBarrier, []const vk.BufferMemoryBarrier, []const vk.ImageMemoryBarrier) VkError!void,
4852
};
4953

5054
pub const VTable = struct {
@@ -169,3 +173,15 @@ pub inline fn fillBuffer(self: *Self, buffer: *Buffer, offset: vk.DeviceSize, si
169173
} }) catch return VkError.OutOfHostMemory;
170174
try self.dispatch_table.fillBuffer(self, buffer, offset, size, data);
171175
}
176+
177+
pub inline fn resetEvent(self: *Self, event: *Event, stage: vk.PipelineStageFlags) VkError!void {
178+
try self.dispatch_table.resetEvent(self, event, stage);
179+
}
180+
181+
pub inline fn setEvent(self: *Self, event: *Event, stage: vk.PipelineStageFlags) VkError!void {
182+
try self.dispatch_table.setEvent(self, event, stage);
183+
}
184+
185+
pub inline fn waitEvents(self: *Self, events: []*const Event, src_stage: vk.PipelineStageFlags, dst_stage: vk.PipelineStageFlags, memory_barriers: []const vk.MemoryBarrier, buffer_barriers: []const vk.BufferMemoryBarrier, image_barriers: []const vk.ImageMemoryBarrier) VkError!void {
186+
try self.dispatch_table.waitEvents(self, events, src_stage, dst_stage, memory_barriers, buffer_barriers, image_barriers);
187+
}

src/vulkan/Event.zig

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,10 @@ vtable: *const VTable,
1616

1717
pub const VTable = struct {
1818
destroy: *const fn (*Self, std.mem.Allocator) void,
19+
getStatus: *const fn (*Self) VkError!void,
20+
reset: *const fn (*Self) VkError!void,
21+
signal: *const fn (*Self) VkError!void,
22+
wait: *const fn (*Self, u64) VkError!void,
1923
};
2024

2125
pub fn init(device: *Device, allocator: std.mem.Allocator, info: *const vk.EventCreateInfo) VkError!Self {
@@ -30,3 +34,19 @@ pub fn init(device: *Device, allocator: std.mem.Allocator, info: *const vk.Event
3034
pub inline fn destroy(self: *Self, allocator: std.mem.Allocator) void {
3135
self.vtable.destroy(self, allocator);
3236
}
37+
38+
pub inline fn getStatus(self: *Self) VkError!void {
39+
try self.vtable.getStatus(self);
40+
}
41+
42+
pub inline fn reset(self: *Self) VkError!void {
43+
try self.vtable.reset(self);
44+
}
45+
46+
pub inline fn signal(self: *Self) VkError!void {
47+
try self.vtable.signal(self);
48+
}
49+
50+
pub inline fn wait(self: *Self, timeout: u64) VkError!void {
51+
try self.vtable.wait(self, timeout);
52+
}

src/vulkan/lib_vulkan.zig

Lines changed: 16 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1219,11 +1219,9 @@ pub export fn strollGetEventStatus(p_device: vk.Device, p_event: vk.Event) callc
12191219

12201220
Dispatchable(Device).checkHandleValidity(p_device) catch |err| return toVkResult(err);
12211221

1222-
notImplementedWarning();
1223-
1224-
_ = p_event;
1225-
1226-
return .error_unknown;
1222+
const event = NonDispatchable(Event).fromHandleObject(p_event) catch |err| return toVkResult(err);
1223+
event.getStatus() catch |err| return toVkResult(err);
1224+
return .success;
12271225
}
12281226

12291227
pub export fn strollGetFenceStatus(p_device: vk.Device, p_fence: vk.Fence) callconv(vk.vulkan_call_conv) vk.Result {
@@ -1234,7 +1232,7 @@ pub export fn strollGetFenceStatus(p_device: vk.Device, p_fence: vk.Fence) callc
12341232

12351233
const fence = NonDispatchable(Fence).fromHandleObject(p_fence) catch |err| return toVkResult(err);
12361234
fence.getStatus() catch |err| return toVkResult(err);
1237-
return .success;
1235+
return .event_set;
12381236
}
12391237

12401238
pub export fn strollGetImageMemoryRequirements(p_device: vk.Device, p_image: vk.Image, requirements: *vk.MemoryRequirements) callconv(vk.vulkan_call_conv) void {
@@ -1406,11 +1404,9 @@ pub export fn strollResetEvent(p_device: vk.Device, p_event: vk.Fence) callconv(
14061404

14071405
Dispatchable(Device).checkHandleValidity(p_device) catch |err| return toVkResult(err);
14081406

1409-
notImplementedWarning();
1410-
1411-
_ = p_event;
1412-
1413-
return .error_unknown;
1407+
const event = NonDispatchable(Event).fromHandleObject(p_event) catch |err| return toVkResult(err);
1408+
event.reset() catch |err| return toVkResult(err);
1409+
return .success;
14141410
}
14151411

14161412
pub export fn strollResetFences(p_device: vk.Device, count: u32, p_fences: [*]const vk.Fence) callconv(vk.vulkan_call_conv) vk.Result {
@@ -1432,11 +1428,9 @@ pub export fn strollSetEvent(p_device: vk.Device, p_event: vk.Fence) callconv(vk
14321428

14331429
Dispatchable(Device).checkHandleValidity(p_device) catch |err| return toVkResult(err);
14341430

1435-
notImplementedWarning();
1436-
1437-
_ = p_event;
1438-
1439-
return .error_unknown;
1431+
const event = NonDispatchable(Event).fromHandleObject(p_event) catch |err| return toVkResult(err);
1432+
event.signal() catch |err| return toVkResult(err);
1433+
return .success;
14401434
}
14411435

14421436
pub export fn strollUnmapMemory(p_device: vk.Device, p_memory: vk.DeviceMemory) callconv(vk.vulkan_call_conv) void {
@@ -1951,12 +1945,8 @@ pub export fn strollCmdResetEvent(p_cmd: vk.CommandBuffer, p_event: vk.Event, st
19511945
defer entryPointEndLogTrace();
19521946

19531947
const cmd = Dispatchable(CommandBuffer).fromHandleObject(p_cmd) catch |err| return errorLogger(err);
1954-
1955-
notImplementedWarning();
1956-
1957-
_ = cmd;
1958-
_ = p_event;
1959-
_ = stage_mask;
1948+
const event = NonDispatchable(Event).fromHandleObject(p_event) catch |err| return errorLogger(err);
1949+
cmd.resetEvent(event, stage_mask) catch |err| return errorLogger(err);
19601950
}
19611951

19621952
pub export fn strollCmdResolveImage(
@@ -2031,12 +2021,8 @@ pub export fn strollCmdSetEvent(p_cmd: vk.CommandBuffer, p_event: vk.Event, stag
20312021
defer entryPointEndLogTrace();
20322022

20332023
const cmd = Dispatchable(CommandBuffer).fromHandleObject(p_cmd) catch |err| return errorLogger(err);
2034-
2035-
notImplementedWarning();
2036-
2037-
_ = cmd;
2038-
_ = p_event;
2039-
_ = stage_mask;
2024+
const event = NonDispatchable(Event).fromHandleObject(p_event) catch |err| return errorLogger(err);
2025+
cmd.setEvent(event, stage_mask) catch |err| return errorLogger(err);
20402026
}
20412027

20422028
pub export fn strollCmdSetLineWidth(p_cmd: vk.CommandBuffer, width: f32) callconv(vk.vulkan_call_conv) void {
@@ -2150,11 +2136,6 @@ pub export fn strollCmdWaitEvents(
21502136
entryPointBeginLogTrace(.vkCmdWaitEvents);
21512137
defer entryPointEndLogTrace();
21522138

2153-
const cmd = Dispatchable(CommandBuffer).fromHandleObject(p_cmd) catch |err| return errorLogger(err);
2154-
2155-
notImplementedWarning();
2156-
2157-
_ = cmd;
21582139
_ = count;
21592140
_ = p_events;
21602141
_ = src_stage_mask;
@@ -2165,6 +2146,8 @@ pub export fn strollCmdWaitEvents(
21652146
_ = buffer_memory_barriers;
21662147
_ = image_memory_barrier_count;
21672148
_ = image_memory_barriers;
2149+
const cmd = Dispatchable(CommandBuffer).fromHandleObject(p_cmd) catch |err| return errorLogger(err);
2150+
_ = cmd;
21682151
}
21692152

21702153
pub export fn strollCmdWriteTimestamp(p_cmd: vk.CommandBuffer, stage: vk.PipelineStageFlags, p_pool: vk.QueryPool, query: u32) callconv(vk.vulkan_call_conv) void {

0 commit comments

Comments
 (0)