darwin: first pass at trying to enable vsync

This commit is contained in:
foxnne 2024-12-06 11:06:37 -06:00 committed by Emi Gutekanst
parent 6ef58d8c1f
commit 0a78c4cc08
3 changed files with 15 additions and 5 deletions

View file

@ -31,6 +31,7 @@ pub fn init(
const window = try core.windows.new(.{ const window = try core.windows.new(.{
.title = "core-transparent-window", .title = "core-transparent-window",
.vsync_mode = .triple,
}); });
// Store our render pipeline in our module's state, so we can access it later on. // Store our render pipeline in our module's state, so we can access it later on.
@ -153,7 +154,7 @@ pub fn tick(app: *App, core: *mach.Core) void {
app.title_timer.reset(); app.title_timer.reset();
// TODO(object): window-title // TODO(object): window-title
// try updateWindowTitle(core); core.windows.set(app.window, .title, std.fmt.allocPrintZ(core.allocator, "core-custom-entrypoint [ {d}fps ] [ Input {d}hz ]", .{ core.frame.rate, core.input.rate }) catch unreachable);
} }
if (app.color_time >= 4.0 or app.color_time <= 0.0) { if (app.color_time >= 4.0 or app.color_time <= 0.0) {

View file

@ -22,6 +22,7 @@ pub const Darwin = @This();
pub const Native = struct { pub const Native = struct {
window: *objc.app_kit.Window = undefined, window: *objc.app_kit.Window = undefined,
view: *objc.mach.View = undefined,
}; };
pub const Context = struct { pub const Context = struct {
@ -69,6 +70,7 @@ pub fn tick(core: *Core) !void {
if (core_window.native) |native| { if (core_window.native) |native| {
const native_window: *objc.app_kit.Window = native.window; const native_window: *objc.app_kit.Window = native.window;
const native_view: *objc.mach.View = native.view;
if (core.windows.updated(window_id, .color)) { if (core.windows.updated(window_id, .color)) {
switch (core_window.color) { switch (core_window.color) {
@ -81,6 +83,7 @@ pub fn tick(core: *Core) !void {
); );
native_window.setBackgroundColor(color); native_window.setBackgroundColor(color);
native_window.setTitlebarAppearsTransparent(true); native_window.setTitlebarAppearsTransparent(true);
native_view.layer().setOpaque(false);
}, },
.solid => |wc| { .solid => |wc| {
const color = objc.app_kit.Color.colorWithRed_green_blue_alpha( const color = objc.app_kit.Color.colorWithRed_green_blue_alpha(
@ -91,9 +94,11 @@ pub fn tick(core: *Core) !void {
); );
native_window.setBackgroundColor(color); native_window.setBackgroundColor(color);
native_window.setTitlebarAppearsTransparent(false); native_window.setTitlebarAppearsTransparent(false);
native_view.layer().setOpaque(true);
}, },
.system => { .system => {
native_window.setTitlebarAppearsTransparent(false); native_window.setTitlebarAppearsTransparent(false);
native_view.layer().setOpaque(true);
}, },
} }
} }
@ -130,8 +135,9 @@ fn initWindow(
const layer = objc.quartz_core.MetalLayer.new(); const layer = objc.quartz_core.MetalLayer.new();
defer layer.release(); defer layer.release();
layer.setDisplaySyncEnabled(true); if (core_window.color == .transparent) {
layer.setOpaque(false); layer.setOpaque(false);
}
metal_descriptor.* = .{ metal_descriptor.* = .{
.layer = layer, .layer = layer,
@ -241,7 +247,7 @@ fn initWindow(
// Set core_window.native, which we use to check if a window is initialized // Set core_window.native, which we use to check if a window is initialized
// Then call core.initWindow to finish initializing the window // Then call core.initWindow to finish initializing the window
core_window.native = .{ .window = native_window }; core_window.native = .{ .window = native_window, .view = view };
core.windows.setValueRaw(window_id, core_window); core.windows.setValueRaw(window_id, core_window);
try core.initWindow(window_id); try core.initWindow(window_id);
} else std.debug.panic("mach: window failed to initialize", .{}); } else std.debug.panic("mach: window failed to initialize", .{});

View file

@ -480,11 +480,14 @@ pub const SwapChain = struct {
if (swapchain.current_drawable) |_| { if (swapchain.current_drawable) |_| {
const queue = try swapchain.device.getQueue(); const queue = try swapchain.device.getQueue();
const command_buffer = queue.command_queue.commandBuffer() orelse { const command_buffer: *mtl.CommandBuffer = queue.command_queue.commandBuffer() orelse {
return error.NewCommandBufferFailed; return error.NewCommandBufferFailed;
}; };
command_buffer.presentDrawable(@ptrCast(swapchain.current_drawable)); // TODO - objc casting? command_buffer.presentDrawable(@ptrCast(swapchain.current_drawable)); // TODO - objc casting?
command_buffer.commit(); command_buffer.commit();
if (swapchain.surface.layer.displaySyncEnabled())
command_buffer.waitUntilScheduled();
} }
} }
}; };