SDL_ttf: Metal fixes, clear atlas texture upfront

From 88322a54330ffe5ac334758a82abb7ae27ed4712 Mon Sep 17 00:00:00 2001
From: Caleb Cornett <[EMAIL REDACTED]>
Date: Wed, 1 Jan 2025 14:53:01 -0500
Subject: [PATCH] Metal fixes, clear atlas texture upfront

---
 examples/testgputext.c   |  8 ++++----
 src/SDL_gpu_textengine.c | 13 ++++++++++++-
 2 files changed, 16 insertions(+), 5 deletions(-)

diff --git a/examples/testgputext.c b/examples/testgputext.c
index bc4a7e6f..eb315876 100644
--- a/examples/testgputext.c
+++ b/examples/testgputext.c
@@ -11,7 +11,7 @@
 
 #define MAX_VERTEX_COUNT 4000
 #define MAX_INDEX_COUNT  6000
-#define SUPPORTED_SHADER_FORMATS (SDL_GPU_SHADERFORMAT_SPIRV | SDL_GPU_SHADERFORMAT_DXBC | SDL_GPU_SHADERFORMAT_DXIL | SDL_GPU_SHADERFORMAT_METALLIB)
+#define SUPPORTED_SHADER_FORMATS (SDL_GPU_SHADERFORMAT_SPIRV | SDL_GPU_SHADERFORMAT_DXBC | SDL_GPU_SHADERFORMAT_DXIL | SDL_GPU_SHADERFORMAT_MSL)
 
 typedef SDL_FPoint Vec2;
 
@@ -89,11 +89,11 @@ SDL_GPUShader *load_shader(
         createinfo.code = is_vertex ? shader_vert_sm60_dxil : shader_frag_sm60_dxil;
         createinfo.code_size = is_vertex ? SDL_arraysize(shader_vert_sm60_dxil) : SDL_arraysize(shader_frag_sm60_dxil);
         createinfo.entrypoint = is_vertex ? "VSMain" : "PSMain";
-    } else if (format & SDL_GPU_SHADERFORMAT_METALLIB) {
-        createinfo.format = SDL_GPU_SHADERFORMAT_METALLIB;
+    } else if (format & SDL_GPU_SHADERFORMAT_MSL) {
+        createinfo.format = SDL_GPU_SHADERFORMAT_MSL;
         createinfo.code = is_vertex ? shader_vert_metal : shader_frag_metal;
         createinfo.code_size = is_vertex ? shader_vert_metal_len : shader_frag_metal_len;
-        createinfo.entrypoint = is_vertex ? "vs_main" : "fs_main";
+        createinfo.entrypoint = "main0";
     } else {
         createinfo.format = SDL_GPU_SHADERFORMAT_SPIRV;
         createinfo.code = is_vertex ? shader_vert_spv : shader_frag_spv;
diff --git a/src/SDL_gpu_textengine.c b/src/SDL_gpu_textengine.c
index 93a4656b..bd9d96a3 100644
--- a/src/SDL_gpu_textengine.c
+++ b/src/SDL_gpu_textengine.c
@@ -182,7 +182,7 @@ static AtlasTexture *CreateAtlas(SDL_GPUDevice *device)
     SDL_GPUTextureCreateInfo info = { 0 };
     info.type = SDL_GPU_TEXTURETYPE_2D;
     info.format = SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UNORM;
-    info.usage = SDL_GPU_TEXTUREUSAGE_SAMPLER;
+    info.usage = SDL_GPU_TEXTUREUSAGE_SAMPLER | SDL_GPU_TEXTUREUSAGE_COLOR_TARGET;
     info.width = ATLAS_TEXTURE_SIZE;
     info.height = ATLAS_TEXTURE_SIZE;
     info.layer_count_or_depth = 1;
@@ -195,6 +195,17 @@ static AtlasTexture *CreateAtlas(SDL_GPUDevice *device)
         return NULL;
     }
 
+    SDL_GPUColorTargetInfo target_info;
+    SDL_zero(target_info);
+    target_info.texture = atlas->texture;
+    target_info.clear_color = (SDL_FColor) { 0, 0, 0, 0 };
+    target_info.load_op = SDL_GPU_LOADOP_CLEAR;
+
+    SDL_GPUCommandBuffer *cbuf = SDL_AcquireGPUCommandBuffer(device);
+    SDL_GPURenderPass *rpass = SDL_BeginGPURenderPass(cbuf, &target_info, 1, NULL);
+    SDL_EndGPURenderPass(rpass);
+    SDL_SubmitGPUCommandBuffer(cbuf);
+
     int num_nodes = ATLAS_TEXTURE_SIZE / 4;
     atlas->packing_nodes = (stbrp_node *)SDL_calloc(num_nodes, sizeof(*atlas->packing_nodes));
     if (!atlas->packing_nodes) {