d3d10: Store shader variables in d3d10_effect_pass instead of d3d10_effect_object.

This commit is contained in:
Henri Verbeet 2012-09-25 10:34:41 +02:00 committed by Alexandre Julliard
parent 2a83e1a581
commit 4f2c93e248
2 changed files with 40 additions and 80 deletions

View File

@ -72,8 +72,6 @@ struct d3d10_effect_object
{
struct d3d10_effect_pass *pass;
enum d3d10_effect_object_type type;
DWORD index;
void *data;
union
{
ID3D10VertexShader *vs;
@ -168,6 +166,9 @@ struct d3d10_effect_pass
struct d3d10_effect_object *objects;
struct d3d10_effect_variable *annotations;
D3D10_PASS_SHADER_DESC vs;
D3D10_PASS_SHADER_DESC ps;
D3D10_PASS_SHADER_DESC gs;
UINT stencil_ref;
UINT sample_mask;
float blend_factor[4];

View File

@ -395,8 +395,9 @@ static HRESULT shader_chunk_handler(const char *data, DWORD data_size, DWORD tag
return S_OK;
}
static HRESULT parse_shader(struct d3d10_effect_variable *v, const char *data)
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;
@ -1214,18 +1215,20 @@ static BOOL parse_fx10_state_group(const char **ptr, const char *data,
static HRESULT parse_fx10_object(struct d3d10_effect_object *o, const char **ptr, const char *data)
{
ID3D10EffectVariable *variable = &null_variable.ID3D10EffectVariable_iface;
const char *data_ptr = NULL;
DWORD offset;
enum d3d10_effect_object_operation operation;
HRESULT hr;
struct d3d10_effect *effect = o->pass->technique->effect;
ID3D10Effect *e = &effect->ID3D10Effect_iface;
DWORD tmp, variable_idx = 0;
read_dword(ptr, &o->type);
TRACE("Effect object is of type %#x.\n", o->type);
read_dword(ptr, &o->index);
TRACE("Effect object index %#x.\n", o->index);
read_dword(ptr, &tmp);
TRACE("Effect object index %#x.\n", tmp);
read_dword(ptr, &operation);
TRACE("Effect object operation %#x.\n", operation);
@ -1242,17 +1245,17 @@ static HRESULT parse_fx10_object(struct d3d10_effect_object *o, const char **ptr
{
case D3D10_EOT_VERTEXSHADER:
TRACE("Vertex shader\n");
o->data = &anonymous_vs;
variable = &anonymous_vs.ID3D10EffectVariable_iface;
break;
case D3D10_EOT_PIXELSHADER:
TRACE("Pixel shader\n");
o->data = &anonymous_ps;
variable = &anonymous_ps.ID3D10EffectVariable_iface;
break;
case D3D10_EOT_GEOMETRYSHADER:
TRACE("Geometry shader\n");
o->data = &anonymous_gs;
variable = &anonymous_gs.ID3D10EffectVariable_iface;
break;
case D3D10_EOT_STENCIL_REF:
@ -1289,17 +1292,17 @@ static HRESULT parse_fx10_object(struct d3d10_effect_object *o, const char **ptr
/* This is a local object, we've parsed in parse_fx10_local_object. */
TRACE("Variable name %s.\n", debugstr_a(data + offset));
o->data = e->lpVtbl->GetVariableByName(e, data + offset);
variable = e->lpVtbl->GetVariableByName(e, data + offset);
break;
case D3D10_EOO_PARSED_OBJECT_INDEX:
/* This is a local object, we've parsed in parse_fx10_local_object, which has an array index. */
data_ptr = data + offset;
read_dword(&data_ptr, &offset);
read_dword(&data_ptr, &o->index);
TRACE("Variable name %s[%u].\n", debugstr_a(data + offset), o->index);
read_dword(&data_ptr, &variable_idx);
TRACE("Variable name %s[%u].\n", debugstr_a(data + offset), variable_idx);
o->data = e->lpVtbl->GetVariableByName(e, data + offset);
variable = e->lpVtbl->GetVariableByName(e, data + offset);
break;
case D3D10_EOO_ANONYMOUS_SHADER:
@ -1321,7 +1324,7 @@ static HRESULT parse_fx10_object(struct d3d10_effect_object *o, const char **ptr
hr = parse_fx10_anonymous_shader(effect, &effect->anonymous_shaders[effect->anonymous_shader_current], o->type);
if (FAILED(hr)) return hr;
o->data = &effect->anonymous_shaders[effect->anonymous_shader_current].shader;
variable = &effect->anonymous_shaders[effect->anonymous_shader_current].shader.ID3D10EffectVariable_iface;
++effect->anonymous_shader_current;
switch (o->type)
@ -1329,7 +1332,7 @@ static HRESULT parse_fx10_object(struct d3d10_effect_object *o, const char **ptr
case D3D10_EOT_VERTEXSHADER:
case D3D10_EOT_PIXELSHADER:
case D3D10_EOT_GEOMETRYSHADER:
if (FAILED(hr = parse_shader(o->data, data_ptr)))
if (FAILED(hr = parse_shader(variable, data_ptr)))
return hr;
break;
@ -1348,28 +1351,31 @@ static HRESULT parse_fx10_object(struct d3d10_effect_object *o, const char **ptr
{
case D3D10_EOT_VERTEXSHADER:
{
ID3D10EffectVariable *variable = o->data;
ID3D10EffectShaderVariable *sv = variable->lpVtbl->AsShader(variable);
if (FAILED(hr = sv->lpVtbl->GetVertexShader(sv, o->index, &o->object.vs)))
if (FAILED(hr = sv->lpVtbl->GetVertexShader(sv, variable_idx, &o->object.vs)))
return hr;
o->pass->vs.pShaderVariable = sv;
o->pass->vs.ShaderIndex = variable_idx;
break;
}
case D3D10_EOT_PIXELSHADER:
{
ID3D10EffectVariable *variable = o->data;
ID3D10EffectShaderVariable *sv = variable->lpVtbl->AsShader(variable);
if (FAILED(hr = sv->lpVtbl->GetPixelShader(sv, o->index, &o->object.ps)))
if (FAILED(hr = sv->lpVtbl->GetPixelShader(sv, variable_idx, &o->object.ps)))
return hr;
o->pass->ps.pShaderVariable = sv;
o->pass->ps.ShaderIndex = variable_idx;
break;
}
case D3D10_EOT_GEOMETRYSHADER:
{
ID3D10EffectVariable *variable = o->data;
ID3D10EffectShaderVariable *sv = variable->lpVtbl->AsShader(variable);
if (FAILED(hr = sv->lpVtbl->GetGeometryShader(sv, o->index, &o->object.gs)))
if (FAILED(hr = sv->lpVtbl->GetGeometryShader(sv, variable_idx, &o->object.gs)))
return hr;
o->pass->gs.pShaderVariable = sv;
o->pass->gs.ShaderIndex = variable_idx;
break;
}
@ -1436,6 +1442,10 @@ static HRESULT parse_fx10_pass(struct d3d10_effect_pass *p, const char **ptr, co
return E_OUTOFMEMORY;
}
p->vs.pShaderVariable = (ID3D10EffectShaderVariable *)&null_shader_variable.ID3D10EffectVariable_iface;
p->ps.pShaderVariable = (ID3D10EffectShaderVariable *)&null_shader_variable.ID3D10EffectVariable_iface;
p->gs.pShaderVariable = (ID3D10EffectShaderVariable *)&null_shader_variable.ID3D10EffectVariable_iface;
for (i = 0; i < p->object_count; ++i)
{
struct d3d10_effect_object *o = &p->objects[i];
@ -1619,7 +1629,7 @@ static HRESULT parse_fx10_local_variable(struct d3d10_effect_variable *v, const
read_dword(ptr, &shader_offset);
TRACE("Shader offset: %#x.\n", shader_offset);
hr = parse_shader(var, data + shader_offset);
hr = parse_shader(&var->ID3D10EffectVariable_iface, data + shader_offset);
if (FAILED(hr)) return hr;
}
break;
@ -2892,7 +2902,7 @@ static HRESULT STDMETHODCALLTYPE d3d10_effect_pass_GetDesc(ID3D10EffectPass *ifa
D3D10_PASS_DESC *desc)
{
struct d3d10_effect_pass *This = impl_from_ID3D10EffectPass(iface);
unsigned int i;
struct d3d10_effect_shader_variable *s;
FIXME("iface %p, desc %p partial stub!\n", iface, desc);
@ -2910,17 +2920,11 @@ static HRESULT STDMETHODCALLTYPE d3d10_effect_pass_GetDesc(ID3D10EffectPass *ifa
memset(desc, 0, sizeof(*desc));
desc->Name = This->name;
for (i = 0; i < This->object_count; ++i)
if ((s = impl_from_ID3D10EffectVariable((ID3D10EffectVariable *)This->vs.pShaderVariable)->data))
{
struct d3d10_effect_object *o = &This->objects[i];
if (o->type == D3D10_EOT_VERTEXSHADER)
{
struct d3d10_effect_variable *v = o->data;
struct d3d10_effect_shader_variable *s = v->data;
desc->pIAInputSignature = (BYTE *)s->input_signature.signature;
desc->IAInputSignatureSize = s->input_signature.signature_size;
break;
}
}
desc->StencilRef = This->stencil_ref;
@ -2934,7 +2938,6 @@ static HRESULT STDMETHODCALLTYPE d3d10_effect_pass_GetVertexShaderDesc(ID3D10Eff
D3D10_PASS_SHADER_DESC *desc)
{
struct d3d10_effect_pass *This = impl_from_ID3D10EffectPass(iface);
unsigned int i;
TRACE("iface %p, desc %p\n", iface, desc);
@ -2950,21 +2953,7 @@ static HRESULT STDMETHODCALLTYPE d3d10_effect_pass_GetVertexShaderDesc(ID3D10Eff
return E_INVALIDARG;
}
for (i = 0; i < This->object_count; ++i)
{
struct d3d10_effect_object *o = &This->objects[i];
if (o->type == D3D10_EOT_VERTEXSHADER)
{
desc->pShaderVariable = o->data;
desc->ShaderIndex = o->index;
return S_OK;
}
}
TRACE("Returning null_shader_variable\n");
desc->pShaderVariable = (ID3D10EffectShaderVariable *)&null_shader_variable;
desc->ShaderIndex = 0;
*desc = This->vs;
return S_OK;
}
@ -2973,7 +2962,6 @@ static HRESULT STDMETHODCALLTYPE d3d10_effect_pass_GetGeometryShaderDesc(ID3D10E
D3D10_PASS_SHADER_DESC *desc)
{
struct d3d10_effect_pass *This = impl_from_ID3D10EffectPass(iface);
unsigned int i;
TRACE("iface %p, desc %p\n", iface, desc);
@ -2989,21 +2977,7 @@ static HRESULT STDMETHODCALLTYPE d3d10_effect_pass_GetGeometryShaderDesc(ID3D10E
return E_INVALIDARG;
}
for (i = 0; i < This->object_count; ++i)
{
struct d3d10_effect_object *o = &This->objects[i];
if (o->type == D3D10_EOT_GEOMETRYSHADER)
{
desc->pShaderVariable = o->data;
desc->ShaderIndex = o->index;
return S_OK;
}
}
TRACE("Returning null_shader_variable\n");
desc->pShaderVariable = (ID3D10EffectShaderVariable *)&null_shader_variable;
desc->ShaderIndex = 0;
*desc = This->gs;
return S_OK;
}
@ -3012,7 +2986,6 @@ static HRESULT STDMETHODCALLTYPE d3d10_effect_pass_GetPixelShaderDesc(ID3D10Effe
D3D10_PASS_SHADER_DESC *desc)
{
struct d3d10_effect_pass *This = impl_from_ID3D10EffectPass(iface);
unsigned int i;
TRACE("iface %p, desc %p\n", iface, desc);
@ -3028,21 +3001,7 @@ static HRESULT STDMETHODCALLTYPE d3d10_effect_pass_GetPixelShaderDesc(ID3D10Effe
return E_INVALIDARG;
}
for (i = 0; i < This->object_count; ++i)
{
struct d3d10_effect_object *o = &This->objects[i];
if (o->type == D3D10_EOT_PIXELSHADER)
{
desc->pShaderVariable = o->data;
desc->ShaderIndex = o->index;
return S_OK;
}
}
TRACE("Returning null_shader_variable\n");
desc->pShaderVariable = (ID3D10EffectShaderVariable *)&null_shader_variable;
desc->ShaderIndex = 0;
*desc = This->ps;
return S_OK;
}