Henri Verbeet : d3d10: Store shaders directly in d3d10_effect_object.

Alexandre Julliard julliard at winehq.org
Tue Sep 25 15:13:37 CDT 2012


Module: wine
Branch: master
Commit: 2a83e1a581585d1d92408200ac5f3abf5701a098
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=2a83e1a581585d1d92408200ac5f3abf5701a098

Author: Henri Verbeet <hverbeet at codeweavers.com>
Date:   Tue Sep 25 10:34:40 2012 +0200

d3d10: Store shaders directly in d3d10_effect_object.

---

 dlls/d3d10/d3d10_private.h |    9 ++++
 dlls/d3d10/effect.c        |  115 +++++++++++++++++++++++++++++++------------
 2 files changed, 92 insertions(+), 32 deletions(-)

diff --git a/dlls/d3d10/d3d10_private.h b/dlls/d3d10/d3d10_private.h
index 51696ef..417bff3 100644
--- a/dlls/d3d10/d3d10_private.h
+++ b/dlls/d3d10/d3d10_private.h
@@ -49,6 +49,9 @@ void d3d10_rb_free(void *ptr) DECLSPEC_HIDDEN;
 
 enum d3d10_effect_object_type
 {
+    D3D10_EOT_RASTERIZER_STATE = 0x0,
+    D3D10_EOT_DEPTH_STENCIL_STATE = 0x1,
+    D3D10_EOT_BLEND_STATE = 0x2,
     D3D10_EOT_VERTEXSHADER = 0x6,
     D3D10_EOT_PIXELSHADER = 0x7,
     D3D10_EOT_GEOMETRYSHADER = 0x8,
@@ -71,6 +74,12 @@ struct d3d10_effect_object
     enum d3d10_effect_object_type type;
     DWORD index;
     void *data;
+    union
+    {
+        ID3D10VertexShader *vs;
+        ID3D10PixelShader *ps;
+        ID3D10GeometryShader *gs;
+    } object;
 };
 
 struct d3d10_effect_shader_signature
diff --git a/dlls/d3d10/effect.c b/dlls/d3d10/effect.c
index edb216b..18ac964 100644
--- a/dlls/d3d10/effect.c
+++ b/dlls/d3d10/effect.c
@@ -1243,19 +1243,16 @@ 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;
-                    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;
 
                 case D3D10_EOT_STENCIL_REF:
@@ -1264,8 +1261,6 @@ static HRESULT parse_fx10_object(struct d3d10_effect_object *o, const char **ptr
                         ERR("Failed to read stencil ref.\n");
                         return E_FAIL;
                     }
-
-                    hr = S_OK;
                     break;
 
                 case D3D10_EOT_SAMPLE_MASK:
@@ -1274,8 +1269,6 @@ static HRESULT parse_fx10_object(struct d3d10_effect_object *o, const char **ptr
                         FIXME("Failed to read sample mask.\n");
                         return E_FAIL;
                     }
-
-                    hr = S_OK;
                     break;
 
                 case D3D10_EOT_BLEND_FACTOR:
@@ -1284,14 +1277,11 @@ static HRESULT parse_fx10_object(struct d3d10_effect_object *o, const char **ptr
                         FIXME("Failed to read blend factor.\n");
                         return E_FAIL;
                     }
-
-                    hr = S_OK;
                     break;
 
                 default:
                     FIXME("Unhandled object type %#x\n", o->type);
-                    hr = E_FAIL;
-                    break;
+                    return E_FAIL;
             }
             break;
 
@@ -1300,7 +1290,6 @@ static HRESULT parse_fx10_object(struct d3d10_effect_object *o, const char **ptr
             TRACE("Variable name %s.\n", debugstr_a(data + offset));
 
             o->data = e->lpVtbl->GetVariableByName(e, data + offset);
-            hr = S_OK;
             break;
 
         case D3D10_EOO_PARSED_OBJECT_INDEX:
@@ -1311,7 +1300,6 @@ static HRESULT parse_fx10_object(struct d3d10_effect_object *o, const char **ptr
             TRACE("Variable name %s[%u].\n", debugstr_a(data + offset), o->index);
 
             o->data = e->lpVtbl->GetVariableByName(e, data + offset);
-            hr = S_OK;
             break;
 
         case D3D10_EOO_ANONYMOUS_SHADER:
@@ -1339,34 +1327,66 @@ static HRESULT parse_fx10_object(struct d3d10_effect_object *o, const char **ptr
             switch (o->type)
             {
                 case D3D10_EOT_VERTEXSHADER:
-                    TRACE("Vertex shader\n");
-                    hr = parse_shader(o->data, data_ptr);
-                    break;
-
                 case D3D10_EOT_PIXELSHADER:
-                    TRACE("Pixel shader\n");
-                    hr = parse_shader(o->data, data_ptr);
-                    break;
-
                 case D3D10_EOT_GEOMETRYSHADER:
-                    TRACE("Geometry shader\n");
-                    hr = parse_shader(o->data, data_ptr);
+                    if (FAILED(hr = parse_shader(o->data, data_ptr)))
+                        return hr;
                     break;
 
                 default:
                     FIXME("Unhandled object type %#x\n", o->type);
-                    hr = E_FAIL;
-                    break;
+                    return E_FAIL;
             }
             break;
 
         default:
-            hr = E_FAIL;
             FIXME("Unhandled operation %#x.\n", operation);
+            return E_FAIL;
+    }
+
+    switch (o->type)
+    {
+        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)))
+                return hr;
+            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)))
+                return hr;
+            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)))
+                return hr;
             break;
