aboutsummaryrefslogtreecommitdiff
path: root/vendor/libghostty-vt/src/renderer/metal/Sampler.zig
diff options
context:
space:
mode:
authorCan Celik <ogulcancelik@gmail.com>2026-04-04 19:22:04 +0300
committerCan Celik <ogulcancelik@gmail.com>2026-04-05 01:23:06 +0300
commit41dd733ca7123c9ac4bfc6c781697a660e95b052 (patch)
tree3fc91815ca139ef2e0b281bba0abda4ef15175f4 /vendor/libghostty-vt/src/renderer/metal/Sampler.zig
parent55c138263e190a1e79d4b997bfb9397306c0ec1f (diff)
feat: finish ghostty pane backend integration
Diffstat (limited to 'vendor/libghostty-vt/src/renderer/metal/Sampler.zig')
-rw-r--r--vendor/libghostty-vt/src/renderer/metal/Sampler.zig64
1 files changed, 64 insertions, 0 deletions
diff --git a/vendor/libghostty-vt/src/renderer/metal/Sampler.zig b/vendor/libghostty-vt/src/renderer/metal/Sampler.zig
new file mode 100644
index 00000000..593f9a86
--- /dev/null
+++ b/vendor/libghostty-vt/src/renderer/metal/Sampler.zig
@@ -0,0 +1,64 @@
+//! Wrapper for handling samplers.
+const Self = @This();
+
+const std = @import("std");
+const Allocator = std.mem.Allocator;
+const objc = @import("objc");
+
+const mtl = @import("api.zig");
+const Metal = @import("../Metal.zig");
+
+const log = std.log.scoped(.metal);
+
+/// Options for initializing a sampler.
+pub const Options = struct {
+ /// MTLDevice
+ device: objc.Object,
+ min_filter: mtl.MTLSamplerMinMagFilter,
+ mag_filter: mtl.MTLSamplerMinMagFilter,
+ s_address_mode: mtl.MTLSamplerAddressMode,
+ t_address_mode: mtl.MTLSamplerAddressMode,
+};
+
+/// The underlying MTLSamplerState Object.
+sampler: objc.Object,
+
+pub const Error = error{
+ /// A Metal API call failed.
+ MetalFailed,
+};
+
+/// Initialize a sampler
+pub fn init(
+ opts: Options,
+) Error!Self {
+ // Create our descriptor
+ const desc = init: {
+ const Class = objc.getClass("MTLSamplerDescriptor").?;
+ const id_alloc = Class.msgSend(objc.Object, objc.sel("alloc"), .{});
+ const id_init = id_alloc.msgSend(objc.Object, objc.sel("init"), .{});
+ break :init id_init;
+ };
+ defer desc.release();
+
+ // Properties
+ desc.setProperty("minFilter", opts.min_filter);
+ desc.setProperty("magFilter", opts.mag_filter);
+ desc.setProperty("sAddressMode", opts.s_address_mode);
+ desc.setProperty("tAddressMode", opts.t_address_mode);
+
+ // Create the sampler state
+ const id = opts.device.msgSend(
+ ?*anyopaque,
+ objc.sel("newSamplerStateWithDescriptor:"),
+ .{desc},
+ ) orelse return error.MetalFailed;
+
+ return .{
+ .sampler = objc.Object.fromId(id),
+ };
+}
+
+pub fn deinit(self: Self) void {
+ self.sampler.release();
+}