[PATCH 08/10] d3d10: Implement ShaderResource effect variable set method.

Connor McAdams conmanx360 at gmail.com
Sat Dec 7 12:22:58 CST 2019


Implement the SetResource method for the
ID3D10EffectShaderResourceVariable interface.

Signed-off-by: Connor McAdams <conmanx360 at gmail.com>
---
 dlls/d3d10/d3d10_private.h |  6 ++++
 dlls/d3d10/effect.c        | 71 +++++++++++++++++++++++++++++++++++---
 2 files changed, 73 insertions(+), 4 deletions(-)

diff --git a/dlls/d3d10/d3d10_private.h b/dlls/d3d10/d3d10_private.h
index 5c6c7a2d72..f3b4e65e1c 100644
--- a/dlls/d3d10/d3d10_private.h
+++ b/dlls/d3d10/d3d10_private.h
@@ -114,6 +114,11 @@ struct d3d10_effect_state_object_variable
     } object;
 };
 
+struct d3d10_effect_resource_variable
+{
+    ID3D10ShaderResourceView **resource_view;
+};
+
 struct d3d10_effect_buffer_variable
 {
     ID3D10Buffer *buffer;
@@ -179,6 +184,7 @@ struct d3d10_effect_variable
         struct d3d10_effect_state_object_variable state;
         struct d3d10_effect_shader_variable shader;
         struct d3d10_effect_buffer_variable buffer;
+        struct d3d10_effect_resource_variable resource;
     } u;
 };
 
diff --git a/dlls/d3d10/effect.c b/dlls/d3d10/effect.c
index 1e1d5d7f4c..9898b7f79f 100644
--- a/dlls/d3d10/effect.c
+++ b/dlls/d3d10/effect.c
@@ -1994,6 +1994,19 @@ static HRESULT parse_fx10_local_variable(const char *data, size_t data_size,
         case D3D10_SVT_TEXTURE2DMSARRAY:
         case D3D10_SVT_TEXTURE3D:
         case D3D10_SVT_TEXTURECUBE:
+            TRACE("SVT could not have elements.\n");
+            if (!v->type->element_count)
+                i = 1;
+            else
+                i = v->type->element_count;
+
+            if (!(v->u.resource.resource_view = heap_calloc(i, sizeof(ID3D10ShaderResourceView *))))
+            {
+                ERR("Failed to allocate shader resource view array memory.\n");
+                return E_OUTOFMEMORY;
+            }
+            break;
+
         case D3D10_SVT_RENDERTARGETVIEW:
         case D3D10_SVT_DEPTHSTENCILVIEW:
         case D3D10_SVT_BUFFER:
@@ -2689,6 +2702,31 @@ static void d3d10_effect_variable_destroy(struct d3d10_effect_variable *v)
                     ID3D10SamplerState_Release(v->u.state.object.sampler);
                 break;
 
+            case D3D10_SVT_TEXTURE1D:
+            case D3D10_SVT_TEXTURE1DARRAY:
+            case D3D10_SVT_TEXTURE2D:
+            case D3D10_SVT_TEXTURE2DARRAY:
+            case D3D10_SVT_TEXTURE2DMS:
+            case D3D10_SVT_TEXTURE2DMSARRAY:
+            case D3D10_SVT_TEXTURE3D:
+            case D3D10_SVT_TEXTURECUBE:
+                if (!v->type->element_count)
+                {
+                    if (*v->u.resource.resource_view)
+                        ID3D10ShaderResourceView_Release(*v->u.resource.resource_view);
+                }
+                else
+                {
+                    for (i = 0; i < v->type->element_count; i++)
+                    {
+                        if (v->u.resource.resource_view[i])
+                            ID3D10ShaderResourceView_Release(v->u.resource.resource_view[i]);
+
+                    }
+                }
+                heap_free(v->u.resource.resource_view);
+                break;
+
             default:
                 break;
         }
@@ -5731,9 +5769,19 @@ static HRESULT STDMETHODCALLTYPE d3d10_effect_shader_resource_variable_GetRawVal
 static HRESULT STDMETHODCALLTYPE d3d10_effect_shader_resource_variable_SetResource(
         ID3D10EffectShaderResourceVariable *iface, ID3D10ShaderResourceView *resource)
 {
-    FIXME("iface %p, resource %p stub!\n", iface, resource);
+    struct d3d10_effect_variable *effect_var = impl_from_ID3D10EffectVariable((ID3D10EffectVariable *)iface);
 
-    return E_NOTIMPL;
+    TRACE("iface %p, resource %p.\n", iface, resource);
+
+    if (*effect_var->u.resource.resource_view)
+        ID3D10ShaderResourceView_Release(*effect_var->u.resource.resource_view);
+
+    if (resource)
+        ID3D10ShaderResourceView_AddRef(resource);
+
+    *effect_var->u.resource.resource_view = resource;
+
+    return S_OK;
 }
 
 static HRESULT STDMETHODCALLTYPE d3d10_effect_shader_resource_variable_GetResource(
@@ -5747,9 +5795,24 @@ static HRESULT STDMETHODCALLTYPE d3d10_effect_shader_resource_variable_GetResour
 static HRESULT STDMETHODCALLTYPE d3d10_effect_shader_resource_variable_SetResourceArray(
         ID3D10EffectShaderResourceVariable *iface, ID3D10ShaderResourceView **resources, UINT offset, UINT count)
 {
-    FIXME("iface %p, resources %p, offset %u, count %u stub!\n", iface, resources, offset, count);
+    struct d3d10_effect_variable *effect_var = impl_from_ID3D10EffectVariable((ID3D10EffectVariable *)iface);
+    UINT i;
 
-    return E_NOTIMPL;
+    TRACE("iface %p, resources %p, offset %u, count %u stub!\n", iface, resources, offset, count);
+
+    if (!effect_var->type->element_count)
+        return d3d10_effect_shader_resource_variable_SetResource(iface, *resources);
+
+    for (i = 0; i < count; i++)
+    {
+        if (effect_var->u.resource.resource_view[i + offset])
+            ID3D10ShaderResourceView_Release(effect_var->u.resource.resource_view[i + offset]);
+        if (resources[i])
+            ID3D10ShaderResourceView_AddRef(resources[i]);
+        effect_var->u.resource.resource_view[i + offset] = resources[i];
+    }
+
+    return S_OK;
 }
 
 static HRESULT STDMETHODCALLTYPE d3d10_effect_shader_resource_variable_GetResourceArray(
-- 
2.20.1




More information about the wine-devel mailing list