+        }
+
+        case D3D10_EOT_RASTERIZER_STATE:
+        case D3D10_EOT_DEPTH_STENCIL_STATE:
+        case D3D10_EOT_BLEND_STATE:
+        case D3D10_EOT_STENCIL_REF:
+        case D3D10_EOT_BLEND_FACTOR:
+        case D3D10_EOT_SAMPLE_MASK:
+            break;
+
+        default:
+            FIXME("Unhandled object type %#x.\n", o->type);
+            return E_FAIL;
     }
 
-    return hr;
+    return S_OK;
 }
 
 static HRESULT parse_fx10_pass(struct d3d10_effect_pass *p, const char **ptr, const char *data)
@@ -2093,22 +2113,21 @@ HRESULT d3d10_effect_parse(struct d3d10_effect *This, const void *data, SIZE_T d
 static HRESULT d3d10_effect_object_apply(struct d3d10_effect_object *o)
 {
     ID3D10Device *device = o->pass->technique->effect->device;
-    struct d3d10_effect_variable *v = (struct d3d10_effect_variable*) o->data;
 
     TRACE("effect object %p, type %#x.\n", o, o->type);
 
     switch(o->type)
     {
         case D3D10_EOT_VERTEXSHADER:
-            ID3D10Device_VSSetShader(device, ((struct d3d10_effect_shader_variable *)v->data)->shader.vs);
+            ID3D10Device_VSSetShader(device, o->object.vs);
             return S_OK;
 
         case D3D10_EOT_PIXELSHADER:
-            ID3D10Device_PSSetShader(device, ((struct d3d10_effect_shader_variable *)v->data)->shader.ps);
+            ID3D10Device_PSSetShader(device, o->object.ps);
             return S_OK;
 
         case D3D10_EOT_GEOMETRYSHADER:
-            ID3D10Device_GSSetShader(device, ((struct d3d10_effect_shader_variable *)v->data)->shader.gs);
+            ID3D10Device_GSSetShader(device, o->object.gs);
             return S_OK;
 
         default:
@@ -2198,6 +2217,30 @@ static void d3d10_effect_variable_destroy(struct d3d10_effect_variable *v)
     }
 }
 
+static void d3d10_effect_object_destroy(struct d3d10_effect_object *o)
+{
+    switch (o->type)
+    {
+        case D3D10_EOT_VERTEXSHADER:
+            if (o->object.vs)
+                ID3D10VertexShader_Release(o->object.vs);
+            break;
+
+        case D3D10_EOT_PIXELSHADER:
+            if (o->object.ps)
+                ID3D10PixelShader_Release(o->object.ps);
+            break;
+
+        case D3D10_EOT_GEOMETRYSHADER:
+            if (o->object.gs)
+                ID3D10GeometryShader_Release(o->object.gs);
+            break;
+
+        default:
+            break;
+    }
+}
+
 static void d3d10_effect_pass_destroy(struct d3d10_effect_pass *p)
 {
     unsigned int i;
@@ -2205,7 +2248,15 @@ static void d3d10_effect_pass_destroy(struct d3d10_effect_pass *p)
     TRACE("pass %p\n", p);
 
     HeapFree(GetProcessHeap(), 0, p->name);
-    HeapFree(GetProcessHeap(), 0, p->objects);
+
+    if (p->objects)
+    {
+        for (i = 0; i < p->object_count; ++i)
+        {
+            d3d10_effect_object_destroy(&p->objects[i]);
+        }
+        HeapFree(GetProcessHeap(), 0, p->objects);
+    }
 
     if (p->annotations)
     {




More information about the wine-cvs mailing list