[PATCH 3/4] wined3d: Move the pixel shader to wined3d_state.

Henri Verbeet hverbeet at codeweavers.com
Mon Sep 20 05:04:29 CDT 2010


---
 dlls/wined3d/arb_program_shader.c |   17 +++++++++--------
 dlls/wined3d/device.c             |   20 +++++++++++---------
 dlls/wined3d/glsl_shader.c        |    8 ++++----
 dlls/wined3d/state.c              |    8 ++++----
 dlls/wined3d/stateblock.c         |   15 +++++++++------
 dlls/wined3d/wined3d_private.h    |    7 +++----
 6 files changed, 40 insertions(+), 35 deletions(-)

diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c
index 8c0dea4..0c40f38 100644
--- a/dlls/wined3d/arb_program_shader.c
+++ b/dlls/wined3d/arb_program_shader.c
@@ -650,8 +650,9 @@ static void shader_arb_load_constants(const struct wined3d_context *context, cha
         shader_arb_vs_local_constants(device);
     }
 
-    if (usePixelShader) {
-        IWineD3DBaseShaderImpl* pshader = (IWineD3DBaseShaderImpl*) stateBlock->pixelShader;
+    if (usePixelShader)
+    {
+        IWineD3DBaseShaderImpl *pshader = (IWineD3DBaseShaderImpl *)stateBlock->state.pixel_shader;
 
         /* Load DirectX 9 float constants for pixel shader */
         device->highest_dirty_ps_const = shader_arb_load_constantsF(pshader, gl_info, GL_FRAGMENT_PROGRAM_ARB,
@@ -3978,7 +3979,7 @@ static void init_output_registers(IWineD3DVertexShaderImpl *shader, DWORD sig_nu
     /* Instead of searching for the signature in the signature list, read the one from the current pixel shader.
      * Its maybe not the shader where the signature came from, but it is the same signature and faster to find
      */
-    sig = ((IWineD3DPixelShaderImpl *)device->stateBlock->pixelShader)->baseShader.input_signature;
+    sig = device->stateBlock->state.pixel_shader->baseShader.input_signature;
     TRACE("Pixel shader uses declared varyings\n");
 
     /* Map builtin to declared. /dev/null the results by default to the TA temp reg */
@@ -4453,7 +4454,7 @@ static inline void find_arb_vs_compile_args(IWineD3DVertexShaderImpl *shader, IW
     args->clip.boolclip_compare = 0;
     if(use_ps(stateblock))
     {
-        IWineD3DPixelShaderImpl *ps = (IWineD3DPixelShaderImpl *) stateblock->pixelShader;
+        IWineD3DPixelShaderImpl *ps = stateblock->state.pixel_shader;
         struct arb_pshader_private *shader_priv = ps->baseShader.backend_data;
         args->ps_signature = shader_priv->input_signature_idx;
 
@@ -4528,9 +4529,9 @@ static void shader_arb_select(const struct wined3d_context *context, BOOL usePS,
     if (usePS) {
         struct arb_ps_compile_args compile_args;
         struct arb_ps_compiled_shader *compiled;
-        IWineD3DPixelShaderImpl *ps = (IWineD3DPixelShaderImpl *) This->stateBlock->pixelShader;
+        IWineD3DPixelShaderImpl *ps = This->stateBlock->state.pixel_shader;
 
-        TRACE("Using pixel shader %p\n", This->stateBlock->pixelShader);
+        TRACE("Using pixel shader %p.\n", ps);
         find_arb_ps_compile_args(ps, This->stateBlock, &compile_args);
         compiled = find_arb_pshader(ps, &compile_args);
         priv->current_fprogram_id = compiled->prgId;
@@ -5587,7 +5588,7 @@ static void set_bumpmat_arbfp(DWORD state, IWineD3DStateBlockImpl *stateblock, s
 
     if (use_ps(stateblock))
     {
-        IWineD3DPixelShaderImpl *ps = (IWineD3DPixelShaderImpl *)stateblock->pixelShader;
+        IWineD3DPixelShaderImpl *ps = stateblock->state.pixel_shader;
         if (stage && (ps->baseShader.reg_maps.bumpmat & (1 << stage)))
         {
             /* The pixel shader has to know the bump env matrix. Do a constants update if it isn't scheduled
@@ -5624,7 +5625,7 @@ static void tex_bumpenvlum_arbfp(DWORD state, IWineD3DStateBlockImpl *stateblock
 
     if (use_ps(stateblock))
     {
-        IWineD3DPixelShaderImpl *ps = (IWineD3DPixelShaderImpl *)stateblock->pixelShader;
+        IWineD3DPixelShaderImpl *ps = stateblock->state.pixel_shader;
         if (stage && (ps->baseShader.reg_maps.luminanceparams & (1 << stage)))
         {
             /* The pixel shader has to know the luminance offset. Do a constants update if it
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 8918aad..f75213c 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -481,7 +481,7 @@ void device_preload_textures(IWineD3DDeviceImpl *device)
     {
         for (i = 0; i < MAX_FRAGMENT_SAMPLERS; ++i)
         {
-            if (((IWineD3DBaseShaderImpl *)stateblock->pixelShader)->baseShader.reg_maps.sampler_type[i])
+            if (stateblock->state.pixel_shader->baseShader.reg_maps.sampler_type[i])
                 device_preload_texture(stateblock, i);
         }
     }
@@ -3491,7 +3491,7 @@ static void device_map_fixed_function_samplers(IWineD3DDeviceImpl *This, const s
 static void device_map_psamplers(IWineD3DDeviceImpl *This, const struct wined3d_gl_info *gl_info)
 {
     const WINED3DSAMPLER_TEXTURE_TYPE *sampler_type =
-            ((IWineD3DPixelShaderImpl *)This->stateBlock->pixelShader)->baseShader.reg_maps.sampler_type;
+            This->stateBlock->state.pixel_shader->baseShader.reg_maps.sampler_type;
     unsigned int i;
 
     for (i = 0; i < MAX_FRAGMENT_SAMPLERS; ++i) {
@@ -3539,8 +3539,9 @@ static void device_map_vsamplers(IWineD3DDeviceImpl *This, BOOL ps, const struct
     int start = min(MAX_COMBINED_SAMPLERS, gl_info->limits.combined_samplers) - 1;
     int i;
 
-    if (ps) {
-        IWineD3DPixelShaderImpl *pshader = (IWineD3DPixelShaderImpl *)This->stateBlock->pixelShader;
+    if (ps)
+    {
+        IWineD3DPixelShaderImpl *pshader = This->stateBlock->state.pixel_shader;
 
         /* Note that we only care if a sampler is sampled or not, not the sampler's specific type.
          * Otherwise we'd need to call shader_update_samplers() here for 1.x pixelshaders. */
@@ -3591,10 +3592,11 @@ void IWineD3DDeviceImpl_FindTexUnitMap(IWineD3DDeviceImpl *This)
     if (vs) device_map_vsamplers(This, ps, gl_info);
 }
 
-static HRESULT WINAPI IWineD3DDeviceImpl_SetPixelShader(IWineD3DDevice *iface, IWineD3DPixelShader *pShader) {
-    IWineD3DDeviceImpl *This        = (IWineD3DDeviceImpl *)iface;
-    IWineD3DPixelShader *oldShader  = This->updateStateBlock->pixelShader;
-    This->updateStateBlock->pixelShader         = pShader;
+static HRESULT WINAPI IWineD3DDeviceImpl_SetPixelShader(IWineD3DDevice *iface, IWineD3DPixelShader *pShader)
+{
+    IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
+    IWineD3DPixelShader *oldShader = (IWineD3DPixelShader *)This->updateStateBlock->state.pixel_shader;
+    This->updateStateBlock->state.pixel_shader = (IWineD3DPixelShaderImpl *)pShader;
     This->updateStateBlock->changed.pixelShader = TRUE;
 
     /* Handle recording of state blocks */
@@ -3630,7 +3632,7 @@ static IWineD3DPixelShader * WINAPI IWineD3DDeviceImpl_GetPixelShader(IWineD3DDe
 
     TRACE("iface %p.\n", iface);
 
-    shader = device->stateBlock->pixelShader;
+    shader = (IWineD3DPixelShader *)device->stateBlock->state.pixel_shader;
     if (shader) IWineD3DPixelShader_AddRef(shader);
 
     TRACE("Returning %p.\n", shader);
diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c
index 34d8318..e1e16ee 100644
--- a/dlls/wined3d/glsl_shader.c
+++ b/dlls/wined3d/glsl_shader.c
@@ -773,9 +773,9 @@ static void shader_glsl_load_constants(const struct wined3d_context *context,
         checkGLcall("glUniform4fvARB");
     }
 
-    if (usePixelShader) {
-
-        IWineD3DBaseShaderImpl* pshader = (IWineD3DBaseShaderImpl*) stateBlock->pixelShader;
+    if (usePixelShader)
+    {
+        IWineD3DBaseShaderImpl *pshader = (IWineD3DBaseShaderImpl *)stateBlock->state.pixel_shader;
 
         /* Load DirectX 9 float constants/uniforms for pixel shader */
         shader_glsl_load_constantsF(pshader, gl_info, stateBlock->pixelShaderConstantF,
@@ -4279,7 +4279,7 @@ static void set_glsl_shader_program(const struct wined3d_context *context,
         IWineD3DDeviceImpl *device, BOOL use_ps, BOOL use_vs)
 {
     IWineD3DVertexShader *vshader = use_vs ? (IWineD3DVertexShader *)device->stateBlock->state.vertex_shader : NULL;
-    IWineD3DPixelShader *pshader = use_ps ? device->stateBlock->pixelShader : NULL;
+    IWineD3DPixelShader *pshader = use_ps ? (IWineD3DPixelShader *)device->stateBlock->state.pixel_shader : NULL;
     const struct wined3d_gl_info *gl_info = context->gl_info;
     struct shader_glsl_priv *priv = device->shader_priv;
     struct glsl_shader_prog_link *entry    = NULL;
diff --git a/dlls/wined3d/state.c b/dlls/wined3d/state.c
index 5aac387..1ced63a 100644
--- a/dlls/wined3d/state.c
+++ b/dlls/wined3d/state.c
@@ -3562,9 +3562,9 @@ static void shaderconstant(DWORD state, IWineD3DStateBlockImpl *stateblock, stru
 static void tex_bumpenvlscale(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
 {
     DWORD stage = (state - STATE_TEXTURESTAGE(0, 0)) / (WINED3D_HIGHEST_TEXTURE_STATE + 1);
-    IWineD3DPixelShaderImpl *ps = (IWineD3DPixelShaderImpl *)stateblock->pixelShader;
+    IWineD3DPixelShaderImpl *ps = stateblock->state.pixel_shader;
 
-    if (stateblock->pixelShader && stage && (ps->baseShader.reg_maps.luminanceparams & (1 << stage)))
+    if (ps && stage && (ps->baseShader.reg_maps.luminanceparams & (1 << stage)))
     {
         /* The pixel shader has to know the luminance scale. Do a constants update if it
          * isn't scheduled anyway
@@ -3735,9 +3735,9 @@ void apply_pixelshader(DWORD state, IWineD3DStateBlockImpl *stateblock, struct w
 static void shader_bumpenvmat(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
 {
     DWORD stage = (state - STATE_TEXTURESTAGE(0, 0)) / (WINED3D_HIGHEST_TEXTURE_STATE + 1);
-    IWineD3DPixelShaderImpl *ps = (IWineD3DPixelShaderImpl *)stateblock->pixelShader;
+    IWineD3DPixelShaderImpl *ps = stateblock->state.pixel_shader;
 
-    if (stateblock->pixelShader && stage && (ps->baseShader.reg_maps.bumpmat & (1 << stage)))
+    if (ps && stage && (ps->baseShader.reg_maps.bumpmat & (1 << stage)))
     {
         /* The pixel shader has to know the bump env matrix. Do a constants update if it isn't scheduled
          * anyway
diff --git a/dlls/wined3d/stateblock.c b/dlls/wined3d/stateblock.c
index c5ff989..126f9dd 100644
--- a/dlls/wined3d/stateblock.c
+++ b/dlls/wined3d/stateblock.c
@@ -514,7 +514,7 @@ static ULONG  WINAPI IWineD3DStateBlockImpl_Release(IWineD3DStateBlock *iface) {
         }
         if(This->pIndexData) IWineD3DBuffer_Release(This->pIndexData);
         if (This->state.vertex_shader) IWineD3DVertexShader_Release((IWineD3DVertexShader *)This->state.vertex_shader);
-        if(This->pixelShader) IWineD3DPixelShader_Release(This->pixelShader);
+        if (This->state.pixel_shader) IWineD3DPixelShader_Release((IWineD3DPixelShader *)This->state.pixel_shader);
 
         for(counter = 0; counter < LIGHTMAP_SIZE; counter++) {
             struct list *e1, *e2;
@@ -871,11 +871,13 @@ static HRESULT WINAPI IWineD3DStateBlockImpl_Capture(IWineD3DStateBlock *iface)
         This->state.sampler_states[stage][state] = targetStateBlock->state.sampler_states[stage][state];
     }
 
-    if (This->changed.pixelShader && This->pixelShader != targetStateBlock->pixelShader)
+    if (This->changed.pixelShader && This->state.pixel_shader != targetStateBlock->state.pixel_shader)
     {
-        if (targetStateBlock->pixelShader) IWineD3DPixelShader_AddRef(targetStateBlock->pixelShader);
-        if (This->pixelShader) IWineD3DPixelShader_Release(This->pixelShader);
-        This->pixelShader = targetStateBlock->pixelShader;
+        if (targetStateBlock->state.pixel_shader)
+            IWineD3DPixelShader_AddRef((IWineD3DPixelShader *)targetStateBlock->state.pixel_shader);
+        if (This->state.pixel_shader)
+            IWineD3DPixelShader_Release((IWineD3DPixelShader *)This->state.pixel_shader);
+        This->state.pixel_shader = targetStateBlock->state.pixel_shader;
     }
 
     record_lights(This, targetStateBlock);
@@ -934,7 +936,8 @@ static HRESULT WINAPI IWineD3DStateBlockImpl_Apply(IWineD3DStateBlock *iface)
 
     apply_lights(device, This);
 
-    if (This->changed.pixelShader) IWineD3DDevice_SetPixelShader(device, This->pixelShader);
+    if (This->changed.pixelShader)
+        IWineD3DDevice_SetPixelShader(device, (IWineD3DPixelShader *)This->state.pixel_shader);
 
     /* Pixel Shader Constants */
     for (i = 0; i < This->num_contained_ps_consts_f; ++i)
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 5665392..5f1ea2c 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -2356,6 +2356,8 @@ struct wined3d_state
     INT vs_consts_i[MAX_CONST_I * 4];
     float *vs_consts_f;
 
+    struct IWineD3DPixelShaderImpl *pixel_shader;
+
     IWineD3DBaseTextureImpl *textures[MAX_COMBINED_SAMPLERS];
     DWORD sampler_states[MAX_COMBINED_SAMPLERS][WINED3D_HIGHEST_SAMPLER_STATE + 1];
     DWORD texture_states[MAX_TEXTURES][WINED3D_HIGHEST_TEXTURE_STATE + 1];
@@ -2406,9 +2408,6 @@ struct IWineD3DStateBlockImpl
     double                    clipplane[MAX_CLIPPLANES][4];
     WINED3DCLIPSTATUS         clip_status;
 
-    /* Pixel Shader */
-    IWineD3DPixelShader      *pixelShader;
-
     /* Pixel Shader Constants */
     BOOL                       pixelShaderConstantB[MAX_CONST_B];
     INT                        pixelShaderConstantI[MAX_CONST_I * 4];
@@ -3039,7 +3038,7 @@ static inline BOOL use_vs(IWineD3DStateBlockImpl *stateblock)
 
 static inline BOOL use_ps(IWineD3DStateBlockImpl *stateblock)
 {
-    return (stateblock->pixelShader && stateblock->device->ps_selected_mode != SHADER_NONE);
+    return (stateblock->state.pixel_shader && stateblock->device->ps_selected_mode != SHADER_NONE);
 }
 
 /* The WNDCLASS-Name for the fake window which we use to retrieve the GL capabilities */
-- 
1.7.2.2




More information about the wine-patches mailing list