From 01a73994cba440a4972277dff576dbd7a7587454 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Thu, 16 Nov 2023 15:37:50 -0800 Subject: [PATCH] renderer/metal: setup sampler state --- pkg/glslang/build.zig | 1 - src/renderer/Metal.zig | 41 ++++++++++++++++---------------- src/renderer/metal/sampler.zig | 31 ++++++++++++++++++++++++ src/renderer/shaders/temp3.metal | 2 +- 4 files changed, 52 insertions(+), 23 deletions(-) create mode 100644 src/renderer/metal/sampler.zig diff --git a/pkg/glslang/build.zig b/pkg/glslang/build.zig index 46d0ba4a4..201c0743e 100644 --- a/pkg/glslang/build.zig +++ b/pkg/glslang/build.zig @@ -103,7 +103,6 @@ fn buildGlslang( "SPIRV/SpvBuilder.cpp", "SPIRV/SpvPostProcess.cpp", "SPIRV/doc.cpp", - "SPIRV/SpvTools.cpp", "SPIRV/disassemble.cpp", "SPIRV/CInterface/spirv_c_interface.cpp", }, diff --git a/src/renderer/Metal.zig b/src/renderer/Metal.zig index 0b9d3ac70..c2e9ebc30 100644 --- a/src/renderer/Metal.zig +++ b/src/renderer/Metal.zig @@ -27,6 +27,7 @@ const Terminal = terminal.Terminal; const mtl = @import("metal/api.zig"); const mtl_buffer = @import("metal/buffer.zig"); const mtl_image = @import("metal/image.zig"); +const mtl_sampler = @import("metal/sampler.zig"); const mtl_shaders = @import("metal/shaders.zig"); const Image = mtl_image.Image; const ImageMap = mtl_image.ImageMap; @@ -282,12 +283,10 @@ pub fn init(alloc: Allocator, options: renderer.Options) !Metal { log.warn("error loading custom shaders err={}", .{err}); break :err &.{}; }; - _ = custom_shaders; // Initialize our shaders - var shaders = try Shaders.init(alloc, device, &.{ - @embedFile("shaders/temp3.metal"), - }); + var shaders = try Shaders.init(alloc, device, custom_shaders); + //var shaders = try Shaders.init(alloc, device, &.{@embedFile("shaders/temp3.metal")}); errdefer shaders.deinit(alloc); // Font atlas textures @@ -779,23 +778,9 @@ fn drawPostShader( encoder: objc.Object, texture: objc.c.id, ) !void { - // Use our image shader pipeline - encoder.msgSend( - void, - objc.sel("setRenderPipelineState:"), - .{self.shaders.post_pipelines[0].value}, - ); - - // Set our uniform, which is the only shared buffer - encoder.msgSend( - void, - objc.sel("setVertexBytes:length:atIndex:"), - .{ - @as(*const anyopaque, @ptrCast(&self.uniforms)), - @as(c_ulong, @sizeOf(@TypeOf(self.uniforms))), - @as(c_ulong, 1), - }, - ); + // Build our sampler for our texture + var sampler = try mtl_sampler.Sampler.init(self.device); + defer sampler.deinit(); const Buffer = mtl_buffer.Buffer(mtl_shaders.PostUniforms); var buf = try Buffer.initFill(self.device, &.{.{ @@ -817,6 +802,20 @@ fn drawPostShader( defer buf.deinit(); post_time += 1; + // Use our custom shader pipeline + encoder.msgSend( + void, + objc.sel("setRenderPipelineState:"), + .{self.shaders.post_pipelines[0].value}, + ); + + // Set our sampler + encoder.msgSend( + void, + objc.sel("setFragmentSamplerState:atIndex:"), + .{ sampler.sampler.value, @as(c_ulong, 0) }, + ); + // Set our buffer encoder.msgSend( void, diff --git a/src/renderer/metal/sampler.zig b/src/renderer/metal/sampler.zig new file mode 100644 index 000000000..5f4d51cfc --- /dev/null +++ b/src/renderer/metal/sampler.zig @@ -0,0 +1,31 @@ +const std = @import("std"); +const Allocator = std.mem.Allocator; +const assert = std.debug.assert; +const objc = @import("objc"); + +pub const Sampler = struct { + sampler: objc.Object, + + pub fn init(device: objc.Object) !Sampler { + 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.msgSend(void, objc.sel("release"), .{}); + + const sampler = device.msgSend( + objc.Object, + objc.sel("newSamplerStateWithDescriptor:"), + .{desc}, + ); + errdefer sampler.msgSend(void, objc.sel("release"), .{}); + + return .{ .sampler = sampler }; + } + + pub fn deinit(self: *Sampler) void { + self.sampler.msgSend(void, objc.sel("release"), .{}); + } +}; diff --git a/src/renderer/shaders/temp3.metal b/src/renderer/shaders/temp3.metal index c8cedc0d4..b7a648608 100644 --- a/src/renderer/shaders/temp3.metal +++ b/src/renderer/shaders/temp3.metal @@ -102,7 +102,7 @@ void mainImage(thread float4& fragColor, thread const float2& fragCoord, constan fragColor = float4(col, 1.0); } -fragment main0_out main0(constant Globals& _89 [[buffer(0)]], texture2d iChannel0 [[texture(0)]], float4 gl_FragCoord [[position]]) +fragment main0_out main0(constant Globals& _89 [[buffer(0)]], texture2d iChannel0 [[texture(0)]], sampler iChannel0Smplr [[sampler(0)]], float4 gl_FragCoord [[position]]) { constexpr sampler iChannel0Smplr(address::clamp_to_edge, filter::linear);