[PATCH 1/5] d3d10: Use a union to store effect variable data instead of a void pointer.

Henri Verbeet hverbeet at codeweavers.com
Wed Sep 26 15:34:00 CDT 2012


---
 dlls/d3d10/d3d10_private.h |    7 +++-
 dlls/d3d10/effect.c        |  100 +++++++++++++------------------------------
 2 files changed, 36 insertions(+), 71 deletions(-)

diff --git a/dlls/d3d10/d3d10_private.h b/dlls/d3d10/d3d10_private.h
index 9edc32c..4f40c3e 100644
--- a/dlls/d3d10/d3d10_private.h
+++ b/dlls/d3d10/d3d10_private.h
@@ -151,7 +151,6 @@ struct d3d10_effect_variable
     struct d3d10_effect_variable *buffer;
     struct d3d10_effect_type *type;
 
-    void *data;
     char *name;
     char *semantic;
     DWORD buffer_offset;
@@ -162,6 +161,12 @@ struct d3d10_effect_variable
     struct d3d10_effect_variable *elements;
     struct d3d10_effect_variable *members;
     struct d3d10_effect_variable *annotations;
+
+    union
+    {
+        struct d3d10_effect_state_object_variable state;
+        struct d3d10_effect_shader_variable shader;
+    } u;
 };
 
 /* ID3D10EffectPass */
diff --git a/dlls/d3d10/effect.c b/dlls/d3d10/effect.c
index 97ce61e..30832f5 100644
--- a/dlls/d3d10/effect.c
+++ b/dlls/d3d10/effect.c
@@ -104,11 +104,11 @@ static struct d3d10_effect_type anonymous_ps_type = {{&d3d10_effect_type_vtbl},
 static struct d3d10_effect_type anonymous_gs_type = {{&d3d10_effect_type_vtbl},
         anonymous_geometryshader_name, D3D10_SVT_GEOMETRYSHADER, D3D10_SVC_OBJECT};
 static struct d3d10_effect_variable anonymous_vs = {{(const ID3D10EffectVariableVtbl *)&d3d10_effect_shader_variable_vtbl},
-        &null_local_buffer, &anonymous_vs_type, &null_shader_variable, anonymous_name};
+        &null_local_buffer, &anonymous_vs_type, anonymous_name};
 static struct d3d10_effect_variable anonymous_ps = {{(const ID3D10EffectVariableVtbl *)&d3d10_effect_shader_variable_vtbl},
-        &null_local_buffer, &anonymous_ps_type, &null_shader_variable, anonymous_name};
+        &null_local_buffer, &anonymous_ps_type, anonymous_name};
 static struct d3d10_effect_variable anonymous_gs = {{(const ID3D10EffectVariableVtbl *)&d3d10_effect_shader_variable_vtbl},
-        &null_local_buffer, &anonymous_gs_type, &null_shader_variable, anonymous_name};
+        &null_local_buffer, &anonymous_gs_type, anonymous_name};
 
 static struct d3d10_effect_type *get_fx10_type(struct d3d10_effect *effect, const char *data, DWORD offset);
 
