Saltar al contenido principal
agosto 26, 2021

API Metal y Wave Engine

En nuestro esfuerzo por colaborar entre el equipo de mobile (para el que trabajo) y el de research, se me ha asignado la tarea de construir nuestro propio .NET binding para la API Metal de Apple. 

Los principales objetivos son:

  1. Poder mantenerlo actualizado con las últimas versiones.
  2. Rendimiento: Hacerlo lo más ligero posible.

Metal es el conjunto de APIs gráficas que Apple ofrece junto con sus dispositivos. Podemos verlo rápidamente como el sustituto de OpenGL, o el equivalente de DirectX en Windows. Mis compañeros, que trabajan en Wave Engine, han estado probando diferentes bindings proporcionados por la comunidad, pero les faltan las últimas actualizaciones de Apple.

METAL

API Metal

La API de Metal ha evolucionado desde que se crearon esos bindings y, como ya hemos hecho con WebGL, nos gustaría generarlos bajo demanda. Esto nos permite alinearnos rápidamente con las últimas API gráficas para aprovechar todas sus ventajas.

Metal está disponible en forma de un conjunto de archivos Objective-C, que se pueden encontrar dentro de Xcode.app. Necesitamos una herramienta que los lea y genere un equivalente en C#, consumible desde .NET. Queremos que sea una plataforma agnóstica, en términos de generar una pequeña DLL que llame directamente a la API de Metal con la ayuda del Runtime de Objective-C, todo a través de P/Invoke.

Como Objective-C es una lenguaje mucho más complejo que, por ejemplo, IDL (WebGL se definió en IDL), hemos elegido ANTLR, junto con su gramática pública de Objective-C. Esta última necesita algún esfuerzo para soportar algunas características utilizadas junto a la API de Metal, pero parece lo suficientemente prometedora como para proporcionar una representación abstract syntax tree (AST) en memoria, que posteriormente se traduce a C#.

MTLResource.h (Objective-C) frente a su equivalente MTLResource.cs (C#)

Actualmente estamos trabajando en la definición de los enums junto con toda la API. Paso a paso, la gramática se está fortaleciendo al pasar por todo el codebase, lo que nos ayudará con el resto de traducciones.

Una vez que hayamos completado y testado el biding haremos público el repositorio, para que todo el mundo pueda beneficiarse de él, junto con OpenGL.NET, Vulkan.NET y OpenXR.NET.

Y si quieres saber más sobre la última versión de nuestro motor gráfico, ¡descubre Evergine!

Autor
Marcos Cobeña Morián
Plain Concepts Mobile