Rico Schüller : d3d10: Add anonymous shaders.
Alexandre Julliard
julliard at winehq.org
Mon Jan 25 11:21:11 CST 2010
Module: wine
Branch: master
Commit: 3b56f259ce77860b0f56e38b5f50da534e69f696
URL: http://source.winehq.org/git/wine.git/?a=commit;h=3b56f259ce77860b0f56e38b5f50da534e69f696
Author: Rico Schüller <kgbricola at web.de>
Date: Sun Jan 24 14:25:19 2010 +0100
d3d10: Add anonymous shaders.
---
dlls/d3d10/d3d10_private.h | 9 ++++---
dlls/d3d10/effect.c | 54 +++++++++++++++++++++++++++++++++++++++----
2 files changed, 54 insertions(+), 9 deletions(-)
diff --git a/dlls/d3d10/d3d10_private.h b/dlls/d3d10/d3d10_private.h
index 85618f5..06f435f 100644
--- a/dlls/d3d10/d3d10_private.h
+++ b/dlls/d3d10/d3d10_private.h
@@ -76,11 +76,14 @@ struct d3d10_effect_type
{
const struct ID3D10EffectTypeVtbl *vtbl;
+ char *name;
+ D3D10_SHADER_VARIABLE_TYPE basetype;
+ D3D10_SHADER_VARIABLE_CLASS type_class;
+
DWORD id;
struct wine_rb_entry entry;
struct d3d10_effect *effect;
- char *name;
DWORD element_count;
DWORD size_unpacked;
DWORD stride;
@@ -88,8 +91,6 @@ struct d3d10_effect_type
DWORD member_count;
DWORD column_count;
DWORD row_count;
- D3D10_SHADER_VARIABLE_TYPE basetype;
- D3D10_SHADER_VARIABLE_CLASS type_class;
struct d3d10_effect_type *elementtype;
struct d3d10_effect_type_member *members;
};
@@ -109,7 +110,6 @@ struct d3d10_effect_variable
struct d3d10_effect_variable *buffer;
struct d3d10_effect_type *type;
- struct d3d10_effect *effect;
void *data;
char *name;
@@ -118,6 +118,7 @@ struct d3d10_effect_variable
DWORD annotation_count;
DWORD flag;
DWORD data_size;
+ struct d3d10_effect *effect;
struct d3d10_effect_variable *elements;
struct d3d10_effect_variable *members;
struct d3d10_effect_variable *annotations;
diff --git a/dlls/d3d10/effect.c b/dlls/d3d10/effect.c
index f31bddd..20eccb5 100644
--- a/dlls/d3d10/effect.c
+++ b/dlls/d3d10/effect.c
@@ -97,6 +97,24 @@ static struct d3d10_effect_variable null_rasterizer_variable = {(ID3D10EffectVar
static struct d3d10_effect_variable null_sampler_variable = {(ID3D10EffectVariableVtbl *)&d3d10_effect_sampler_variable_vtbl,
&null_local_buffer, &null_type};
+/* anonymous_shader_type and anonymous_shader */
+static char anonymous_name[] = "$Anonymous";
+static char anonymous_vertexshader_name[] = "vertexshader";
+static char anonymous_pixelshader_name[] = "pixelshader";
+static char anonymous_geometryshader_name[] = "geometryshader";
+static struct d3d10_effect_type anonymous_vs_type = {&d3d10_effect_type_vtbl, anonymous_vertexshader_name,
+ D3D10_SVT_VERTEXSHADER, D3D10_SVC_OBJECT};
+static struct d3d10_effect_type anonymous_ps_type = {&d3d10_effect_type_vtbl, anonymous_pixelshader_name,
+ D3D10_SVT_PIXELSHADER, D3D10_SVC_OBJECT};
+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 = {(ID3D10EffectVariableVtbl *)&d3d10_effect_shader_variable_vtbl,
+ &null_local_buffer, &anonymous_vs_type, &null_shader_variable, anonymous_name};
+static struct d3d10_effect_variable anonymous_ps = {(ID3D10EffectVariableVtbl *)&d3d10_effect_shader_variable_vtbl,
+ &null_local_buffer, &anonymous_ps_type, &null_shader_variable, anonymous_name};
+static struct d3d10_effect_variable anonymous_gs = {(ID3D10EffectVariableVtbl *)&d3d10_effect_shader_variable_vtbl,
+ &null_local_buffer, &anonymous_gs_type, &null_shader_variable, anonymous_name};
+
static struct d3d10_effect_type *get_fx10_type(struct d3d10_effect *effect, const char *data, DWORD offset);
static inline void read_dword(const char **ptr, DWORD *d)
@@ -904,10 +922,35 @@ static HRESULT parse_fx10_object(struct d3d10_effect_object *o, const char **ptr
switch(operation)
{
- /* FIXME: This probably isn't completely correct. */
case D3D10_EOO_VALUE:
- FIXME("Copy variable value\n");
+ TRACE("Copy variable values\n");
hr = E_FAIL;
+
+ switch (o->type)
+ {
+ case D3D10_EOT_VERTEXSHADER:
+ TRACE("Vertex shader\n");
+ o->data = &anonymous_vs;
+ hr = S_OK;
+ break;
+
+ case D3D10_EOT_PIXELSHADER:
+ TRACE("Pixel shader\n");
+ o->data = &anonymous_ps;
+ hr = S_OK;
+ break;
+
+ case D3D10_EOT_GEOMETRYSHADER:
+ TRACE("Geometry shader\n");
+ o->data = &anonymous_gs;
+ hr = S_OK;
+ break;
+
+ default:
+ FIXME("Unhandled object type %#x\n", o->type);
+ hr = E_FAIL;
+ break;
+ }
break;
case D3D10_EOO_ANONYMOUS_SHADER:
@@ -2454,18 +2497,19 @@ static HRESULT STDMETHODCALLTYPE d3d10_effect_variable_GetDesc(ID3D10EffectVaria
TRACE("iface %p, desc %p\n", iface, desc);
- if(This == &null_variable)
+ if (!iface->lpVtbl->IsValid(iface))
{
WARN("Null variable specified\n");
return E_FAIL;
}
- if(!desc)
+ if (!desc)
{
WARN("Invalid argument specified\n");
return E_INVALIDARG;
}
+ /* FIXME: This isn't correct. Anonymous shaders let desc->ExplicitBindPoint untouched, but normal shaders set it! */
memset(desc, 0, sizeof(*desc));
desc->Name = This->name;
desc->Semantic = This->semantic;
@@ -2473,7 +2517,7 @@ static HRESULT STDMETHODCALLTYPE d3d10_effect_variable_GetDesc(ID3D10EffectVaria
desc->Annotations = This->annotation_count;
desc->BufferOffset = This->buffer_offset;
- if( This->flag == D3D10_EFFECT_VARIABLE_EXPLICIT_BIND_POINT)
+ if (This->flag & D3D10_EFFECT_VARIABLE_EXPLICIT_BIND_POINT)
{
desc->ExplicitBindPoint = This->buffer_offset;
}
More information about the wine-cvs
mailing list