Nikolay Sivov : d3d10/effect: Add a helper to return array element.

Alexandre Julliard julliard at winehq.org
Fri Oct 15 15:40:05 CDT 2021


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Thu Oct 14 09:42:17 2021 +0300

d3d10/effect: Add a helper to return array element.

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 | 48 +++++++++++++++++++-----------------------------
 1 file changed, 19 insertions(+), 29 deletions(-)

diff --git a/dlls/d3d10/effect.c b/dlls/d3d10/effect.c
index 14c18aa77db..17a4c547a2c 100644
--- a/dlls/d3d10/effect.c
+++ b/dlls/d3d10/effect.c
@@ -142,6 +142,13 @@ static inline struct d3d10_effect_variable *impl_from_ID3D10EffectShaderVariable
     return CONTAINING_RECORD(iface, struct d3d10_effect_variable, ID3D10EffectVariable_iface);
 }
 
+static struct d3d10_effect_variable * d3d10_array_get_element(struct d3d10_effect_variable *v,
+        unsigned int index)
+{
+    if (!v->type->element_count) return v;
+    return &v->elements[index];
+}
+
 enum d3d10_effect_container_type
 {
     D3D10_C_NONE,
@@ -2152,7 +2159,8 @@ static HRESULT create_state_object(struct d3d10_effect_variable *v)
 static HRESULT parse_fx10_object_variable(const char *data, size_t data_size,
         const char **ptr, BOOL shared_type_desc, struct d3d10_effect_variable *v)
 {
-    unsigned int i, j;
+    struct d3d10_effect_variable *var;
+    unsigned int i, j, element_count;
     HRESULT hr;
     DWORD offset;
 
@@ -2175,6 +2183,8 @@ static HRESULT parse_fx10_object_variable(const char *data, size_t data_size,
     /* Shared variable description contains only type information. */
     if (shared_type_desc) return S_OK;
 
+    element_count = max(v->type->element_count, 1);
+
     switch (v->type->basetype)
     {
         case D3D10_SVT_TEXTURE:
@@ -2186,12 +2196,7 @@ static HRESULT parse_fx10_object_variable(const char *data, size_t data_size,
         case D3D10_SVT_TEXTURE2DMSARRAY:
         case D3D10_SVT_TEXTURE3D:
         case D3D10_SVT_TEXTURECUBE:
-            if (!v->type->element_count)
-                i = 1;
-            else
-                i = v->type->element_count;
-
-            if (!(v->u.resource.srv = heap_calloc(i, sizeof(*v->u.resource.srv))))
+            if (!(v->u.resource.srv = heap_calloc(element_count, sizeof(*v->u.resource.srv))))
             {
                 ERR("Failed to allocate shader resource view array memory.\n");
                 return E_OUTOFMEMORY;
@@ -2218,19 +2223,11 @@ static HRESULT parse_fx10_object_variable(const char *data, size_t data_size,
         case D3D10_SVT_PIXELSHADER:
         case D3D10_SVT_GEOMETRYSHADER:
             TRACE("Shader type is %s\n", debug_d3d10_shader_variable_type(v->type->basetype));
-            for (i = 0; i < max(v->type->element_count, 1); ++i)
+            for (i = 0; i < element_count; ++i)
             {
                 DWORD shader_offset, sodecl_offset;
-                struct d3d10_effect_variable *var;
 
-                if (!v->type->element_count)
-                {
-                    var = v;
-                }
-                else
-                {
-                    var = &v->elements[i];
-                }
+                var = d3d10_array_get_element(v, i);
 
                 read_dword(ptr, &shader_offset);
                 TRACE("Shader offset: %#x.\n", shader_offset);
@@ -2261,7 +2258,6 @@ static HRESULT parse_fx10_object_variable(const char *data, size_t data_size,
         case D3D10_SVT_SAMPLER:
             {
                 const struct d3d10_effect_state_storage_info *storage_info;
-                unsigned int count = max(v->type->element_count, 1);
 
                 if (!(storage_info = get_storage_info(v->type->basetype)))
                 {
@@ -2276,15 +2272,11 @@ static HRESULT parse_fx10_object_variable(const char *data, size_t data_size,
                     return E_FAIL;
                 }
 
-                for (i = 0; i < count; ++i)
+                for (i = 0; i < element_count; ++i)
                 {
-                    struct d3d10_effect_variable *var;
                     unsigned int prop_count;
 
-                    if (v->type->element_count)
-                        var = &v->elements[i];
-                    else
-                        var = v;
+                    var = d3d10_array_get_element(v, i);
 
                     read_dword(ptr, &prop_count);
                     TRACE("State object property count: %#x.\n", prop_count);
@@ -3969,10 +3961,9 @@ static void d3d10_effect_pass_set_shader(struct d3d10_effect_pass *pass,
         const struct d3d10_effect_pass_shader_desc *shader_desc)
 {
     ID3D10Device *device = pass->technique->effect->device;
-    struct d3d10_effect_variable *v = shader_desc->shader;
+    struct d3d10_effect_variable *v;
 
-    if (v->type->element_count)
-        v = &v->elements[shader_desc->index];
+    v = d3d10_array_get_element(shader_desc->shader, shader_desc->index);
 
     switch (v->type->basetype)
     {
@@ -7081,8 +7072,7 @@ static HRESULT d3d10_get_shader_variable(struct d3d10_effect_variable *v, UINT s
 {
     unsigned int i;
 
-    if (v->type->element_count)
-        v = &v->elements[0];
+    v = d3d10_array_get_element(v, 0);
 
     if (!shader_index)
     {




More information about the wine-cvs mailing list