H. Verbeet : wined3d: Store the current GLSL program in the backend' s private data.

Alexandre Julliard julliard at winehq.org
Tue Jul 8 06:10:51 CDT 2008


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

Author: H. Verbeet <hverbeet at gmail.com>
Date:   Mon Jul  7 21:02:57 2008 +0200

wined3d: Store the current GLSL program in the backend's private data.

---

 dlls/wined3d/glsl_shader.c     |   17 ++++++++++-------
 dlls/wined3d/stateblock.c      |    5 -----
 dlls/wined3d/wined3d_private.h |    4 +---
 3 files changed, 11 insertions(+), 15 deletions(-)

diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c
index 4823126..34b86a3 100644
--- a/dlls/wined3d/glsl_shader.c
+++ b/dlls/wined3d/glsl_shader.c
@@ -369,13 +369,14 @@ void shader_glsl_load_constants(
     char useVertexShader) {
    
     IWineD3DDeviceImpl* deviceImpl = (IWineD3DDeviceImpl*) device;
+    struct shader_glsl_priv *priv = (struct shader_glsl_priv *)deviceImpl->shader_priv;
     IWineD3DStateBlockImpl* stateBlock = deviceImpl->stateBlock;
     WineD3D_GL_Info *gl_info = &deviceImpl->adapter->gl_info;
 
     GLhandleARB *constant_locations;
     struct list *constant_list;
     GLhandleARB programId;
-    struct glsl_shader_prog_link *prog = stateBlock->glsl_program;
+    struct glsl_shader_prog_link *prog = priv->glsl_program;
     unsigned int i;
 
     if (!prog) {
@@ -3145,6 +3146,7 @@ static void hardcode_local_constants(IWineD3DBaseShaderImpl *shader, WineD3D_GL_
  */
 static void set_glsl_shader_program(IWineD3DDevice *iface, BOOL use_ps, BOOL use_vs) {
     IWineD3DDeviceImpl *This               = (IWineD3DDeviceImpl *)iface;
+    struct shader_glsl_priv *priv          = (struct shader_glsl_priv *)This->shader_priv;
     WineD3D_GL_Info *gl_info               = &This->adapter->gl_info;
     IWineD3DPixelShader  *pshader          = This->stateBlock->pixelShader;
     IWineD3DVertexShader *vshader          = This->stateBlock->vertexShader;
@@ -3158,7 +3160,7 @@ static void set_glsl_shader_program(IWineD3DDevice *iface, BOOL use_ps, BOOL use
     GLhandleARB pshader_id = use_ps ? ((IWineD3DBaseShaderImpl*)pshader)->baseShader.prgId : 0;
     entry = get_glsl_program_entry(This, vshader_id, pshader_id);
     if (entry) {
-        This->stateBlock->glsl_program = entry;
+        priv->glsl_program = entry;
         return;
     }
 
@@ -3175,7 +3177,7 @@ static void set_glsl_shader_program(IWineD3DDevice *iface, BOOL use_ps, BOOL use
     add_glsl_program_entry(This, entry);
 
     /* Set the current program */
-    This->stateBlock->glsl_program = entry;
+    priv->glsl_program = entry;
 
     /* Attach GLSL vshader */
     if (vshader_id) {
@@ -3356,16 +3358,17 @@ static GLhandleARB create_glsl_blt_shader(WineD3D_GL_Info *gl_info) {
 
 static void shader_glsl_select(IWineD3DDevice *iface, BOOL usePS, BOOL useVS) {
     IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
+    struct shader_glsl_priv *priv = (struct shader_glsl_priv *)This->shader_priv;
     WineD3D_GL_Info *gl_info = &This->adapter->gl_info;
     GLhandleARB program_id = 0;
     GLenum old_vertex_color_clamp, current_vertex_color_clamp;
 
-    old_vertex_color_clamp = This->stateBlock->glsl_program ? This->stateBlock->glsl_program->vertex_color_clamp : GL_FIXED_ONLY_ARB;
+    old_vertex_color_clamp = priv->glsl_program ? priv->glsl_program->vertex_color_clamp : GL_FIXED_ONLY_ARB;
 
     if (useVS || usePS) set_glsl_shader_program(iface, usePS, useVS);
-    else This->stateBlock->glsl_program = NULL;
+    else priv->glsl_program = NULL;
 
-    current_vertex_color_clamp = This->stateBlock->glsl_program ? This->stateBlock->glsl_program->vertex_color_clamp : GL_FIXED_ONLY_ARB;
+    current_vertex_color_clamp = priv->glsl_program ? priv->glsl_program->vertex_color_clamp : GL_FIXED_ONLY_ARB;
 
     if (old_vertex_color_clamp != current_vertex_color_clamp) {
         if (GL_SUPPORT(ARB_COLOR_BUFFER_FLOAT)) {
@@ -3376,7 +3379,7 @@ static void shader_glsl_select(IWineD3DDevice *iface, BOOL usePS, BOOL useVS) {
         }
     }
 
-    program_id = This->stateBlock->glsl_program ? This->stateBlock->glsl_program->programId : 0;
+    program_id = priv->glsl_program ? priv->glsl_program->programId : 0;
     if (program_id) TRACE("Using GLSL program %u\n", program_id);
     GL_EXTCALL(glUseProgramObjectARB(program_id));
     checkGLcall("glUseProgramObjectARB");
diff --git a/dlls/wined3d/stateblock.c b/dlls/wined3d/stateblock.c
index ceb1330..a7b20ee 100644
--- a/dlls/wined3d/stateblock.c
+++ b/dlls/wined3d/stateblock.c
@@ -170,7 +170,6 @@ void stateblock_copy(
     Dest->viewport = This->viewport;
     Dest->material = This->material;
     Dest->pixelShader = This->pixelShader;
-    Dest->glsl_program = This->glsl_program;
     Dest->scissorRect = This->scissorRect;
 
     /* Lights */
@@ -1240,10 +1239,6 @@ static HRESULT  WINAPI IWineD3DStateBlockImpl_InitStartupStateBlock(IWineD3DStat
         This->textures[i]         = NULL;
     }
 
-    /* Set default GLSL program to NULL.  We won't actually create one
-     * until the app sets a vertex or pixel shader */
-    This->glsl_program = NULL;
-
     TRACE("-----------------------> Device defaults now set up...\n");
     return WINED3D_OK;
 }
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 35b096b..706fdff 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -312,6 +312,7 @@ extern const shader_backend_t none_shader_backend;
 
 /* GLSL shader private data */
 struct shader_glsl_priv {
+    struct glsl_shader_prog_link *glsl_program;
     GLhandleARB             depth_blt_glsl_program_id;
 };
 
@@ -1610,9 +1611,6 @@ struct IWineD3DStateBlockImpl
     /* Sampler States */
     DWORD                     samplerState[MAX_COMBINED_SAMPLERS][WINED3D_HIGHEST_SAMPLER_STATE + 1];
 
-    /* Current GLSL Shader Program */
-    struct glsl_shader_prog_link *glsl_program;
-
     /* Scissor test rectangle */
     RECT                      scissorRect;
 




More information about the wine-cvs mailing list