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