About Social Code
aboutsummaryrefslogtreecommitdiff
path: root/src/kosmickrisp/bridge/mtl_sampler.m
diff options
context:
space:
mode:
Diffstat (limited to 'src/kosmickrisp/bridge/mtl_sampler.m')
-rw-r--r--src/kosmickrisp/bridge/mtl_sampler.m118
1 files changed, 118 insertions, 0 deletions
diff --git a/src/kosmickrisp/bridge/mtl_sampler.m b/src/kosmickrisp/bridge/mtl_sampler.m
new file mode 100644
index 00000000000..f7ddb66b7e1
--- /dev/null
+++ b/src/kosmickrisp/bridge/mtl_sampler.m
@@ -0,0 +1,118 @@
+/*
+ * Copyright 2025 LunarG, Inc.
+ * Copyright 2025 Google LLC
+ * SPDX-License-Identifier: MIT
+ */
+
+#include "mtl_sampler.h"
+
+#include <Metal/MTLSampler.h>
+
+mtl_sampler_descriptor *
+mtl_new_sampler_descriptor()
+{
+ @autoreleasepool {
+ MTLSamplerDescriptor *descriptor = [MTLSamplerDescriptor new];
+ /* Set common variables we don't expose */
+ descriptor.lodAverage = false;
+ descriptor.supportArgumentBuffers = true;
+ return descriptor;
+ }
+}
+
+void
+mtl_sampler_descriptor_set_normalized_coordinates(mtl_sampler_descriptor *descriptor, bool normalized_coordinates)
+{
+ @autoreleasepool {
+ MTLSamplerDescriptor *desc = (MTLSamplerDescriptor *)descriptor;
+ desc.normalizedCoordinates = normalized_coordinates;
+ }
+}
+
+void
+mtl_sampler_descriptor_set_address_mode(mtl_sampler_descriptor *descriptor,
+ enum mtl_sampler_address_mode address_mode_u,
+ enum mtl_sampler_address_mode address_mode_v,
+ enum mtl_sampler_address_mode address_mode_w)
+{
+ @autoreleasepool {
+ MTLSamplerDescriptor *desc = (MTLSamplerDescriptor *)descriptor;
+ desc.sAddressMode = (MTLSamplerAddressMode)address_mode_u;
+ desc.tAddressMode = (MTLSamplerAddressMode)address_mode_v;
+ desc.rAddressMode = (MTLSamplerAddressMode)address_mode_w;
+ }
+}
+
+void
+mtl_sampler_descriptor_set_border_color(mtl_sampler_descriptor *descriptor, enum mtl_sampler_border_color color)
+{
+ @autoreleasepool {
+ MTLSamplerDescriptor *desc = (MTLSamplerDescriptor *)descriptor;
+ desc.borderColor = (MTLSamplerBorderColor)color;
+ }
+}
+
+void
+mtl_sampler_descriptor_set_filters(mtl_sampler_descriptor *descriptor,
+ enum mtl_sampler_min_mag_filter min_filter,
+ enum mtl_sampler_min_mag_filter mag_filter,
+ enum mtl_sampler_mip_filter mip_filter)
+{
+ @autoreleasepool {
+ MTLSamplerDescriptor *desc = (MTLSamplerDescriptor *)descriptor;
+ desc.minFilter = (MTLSamplerMinMagFilter)min_filter;
+ desc.magFilter = (MTLSamplerMinMagFilter)mag_filter;
+ desc.mipFilter = (MTLSamplerMipFilter)mip_filter;
+ }
+}
+
+void
+mtl_sampler_descriptor_set_lod_clamp(mtl_sampler_descriptor *descriptor,
+ float min,
+ float max)
+{
+ @autoreleasepool {
+ MTLSamplerDescriptor *desc = (MTLSamplerDescriptor *)descriptor;
+ desc.lodMinClamp = min;
+ desc.lodMaxClamp = max;
+ }
+}
+
+void
+mtl_sampler_descriptor_set_max_anisotropy(mtl_sampler_descriptor *descriptor,
+ uint64_t max)
+{
+ @autoreleasepool {
+ MTLSamplerDescriptor *desc = (MTLSamplerDescriptor *)descriptor;
+ desc.maxAnisotropy = max ? max : 1u; /* Metal requires a non-zero value */
+ }
+}
+
+void
+mtl_sampler_descriptor_set_compare_function(mtl_sampler_descriptor *descriptor,
+ enum mtl_compare_function function)
+{
+ @autoreleasepool {
+ MTLSamplerDescriptor *desc = (MTLSamplerDescriptor *)descriptor;
+ desc.compareFunction = (MTLCompareFunction)function;
+ }
+}
+
+mtl_sampler *
+mtl_new_sampler(mtl_device *device, mtl_sampler_descriptor *descriptor)
+{
+ @autoreleasepool {
+ id<MTLDevice> dev = (id<MTLDevice>)device;
+ MTLSamplerDescriptor *desc = (MTLSamplerDescriptor *)descriptor;
+ return [dev newSamplerStateWithDescriptor:desc];
+ }
+}
+
+uint64_t
+mtl_sampler_get_gpu_resource_id(mtl_sampler *sampler)
+{
+ @autoreleasepool {
+ id<MTLSamplerState> samp = (id<MTLSamplerState>)sampler;
+ return [samp gpuResourceID]._impl;
+ }
+}