[PATCH 2/3] d3dx9: Support arrays of samplers.

Paul Gofman gofmanp at gmail.com
Wed Jun 28 06:28:23 CDT 2017


Signed-off-by: Paul Gofman <gofmanp at gmail.com>
---
 dlls/d3dx9_36/effect.c | 32 +++++++++++++++++++++-----------
 1 file changed, 21 insertions(+), 11 deletions(-)

diff --git a/dlls/d3dx9_36/effect.c b/dlls/d3dx9_36/effect.c
index e9b139e..c3647d3 100644
--- a/dlls/d3dx9_36/effect.c
+++ b/dlls/d3dx9_36/effect.c
@@ -2928,15 +2928,20 @@ static HRESULT d3dx_set_shader_constants(struct ID3DXEffectImpl *effect, struct
         if (params[i] && params[i]->class == D3DXPC_OBJECT && is_param_type_sampler(params[i]->type))
         {
             struct d3dx_sampler *sampler;
+            unsigned int sampler_idx;
 
-            sampler = (struct d3dx_sampler *)params[i]->data;
-            TRACE("sampler %s, register index %u, state count %u.\n", debugstr_a(params[i]->name),
-                    cdesc[i].RegisterIndex, sampler->state_count);
-            for (j = 0; j < sampler->state_count; ++j)
+            for (sampler_idx = 0; sampler_idx < cdesc[i].RegisterCount; ++sampler_idx)
             {
-                if (FAILED(hr = d3dx9_apply_state(effect, pass, &sampler->states[j],
-                        cdesc[i].RegisterIndex + (vs ? D3DVERTEXTEXTURESAMPLER0 : 0), update_all)))
-                    ret = hr;
+                sampler = params[i]->element_count ? params[i]->members[sampler_idx].data : params[i]->data;
+                TRACE("sampler %s, register index %u, state count %u.\n", debugstr_a(params[i]->name),
+                        cdesc[i].RegisterIndex, sampler->state_count);
+                for (j = 0; j < sampler->state_count; ++j)
+                {
+                    if (FAILED(hr = d3dx9_apply_state(effect, pass, &sampler->states[j],
+                            cdesc[i].RegisterIndex + sampler_idx + (vs ? D3DVERTEXTEXTURESAMPLER0 : 0),
+                            update_all)))
+                        ret = hr;
+                }
             }
         }
     }
@@ -4000,12 +4005,17 @@ static BOOL walk_parameter_dep(struct d3dx_parameter *param, walk_parameter_dep_
     if (param->class == D3DXPC_OBJECT && is_param_type_sampler(param->type))
     {
         struct d3dx_sampler *sampler;
+        unsigned int sampler_idx;
+        unsigned int samplers_count = max(param->element_count, 1);
 
-        sampler = (struct d3dx_sampler *)param->data;
-        for (i = 0; i < sampler->state_count; ++i)
+        for (sampler_idx = 0; sampler_idx < samplers_count; ++sampler_idx)
         {
-            if (walk_state_dep(&sampler->states[i], param_func, data))
-                return TRUE;
+            sampler = param->element_count ? param->members[sampler_idx].data : param->data;
+            for (i = 0; i < sampler->state_count; ++i)
+            {
+                if (walk_state_dep(&sampler->states[i], param_func, data))
+                    return TRUE;
+            }
         }
         return FALSE;
     }
-- 
2.9.4




More information about the wine-patches mailing list