mesa/src/kosmickrisp/bridge/mtl_render_state.m
Aitor Camacho 7c268a1e91
Some checks are pending
macOS-CI / macOS-CI (dri) (push) Waiting to run
macOS-CI / macOS-CI (xlib) (push) Waiting to run
kk: Add KosmicKrisp
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/37522>
2025-10-20 17:46:38 +00:00

475 lines
15 KiB
Objective-C

/*
* 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];
}
}