About Social Code
aboutsummaryrefslogtreecommitdiff
path: root/src/kosmickrisp/bridge/mtl_render_state.m
diff options
context:
space:
mode:
Diffstat (limited to 'src/kosmickrisp/bridge/mtl_render_state.m')
-rw-r--r--src/kosmickrisp/bridge/mtl_render_state.m475
1 files changed, 475 insertions, 0 deletions
diff --git a/src/kosmickrisp/bridge/mtl_render_state.m b/src/kosmickrisp/bridge/mtl_render_state.m
new file mode 100644
index 00000000000..0a5051c286a
--- /dev/null
+++ b/src/kosmickrisp/bridge/mtl_render_state.m
@@ -0,0 +1,475 @@
+/*
+ * Copyright 2025 LunarG, Inc.
+ * Copyright 2025 Google LLC
+ * SPDX-License-Identifier: MIT
+ */
+
+#include "mtl_render_state.h"
+
+#include "mtl_format.h"
+
+/* TODO_KOSMICKRISP Remove */
+#include "vk_to_mtl_map.h"
+
+/* TODO_KOSMICKRISP Remove */
+#include "vulkan/vulkan.h"
+
+#include <Metal/MTLRenderPass.h>
+#include <Metal/MTLRenderPipeline.h>
+#include <Metal/MTLDepthStencil.h>
+
+/* Render pass descriptor */
+mtl_render_pass_descriptor *
+mtl_new_render_pass_descriptor(void)
+{
+ @autoreleasepool {
+ return [[MTLRenderPassDescriptor renderPassDescriptor] retain];
+ }
+}
+
+mtl_render_pass_attachment_descriptor *
+mtl_render_pass_descriptor_get_color_attachment(
+ mtl_render_pass_descriptor *descriptor, uint32_t index)
+{
+ @autoreleasepool {
+ MTLRenderPassDescriptor *desc = (MTLRenderPassDescriptor *)descriptor;
+ return desc.colorAttachments[index];
+ }
+}
+
+mtl_render_pass_attachment_descriptor *
+mtl_render_pass_descriptor_get_depth_attachment(
+ mtl_render_pass_descriptor *descriptor)
+{
+ @autoreleasepool {
+ MTLRenderPassDescriptor *desc = (MTLRenderPassDescriptor *)descriptor;
+ return desc.depthAttachment;
+ }
+}
+
+mtl_render_pass_attachment_descriptor *
+mtl_render_pass_descriptor_get_stencil_attachment(
+ mtl_render_pass_descriptor *descriptor)
+{
+ @autoreleasepool {
+ MTLRenderPassDescriptor *desc = (MTLRenderPassDescriptor *)descriptor;
+ return desc.stencilAttachment;
+ }
+}
+
+void
+mtl_render_pass_attachment_descriptor_set_texture(
+ mtl_render_pass_attachment_descriptor *descriptor, mtl_texture *texture)
+{
+ @autoreleasepool {
+ MTLRenderPassAttachmentDescriptor *desc = (MTLRenderPassAttachmentDescriptor *)descriptor;
+ desc.texture = (id<MTLTexture>)texture;
+ }
+}
+
+void
+mtl_render_pass_attachment_descriptor_set_level(
+ mtl_render_pass_attachment_descriptor *descriptor, uint32_t level)
+{
+ @autoreleasepool {
+ MTLRenderPassAttachmentDescriptor *desc = (MTLRenderPassAttachmentDescriptor *)descriptor;
+ desc.level = level;
+ }
+}
+
+void
+mtl_render_pass_attachment_descriptor_set_slice(
+ mtl_render_pass_attachment_descriptor *descriptor, uint32_t slice)
+{
+ @autoreleasepool {
+ MTLRenderPassAttachmentDescriptor *desc = (MTLRenderPassAttachmentDescriptor *)descriptor;
+ desc.slice = slice;
+ }
+}
+
+void
+mtl_render_pass_attachment_descriptor_set_load_action(
+ mtl_render_pass_attachment_descriptor *descriptor,
+ enum mtl_load_action action)
+{
+ @autoreleasepool {
+ MTLRenderPassAttachmentDescriptor *desc = (MTLRenderPassAttachmentDescriptor *)descriptor;
+ desc.loadAction = (MTLLoadAction)action;
+ }
+}
+
+void
+mtl_render_pass_attachment_descriptor_set_store_action(
+ mtl_render_pass_attachment_descriptor *descriptor,
+ enum mtl_store_action action)
+{
+ @autoreleasepool {
+ MTLRenderPassAttachmentDescriptor *desc = (MTLRenderPassAttachmentDescriptor *)descriptor;
+ desc.storeAction = (MTLStoreAction)action;
+ desc.storeActionOptions = MTLStoreActionOptionNone; /* TODO_KOSMICKRISP Maybe expose this? */
+ }
+}
+
+void
+mtl_render_pass_attachment_descriptor_set_clear_color(
+ mtl_render_pass_attachment_descriptor *descriptor,
+ struct mtl_clear_color clear_color)
+{
+ @autoreleasepool {
+ MTLRenderPassColorAttachmentDescriptor *desc = (MTLRenderPassColorAttachmentDescriptor *)descriptor;
+ desc.clearColor = MTLClearColorMake(clear_color.red, clear_color.green, clear_color.blue, clear_color.alpha);
+ }
+}
+
+void
+mtl_render_pass_attachment_descriptor_set_clear_depth(
+ mtl_render_pass_attachment_descriptor *descriptor, double depth)
+{
+ @autoreleasepool {
+ MTLRenderPassDepthAttachmentDescriptor *desc = (MTLRenderPassDepthAttachmentDescriptor *)descriptor;
+ desc.clearDepth = depth;
+ }
+}
+
+void
+mtl_render_pass_attachment_descriptor_set_clear_stencil(mtl_render_pass_attachment_descriptor *descriptor,
+ uint32_t stencil)
+{
+ @autoreleasepool {
+ MTLRenderPassStencilAttachmentDescriptor *desc = (MTLRenderPassStencilAttachmentDescriptor *)descriptor;
+ desc.clearStencil = stencil;
+ }
+}
+
+void
+mtl_render_pass_descriptor_set_render_target_array_length(mtl_render_pass_descriptor *descriptor,
+ uint32_t length)
+{
+ @autoreleasepool {
+ MTLRenderPassDescriptor *desc = (MTLRenderPassDescriptor *)descriptor;
+ desc.renderTargetArrayLength = length;
+ }
+}
+
+void
+mtl_render_pass_descriptor_set_render_target_width(mtl_render_pass_descriptor *descriptor,
+ uint32_t width)
+{
+ @autoreleasepool {
+ MTLRenderPassDescriptor *desc = (MTLRenderPassDescriptor *)descriptor;
+ desc.renderTargetWidth = width;
+ }
+}
+
+void
+mtl_render_pass_descriptor_set_render_target_height(mtl_render_pass_descriptor *descriptor,
+ uint32_t height)
+{
+ @autoreleasepool {
+ MTLRenderPassDescriptor *desc = (MTLRenderPassDescriptor *)descriptor;
+ desc.renderTargetHeight = height;
+ }
+}
+
+void
+mtl_render_pass_descriptor_set_default_raster_sample_count(mtl_render_pass_descriptor *descriptor,
+ uint32_t sample_count)
+{
+ @autoreleasepool {
+ MTLRenderPassDescriptor *desc = (MTLRenderPassDescriptor *)descriptor;
+ desc.defaultRasterSampleCount = sample_count;
+ }
+}
+
+void
+mtl_render_pass_descriptor_set_visibility_buffer(mtl_render_pass_descriptor *descriptor,
+ mtl_buffer *visibility_buffer)
+{
+ @autoreleasepool {
+ MTLRenderPassDescriptor *desc = (MTLRenderPassDescriptor *)descriptor;
+ id<MTLBuffer> buffer = (id<MTLBuffer>)visibility_buffer;
+ desc.visibilityResultBuffer = buffer;
+ }
+}
+
+/* Render pipeline descriptor */
+mtl_render_pipeline_descriptor *
+mtl_new_render_pipeline_descriptor()
+{
+ @autoreleasepool {
+ return [[MTLRenderPipelineDescriptor alloc] init];
+ }
+}
+
+void
+mtl_render_pipeline_descriptor_set_vertex_shader(mtl_render_pass_descriptor *descriptor,
+ mtl_function *shader)
+{
+ @autoreleasepool {
+ MTLRenderPipelineDescriptor *desc = (MTLRenderPipelineDescriptor *)descriptor;
+ desc.vertexFunction = (id<MTLFunction>)shader;
+ }
+}
+
+void
+mtl_render_pipeline_descriptor_set_fragment_shader(mtl_render_pass_descriptor *descriptor,
+ mtl_function *shader)
+{
+ @autoreleasepool {
+ MTLRenderPipelineDescriptor *desc = (MTLRenderPipelineDescriptor *)descriptor;
+ desc.fragmentFunction = (id<MTLFunction>)shader;
+ }
+}
+
+void
+mtl_render_pipeline_descriptor_set_input_primitive_topology(mtl_render_pass_descriptor *descriptor,
+ enum mtl_primitive_topology_class class)
+{
+ @autoreleasepool {
+ MTLRenderPipelineDescriptor *desc = (MTLRenderPipelineDescriptor *)descriptor;
+ desc.inputPrimitiveTopology = (MTLPrimitiveTopologyClass)class;
+ }
+}
+
+void
+mtl_render_pipeline_descriptor_set_color_attachment_format(mtl_render_pass_descriptor *descriptor,
+ uint8_t index,
+ enum mtl_pixel_format format)
+{
+ @autoreleasepool {
+ MTLRenderPipelineDescriptor *desc = (MTLRenderPipelineDescriptor *)descriptor;
+ desc.colorAttachments[index].pixelFormat = (MTLPixelFormat)format;
+ }
+}
+
+void
+mtl_render_pipeline_descriptor_set_depth_attachment_format(mtl_render_pass_descriptor *descriptor,
+ enum mtl_pixel_format format)
+{
+ @autoreleasepool {
+ MTLRenderPipelineDescriptor *desc = (MTLRenderPipelineDescriptor *)descriptor;
+ desc.depthAttachmentPixelFormat = (MTLPixelFormat)format;
+ }
+}
+
+void
+mtl_render_pipeline_descriptor_set_stencil_attachment_format(mtl_render_pass_descriptor *descriptor,
+ enum mtl_pixel_format format)
+{
+ @autoreleasepool {
+ MTLRenderPipelineDescriptor *desc = (MTLRenderPipelineDescriptor *)descriptor;
+ desc.stencilAttachmentPixelFormat = (MTLPixelFormat)format;
+ }
+}
+
+void
+mtl_render_pipeline_descriptor_set_raster_sample_count(mtl_render_pass_descriptor *descriptor,
+ uint32_t sample_count)
+{
+ @autoreleasepool {
+ MTLRenderPipelineDescriptor *desc = (MTLRenderPipelineDescriptor *)descriptor;
+ desc.rasterSampleCount = sample_count;
+ }
+}
+
+void
+mtl_render_pipeline_descriptor_set_alpha_to_coverage(mtl_render_pass_descriptor *descriptor,
+ bool enabled)
+{
+ @autoreleasepool {
+ MTLRenderPipelineDescriptor *desc = (MTLRenderPipelineDescriptor *)descriptor;
+ desc.alphaToCoverageEnabled = enabled;
+ }
+}
+
+void
+mtl_render_pipeline_descriptor_set_alpha_to_one(mtl_render_pass_descriptor *descriptor,
+ bool enabled)
+{
+ @autoreleasepool {
+ MTLRenderPipelineDescriptor *desc = (MTLRenderPipelineDescriptor *)descriptor;
+ desc.alphaToOneEnabled = enabled;
+ }
+}
+
+void
+mtl_render_pipeline_descriptor_set_rasterization_enabled(mtl_render_pass_descriptor *descriptor,
+ bool enabled)
+{
+ @autoreleasepool {
+ MTLRenderPipelineDescriptor *desc = (MTLRenderPipelineDescriptor *)descriptor;
+ desc.rasterizationEnabled = enabled;
+ }
+}
+
+void
+mtl_render_pipeline_descriptor_set_max_vertex_amplification_count( mtl_render_pass_descriptor *descriptor,
+ uint32_t count)
+{
+ @autoreleasepool {
+ MTLRenderPipelineDescriptor *desc = (MTLRenderPipelineDescriptor *)descriptor;
+ desc.maxVertexAmplificationCount = count;
+ }
+}
+
+/* Render pipeline */
+mtl_render_pipeline_state *
+mtl_new_render_pipeline(mtl_device *device, mtl_render_pass_descriptor *descriptor)
+{
+ @autoreleasepool {
+ MTLRenderPipelineDescriptor *desc = (MTLRenderPipelineDescriptor *)descriptor;
+ id<MTLDevice> dev = (id<MTLDevice>)device;
+ NSError *error = nil;
+ mtl_render_pipeline_state *pipeline = [dev newRenderPipelineStateWithDescriptor:desc error:&error];
+ if (error != nil) {
+ fprintf(stderr, "Failed to create MTLLibrary: %s\n", [error.localizedDescription UTF8String]);
+ }
+
+ return pipeline;
+ }
+}
+
+/* Stencil descriptor */
+mtl_stencil_descriptor *
+mtl_new_stencil_descriptor()
+{
+ @autoreleasepool {
+ return [[MTLStencilDescriptor new] init];
+ }
+}
+
+/* TODO_KOSMICKRISP Move this to map */
+static MTLStencilOperation
+map_vk_stencil_op_to_mtl_stencil_operation(VkStencilOp op)
+{
+ switch (op) {
+ case VK_STENCIL_OP_KEEP:
+ return MTLStencilOperationKeep;
+ case VK_STENCIL_OP_ZERO:
+ return MTLStencilOperationZero;
+ case VK_STENCIL_OP_REPLACE:
+ return MTLStencilOperationReplace;
+ case VK_STENCIL_OP_INCREMENT_AND_CLAMP:
+ return MTLStencilOperationIncrementClamp;
+ case VK_STENCIL_OP_DECREMENT_AND_CLAMP:
+ return MTLStencilOperationDecrementClamp;
+ case VK_STENCIL_OP_INVERT:
+ return MTLStencilOperationInvert;
+ case VK_STENCIL_OP_INCREMENT_AND_WRAP:
+ return MTLStencilOperationIncrementWrap;
+ case VK_STENCIL_OP_DECREMENT_AND_WRAP:
+ return MTLStencilOperationDecrementWrap;
+ default:
+ assert(false && "Unsupported VkStencilOp");
+ return MTLStencilOperationZero;
+ };
+}
+
+void
+mtl_stencil_descriptor_set_stencil_failure_operation(mtl_stencil_descriptor *descriptor, VkStencilOp op)
+{
+ @autoreleasepool {
+ MTLStencilDescriptor *desc = (MTLStencilDescriptor *)descriptor;
+ desc.stencilFailureOperation = map_vk_stencil_op_to_mtl_stencil_operation(op);
+ }
+}
+
+void
+mtl_stencil_descriptor_set_depth_failure_operation(mtl_stencil_descriptor *descriptor, VkStencilOp op)
+{
+ @autoreleasepool {
+ MTLStencilDescriptor *desc = (MTLStencilDescriptor *)descriptor;
+ desc.depthFailureOperation = map_vk_stencil_op_to_mtl_stencil_operation(op);
+ }
+}
+
+void
+mtl_stencil_descriptor_set_depth_stencil_pass_operation(mtl_stencil_descriptor *descriptor, VkStencilOp op)
+{
+ @autoreleasepool {
+ MTLStencilDescriptor *desc = (MTLStencilDescriptor *)descriptor;
+ desc.depthStencilPassOperation = map_vk_stencil_op_to_mtl_stencil_operation(op);
+ }
+}
+
+void
+mtl_stencil_descriptor_set_stencil_compare_function(mtl_stencil_descriptor *descriptor, VkCompareOp op)
+{
+ @autoreleasepool {
+ MTLStencilDescriptor *desc = (MTLStencilDescriptor *)descriptor;
+ desc.stencilCompareFunction = (MTLCompareFunction)vk_compare_op_to_mtl_compare_function(op);
+ }
+}
+
+void
+mtl_stencil_descriptor_set_read_mask(mtl_stencil_descriptor *descriptor, uint32_t mask)
+{
+ @autoreleasepool {
+ MTLStencilDescriptor *desc = (MTLStencilDescriptor *)descriptor;
+ desc.readMask = mask;
+ }
+}
+
+void
+mtl_stencil_descriptor_set_write_mask(mtl_stencil_descriptor *descriptor, uint32_t mask)
+{
+ @autoreleasepool {
+ MTLStencilDescriptor *desc = (MTLStencilDescriptor *)descriptor;
+ desc.writeMask = mask;
+ }
+}
+
+/* Depth stencil descriptor */
+mtl_depth_stencil_descriptor *
+mtl_new_depth_stencil_descriptor()
+{
+ @autoreleasepool {
+ return [[MTLDepthStencilDescriptor new] init];
+ }
+}
+
+void
+mtl_depth_stencil_descriptor_set_depth_compare_function(mtl_depth_stencil_descriptor *descriptor, VkCompareOp op)
+{
+ @autoreleasepool {
+ MTLDepthStencilDescriptor *desc = (MTLDepthStencilDescriptor *)descriptor;
+ desc.depthCompareFunction = (MTLCompareFunction)vk_compare_op_to_mtl_compare_function(op);
+ }
+}
+
+void
+mtl_depth_stencil_descriptor_set_depth_write_enabled(mtl_depth_stencil_descriptor *descriptor, bool enable_write)
+{
+ @autoreleasepool {
+ MTLDepthStencilDescriptor *desc = (MTLDepthStencilDescriptor *)descriptor;
+ desc.depthWriteEnabled = enable_write;
+ }
+}
+
+void
+mtl_depth_stencil_descriptor_set_back_face_stencil(mtl_depth_stencil_descriptor *descriptor, mtl_stencil_descriptor *stencil_descriptor)
+{
+ @autoreleasepool {
+ MTLDepthStencilDescriptor *desc = (MTLDepthStencilDescriptor *)descriptor;
+ desc.backFaceStencil = (MTLStencilDescriptor *)stencil_descriptor;
+ }
+}
+
+void
+mtl_depth_stencil_descriptor_set_front_face_stencil(mtl_depth_stencil_descriptor *descriptor, mtl_stencil_descriptor *stencil_descriptor)
+{
+ @autoreleasepool {
+ MTLDepthStencilDescriptor *desc = (MTLDepthStencilDescriptor *)descriptor;
+ desc.frontFaceStencil = (MTLStencilDescriptor *)stencil_descriptor;
+ }
+}
+
+mtl_depth_stencil_state *
+mtl_new_depth_stencil_state(mtl_device *device, mtl_depth_stencil_descriptor *descriptor)
+{
+ @autoreleasepool {
+ id<MTLDevice> dev = (id<MTLDevice>)device;
+ MTLDepthStencilDescriptor *desc = (MTLDepthStencilDescriptor *)descriptor;
+ return [dev newDepthStencilStateWithDescriptor:desc];
+ }
+}