Commit 13c00a9d authored by Henri Verbeet's avatar Henri Verbeet Committed by Alexandre Julliard

d3d10: Use a union to store effect variable data instead of a void pointer.

parent 16360a4f
...@@ -151,7 +151,6 @@ struct d3d10_effect_variable ...@@ -151,7 +151,6 @@ struct d3d10_effect_variable
struct d3d10_effect_variable *buffer; struct d3d10_effect_variable *buffer;
struct d3d10_effect_type *type; struct d3d10_effect_type *type;
void *data;
char *name; char *name;
char *semantic; char *semantic;
DWORD buffer_offset; DWORD buffer_offset;
...@@ -162,6 +161,12 @@ struct d3d10_effect_variable ...@@ -162,6 +161,12 @@ struct d3d10_effect_variable
struct d3d10_effect_variable *elements; struct d3d10_effect_variable *elements;
struct d3d10_effect_variable *members; struct d3d10_effect_variable *members;
struct d3d10_effect_variable *annotations; struct d3d10_effect_variable *annotations;
union
{
struct d3d10_effect_state_object_variable state;
struct d3d10_effect_shader_variable shader;
} u;
}; };
/* ID3D10EffectPass */ /* ID3D10EffectPass */
......
...@@ -104,11 +104,11 @@ static struct d3d10_effect_type anonymous_ps_type = {{&d3d10_effect_type_vtbl}, ...@@ -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}, static struct d3d10_effect_type anonymous_gs_type = {{&d3d10_effect_type_vtbl},
anonymous_geometryshader_name, D3D10_SVT_GEOMETRYSHADER, D3D10_SVC_OBJECT}; anonymous_geometryshader_name, D3D10_SVT_GEOMETRYSHADER, D3D10_SVC_OBJECT};
static struct d3d10_effect_variable anonymous_vs = {{(const ID3D10EffectVariableVtbl *)&d3d10_effect_shader_variable_vtbl}, 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}, 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}, 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); 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) ...@@ -399,20 +399,10 @@ static HRESULT parse_shader(ID3D10EffectVariable *variable, const char *data)
{ {
struct d3d10_effect_variable *v = impl_from_ID3D10EffectVariable(variable); struct d3d10_effect_variable *v = impl_from_ID3D10EffectVariable(variable);
ID3D10Device *device = v->effect->device; ID3D10Device *device = v->effect->device;
struct d3d10_effect_shader_variable *s;
const char *ptr = data; const char *ptr = data;
DWORD dxbc_size; DWORD dxbc_size;
HRESULT hr; 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) 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); 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) ...@@ -433,17 +423,17 @@ static HRESULT parse_shader(ID3D10EffectVariable *variable, const char *data)
switch (v->type->basetype) switch (v->type->basetype)
{ {
case D3D10_SVT_VERTEXSHADER: 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; if (FAILED(hr)) return hr;
break; break;
case D3D10_SVT_PIXELSHADER: 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; if (FAILED(hr)) return hr;
break; break;
case D3D10_SVT_GEOMETRYSHADER: 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; if (FAILED(hr)) return hr;
break; break;
...@@ -452,7 +442,7 @@ static HRESULT parse_shader(ID3D10EffectVariable *variable, const char *data) ...@@ -452,7 +442,7 @@ static HRESULT parse_shader(ID3D10EffectVariable *variable, const char *data)
return E_FAIL; 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) 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 ...@@ -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; const struct d3d10_effect_state_storage_info *storage_info;
unsigned int count = max(v->type->element_count, 1); 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))) 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 ...@@ -1650,7 +1639,7 @@ static HRESULT parse_fx10_local_variable(struct d3d10_effect_variable *v, const
return E_FAIL; 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); ERR("Invalid storage size %#lx.\n", storage_info->size);
return E_FAIL; return E_FAIL;
...@@ -1665,21 +1654,12 @@ static HRESULT parse_fx10_local_variable(struct d3d10_effect_variable *v, const ...@@ -1665,21 +1654,12 @@ static HRESULT parse_fx10_local_variable(struct d3d10_effect_variable *v, const
else else
var = v; var = v;
if (!(s = HeapAlloc(GetProcessHeap(), 0, sizeof(*s)))) 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 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))
{ {
ERR("Failed to read property list.\n"); ERR("Failed to read property list.\n");
HeapFree(GetProcessHeap(), 0, s);
return E_FAIL; return E_FAIL;
} }
var->data = s;
} }
} }
break; break;
...@@ -2222,20 +2202,16 @@ static void d3d10_effect_variable_destroy(struct d3d10_effect_variable *v) ...@@ -2222,20 +2202,16 @@ static void d3d10_effect_variable_destroy(struct d3d10_effect_variable *v)
HeapFree(GetProcessHeap(), 0, v->elements); 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_VERTEXSHADER: case D3D10_SVT_GEOMETRYSHADER:
case D3D10_SVT_PIXELSHADER: d3d10_effect_shader_variable_destroy(&v->u.shader, v->type->basetype);
case D3D10_SVT_GEOMETRYSHADER: break;
d3d10_effect_shader_variable_destroy(v->data, v->type->basetype);
break;
default: default:
break; break;
}
HeapFree(GetProcessHeap(), 0, v->data);
} }
} }
...@@ -2933,11 +2909,9 @@ static HRESULT STDMETHODCALLTYPE d3d10_effect_pass_GetDesc(ID3D10EffectPass *ifa ...@@ -2933,11 +2909,9 @@ static HRESULT STDMETHODCALLTYPE d3d10_effect_pass_GetDesc(ID3D10EffectPass *ifa
memset(desc, 0, sizeof(*desc)); memset(desc, 0, sizeof(*desc));
desc->Name = This->name; desc->Name = This->name;
if ((s = impl_from_ID3D10EffectVariable((ID3D10EffectVariable *)This->vs.pShaderVariable)->data)) s = &impl_from_ID3D10EffectVariable((ID3D10EffectVariable *)This->vs.pShaderVariable)->u.shader;
{ desc->pIAInputSignature = (BYTE *)s->input_signature.signature;
desc->pIAInputSignature = (BYTE *)s->input_signature.signature; desc->IAInputSignatureSize = s->input_signature.signature_size;
desc->IAInputSignatureSize = s->input_signature.signature_size;
}
desc->StencilRef = This->stencil_ref; desc->StencilRef = This->stencil_ref;
desc->SampleMask = This->sample_mask; desc->SampleMask = This->sample_mask;
...@@ -5640,7 +5614,6 @@ static HRESULT STDMETHODCALLTYPE d3d10_effect_shader_variable_GetVertexShader( ...@@ -5640,7 +5614,6 @@ static HRESULT STDMETHODCALLTYPE d3d10_effect_shader_variable_GetVertexShader(
ID3D10EffectShaderVariable *iface, UINT index, ID3D10VertexShader **shader) ID3D10EffectShaderVariable *iface, UINT index, ID3D10VertexShader **shader)
{ {
struct d3d10_effect_variable *v = impl_from_ID3D10EffectVariable((ID3D10EffectVariable *)iface); 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); TRACE("iface %p, index %u, shader %p.\n", iface, index, shader);
...@@ -5653,8 +5626,7 @@ static HRESULT STDMETHODCALLTYPE d3d10_effect_shader_variable_GetVertexShader( ...@@ -5653,8 +5626,7 @@ static HRESULT STDMETHODCALLTYPE d3d10_effect_shader_variable_GetVertexShader(
return E_FAIL; return E_FAIL;
} }
s = v->data; if ((*shader = v->u.shader.shader.vs))
if ((*shader = s->shader.vs))
ID3D10VertexShader_AddRef(*shader); ID3D10VertexShader_AddRef(*shader);
return S_OK; return S_OK;
...@@ -5664,7 +5636,6 @@ static HRESULT STDMETHODCALLTYPE d3d10_effect_shader_variable_GetGeometryShader( ...@@ -5664,7 +5636,6 @@ static HRESULT STDMETHODCALLTYPE d3d10_effect_shader_variable_GetGeometryShader(
ID3D10EffectShaderVariable *iface, UINT index, ID3D10GeometryShader **shader) ID3D10EffectShaderVariable *iface, UINT index, ID3D10GeometryShader **shader)
{ {
struct d3d10_effect_variable *v = impl_from_ID3D10EffectVariable((ID3D10EffectVariable *)iface); 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); TRACE("iface %p, index %u, shader %p.\n", iface, index, shader);
...@@ -5677,8 +5648,7 @@ static HRESULT STDMETHODCALLTYPE d3d10_effect_shader_variable_GetGeometryShader( ...@@ -5677,8 +5648,7 @@ static HRESULT STDMETHODCALLTYPE d3d10_effect_shader_variable_GetGeometryShader(
return E_FAIL; return E_FAIL;
} }
s = v->data; if ((*shader = v->u.shader.shader.gs))
if ((*shader = s->shader.gs))
ID3D10GeometryShader_AddRef(*shader); ID3D10GeometryShader_AddRef(*shader);
return S_OK; return S_OK;
...@@ -5688,7 +5658,6 @@ static HRESULT STDMETHODCALLTYPE d3d10_effect_shader_variable_GetPixelShader( ...@@ -5688,7 +5658,6 @@ static HRESULT STDMETHODCALLTYPE d3d10_effect_shader_variable_GetPixelShader(
ID3D10EffectShaderVariable *iface, UINT index, ID3D10PixelShader **shader) ID3D10EffectShaderVariable *iface, UINT index, ID3D10PixelShader **shader)
{ {
struct d3d10_effect_variable *v = impl_from_ID3D10EffectVariable((ID3D10EffectVariable *)iface); 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); TRACE("iface %p, index %u, shader %p.\n", iface, index, shader);
...@@ -5701,8 +5670,7 @@ static HRESULT STDMETHODCALLTYPE d3d10_effect_shader_variable_GetPixelShader( ...@@ -5701,8 +5670,7 @@ static HRESULT STDMETHODCALLTYPE d3d10_effect_shader_variable_GetPixelShader(
return E_FAIL; return E_FAIL;
} }
s = v->data; if ((*shader = v->u.shader.shader.ps))
if ((*shader = s->shader.ps))
ID3D10PixelShader_AddRef(*shader); ID3D10PixelShader_AddRef(*shader);
return S_OK; return S_OK;
...@@ -5732,7 +5700,7 @@ static HRESULT STDMETHODCALLTYPE d3d10_effect_shader_variable_GetInputSignatureE ...@@ -5732,7 +5700,7 @@ static HRESULT STDMETHODCALLTYPE d3d10_effect_shader_variable_GetInputSignatureE
return E_FAIL; 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) if (!s->input_signature.signature)
{ {
WARN("No shader signature\n"); WARN("No shader signature\n");
...@@ -5788,7 +5756,7 @@ static HRESULT STDMETHODCALLTYPE d3d10_effect_shader_variable_GetOutputSignature ...@@ -5788,7 +5756,7 @@ static HRESULT STDMETHODCALLTYPE d3d10_effect_shader_variable_GetOutputSignature
return E_FAIL; 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) if (!s->output_signature.signature)
{ {
WARN("No shader signature\n"); WARN("No shader signature\n");
...@@ -6025,7 +5993,6 @@ static HRESULT STDMETHODCALLTYPE d3d10_effect_blend_variable_GetBackingStore(ID3 ...@@ -6025,7 +5993,6 @@ static HRESULT STDMETHODCALLTYPE d3d10_effect_blend_variable_GetBackingStore(ID3
UINT index, D3D10_BLEND_DESC *desc) UINT index, D3D10_BLEND_DESC *desc)
{ {
struct d3d10_effect_variable *v = impl_from_ID3D10EffectVariable((ID3D10EffectVariable *)iface); 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); TRACE("iface %p, index %u, desc %p.\n", iface, index, desc);
...@@ -6038,8 +6005,7 @@ static HRESULT STDMETHODCALLTYPE d3d10_effect_blend_variable_GetBackingStore(ID3 ...@@ -6038,8 +6005,7 @@ static HRESULT STDMETHODCALLTYPE d3d10_effect_blend_variable_GetBackingStore(ID3
return E_FAIL; return E_FAIL;
} }
s = v->data; *desc = v->u.state.desc.blend;
*desc = s->desc.blend;
return S_OK; return S_OK;
} }
...@@ -6245,7 +6211,6 @@ static HRESULT STDMETHODCALLTYPE d3d10_effect_depth_stencil_variable_GetBackingS ...@@ -6245,7 +6211,6 @@ static HRESULT STDMETHODCALLTYPE d3d10_effect_depth_stencil_variable_GetBackingS
UINT index, D3D10_DEPTH_STENCIL_DESC *desc) UINT index, D3D10_DEPTH_STENCIL_DESC *desc)
{ {
struct d3d10_effect_variable *v = impl_from_ID3D10EffectVariable((ID3D10EffectVariable *)iface); 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); TRACE("iface %p, index %u, desc %p.\n", iface, index, desc);
...@@ -6258,8 +6223,7 @@ static HRESULT STDMETHODCALLTYPE d3d10_effect_depth_stencil_variable_GetBackingS ...@@ -6258,8 +6223,7 @@ static HRESULT STDMETHODCALLTYPE d3d10_effect_depth_stencil_variable_GetBackingS
return E_FAIL; return E_FAIL;
} }
s = v->data; *desc = v->u.state.desc.depth_stencil;
*desc = s->desc.depth_stencil;
return S_OK; return S_OK;
} }
...@@ -6465,7 +6429,6 @@ static HRESULT STDMETHODCALLTYPE d3d10_effect_rasterizer_variable_GetBackingStor ...@@ -6465,7 +6429,6 @@ static HRESULT STDMETHODCALLTYPE d3d10_effect_rasterizer_variable_GetBackingStor
UINT index, D3D10_RASTERIZER_DESC *desc) UINT index, D3D10_RASTERIZER_DESC *desc)
{ {
struct d3d10_effect_variable *v = impl_from_ID3D10EffectVariable((ID3D10EffectVariable *)iface); 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); TRACE("iface %p, index %u, desc %p.\n", iface, index, desc);
...@@ -6478,8 +6441,7 @@ static HRESULT STDMETHODCALLTYPE d3d10_effect_rasterizer_variable_GetBackingStor ...@@ -6478,8 +6441,7 @@ static HRESULT STDMETHODCALLTYPE d3d10_effect_rasterizer_variable_GetBackingStor
return E_FAIL; return E_FAIL;
} }
s = v->data; *desc = v->u.state.desc.rasterizer;
*desc = s->desc.rasterizer;
return S_OK; return S_OK;
} }
...@@ -6685,7 +6647,6 @@ static HRESULT STDMETHODCALLTYPE d3d10_effect_sampler_variable_GetBackingStore(I ...@@ -6685,7 +6647,6 @@ static HRESULT STDMETHODCALLTYPE d3d10_effect_sampler_variable_GetBackingStore(I
UINT index, D3D10_SAMPLER_DESC *desc) UINT index, D3D10_SAMPLER_DESC *desc)
{ {
struct d3d10_effect_variable *v = impl_from_ID3D10EffectVariable((ID3D10EffectVariable *)iface); 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); TRACE("iface %p, index %u, desc %p.\n", iface, index, desc);
...@@ -6698,8 +6659,7 @@ static HRESULT STDMETHODCALLTYPE d3d10_effect_sampler_variable_GetBackingStore(I ...@@ -6698,8 +6659,7 @@ static HRESULT STDMETHODCALLTYPE d3d10_effect_sampler_variable_GetBackingStore(I
return E_FAIL; return E_FAIL;
} }
s = v->data; *desc = v->u.state.desc.sampler;
*desc = s->desc.sampler;
return S_OK; return S_OK;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment