From: Connor McAdams Subject: [PATCH 08/10] d3d10: Implement ShaderResource effect variable set method. Message-Id: <20191207182300.3084-9-conmanx360@gmail.com> Date: Sat, 7 Dec 2019 13:22:58 -0500 In-Reply-To: <20191207182300.3084-1-conmanx360@gmail.com> References: <20191207182300.3084-1-conmanx360@gmail.com> Implement the SetResource method for the ID3D10EffectShaderResourceVariable interface. Signed-off-by: Connor McAdams --- 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