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