[PATCH 3/5] wined3d: Remove COM from the shader implementation.

Henri Verbeet hverbeet at codeweavers.com
Wed Mar 30 13:49:25 CDT 2011


---
 dlls/d3d10core/d3d10core_private.h |    6 +-
 dlls/d3d10core/shader.c            |   10 +-
 dlls/d3d8/d3d8_private.h           |    6 +-
 dlls/d3d8/device.c                 |   21 +++---
 dlls/d3d8/shader.c                 |    8 +-
 dlls/d3d8/vertexdeclaration.c      |    4 +-
 dlls/d3d9/d3d9_private.h           |    4 +-
 dlls/d3d9/device.c                 |   12 ++--
 dlls/d3d9/shader.c                 |   12 ++--
 dlls/wined3d/arb_program_shader.c  |   10 +-
 dlls/wined3d/device.c              |   24 +++---
 dlls/wined3d/glsl_shader.c         |   12 ++--
 dlls/wined3d/shader.c              |  150 ++++++++++++------------------------
 dlls/wined3d/stateblock.c          |   12 ++--
 dlls/wined3d/wined3d.spec          |    6 ++
 dlls/wined3d/wined3d_private.h     |   21 +++---
 include/wine/wined3d.idl           |   41 ++++------
 17 files changed, 153 insertions(+), 206 deletions(-)

diff --git a/dlls/d3d10core/d3d10core_private.h b/dlls/d3d10core/d3d10core_private.h
index a08acfa..716c3f2 100644
--- a/dlls/d3d10core/d3d10core_private.h
+++ b/dlls/d3d10core/d3d10core_private.h
@@ -169,7 +169,7 @@ struct d3d10_vertex_shader
     const struct ID3D10VertexShaderVtbl *vtbl;
     LONG refcount;
 
-    IWineD3DBaseShader *wined3d_shader;
+    struct wined3d_shader *wined3d_shader;
     struct wined3d_shader_signature output_signature;
 };
 
@@ -182,7 +182,7 @@ struct d3d10_geometry_shader
     const struct ID3D10GeometryShaderVtbl *vtbl;
     LONG refcount;
 
-    IWineD3DBaseShader *wined3d_shader;
+    struct wined3d_shader *wined3d_shader;
     struct wined3d_shader_signature output_signature;
 };
 
@@ -195,7 +195,7 @@ struct d3d10_pixel_shader
     const struct ID3D10PixelShaderVtbl *vtbl;
     LONG refcount;
 
-    IWineD3DBaseShader *wined3d_shader;
+    struct wined3d_shader *wined3d_shader;
     struct wined3d_shader_signature output_signature;
 };
 
diff --git a/dlls/d3d10core/shader.c b/dlls/d3d10core/shader.c
index e9beab2..cd4b944 100644
--- a/dlls/d3d10core/shader.c
+++ b/dlls/d3d10core/shader.c
@@ -162,7 +162,7 @@ static ULONG STDMETHODCALLTYPE d3d10_vertex_shader_AddRef(ID3D10VertexShader *if
     TRACE("%p increasing refcount to %u\n", This, refcount);
 
     if (refcount == 1)
-        IWineD3DBaseShader_AddRef(This->wined3d_shader);
+        wined3d_shader_incref(This->wined3d_shader);
 
     return refcount;
 }
@@ -175,7 +175,7 @@ static ULONG STDMETHODCALLTYPE d3d10_vertex_shader_Release(ID3D10VertexShader *i
     TRACE("%p decreasing refcount to %u\n", This, refcount);
 
     if (!refcount)
-        IWineD3DBaseShader_Release(This->wined3d_shader);
+        wined3d_shader_decref(This->wined3d_shader);
 
     return refcount;
 }
@@ -307,7 +307,7 @@ static ULONG STDMETHODCALLTYPE d3d10_geometry_shader_Release(ID3D10GeometryShade
     TRACE("%p decreasing refcount to %u\n", This, refcount);
 
     if (!refcount)
-        IWineD3DBaseShader_Release(This->wined3d_shader);
+        wined3d_shader_decref(This->wined3d_shader);
 
     return refcount;
 }
@@ -429,7 +429,7 @@ static ULONG STDMETHODCALLTYPE d3d10_pixel_shader_AddRef(ID3D10PixelShader *ifac
     TRACE("%p increasing refcount to %u\n", This, refcount);
 
     if (refcount == 1)
-        IWineD3DBaseShader_AddRef(This->wined3d_shader);
+        wined3d_shader_incref(This->wined3d_shader);
 
     return refcount;
 }
@@ -442,7 +442,7 @@ static ULONG STDMETHODCALLTYPE d3d10_pixel_shader_Release(ID3D10PixelShader *ifa
     TRACE("%p decreasing refcount to %u\n", This, refcount);
 
     if (!refcount)
-        IWineD3DBaseShader_Release(This->wined3d_shader);
+        wined3d_shader_decref(This->wined3d_shader);
 
     return refcount;
 }
