Explorar el Código

Merge pull request #64855 from RandomShaper/spv_ref_zero_alloc

Avoid spurious alloc error in SPIRV-Reflect
Rémi Verschelde hace 3 años
padre
commit
04ec0de37a

+ 28 - 0
thirdparty/spirv-reflect/patches/zero-calloc.patch

@@ -0,0 +1,28 @@
+diff --git a/thirdparty/spirv-reflect/spirv_reflect.c b/thirdparty/spirv-reflect/spirv_reflect.c
+index c174ae1900..11ccbdee3a 100644
+--- a/thirdparty/spirv-reflect/spirv_reflect.c
++++ b/thirdparty/spirv-reflect/spirv_reflect.c
+@@ -3322,12 +3322,18 @@ static SpvReflectResult ParseExecutionModes(
+     }
+     for (size_t entry_point_idx = 0; entry_point_idx < p_module->entry_point_count; ++entry_point_idx) {
+       SpvReflectEntryPoint* p_entry_point = &p_module->entry_points[entry_point_idx];
+-      p_entry_point->execution_modes =
+-          (SpvExecutionMode*)calloc(p_entry_point->execution_mode_count, sizeof(*p_entry_point->execution_modes));
+-      if (IsNull(p_entry_point->execution_modes)) {
+-        SafeFree(indices);
+-        return SPV_REFLECT_RESULT_ERROR_ALLOC_FAILED;
++// -- GODOT begin --
++      if (p_entry_point->execution_mode_count > 0) {
++// -- GODOT end --
++        p_entry_point->execution_modes =
++            (SpvExecutionMode*)calloc(p_entry_point->execution_mode_count, sizeof(*p_entry_point->execution_modes));
++        if (IsNull(p_entry_point->execution_modes)) {
++          SafeFree(indices);
++          return SPV_REFLECT_RESULT_ERROR_ALLOC_FAILED;
++        }
++// -- GODOT begin --
+       }
++// -- GODOT end --
+     }
+ 
+     for (size_t node_idx = 0; node_idx < p_parser->node_count; ++node_idx) {

+ 11 - 5
thirdparty/spirv-reflect/spirv_reflect.c

@@ -3322,12 +3322,18 @@ static SpvReflectResult ParseExecutionModes(
     }
     for (size_t entry_point_idx = 0; entry_point_idx < p_module->entry_point_count; ++entry_point_idx) {
       SpvReflectEntryPoint* p_entry_point = &p_module->entry_points[entry_point_idx];
-      p_entry_point->execution_modes =
-          (SpvExecutionMode*)calloc(p_entry_point->execution_mode_count, sizeof(*p_entry_point->execution_modes));
-      if (IsNull(p_entry_point->execution_modes)) {
-        SafeFree(indices);
-        return SPV_REFLECT_RESULT_ERROR_ALLOC_FAILED;
+// -- GODOT begin --
+      if (p_entry_point->execution_mode_count > 0) {
+// -- GODOT end --
+        p_entry_point->execution_modes =
+            (SpvExecutionMode*)calloc(p_entry_point->execution_mode_count, sizeof(*p_entry_point->execution_modes));
+        if (IsNull(p_entry_point->execution_modes)) {
+          SafeFree(indices);
+          return SPV_REFLECT_RESULT_ERROR_ALLOC_FAILED;
+        }
+// -- GODOT begin --
       }
+// -- GODOT end --
     }
 
     for (size_t node_idx = 0; node_idx < p_parser->node_count; ++node_idx) {