Nikolay Sivov : d3d10/effect: Add a helper to parse annotations array.

Alexandre Julliard julliard at winehq.org
Mon Sep 20 16:26:19 CDT 2021


Module: wine
Branch: master
Commit: b6f4284bb10dbc7ea037ffa739147178bdc9b414
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=b6f4284bb10dbc7ea037ffa739147178bdc9b414

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Thu Sep 16 09:48:10 2021 +0300

d3d10/effect: Add a helper to parse annotations array.

Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Matteo Bruni <mbruni at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/d3d10/effect.c | 118 +++++++++++++++++++++-------------------------------
 1 file changed, 47 insertions(+), 71 deletions(-)

diff --git a/dlls/d3d10/effect.c b/dlls/d3d10/effect.c
index 10b8565c8d7..a2595aac136 100644
--- a/dlls/d3d10/effect.c
+++ b/dlls/d3d10/effect.c
@@ -1375,6 +1375,33 @@ static HRESULT parse_fx10_annotation(const char *data, size_t data_size,
     return S_OK;
 }
 
+static HRESULT parse_fx10_annotations(const char *data, size_t data_size, const char **ptr,
+        struct d3d10_effect *effect, unsigned int annotation_count,
+        struct d3d10_effect_variable **annotations)
+{
+    unsigned int i;
+    HRESULT hr;
+
+    if (!(*annotations = heap_calloc(annotation_count, sizeof(**annotations))))
+    {
+        ERR("Failed to allocate annotations memory.\n");
+        return E_OUTOFMEMORY;
+    }
+
+    for (i = 0; i < annotation_count; ++i)
+    {
+        struct d3d10_effect_variable *a = &(*annotations)[i];
+
+        a->effect = effect;
+        a->buffer = &null_local_buffer;
+
+        if (FAILED(hr = parse_fx10_annotation(data, data_size, ptr, a)))
+            return hr;
+    }
+
+    return hr;
+}
+
 static HRESULT parse_fx10_anonymous_shader(struct d3d10_effect *e, struct d3d10_effect_anonymous_shader *s,
     enum d3d10_effect_object_type otype)
 {
@@ -1904,21 +1931,11 @@ static HRESULT parse_fx10_pass(const char *data, size_t data_size,
     read_dword(ptr, &p->annotation_count);
     TRACE("Pass has %u annotations.\n", p->annotation_count);
 
-    if (!(p->annotations = heap_calloc(p->annotation_count, sizeof(*p->annotations))))
-    {
-        ERR("Failed to allocate pass annotations memory.\n");
-        return E_OUTOFMEMORY;
-    }
-
-    for (i = 0; i < p->annotation_count; ++i)
+    if (FAILED(hr = parse_fx10_annotations(data, data_size, ptr, p->technique->effect,
+            p->annotation_count, &p->annotations)))
     {
-        struct d3d10_effect_variable *a = &p->annotations[i];
-
-        a->effect = p->technique->effect;
-        a->buffer = &null_local_buffer;
-
-        if (FAILED(hr = parse_fx10_annotation(data, data_size, ptr, a)))
-            return hr;
+        ERR("Failed to parse pass annotations, hr %#x.\n", hr);
+        return hr;
     }
 
     if (!(p->objects = heap_calloc(p->object_count, sizeof(*p->objects))))
@@ -1967,21 +1984,11 @@ static HRESULT parse_fx10_technique(const char *data, size_t data_size,
     read_dword(ptr, &t->annotation_count);
     TRACE("Technique has %u annotations.\n", t->annotation_count);
 
-    if (!(t->annotations = heap_calloc(t->annotation_count, sizeof(*t->annotations))))
-    {
-        ERR("Failed to allocate technique annotations memory.\n");
-        return E_OUTOFMEMORY;
-    }
-
-    for (i = 0; i < t->annotation_count; ++i)
+    if (FAILED(hr = parse_fx10_annotations(data, data_size, ptr, t->effect,
+            t->annotation_count, &t->annotations)))
     {
-        struct d3d10_effect_variable *a = &t->annotations[i];
-
-        a->effect = t->effect;
-        a->buffer = &null_local_buffer;
-
-        if (FAILED(hr = parse_fx10_annotation(data, data_size, ptr, a)))
-            return hr;
+        ERR("Failed to parse technique annotations, hr %#x.\n", hr);
+        return hr;
     }
 
     if (!(t->passes = heap_calloc(t->pass_count, sizeof(*t->passes))))
@@ -2008,7 +2015,6 @@ static HRESULT parse_fx10_numeric_variable(const char *data, size_t data_size,
         const char **ptr, struct d3d10_effect_variable *v)
 {
     DWORD offset, default_value_offset;
-    unsigned int i;
     HRESULT hr;
 
     if (FAILED(hr = parse_fx10_variable_head(data, data_size, ptr, v)))
@@ -2038,21 +2044,11 @@ static HRESULT parse_fx10_numeric_variable(const char *data, size_t data_size,
     read_dword(ptr, &v->annotation_count);
     TRACE("Variable has %u annotations.\n", v->annotation_count);
 
-    if (!(v->annotations = heap_calloc(v->annotation_count, sizeof(*v->annotations))))
-    {
-        ERR("Failed to allocate variable annotations memory.\n");
-        return E_OUTOFMEMORY;
-    }
-
-    for (i = 0; i < v->annotation_count; ++i)
+    if (FAILED(hr = parse_fx10_annotations(data, data_size, ptr, v->effect,
+            v->annotation_count, &v->annotations)))
     {
-        struct d3d10_effect_variable *a = &v->annotations[i];
-
-        a->effect = v->effect;
-        a->buffer = &null_local_buffer;
-
-        if (FAILED(hr = parse_fx10_annotation(data, data_size, ptr, a)))
-            return hr;
+        ERR("Failed to parse variable annotations, hr %#x.\n", hr);
+        return hr;
     }
 
     if (v->flag & D3D10_EFFECT_VARIABLE_EXPLICIT_BIND_POINT)
@@ -2254,21 +2250,11 @@ static HRESULT parse_fx10_local_variable(const char *data, size_t data_size,
     read_dword(ptr, &v->annotation_count);
     TRACE("Variable has %u annotations.\n", v->annotation_count);
 
-    if (!(v->annotations = heap_calloc(v->annotation_count, sizeof(*v->annotations))))
+    if (FAILED(hr = parse_fx10_annotations(data, data_size, ptr, v->effect,
+            v->annotation_count, &v->annotations)))
     {
-        ERR("Failed to allocate variable annotations memory.\n");
-        return E_OUTOFMEMORY;
-    }
-
-    for (i = 0; i < v->annotation_count; ++i)
-    {
-        struct d3d10_effect_variable *a = &v->annotations[i];
-
-        a->effect = v->effect;
-        a->buffer = &null_local_buffer;
-
-        if (FAILED(hr = parse_fx10_annotation(data, data_size, ptr, a)))
-            return hr;
+        ERR("Failed to parse variable annotations, hr %#x.\n", hr);
+        return hr;
     }
 
     return S_OK;
@@ -2392,21 +2378,11 @@ static HRESULT parse_fx10_local_buffer(const char *data, size_t data_size,
     read_dword(ptr, &l->annotation_count);
     TRACE("Local buffer has %u annotations.\n", l->annotation_count);
 
-    if (!(l->annotations = heap_calloc(l->annotation_count, sizeof(*l->annotations))))
+    if (FAILED(hr = parse_fx10_annotations(data, data_size, ptr, l->effect,
+            l->annotation_count, &l->annotations)))
     {
-        ERR("Failed to allocate local buffer annotations memory.\n");
-        return E_OUTOFMEMORY;
-    }
-
-    for (i = 0; i < l->annotation_count; ++i)
-    {
-        struct d3d10_effect_variable *a = &l->annotations[i];
-
-        a->effect = l->effect;
-        a->buffer = &null_local_buffer;
-
-        if (FAILED(hr = parse_fx10_annotation(data, data_size, ptr, a)))
-            return hr;
+        ERR("Failed to parse buffer annotations, hr %#x.\n", hr);
+        return hr;
     }
 
     if (!(l->members = heap_calloc(l->type->member_count, sizeof(*l->members))))




More information about the wine-cvs mailing list