SDL: Save a copy of the D3D12 semantic string (1fd47)

From 1fd47039075e368430abb0d297f441bd4be40d8d Mon Sep 17 00:00:00 2001
From: Sam Lantinga <[EMAIL REDACTED]>
Date: Sun, 2 Nov 2025 16:15:20 -0800
Subject: [PATCH] Save a copy of the D3D12 semantic string

Fixes https://github.com/libsdl-org/SDL/issues/14383

(cherry picked from commit 4db63e323e37e6bb7df6a743999d1ded036553a8)
---
 src/gpu/d3d12/SDL_gpu_d3d12.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/src/gpu/d3d12/SDL_gpu_d3d12.c b/src/gpu/d3d12/SDL_gpu_d3d12.c
index 914c53a89c3ce..92b9b7a7ad752 100644
--- a/src/gpu/d3d12/SDL_gpu_d3d12.c
+++ b/src/gpu/d3d12/SDL_gpu_d3d12.c
@@ -876,7 +876,7 @@ struct D3D12Renderer
     SDL_SharedObject *d3d12_dll;
     ID3D12Device *device;
     PFN_D3D12_SERIALIZE_ROOT_SIGNATURE D3D12SerializeRootSignature_func;
-    const char *semantic;
+    char *semantic;
     SDL_iconv_t iconv;
 
     ID3D12CommandQueue *commandQueue;
@@ -1739,6 +1739,7 @@ static void D3D12_INTERNAL_DestroyRenderer(D3D12Renderer *renderer)
     SDL_DestroyMutex(renderer->windowLock);
     SDL_DestroyMutex(renderer->fenceLock);
     SDL_DestroyMutex(renderer->disposeLock);
+    SDL_free(renderer->semantic);
     SDL_free(renderer);
 }
 
@@ -9212,7 +9213,7 @@ static SDL_GPUDevice *D3D12_CreateDevice(bool debugMode, bool preferLowPower, SD
     renderer->debug_mode = debugMode;
     renderer->allowedFramesInFlight = 2;
 
-    renderer->semantic = SDL_GetStringProperty(props, SDL_PROP_GPU_DEVICE_CREATE_D3D12_SEMANTIC_NAME_STRING, "TEXCOORD");
+    renderer->semantic = SDL_strdup(SDL_GetStringProperty(props, SDL_PROP_GPU_DEVICE_CREATE_D3D12_SEMANTIC_NAME_STRING, "TEXCOORD"));
 
     // Blit resources
     D3D12_INTERNAL_InitBlitResources(renderer);