@@ -399,20 +399,10 @@ static HRESULT parse_shader(ID3D10EffectVariable *variable, const char *data)
 {
     struct d3d10_effect_variable *v = impl_from_ID3D10EffectVariable(variable);
     ID3D10Device *device = v->effect->device;
-    struct d3d10_effect_shader_variable *s;
     const char *ptr = data;
     DWORD dxbc_size;
     HRESULT hr;
 
-    s = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*s));
-    if (!s)
-    {
-        ERR("Failed to allocate shader variable memory\n");
-        return E_OUTOFMEMORY;
-    }
-
-    v->data = s;
-
     if (v->effect->used_shader_current >= v->effect->used_shader_count)
     {
         WARN("Invalid shader? Used shader current(%u) >= used shader count(%u)\n", v->effect->used_shader_current, v->effect->used_shader_count);
@@ -433,17 +423,17 @@ static HRESULT parse_shader(ID3D10EffectVariable *variable, const char *data)
     switch (v->type->basetype)
     {
         case D3D10_SVT_VERTEXSHADER:
-            hr = ID3D10Device_CreateVertexShader(device, ptr, dxbc_size, &s->shader.vs);
+            hr = ID3D10Device_CreateVertexShader(device, ptr, dxbc_size, &v->u.shader.shader.vs);
             if (FAILED(hr)) return hr;
             break;
 
         case D3D10_SVT_PIXELSHADER:
-            hr = ID3D10Device_CreatePixelShader(device, ptr, dxbc_size, &s->shader.ps);
+            hr = ID3D10Device_CreatePixelShader(device, ptr, dxbc_size, &v->u.shader.shader.ps);
             if (FAILED(hr)) return hr;
             break;
 
         case D3D10_SVT_GEOMETRYSHADER:
-            hr = ID3D10Device_CreateGeometryShader(device, ptr, dxbc_size, &s->shader.gs);
+            hr = ID3D10Device_CreateGeometryShader(device, ptr, dxbc_size, &v->u.shader.shader.gs);
             if (FAILED(hr)) return hr;
             break;
 
@@ -452,7 +442,7 @@ static HRESULT parse_shader(ID3D10EffectVariable *variable, const char *data)
             return E_FAIL;
     }
 
-    return parse_dxbc(ptr, dxbc_size, shader_chunk_handler, s);
+    return parse_dxbc(ptr, dxbc_size, shader_chunk_handler, &v->u.shader);
 }
 
 static D3D10_SHADER_VARIABLE_CLASS d3d10_variable_class(DWORD c, BOOL is_column_major)
