[PATCH 2/5] d3d10: Store shader variables in d3d10_effect_pass instead of d3d10_effect_object.
Henri Verbeet
hverbeet at codeweavers.com
Tue Sep 25 03:34:41 CDT 2012
---
dlls/d3d10/d3d10_private.h | 5 +-
dlls/d3d10/effect.c | 115 ++++++++++++++------------------------------
2 files changed, 40 insertions(+), 80 deletions(-)
diff --git a/dlls/d3d10/d3d10_private.h b/dlls/d3d10/d3d10_private.h
index 417bff3..e414742 100644
--- a/dlls/d3d10/d3d10_private.h
+++ b/dlls/d3d10/d3d10_private.h
@@ -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];
diff --git a/dlls/d3d10/effect.c b/dlls/d3d10/effect.c
index 18ac964..0aca9b3 100644
--- a/dlls/d3d10/effect.c
+++ b/dlls/d3d10/effect.c
@@ -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->pIAInputSignature = (BYTE *)s->input_signature.signature;
+ desc->IAInputSignatureSize = s->input_signature.signature_size;
}
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;
}
--
1.7.8.6
More information about the wine-patches
mailing list