diff --git a/dlls/d3d8/d3d8_private.h b/dlls/d3d8/d3d8_private.h
index 6ee0340..10daa7a 100644
--- a/dlls/d3d8/d3d8_private.h
+++ b/dlls/d3d8/d3d8_private.h
@@ -472,7 +472,7 @@ struct IDirect3DVertexShader8Impl {
   IDirect3DVertexShader8            IDirect3DVertexShader8_iface;
   LONG                              ref;
   IDirect3DVertexDeclaration8 *vertex_declaration;
-  IWineD3DBaseShader *wined3d_shader;
+  struct wined3d_shader *wined3d_shader;
 };
 
 HRESULT vertexshader_init(IDirect3DVertexShader8Impl *shader, IDirect3DDevice8Impl *device,
@@ -487,7 +487,7 @@ typedef struct IDirect3DPixelShader8Impl {
     IDirect3DPixelShader8            IDirect3DPixelShader8_iface;
     LONG                             ref;
     DWORD handle;
-    IWineD3DBaseShader *wined3d_shader;
+    struct wined3d_shader *wined3d_shader;
 } IDirect3DPixelShader8Impl;
 
 HRESULT pixelshader_init(IDirect3DPixelShader8Impl *shader, IDirect3DDevice8Impl *device,
@@ -495,7 +495,7 @@ HRESULT pixelshader_init(IDirect3DPixelShader8Impl *shader, IDirect3DDevice8Impl
 
 D3DFORMAT d3dformat_from_wined3dformat(enum wined3d_format_id format) DECLSPEC_HIDDEN;
 enum wined3d_format_id wined3dformat_from_d3dformat(D3DFORMAT format) DECLSPEC_HIDDEN;
-void load_local_constants(const DWORD *d3d8_elements, IWineD3DBaseShader *wined3d_vertex_shader) DECLSPEC_HIDDEN;
+void load_local_constants(const DWORD *d3d8_elements, struct wined3d_shader *wined3d_vertex_shader) DECLSPEC_HIDDEN;
 size_t parse_token(const DWORD *pToken) DECLSPEC_HIDDEN;
 
 #endif /* __WINE_D3DX8_PRIVATE_H */
diff --git a/dlls/d3d8/device.c b/dlls/d3d8/device.c
index 3c9b677..10a567d 100644
--- a/dlls/d3d8/device.c
+++ b/dlls/d3d8/device.c
@@ -2121,12 +2121,11 @@ static HRESULT WINAPI IDirect3DDevice8Impl_GetVertexShader(IDirect3DDevice8 *ifa
     return hr;
 }
 
-static HRESULT  WINAPI  IDirect3DDevice8Impl_DeleteVertexShader(IDirect3DDevice8 *iface,
-        DWORD pShader)
+static HRESULT WINAPI IDirect3DDevice8Impl_DeleteVertexShader(IDirect3DDevice8 *iface, DWORD pShader)
 {
     IDirect3DDevice8Impl *This = impl_from_IDirect3DDevice8(iface);
     IDirect3DVertexShader8Impl *shader;
-    IWineD3DBaseShader *cur;
+    struct wined3d_shader *cur;
 
     TRACE("iface %p, shader %#x.\n", iface, pShader);
 
@@ -2145,7 +2144,7 @@ static HRESULT  WINAPI  IDirect3DDevice8Impl_DeleteVertexShader(IDirect3DDevice8
     {
         if (cur == shader->wined3d_shader)
             IDirect3DDevice8_SetVertexShader(iface, 0);
-        IWineD3DBaseShader_Release(cur);
+        wined3d_shader_decref(cur);
     }
 
     wined3d_mutex_unlock();
@@ -2268,7 +2267,7 @@ static HRESULT WINAPI IDirect3DDevice8Impl_GetVertexShaderFunction(IDirect3DDevi
         return D3D_OK;
     }
 
-    hr = IWineD3DBaseShader_GetFunction(shader->wined3d_shader, pData, pSizeOfData);
+    hr = wined3d_shader_get_byte_code(shader->wined3d_shader, pData, pSizeOfData);
     wined3d_mutex_unlock();
 
     return hr;
@@ -2419,7 +2418,7 @@ static HRESULT WINAPI IDirect3DDevice8Impl_SetPixelShader(IDirect3DDevice8 *ifac
 static HRESULT WINAPI IDirect3DDevice8Impl_GetPixelShader(IDirect3DDevice8 *iface, DWORD *ppShader)
 {
     IDirect3DDevice8Impl *This = impl_from_IDirect3DDevice8(iface);
-    IWineD3DBaseShader *object;
+    struct wined3d_shader *object;
 
     TRACE("iface %p, shader %p.\n", iface, ppShader);
 
@@ -2433,8 +2432,8 @@ static HRESULT WINAPI IDirect3DDevice8Impl_GetPixelShader(IDirect3DDevice8 *ifac
     if (object)
     {
         IDirect3DPixelShader8Impl *d3d8_shader;
-        d3d8_shader = IWineD3DBaseShader_GetParent(object);
-        IWineD3DBaseShader_Release(object);
+        d3d8_shader = wined3d_shader_get_parent(object);
+        wined3d_shader_decref(object);
         *ppShader = d3d8_shader->handle;
     }
     else
@@ -2452,7 +2451,7 @@ static HRESULT WINAPI IDirect3DDevice8Impl_DeletePixelShader(IDirect3DDevice8 *i
 {
     IDirect3DDevice8Impl *This = impl_from_IDirect3DDevice8(iface);
     IDirect3DPixelShader8Impl *shader;
-    IWineD3DBaseShader *cur;
+    struct wined3d_shader *cur;
 
     TRACE("iface %p, shader %#x.\n", iface, pShader);
 
@@ -2471,7 +2470,7 @@ static HRESULT WINAPI IDirect3DDevice8Impl_DeletePixelShader(IDirect3DDevice8 *i
     {
         if (cur == shader->wined3d_shader)
             IDirect3DDevice8_SetPixelShader(iface, 0);
-        IWineD3DBaseShader_Release(cur);
+        wined3d_shader_decref(cur);
     }
 
     wined3d_mutex_unlock();
@@ -2536,7 +2535,7 @@ static HRESULT WINAPI IDirect3DDevice8Impl_GetPixelShaderFunction(IDirect3DDevic
         return D3DERR_INVALIDCALL;
     }
 
-    hr = IWineD3DBaseShader_GetFunction(shader->wined3d_shader, pData, pSizeOfData);
+    hr = wined3d_shader_get_byte_code(shader->wined3d_shader, pData, pSizeOfData);
     wined3d_mutex_unlock();
 
     return hr;
diff --git a/dlls/d3d8/shader.c b/dlls/d3d8/shader.c
index cbceae4..7f76394 100644
--- a/dlls/d3d8/shader.c
+++ b/dlls/d3d8/shader.c
@@ -55,7 +55,7 @@ static ULONG WINAPI d3d8_vertexshader_AddRef(IDirect3DVertexShader8 *iface)
     if (refcount == 1 && shader->wined3d_shader)
     {
         wined3d_mutex_lock();
-        IWineD3DBaseShader_AddRef(shader->wined3d_shader);
+        wined3d_shader_incref(shader->wined3d_shader);
         wined3d_mutex_unlock();
     }
 
@@ -81,7 +81,7 @@ static ULONG WINAPI d3d8_vertexshader_Release(IDirect3DVertexShader8 *iface)
         if (shader->wined3d_shader)
         {
             wined3d_mutex_lock();
-            IWineD3DBaseShader_Release(shader->wined3d_shader);
+            wined3d_shader_decref(shader->wined3d_shader);
             wined3d_mutex_unlock();
         }
         else
@@ -225,7 +225,7 @@ static ULONG WINAPI d3d8_pixelshader_AddRef(IDirect3DPixelShader8 *iface)
     if (refcount == 1)
     {
         wined3d_mutex_lock();
-        IWineD3DBaseShader_AddRef(shader->wined3d_shader);
+        wined3d_shader_incref(shader->wined3d_shader);
         wined3d_mutex_unlock();
     }
 
@@ -242,7 +242,7 @@ static ULONG WINAPI d3d8_pixelshader_Release(IDirect3DPixelShader8 *iface)
     if (!refcount)
     {
         wined3d_mutex_lock();
-        IWineD3DBaseShader_Release(shader->wined3d_shader);
+        wined3d_shader_decref(shader->wined3d_shader);
         wined3d_mutex_unlock();
     }
 
diff --git a/dlls/d3d8/vertexdeclaration.c b/dlls/d3d8/vertexdeclaration.c
index 4881dc6..0cde96e 100644
--- a/dlls/d3d8/vertexdeclaration.c
+++ b/dlls/d3d8/vertexdeclaration.c
@@ -199,7 +199,7 @@ size_t parse_token(const DWORD* pToken)
     return tokenlen;
 }
 
-void load_local_constants(const DWORD *d3d8_elements, IWineD3DBaseShader *wined3d_vertex_shader)
+void load_local_constants(const DWORD *d3d8_elements, struct wined3d_shader *wined3d_vertex_shader)
 {
     const DWORD *token = d3d8_elements;
 
@@ -224,7 +224,7 @@ void load_local_constants(const DWORD *d3d8_elements, IWineD3DBaseShader *wined3
                             *(const float *)(token + i * 4 + 4));
                 }
             }
-            hr = IWineD3DBaseShader_SetLocalConstantsF(wined3d_vertex_shader,
+            hr = wined3d_shader_set_local_constants_float(wined3d_vertex_shader,
                     constant_idx, (const float *)token + 1, count);
             if (FAILED(hr)) ERR("Failed setting shader constants\n");
         }
diff --git a/dlls/d3d9/d3d9_private.h b/dlls/d3d9/d3d9_private.h
index 0c64978..3a44859 100644
--- a/dlls/d3d9/d3d9_private.h
+++ b/dlls/d3d9/d3d9_private.h
@@ -432,7 +432,7 @@ typedef struct IDirect3DVertexShader9Impl {
   /* IUnknown fields */
   const IDirect3DVertexShader9Vtbl *lpVtbl;
   LONG ref;
-  IWineD3DBaseShader *wined3d_shader;
+  struct wined3d_shader *wined3d_shader;
   IDirect3DDevice9Ex *parentDevice;
 } IDirect3DVertexShader9Impl;
 
@@ -453,7 +453,7 @@ typedef struct IDirect3DPixelShader9Impl {
   /* IUnknown fields */
     const IDirect3DPixelShader9Vtbl *lpVtbl;
     LONG                    ref;
-    IWineD3DBaseShader *wined3d_shader;
+    struct wined3d_shader *wined3d_shader;
     IDirect3DDevice9Ex *parentDevice;
 } IDirect3DPixelShader9Impl;
 
diff --git a/dlls/d3d9/device.c b/dlls/d3d9/device.c
index 2554e7d..1a66104 100644
--- a/dlls/d3d9/device.c
+++ b/dlls/d3d9/device.c
@@ -2242,7 +2242,7 @@ static HRESULT WINAPI IDirect3DDevice9Impl_SetVertexShader(IDirect3DDevice9Ex *i
 static HRESULT WINAPI IDirect3DDevice9Impl_GetVertexShader(IDirect3DDevice9Ex *iface,
         IDirect3DVertexShader9 **shader)
 {
-    IWineD3DBaseShader *wined3d_shader;
+    struct wined3d_shader *wined3d_shader;
 
     TRACE("iface %p, shader %p.\n", iface, shader);
 
@@ -2250,9 +2250,9 @@ static HRESULT WINAPI IDirect3DDevice9Impl_GetVertexShader(IDirect3DDevice9Ex *i
     wined3d_shader = IWineD3DDevice_GetVertexShader(((IDirect3DDevice9Impl *)iface)->WineD3DDevice);
     if (wined3d_shader)
     {
-        *shader = IWineD3DBaseShader_GetParent(wined3d_shader);
+        *shader = wined3d_shader_get_parent(wined3d_shader);
         IDirect3DVertexShader9_AddRef(*shader);
-        IWineD3DBaseShader_Release(wined3d_shader);
+        wined3d_shader_decref(wined3d_shader);
     }
     else
     {
@@ -2536,7 +2536,7 @@ static HRESULT WINAPI IDirect3DDevice9Impl_SetPixelShader(IDirect3DDevice9Ex *if
 static HRESULT WINAPI IDirect3DDevice9Impl_GetPixelShader(IDirect3DDevice9Ex *iface,
         IDirect3DPixelShader9 **shader)
 {
-    IWineD3DBaseShader *wined3d_shader;
+    struct wined3d_shader *wined3d_shader;
 
     TRACE("iface %p, shader %p.\n", iface, shader);
 
@@ -2546,9 +2546,9 @@ static HRESULT WINAPI IDirect3DDevice9Impl_GetPixelShader(IDirect3DDevice9Ex *if
     wined3d_shader = IWineD3DDevice_GetPixelShader(((IDirect3DDevice9Impl *)iface)->WineD3DDevice);
     if (wined3d_shader)
     {
-        *shader = IWineD3DBaseShader_GetParent(wined3d_shader);
+        *shader = wined3d_shader_get_parent(wined3d_shader);
         IDirect3DPixelShader9_AddRef(*shader);
-        IWineD3DBaseShader_Release(wined3d_shader);
+        wined3d_shader_decref(wined3d_shader);
     }
     else
     {
diff --git a/dlls/d3d9/shader.c b/dlls/d3d9/shader.c
index 4e5c459..0c11562 100644
--- a/dlls/d3d9/shader.c
+++ b/dlls/d3d9/shader.c
@@ -51,7 +51,7 @@ static ULONG WINAPI d3d9_vertexshader_AddRef(IDirect3DVertexShader9 *iface)
     {
         IDirect3DDevice9Ex_AddRef(shader->parentDevice);
         wined3d_mutex_lock();
-        IWineD3DBaseShader_AddRef(shader->wined3d_shader);
+        wined3d_shader_incref(shader->wined3d_shader);
         wined3d_mutex_unlock();
     }
 
@@ -70,7 +70,7 @@ static ULONG WINAPI d3d9_vertexshader_Release(IDirect3DVertexShader9 *iface)
         IDirect3DDevice9Ex *device = shader->parentDevice;
 
         wined3d_mutex_lock();
-        IWineD3DBaseShader_Release(shader->wined3d_shader);
+        wined3d_shader_decref(shader->wined3d_shader);
         wined3d_mutex_unlock();
 
         /* Release the device last, as it may cause the device to be destroyed. */
@@ -100,7 +100,7 @@ static HRESULT WINAPI d3d9_vertexshader_GetFunction(IDirect3DVertexShader9 *ifac
     TRACE("iface %p, data %p, data_size %p.\n", iface, data, data_size);
 
     wined3d_mutex_lock();
-    hr = IWineD3DBaseShader_GetFunction(((IDirect3DVertexShader9Impl *)iface)->wined3d_shader, data, data_size);
+    hr = wined3d_shader_get_byte_code(((IDirect3DVertexShader9Impl *)iface)->wined3d_shader, data, data_size);
     wined3d_mutex_unlock();
 
     return hr;
@@ -179,7 +179,7 @@ static ULONG WINAPI d3d9_pixelshader_AddRef(IDirect3DPixelShader9 *iface)
     {
         IDirect3DDevice9Ex_AddRef(shader->parentDevice);
         wined3d_mutex_lock();
-        IWineD3DBaseShader_AddRef(shader->wined3d_shader);
+        wined3d_shader_incref(shader->wined3d_shader);
         wined3d_mutex_unlock();
     }
 
@@ -198,7 +198,7 @@ static ULONG WINAPI d3d9_pixelshader_Release(IDirect3DPixelShader9 *iface)
         IDirect3DDevice9Ex *device = shader->parentDevice;
 
         wined3d_mutex_lock();
-        IWineD3DBaseShader_Release(shader->wined3d_shader);
+        wined3d_shader_decref(shader->wined3d_shader);
         wined3d_mutex_unlock();
 
         /* Release the device last, as it may cause the device to be destroyed. */
@@ -227,7 +227,7 @@ static HRESULT WINAPI d3d9_pixelshader_GetFunction(IDirect3DPixelShader9 *iface,
     TRACE("iface %p, data %p, data_size %p.\n", iface, data, data_size);
 
     wined3d_mutex_lock();
-    hr = IWineD3DBaseShader_GetFunction(((IDirect3DPixelShader9Impl *)iface)->wined3d_shader, data, data_size);
+    hr = wined3d_shader_get_byte_code(((IDirect3DPixelShader9Impl *)iface)->wined3d_shader, data, data_size);
     wined3d_mutex_unlock();
 
     return hr;
diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c
index 8264872..f4db6b6 100644
--- a/dlls/wined3d/arb_program_shader.c
+++ b/dlls/wined3d/arb_program_shader.c
@@ -944,7 +944,7 @@ static void shader_arb_get_register_name(const struct wined3d_shader_instruction
 {
     /* oPos, oFog and oPts in D3D */
     static const char * const rastout_reg_names[] = {"TMP_OUT", "result.fogcoord", "result.pointsize"};
-    struct IWineD3DBaseShaderImpl *shader = ins->ctx->shader;
+    struct wined3d_shader *shader = ins->ctx->shader;
     const struct wined3d_shader_reg_maps *reg_maps = ins->ctx->reg_maps;
     BOOL pshader = shader_is_pshader_version(reg_maps->shader_version.type);
     struct shader_arb_ctx_priv *ctx = ins->ctx->backend_data;
@@ -1340,7 +1340,7 @@ static void shader_hw_sample(const struct wined3d_shader_instruction *ins, DWORD
     const struct wined3d_texture *texture;
     const char *tex_type;
     BOOL np2_fixup = FALSE;
-    struct IWineD3DBaseShaderImpl *shader = ins->ctx->shader;
+    struct wined3d_shader *shader = ins->ctx->shader;
     IWineD3DDeviceImpl *device = shader->device;
     struct shader_arb_ctx_priv *priv = ins->ctx->backend_data;
     const char *mod;
@@ -1756,7 +1756,7 @@ static void shader_hw_nop(const struct wined3d_shader_instruction *ins)
 
 static void shader_hw_mov(const struct wined3d_shader_instruction *ins)
 {
-    struct IWineD3DBaseShaderImpl *shader = ins->ctx->shader;
+    struct wined3d_shader *shader = ins->ctx->shader;
     const struct wined3d_shader_reg_maps *reg_maps = ins->ctx->reg_maps;
     BOOL pshader = shader_is_pshader_version(reg_maps->shader_version.type);
     struct shader_arb_ctx_priv *ctx = ins->ctx->backend_data;
@@ -3206,7 +3206,7 @@ static void shader_hw_ret(const struct wined3d_shader_instruction *ins)
 {
     struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
     struct shader_arb_ctx_priv *priv = ins->ctx->backend_data;
-    struct IWineD3DBaseShaderImpl *shader = ins->ctx->shader;
+    struct wined3d_shader *shader = ins->ctx->shader;
     BOOL vshader = shader_is_vshader_version(ins->ctx->reg_maps->shader_version.type);
 
     if(priv->target_version == ARB) return;
@@ -5257,7 +5257,7 @@ static void free_recorded_instruction(struct list *list)
 static void shader_arb_handle_instruction(const struct wined3d_shader_instruction *ins) {
     SHADER_HANDLER hw_fct;
     struct shader_arb_ctx_priv *priv = ins->ctx->backend_data;
-    struct IWineD3DBaseShaderImpl *shader = ins->ctx->shader;
+    struct wined3d_shader *shader = ins->ctx->shader;
     struct control_frame *control_frame;
     struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
     BOOL bool_const;
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 74a4ac3..c34a0ee 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -9,7 +9,7 @@
  * Copyright 2006-2008 Stefan Dösinger for CodeWeavers
  * Copyright 2006-2008 Henri Verbeet
  * Copyright 2007 Andrew Riedi
- * Copyright 2009-2010 Henri Verbeet for CodeWeavers
+ * Copyright 2009-2011 Henri Verbeet for CodeWeavers
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -3350,9 +3350,9 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetVertexShader(IWineD3DDevice *iface,
     if (device->isRecordingState)
     {
         if (shader)
-            IWineD3DBaseShader_AddRef(shader);
+            wined3d_shader_incref(shader);
         if (prev)
-            IWineD3DBaseShader_Release(prev);
+            wined3d_shader_decref(prev);
         TRACE("Recording... not performing anything.\n");
         return WINED3D_OK;
     }
@@ -3365,9 +3365,9 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetVertexShader(IWineD3DDevice *iface,
 
     TRACE("(%p) : setting shader(%p)\n", device, shader);
     if (shader)
-        IWineD3DBaseShader_AddRef(shader);
+        wined3d_shader_incref(shader);
     if (prev)
-        IWineD3DBaseShader_Release(prev);
+        wined3d_shader_decref(prev);
 
     IWineD3DDeviceImpl_MarkStateDirty(device, STATE_VSHADER);
 
@@ -3383,7 +3383,7 @@ static IWineD3DBaseShader * WINAPI IWineD3DDeviceImpl_GetVertexShader(IWineD3DDe
 
     shader = (IWineD3DBaseShader *)device->stateBlock->state.vertex_shader;
     if (shader)
-        IWineD3DBaseShader_AddRef(shader);
+        wined3d_shader_incref(shader);
 
     TRACE("Returning %p.\n", shader);
     return shader;
@@ -3759,9 +3759,9 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetPixelShader(IWineD3DDevice *iface, I
     {
         TRACE("Recording... not performing anything.\n");
         if (shader)
-            IWineD3DBaseShader_AddRef(shader);
+            wined3d_shader_incref(shader);
         if (prev)
-            IWineD3DBaseShader_Release(prev);
+            wined3d_shader_decref(prev);
         return WINED3D_OK;
     }
 
@@ -3772,9 +3772,9 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetPixelShader(IWineD3DDevice *iface, I
     }
 
     if (shader)
-        IWineD3DBaseShader_AddRef(shader);
+        wined3d_shader_incref(shader);
     if (prev)
-        IWineD3DBaseShader_Release(prev);
+        wined3d_shader_decref(prev);
 
     TRACE("Setting shader %p.\n", shader);
     IWineD3DDeviceImpl_MarkStateDirty(device, STATE_PIXELSHADER);
@@ -3789,9 +3789,9 @@ static IWineD3DBaseShader * WINAPI IWineD3DDeviceImpl_GetPixelShader(IWineD3DDev
 
     TRACE("iface %p.\n", iface);
 
-    shader = (IWineD3DBaseShader *)device->stateBlock->state.pixel_shader;
+    shader = device->stateBlock->state.pixel_shader;
     if (shader)
-        IWineD3DBaseShader_AddRef(shader);
+        wined3d_shader_incref(shader);
 
     TRACE("Returning %p.\n", shader);
     return shader;
diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c
index a211106..c10dd17 100644
--- a/dlls/wined3d/glsl_shader.c
+++ b/dlls/wined3d/glsl_shader.c
@@ -1317,7 +1317,7 @@ static void shader_glsl_get_register_name(const struct wined3d_shader_register *
     /* oPos, oFog and oPts in D3D */
     static const char * const hwrastout_reg_names[] = {"OUT[10]", "OUT[11].x", "OUT[11].y"};
 
-    struct IWineD3DBaseShaderImpl *shader = ins->ctx->shader;
+    struct wined3d_shader *shader = ins->ctx->shader;
     const struct wined3d_shader_reg_maps *reg_maps = ins->ctx->reg_maps;
     const struct wined3d_gl_info *gl_info = ins->ctx->gl_info;
     char pshader = shader_is_pshader_version(reg_maps->shader_version.type);
@@ -2842,7 +2842,7 @@ static void shader_glsl_loop(const struct wined3d_shader_instruction *ins)
 {
     struct wined3d_shader_loop_state *loop_state = ins->ctx->loop_state;
     glsl_src_param_t src1_param;
-    struct IWineD3DBaseShaderImpl *shader = ins->ctx->shader;
+    struct wined3d_shader *shader = ins->ctx->shader;
     const DWORD *control_values = NULL;
     const local_constant *constant;
 
@@ -2925,7 +2925,7 @@ static void shader_glsl_end(const struct wined3d_shader_instruction *ins)
 
 static void shader_glsl_rep(const struct wined3d_shader_instruction *ins)
 {
-    struct IWineD3DBaseShaderImpl *shader = ins->ctx->shader;
+    struct wined3d_shader *shader = ins->ctx->shader;
     struct wined3d_shader_loop_state *loop_state = ins->ctx->loop_state;
     glsl_src_param_t src0_param;
     const DWORD *control_values = NULL;
@@ -3035,7 +3035,7 @@ static void shader_glsl_ret(const struct wined3d_shader_instruction *ins)
  ********************************************/
 static void shader_glsl_tex(const struct wined3d_shader_instruction *ins)
 {
-    struct IWineD3DBaseShaderImpl *shader = ins->ctx->shader;
+    struct wined3d_shader *shader = ins->ctx->shader;
     IWineD3DDeviceImpl *device = shader->device;
     DWORD shader_version = WINED3D_SHADER_VERSION(ins->ctx->reg_maps->shader_version.major,
             ins->ctx->reg_maps->shader_version.minor);
@@ -3125,7 +3125,7 @@ static void shader_glsl_tex(const struct wined3d_shader_instruction *ins)
 
 static void shader_glsl_texldd(const struct wined3d_shader_instruction *ins)
 {
-    struct IWineD3DBaseShaderImpl *shader = ins->ctx->shader;
+    struct wined3d_shader *shader = ins->ctx->shader;
     IWineD3DDeviceImpl *device = shader->device;
     const struct wined3d_gl_info *gl_info = ins->ctx->gl_info;
     glsl_sample_function_t sample_function;
@@ -3158,7 +3158,7 @@ static void shader_glsl_texldd(const struct wined3d_shader_instruction *ins)
 
 static void shader_glsl_texldl(const struct wined3d_shader_instruction *ins)
 {
-    struct IWineD3DBaseShaderImpl *shader = ins->ctx->shader;
+    struct wined3d_shader *shader = ins->ctx->shader;
     IWineD3DDeviceImpl *device = shader->device;
     const struct wined3d_gl_info *gl_info = ins->ctx->gl_info;
     glsl_sample_function_t sample_function;
diff --git a/dlls/wined3d/shader.c b/dlls/wined3d/shader.c
index 5829836..0fdea9f 100644
--- a/dlls/wined3d/shader.c
+++ b/dlls/wined3d/shader.c
@@ -1546,54 +1546,6 @@ const shader_backend_t none_shader_backend = {
     shader_none_color_fixup_supported,
 };
 
-static HRESULT shader_get_function(IWineD3DBaseShaderImpl *shader, void *data, UINT *data_size)
-{
-    if (!data)
-    {
-        *data_size = shader->functionLength;
-        return WINED3D_OK;
-    }
-
-    if (*data_size < shader->functionLength)
-    {
-        /* MSDN claims (for d3d8 at least) that if *pSizeOfData is smaller
-         * than the required size we should write the required size and
-         * return D3DERR_MOREDATA. That's not actually true. */
-        return WINED3DERR_INVALIDCALL;
-    }
-
-    memcpy(data, shader->function, shader->functionLength);
-
-    return WINED3D_OK;
-}
-
-/* Set local constants for d3d8 shaders. */
-static HRESULT shader_set_local_constants_float(IWineD3DBaseShaderImpl *shader,
-        UINT start_idx, const float *src_data, UINT count)
-{
-    UINT end_idx = start_idx + count;
-    UINT i;
-
-    if (end_idx > shader->limits.constant_float)
-    {
-        WARN("end_idx %u > float constants limit %u.\n",
-                end_idx, shader->limits.constant_float);
-        end_idx = shader->limits.constant_float;
-    }
-
-    for (i = start_idx; i < end_idx; ++i)
-    {
-        local_constant* lconst = HeapAlloc(GetProcessHeap(), 0, sizeof(local_constant));
-        if (!lconst) return E_OUTOFMEMORY;
-
-        lconst->idx = i;
-        memcpy(lconst->value, src_data + (i - start_idx) * 4 /* 4 components */, 4 * sizeof(float));
-        list_add_head(&shader->constantsF, &lconst->entry);
-    }
-
-    return WINED3D_OK;
-}
-
 static HRESULT shader_set_function(IWineD3DBaseShaderImpl *shader, const DWORD *byte_code,
         const struct wined3d_shader_signature *output_signature, DWORD float_const_count)
 {
@@ -1641,29 +1593,8 @@ static HRESULT shader_set_function(IWineD3DBaseShaderImpl *shader, const DWORD *
     return WINED3D_OK;
 }
 
-static HRESULT STDMETHODCALLTYPE wined3d_shader_QueryInterface(IWineD3DBaseShader *iface,
-        REFIID riid, void **object)
+ULONG CDECL wined3d_shader_incref(struct wined3d_shader *shader)
 {
-    TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object);
-
-    if (IsEqualGUID(riid, &IID_IWineD3DBaseShader)
-            || IsEqualGUID(riid, &IID_IWineD3DBase)
-            || IsEqualGUID(riid, &IID_IUnknown))
-    {
-        IUnknown_AddRef(iface);
-        *object = iface;
-        return S_OK;
-    }
-
-    WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid));
-
-    *object = NULL;
-    return E_NOINTERFACE;
-}
-
-static ULONG STDMETHODCALLTYPE wined3d_shader_AddRef(IWineD3DBaseShader *iface)
-{
-    IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)iface;
     ULONG refcount = InterlockedIncrement(&shader->ref);
 
     TRACE("%p increasing refcount to %u.\n", shader, refcount);
@@ -1672,9 +1603,8 @@ static ULONG STDMETHODCALLTYPE wined3d_shader_AddRef(IWineD3DBaseShader *iface)
 }
 
 /* Do not call while under the GL lock. */
-static ULONG STDMETHODCALLTYPE wined3d_shader_Release(IWineD3DBaseShader *iface)
+ULONG CDECL wined3d_shader_decref(struct wined3d_shader *shader)
 {
-    IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)iface;
     ULONG refcount = InterlockedDecrement(&shader->ref);
 
     TRACE("%p decreasing refcount to %u.\n", shader, refcount);
@@ -1689,38 +1619,66 @@ static ULONG STDMETHODCALLTYPE wined3d_shader_Release(IWineD3DBaseShader *iface)
     return refcount;
 }
 
-static void * STDMETHODCALLTYPE wined3d_shader_GetParent(IWineD3DBaseShader *iface)
+void * CDECL wined3d_shader_get_parent(const struct wined3d_shader *shader)
 {
-    TRACE("iface %p.\n", iface);
+    TRACE("shader %p.\n", shader);
 
-    return ((IWineD3DBaseShaderImpl *)iface)->parent;
+    return shader->parent;
 }
 
-static HRESULT STDMETHODCALLTYPE wined3d_shader_GetFunction(IWineD3DBaseShader *iface, void *data, UINT *data_size)
+HRESULT CDECL wined3d_shader_get_byte_code(const struct wined3d_shader *shader,
+        void *byte_code, UINT *byte_code_size)
 {
-    TRACE("iface %p, data %p, data_size %p.\n", iface, data, data_size);
+    TRACE("shader %p, byte_code %p, byte_code_size %p.\n", shader, byte_code, byte_code_size);
 
-    return shader_get_function((IWineD3DBaseShaderImpl *)iface, data, data_size);
+    if (!byte_code)
+    {
+        *byte_code_size = shader->functionLength;
+        return WINED3D_OK;
+    }
+
+    if (*byte_code_size < shader->functionLength)
+    {
+        /* MSDN claims (for d3d8 at least) that if *byte_code_size is smaller
+         * than the required size we should write the required size and
+         * return D3DERR_MOREDATA. That's not actually true. */
+        return WINED3DERR_INVALIDCALL;
+    }
+
+    memcpy(byte_code, shader->function, shader->functionLength);
+
+    return WINED3D_OK;
 }
 
-static HRESULT STDMETHODCALLTYPE wined3d_shader_SetLocalConstantsF(IWineD3DBaseShader *iface,
+/* Set local constants for d3d8 shaders. */
+HRESULT CDECL wined3d_shader_set_local_constants_float(struct wined3d_shader *shader,
         UINT start_idx, const float *src_data, UINT count)
 {
-    TRACE("iface %p, start_idx %u, src_data %p, count %u.\n", iface, start_idx, src_data, count);
+    UINT end_idx = start_idx + count;
+    UINT i;
 
-    return shader_set_local_constants_float((IWineD3DBaseShaderImpl *)iface,
-            start_idx, src_data, count);
-}
+    TRACE("shader %p, start_idx %u, src_data %p, count %u.\n", shader, start_idx, src_data, count);
 
-static const IWineD3DBaseShaderVtbl wined3d_shader_vtbl =
-{
-    wined3d_shader_QueryInterface,
-    wined3d_shader_AddRef,
-    wined3d_shader_Release,
-    wined3d_shader_GetParent,
-    wined3d_shader_GetFunction,
-    wined3d_shader_SetLocalConstantsF,
-};
+    if (end_idx > shader->limits.constant_float)
+    {
+        WARN("end_idx %u > float constants limit %u.\n",
+                end_idx, shader->limits.constant_float);
+        end_idx = shader->limits.constant_float;
+    }
+
+    for (i = start_idx; i < end_idx; ++i)
+    {
+        struct local_constant *lconst = HeapAlloc(GetProcessHeap(), 0, sizeof(local_constant));
+        if (!lconst)
+            return E_OUTOFMEMORY;
+
+        lconst->idx = i;
+        memcpy(lconst->value, src_data + (i - start_idx) * 4 /* 4 components */, 4 * sizeof(float));
+        list_add_head(&shader->constantsF, &lconst->entry);
+    }
+
+    return WINED3D_OK;
+}
 
 void find_vs_compile_args(const struct wined3d_state *state,
         IWineD3DBaseShaderImpl *shader, struct vs_compile_args *args)
@@ -1742,7 +1700,7 @@ static BOOL match_usage(BYTE usage1, BYTE usage_idx1, BYTE usage2, BYTE usage_id
     return FALSE;
 }
 
-BOOL vshader_get_input(struct IWineD3DBaseShaderImpl *shader,
+BOOL vshader_get_input(struct wined3d_shader *shader,
         BYTE usage_req, BYTE usage_idx_req, unsigned int *regnum)
 {
     WORD map = shader->reg_maps.input_registers;
@@ -1847,9 +1805,7 @@ HRESULT vertexshader_init(IWineD3DBaseShaderImpl *shader, IWineD3DDeviceImpl *de
 
     if (!byte_code) return WINED3DERR_INVALIDCALL;
 
-    shader->lpVtbl = &wined3d_shader_vtbl;
     shader_init(shader, device, parent, parent_ops);
-
     hr = shader_set_function(shader, byte_code, output_signature, device->d3d_vshader_constantF);
     if (FAILED(hr))
     {
@@ -1893,9 +1849,7 @@ HRESULT geometryshader_init(IWineD3DBaseShaderImpl *shader, IWineD3DDeviceImpl *
 {
     HRESULT hr;
 
-    shader->lpVtbl = &wined3d_shader_vtbl;
     shader_init(shader, device, parent, parent_ops);
-
     hr = shader_set_function(shader, byte_code, output_signature, 0);
     if (FAILED(hr))
     {
@@ -2105,9 +2059,7 @@ HRESULT pixelshader_init(IWineD3DBaseShaderImpl *shader, IWineD3DDeviceImpl *dev
 
     if (!byte_code) return WINED3DERR_INVALIDCALL;
 
-    shader->lpVtbl = &wined3d_shader_vtbl;
     shader_init(shader, device, parent, parent_ops);
-
     hr = shader_set_function(shader, byte_code, output_signature, device->d3d_pshader_constantF);
     if (FAILED(hr))
     {
diff --git a/dlls/wined3d/stateblock.c b/dlls/wined3d/stateblock.c
index 7cf9d99..2e2d1b9 100644
--- a/dlls/wined3d/stateblock.c
+++ b/dlls/wined3d/stateblock.c
@@ -499,9 +499,9 @@ ULONG CDECL wined3d_stateblock_decref(struct wined3d_stateblock *stateblock)
         if (stateblock->state.index_buffer)
             wined3d_buffer_decref(stateblock->state.index_buffer);
         if (stateblock->state.vertex_shader)
-            IWineD3DBaseShader_Release((IWineD3DBaseShader *)stateblock->state.vertex_shader);
+            wined3d_shader_decref(stateblock->state.vertex_shader);
         if (stateblock->state.pixel_shader)
-            IWineD3DBaseShader_Release((IWineD3DBaseShader *)stateblock->state.pixel_shader);
+            wined3d_shader_decref(stateblock->state.pixel_shader);
 
         for (counter = 0; counter < LIGHTMAP_SIZE; ++counter)
         {
@@ -599,9 +599,9 @@ HRESULT CDECL wined3d_stateblock_capture(struct wined3d_stateblock *stateblock)
                 stateblock->state.vertex_shader, src_state->vertex_shader);
 
         if (src_state->vertex_shader)
-            IWineD3DBaseShader_AddRef((IWineD3DBaseShader *)src_state->vertex_shader);
+            wined3d_shader_incref(src_state->vertex_shader);
         if (stateblock->state.vertex_shader)
-            IWineD3DBaseShader_Release((IWineD3DBaseShader *)stateblock->state.vertex_shader);
+            wined3d_shader_decref(stateblock->state.vertex_shader);
         stateblock->state.vertex_shader = src_state->vertex_shader;
     }
 
@@ -860,9 +860,9 @@ HRESULT CDECL wined3d_stateblock_capture(struct wined3d_stateblock *stateblock)
     if (stateblock->changed.pixelShader && stateblock->state.pixel_shader != src_state->pixel_shader)
     {
         if (src_state->pixel_shader)
-            IWineD3DBaseShader_AddRef((IWineD3DBaseShader *)src_state->pixel_shader);
+            wined3d_shader_incref(src_state->pixel_shader);
         if (stateblock->state.pixel_shader)
-            IWineD3DBaseShader_Release((IWineD3DBaseShader *)stateblock->state.pixel_shader);
+            wined3d_shader_decref(stateblock->state.pixel_shader);
         stateblock->state.pixel_shader = src_state->pixel_shader;
     }
 
diff --git a/dlls/wined3d/wined3d.spec b/dlls/wined3d/wined3d.spec
index f2eb5af..28bdf4e 100644
--- a/dlls/wined3d/wined3d.spec
+++ b/dlls/wined3d/wined3d.spec
@@ -61,6 +61,12 @@
 @ cdecl wined3d_resource_get_desc(ptr ptr)
 @ cdecl wined3d_resource_get_parent(ptr)
 
+@ cdecl wined3d_shader_decref(ptr)
+@ cdecl wined3d_shader_get_byte_code(ptr ptr ptr)
+@ cdecl wined3d_shader_get_parent(ptr)
+@ cdecl wined3d_shader_incref(ptr)
+@ cdecl wined3d_shader_set_local_constants_float(ptr long ptr long)
+
 @ cdecl wined3d_stateblock_apply(ptr)
 @ cdecl wined3d_stateblock_capture(ptr)
 @ cdecl wined3d_stateblock_decref(ptr)
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index e5fe1d0..59738df6 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -55,7 +55,8 @@
 typedef struct IWineD3DSurfaceImpl    IWineD3DSurfaceImpl;
 typedef struct IWineD3DDeviceImpl     IWineD3DDeviceImpl;
 typedef struct IWineD3DSwapChainImpl  IWineD3DSwapChainImpl;
-struct IWineD3DBaseShaderImpl;
+typedef struct wined3d_shader IWineD3DBaseShaderImpl;
+typedef struct wined3d_shader IWineD3DBaseShader;
 
 /* Texture format fixups */
 
@@ -586,7 +587,7 @@ struct wined3d_shader_loop_state
 
 struct wined3d_shader_context
 {
-    struct IWineD3DBaseShaderImpl *shader;
+    struct wined3d_shader *shader;
     const struct wined3d_gl_info *gl_info;
     const struct wined3d_shader_reg_maps *reg_maps;
     struct wined3d_shader_buffer *buffer;
@@ -757,7 +758,7 @@ typedef struct {
     void (*shader_load_constants)(const struct wined3d_context *context, char usePS, char useVS);
     void (*shader_load_np2fixup_constants)(void *shader_priv, const struct wined3d_gl_info *gl_info,
             const struct wined3d_state *state);
-    void (*shader_destroy)(struct IWineD3DBaseShaderImpl *shader);
+    void (*shader_destroy)(struct wined3d_shader *shader);
     HRESULT (*shader_alloc_private)(IWineD3DDeviceImpl *device);
     void (*shader_free_private)(IWineD3DDeviceImpl *device);
     BOOL (*shader_dirtifyable_constants)(void);
@@ -2336,12 +2337,12 @@ struct wined3d_state
     INT load_base_vertex_index; /* Non-indexed drawing needs 0 here, indexed needs base_vertex_index. */
     GLenum gl_primitive_type;
 
-    struct IWineD3DBaseShaderImpl *vertex_shader;
+    struct wined3d_shader *vertex_shader;
     BOOL vs_consts_b[MAX_CONST_B];
     INT vs_consts_i[MAX_CONST_I * 4];
     float *vs_consts_f;
 
-    struct IWineD3DBaseShaderImpl *pixel_shader;
+    struct wined3d_shader *pixel_shader;
     BOOL ps_consts_b[MAX_CONST_B];
     INT ps_consts_i[MAX_CONST_I * 4];
     float *ps_consts_f;
@@ -2682,7 +2683,7 @@ int shader_addline(struct wined3d_shader_buffer *buffer, const char *fmt, ...) P
 int shader_vaddline(struct wined3d_shader_buffer *buffer, const char *fmt, va_list args) DECLSPEC_HIDDEN;
 
 /* Vertex shader utility functions */
-extern BOOL vshader_get_input(struct IWineD3DBaseShaderImpl *shader,
+extern BOOL vshader_get_input(struct wined3d_shader *shader,
         BYTE usage_req, BYTE usage_idx_req, unsigned int *regnum) DECLSPEC_HIDDEN;
 
 struct wined3d_vertex_shader
@@ -2703,10 +2704,8 @@ struct wined3d_pixel_shader
     DWORD color0_reg;
 };
 
-typedef struct IWineD3DBaseShaderImpl {
-    /* IUnknown */
-    const IWineD3DBaseShaderVtbl    *lpVtbl;
-
+struct wined3d_shader
+{
     LONG ref;
     SHADER_LIMITS limits;
     DWORD *function;
@@ -2740,7 +2739,7 @@ typedef struct IWineD3DBaseShaderImpl {
         struct wined3d_vertex_shader vs;
         struct wined3d_pixel_shader ps;
     } u;
-} IWineD3DBaseShaderImpl;
+};
 
 HRESULT geometryshader_init(IWineD3DBaseShaderImpl *shader, IWineD3DDeviceImpl *device,
         const DWORD *byte_code, const struct wined3d_shader_signature *output_signature,
diff --git a/include/wine/wined3d.idl b/include/wine/wined3d.idl
index 799fbaf..ad32234 100644
--- a/include/wine/wined3d.idl
+++ b/include/wine/wined3d.idl
@@ -2096,6 +2096,7 @@ struct wined3d_clipper;
 struct wined3d_palette;
 struct wined3d_query;
 struct wined3d_resource;
+struct wined3d_shader;
 struct wined3d_stateblock;
 struct wined3d_texture;
 struct wined3d_vertex_declaration;
@@ -2387,24 +2388,6 @@ interface IWineD3DSwapChain : IWineD3DBase
 [
     object,
     local,
-    uuid(eac93065-a4df-446f-86a1-9ef2bca40a3c)
-]
-interface IWineD3DBaseShader : IWineD3DBase
-{
-    HRESULT GetFunction(
-        [out] void *data,
-        [in, out] UINT *data_size
-    );
-    HRESULT SetLocalConstantsF(
-        [in] UINT start_idx,
-        [in] const float *src_data,
-        [in] UINT vector4f_count
-    );
-}
-
-[
-    object,
-    local,
     uuid(6d10a2ce-09d0-4a53-a427-11388f9f8ca5)
 ]
 interface IWineD3DDevice : IUnknown
@@ -2529,21 +2512,21 @@ interface IWineD3DDevice : IUnknown
         [in] const struct wined3d_shader_signature *output_signature,
         [in] void *parent,
         [in] const struct wined3d_parent_ops *parent_ops,
-        [out] IWineD3DBaseShader **shader
+        [out] struct wined3d_shader **shader
     );
     HRESULT CreateGeometryShader(
         [in] const DWORD *byte_code,
         [in] const struct wined3d_shader_signature *output_signature,
         [in] void *parent,
         [in] const struct wined3d_parent_ops *parent_ops,
-        [out] IWineD3DBaseShader **shader
+        [out] struct wined3d_shader **shader
     );
     HRESULT CreatePixelShader(
         [in] const DWORD *function,
         [in] const struct wined3d_shader_signature *output_signature,
         [in] void *parent,
         [in] const struct wined3d_parent_ops *parent_ops,
-        [out] IWineD3DBaseShader **shader
+        [out] struct wined3d_shader **shader
     );
     HRESULT CreatePalette(
         [in] DWORD flags,
@@ -2705,9 +2688,9 @@ interface IWineD3DDevice : IUnknown
         [out] PALETTEENTRY *entries
     );
     HRESULT SetPixelShader(
-        [in] IWineD3DBaseShader *shader
+        [in] struct wined3d_shader *shader
     );
-    IWineD3DBaseShader *GetPixelShader(
+    struct wined3d_shader *GetPixelShader(
     );
     HRESULT SetPixelShaderConstantB(
         [in] UINT start_register,
@@ -2830,9 +2813,9 @@ interface IWineD3DDevice : IUnknown
         [out] struct wined3d_vertex_declaration **declaration
     );
     HRESULT SetVertexShader(
-        [in] IWineD3DBaseShader *shader
+        [in] struct wined3d_shader *shader
     );
-    IWineD3DBaseShader *GetVertexShader(
+    struct wined3d_shader *GetVertexShader(
     );
     HRESULT SetVertexShaderConstantB(
         [in] UINT start_register,
@@ -3092,6 +3075,14 @@ void __cdecl wined3d_resource_get_desc(const struct wined3d_resource *resource,
         struct wined3d_resource_desc *desc);
 void * __cdecl wined3d_resource_get_parent(const struct wined3d_resource *resource);
 
+ULONG __cdecl wined3d_shader_decref(struct wined3d_shader *shader);
+HRESULT __cdecl wined3d_shader_get_byte_code(const struct wined3d_shader *shader,
+        void *byte_code, UINT *byte_code_size);
+void * __cdecl wined3d_shader_get_parent(const struct wined3d_shader *shader);
+ULONG __cdecl wined3d_shader_incref(struct wined3d_shader *shader);
+HRESULT __cdecl wined3d_shader_set_local_constants_float(struct wined3d_shader *shader,
+        UINT start_idx, const float *src_data, UINT vector4f_count);
+
 HRESULT __cdecl wined3d_stateblock_apply(const struct wined3d_stateblock *stateblock);
 HRESULT __cdecl wined3d_stateblock_capture(struct wined3d_stateblock *stateblock);
 ULONG __cdecl wined3d_stateblock_decref(struct wined3d_stateblock *stateblock);
-- 
1.7.3.4




More information about the wine-patches mailing list