@@ -1641,7 +1631,6 @@ static HRESULT parse_fx10_local_variable(struct d3d10_effect_variable *v, const
             {
                 const struct d3d10_effect_state_storage_info *storage_info;
                 unsigned int count = max(v->type->element_count, 1);
-                struct d3d10_effect_state_object_variable *s;
 
                 if (!(storage_info = get_storage_info(v->type->basetype)))
                 {
@@ -1650,7 +1639,7 @@ static HRESULT parse_fx10_local_variable(struct d3d10_effect_variable *v, const
                     return E_FAIL;
                 }
 
-                if (storage_info->size > sizeof(s->desc))
+                if (storage_info->size > sizeof(v->u.state.desc))
                 {
                     ERR("Invalid storage size %#lx.\n", storage_info->size);
                     return E_FAIL;
@@ -1665,21 +1654,12 @@ static HRESULT parse_fx10_local_variable(struct d3d10_effect_variable *v, const
                     else
                         var = v;
 
-                    if (!(s = HeapAlloc(GetProcessHeap(), 0, sizeof(*s))))
-                    {
-                        ERR("Failed to allocate backing store memory.\n");
-                        return E_OUTOFMEMORY;
-                    }
-
-                    memcpy(&s->desc, storage_info->default_state, storage_info->size);
-                    if (!parse_fx10_state_group(ptr, data, var->type->basetype, &s->desc))
+                    memcpy(&var->u.state.desc, storage_info->default_state, storage_info->size);
+                    if (!parse_fx10_state_group(ptr, data, var->type->basetype, &var->u.state.desc))
                     {
                         ERR("Failed to read property list.\n");
-                        HeapFree(GetProcessHeap(), 0, s);
                         return E_FAIL;
                     }
-
-                    var->data = s;
                 }
             }
             break;
@@ -2222,20 +2202,16 @@ static void d3d10_effect_variable_destroy(struct d3d10_effect_variable *v)
         HeapFree(GetProcessHeap(), 0, v->elements);
     }
 
-    if (v->data)
+    switch(v->type->basetype)
     {
-        switch(v->type->basetype)
-        {
-            case D3D10_SVT_VERTEXSHADER:
-            case D3D10_SVT_PIXELSHADER:
-            case D3D10_SVT_GEOMETRYSHADER:
-                d3d10_effect_shader_variable_destroy(v->data, v->type->basetype);
-                break;
+        case D3D10_SVT_VERTEXSHADER:
+        case D3D10_SVT_PIXELSHADER:
+        case D3D10_SVT_GEOMETRYSHADER:
+            d3d10_effect_shader_variable_destroy(&v->u.shader, v->type->basetype);
+            break;
 
-            default:
-                break;
-        }
-        HeapFree(GetProcessHeap(), 0, v->data);
+        default:
+            break;
     }
 }
 
@@ -2933,11 +2909,9 @@ static HRESULT STDMETHODCALLTYPE d3d10_effect_pass_GetDesc(ID3D10EffectPass *ifa
     memset(desc, 0, sizeof(*desc));
     desc->Name = This->name;
 
-    if ((s = impl_from_ID3D10EffectVariable((ID3D10EffectVariable *)This->vs.pShaderVariable)->data))
-    {
-        desc->pIAInputSignature = (BYTE *)s->input_signature.signature;
-        desc->IAInputSignatureSize = s->input_signature.signature_size;
-    }
+    s = &impl_from_ID3D10EffectVariable((ID3D10EffectVariable *)This->vs.pShaderVariable)->u.shader;
+    desc->pIAInputSignature = (BYTE *)s->input_signature.signature;
+    desc->IAInputSignatureSize = s->input_signature.signature_size;
 
     desc->StencilRef = This->stencil_ref;
     desc->SampleMask = This->sample_mask;
@@ -5640,7 +5614,6 @@ static HRESULT STDMETHODCALLTYPE d3d10_effect_shader_variable_GetVertexShader(
         ID3D10EffectShaderVariable *iface, UINT index, ID3D10VertexShader **shader)
 {
     struct d3d10_effect_variable *v = impl_from_ID3D10EffectVariable((ID3D10EffectVariable *)iface);
-    struct d3d10_effect_shader_variable *s;
 
     TRACE("iface %p, index %u, shader %p.\n", iface, index, shader);
 
@@ -5653,8 +5626,7 @@ static HRESULT STDMETHODCALLTYPE d3d10_effect_shader_variable_GetVertexShader(
         return E_FAIL;
     }
 
-    s = v->data;
-    if ((*shader = s->shader.vs))
+    if ((*shader = v->u.shader.shader.vs))
         ID3D10VertexShader_AddRef(*shader);
 
     return S_OK;
@@ -5664,7 +5636,6 @@ static HRESULT STDMETHODCALLTYPE d3d10_effect_shader_variable_GetGeometryShader(
         ID3D10EffectShaderVariable *iface, UINT index, ID3D10GeometryShader **shader)
 {
     struct d3d10_effect_variable *v = impl_from_ID3D10EffectVariable((ID3D10EffectVariable *)iface);
-    struct d3d10_effect_shader_variable *s;
 
     TRACE("iface %p, index %u, shader %p.\n", iface, index, shader);
 
@@ -5677,8 +5648,7 @@ static HRESULT STDMETHODCALLTYPE d3d10_effect_shader_variable_GetGeometryShader(
         return E_FAIL;
     }
 
-    s = v->data;
-    if ((*shader = s->shader.gs))
+    if ((*shader = v->u.shader.shader.gs))
         ID3D10GeometryShader_AddRef(*shader);
 
     return S_OK;
@@ -5688,7 +5658,6 @@ static HRESULT STDMETHODCALLTYPE d3d10_effect_shader_variable_GetPixelShader(
         ID3D10EffectShaderVariable *iface, UINT index, ID3D10PixelShader **shader)
 {
     struct d3d10_effect_variable *v = impl_from_ID3D10EffectVariable((ID3D10EffectVariable *)iface);
-    struct d3d10_effect_shader_variable *s;
 
     TRACE("iface %p, index %u, shader %p.\n", iface, index, shader);
 
@@ -5701,8 +5670,7 @@ static HRESULT STDMETHODCALLTYPE d3d10_effect_shader_variable_GetPixelShader(
         return E_FAIL;
     }
 
-    s = v->data;
-    if ((*shader = s->shader.ps))
+    if ((*shader = v->u.shader.shader.ps))
         ID3D10PixelShader_AddRef(*shader);
 
     return S_OK;
@@ -5732,7 +5700,7 @@ static HRESULT STDMETHODCALLTYPE d3d10_effect_shader_variable_GetInputSignatureE
         return E_FAIL;
     }
 
-    s = This->effect->used_shaders[shader_index]->data;
+    s = &This->effect->used_shaders[shader_index]->u.shader;
     if (!s->input_signature.signature)
     {
         WARN("No shader signature\n");
@@ -5788,7 +5756,7 @@ static HRESULT STDMETHODCALLTYPE d3d10_effect_shader_variable_GetOutputSignature
         return E_FAIL;
     }
 
-    s = This->effect->used_shaders[shader_index]->data;
+    s = &This->effect->used_shaders[shader_index]->u.shader;
     if (!s->output_signature.signature)
     {
         WARN("No shader signature\n");
@@ -6025,7 +5993,6 @@ static HRESULT STDMETHODCALLTYPE d3d10_effect_blend_variable_GetBackingStore(ID3
         UINT index, D3D10_BLEND_DESC *desc)
 {
     struct d3d10_effect_variable *v = impl_from_ID3D10EffectVariable((ID3D10EffectVariable *)iface);
-    struct d3d10_effect_state_object_variable *s;
 
     TRACE("iface %p, index %u, desc %p.\n", iface, index, desc);
 
@@ -6038,8 +6005,7 @@ static HRESULT STDMETHODCALLTYPE d3d10_effect_blend_variable_GetBackingStore(ID3
         return E_FAIL;
     }
 
-    s = v->data;
-    *desc = s->desc.blend;
+    *desc = v->u.state.desc.blend;
 
     return S_OK;
 }
@@ -6245,7 +6211,6 @@ static HRESULT STDMETHODCALLTYPE d3d10_effect_depth_stencil_variable_GetBackingS
         UINT index, D3D10_DEPTH_STENCIL_DESC *desc)
 {
     struct d3d10_effect_variable *v = impl_from_ID3D10EffectVariable((ID3D10EffectVariable *)iface);
-    struct d3d10_effect_state_object_variable *s;
 
     TRACE("iface %p, index %u, desc %p.\n", iface, index, desc);
 
@@ -6258,8 +6223,7 @@ static HRESULT STDMETHODCALLTYPE d3d10_effect_depth_stencil_variable_GetBackingS
         return E_FAIL;
     }
 
-    s = v->data;
-    *desc = s->desc.depth_stencil;
+    *desc = v->u.state.desc.depth_stencil;
 
     return S_OK;
 }
@@ -6465,7 +6429,6 @@ static HRESULT STDMETHODCALLTYPE d3d10_effect_rasterizer_variable_GetBackingStor
         UINT index, D3D10_RASTERIZER_DESC *desc)
 {
     struct d3d10_effect_variable *v = impl_from_ID3D10EffectVariable((ID3D10EffectVariable *)iface);
-    struct d3d10_effect_state_object_variable *s;
 
     TRACE("iface %p, index %u, desc %p.\n", iface, index, desc);
 
@@ -6478,8 +6441,7 @@ static HRESULT STDMETHODCALLTYPE d3d10_effect_rasterizer_variable_GetBackingStor
         return E_FAIL;
     }
 
-    s = v->data;
-    *desc = s->desc.rasterizer;
+    *desc = v->u.state.desc.rasterizer;
 
     return S_OK;
 }
@@ -6685,7 +6647,6 @@ static HRESULT STDMETHODCALLTYPE d3d10_effect_sampler_variable_GetBackingStore(I
         UINT index, D3D10_SAMPLER_DESC *desc)
 {
     struct d3d10_effect_variable *v = impl_from_ID3D10EffectVariable((ID3D10EffectVariable *)iface);
-    struct d3d10_effect_state_object_variable *s;
 
     TRACE("iface %p, index %u, desc %p.\n", iface, index, desc);
 
@@ -6698,8 +6659,7 @@ static HRESULT STDMETHODCALLTYPE d3d10_effect_sampler_variable_GetBackingStore(I
         return E_FAIL;
     }
 
-    s = v->data;
-    *desc = s->desc.sampler;
+    *desc = v->u.state.desc.sampler;
 
     return S_OK;
 }
-- 
1.7.8.6




More information about the wine-patches mailing list