SDL_shadercross: HLSL compile warnings are no longer fatal (#74)

From 2a504a4b9ec5492a447335839c82cbff42ab2ac9 Mon Sep 17 00:00:00 2001
From: Evan Hemsley <[EMAIL REDACTED]>
Date: Fri, 20 Dec 2024 20:02:10 -0800
Subject: [PATCH] HLSL compile warnings are no longer fatal (#74)

---
 src/SDL_shadercross.c | 48 +++++++++++++++++++++++++++----------------
 1 file changed, 30 insertions(+), 18 deletions(-)

diff --git a/src/SDL_shadercross.c b/src/SDL_shadercross.c
index 7d954ba..a42dd1f 100644
--- a/src/SDL_shadercross.c
+++ b/src/SDL_shadercross.c
@@ -492,36 +492,48 @@ static void *SDL_ShaderCross_INTERNAL_CompileUsingDXC(
         return NULL;
     }
 
-    dxcResult->lpVtbl->GetOutput(
-        dxcResult,
-        DXC_OUT_ERRORS,
-        IID_IDxcBlobUtf8,
-        (void **)&errors,
-        NULL);
-
-    if (errors != NULL && errors->lpVtbl->GetBufferSize(errors) != 0) {
-        SDL_SetError(
-           "HLSL compilation failed: %s",
-            (char *)errors->lpVtbl->GetBufferPointer(errors));
-        dxcResult->lpVtbl->Release(dxcResult);
-        dxcInstance->lpVtbl->Release(dxcInstance);
-        utils->lpVtbl->Release(utils);
-        return NULL;
-    }
-
     ret = dxcResult->lpVtbl->GetOutput(dxcResult,
                                        DXC_OUT_OBJECT,
                                        IID_IDxcBlob,
                                        (void **)&blob,
                                        NULL);
     if (ret < 0) {
-        SDL_SetError("%s", "IDxcBlob fetch failed");
+        // Compilation failed, display errors
+        dxcResult->lpVtbl->GetOutput(
+            dxcResult,
+            DXC_OUT_ERRORS,
+            IID_IDxcBlobUtf8,
+            (void **)&errors,
+            NULL);
+
+        if (errors != NULL && errors->lpVtbl->GetBufferSize(errors) != 0) {
+            SDL_SetError(
+            "HLSL compilation failed: %s",
+                (char *)errors->lpVtbl->GetBufferPointer(errors));
+        } else {
+            SDL_SetError("%s", "Compilation failed with unknown error");
+        }
+
+        // teardown
         dxcResult->lpVtbl->Release(dxcResult);
         dxcInstance->lpVtbl->Release(dxcInstance);
         utils->lpVtbl->Release(utils);
         return NULL;
     }
 
+    // If compilation succeeded, but there are errors, those are warnings
+    dxcResult->lpVtbl->GetOutput(
+        dxcResult,
+        DXC_OUT_ERRORS,
+        IID_IDxcBlobUtf8,
+        (void **)&errors,
+        NULL);
+
+    if (errors != NULL && errors->lpVtbl->GetBufferSize(errors) != 0) {
+        SDL_LogWarn(SDL_LOG_CATEGORY_APPLICATION, "HLSL compiled with warnings: %s",
+            (char *)errors->lpVtbl->GetBufferPointer(errors));
+    }
+
     *size = blob->lpVtbl->GetBufferSize(blob);
     void *buffer = SDL_malloc(*size);
     SDL_memcpy(buffer, blob->lpVtbl->GetBufferPointer(blob), *size);