[PATCH] WineD3D: Store shader IDs in the vs and ps impl =

Stefan Doesinger stefan at codeweavers.com
Thu Nov 20 13:27:42 CST 2008


structures=0A=
=0A=
Later patches will add the ability to have more than one GL=0A=
shader per D3D shader, and the compiled GL shaders are linked to=0A=
a vs and ps specific description structure.=0A=
=0A=
Most of the code was already specialized for pixel and vertex=0A=
shaders. The only code that wasn't was the shader destruction=0A=
code.=0A=
---=0A=
 dlls/wined3d/arb_program_shader.c |   43 =
++++++++++++++++++++++--------------=0A=
 dlls/wined3d/glsl_shader.c        |   26 +++++++++++++--------=0A=
 dlls/wined3d/wined3d_private.h    |    7 +++++-=0A=
 3 files changed, 48 insertions(+), 28 deletions(-)=0A=
=0A=
diff --git a/dlls/wined3d/arb_program_shader.c =
b/dlls/wined3d/arb_program_shader.c=0A=
index 20e731b..f6cefe3 100644=0A=
--- a/dlls/wined3d/arb_program_shader.c=0A=
+++ b/dlls/wined3d/arb_program_shader.c=0A=
@@ -1878,7 +1878,7 @@ static void shader_arb_select(IWineD3DDevice =
*iface, BOOL usePS, BOOL useVS) {=0A=
         TRACE("Using vertex shader\n");=0A=
         =
IWineD3DVertexShaderImpl_CompileShader(This->stateBlock->vertexShader);=0A=
 =0A=
-        priv->current_vprogram_id =3D ((IWineD3DVertexShaderImpl =
*)This->stateBlock->vertexShader)->baseShader.prgId;=0A=
+        priv->current_vprogram_id =3D ((IWineD3DVertexShaderImpl =
*)This->stateBlock->vertexShader)->prgId;=0A=
 =0A=
         /* Bind the vertex program */=0A=
         GL_EXTCALL(glBindProgramARB(GL_VERTEX_PROGRAM_ARB, =
priv->current_vprogram_id));=0A=
@@ -1900,7 +1900,7 @@ static void shader_arb_select(IWineD3DDevice =
*iface, BOOL usePS, BOOL useVS) {=0A=
         find_ps_compile_args((IWineD3DPixelShaderImpl *) =
This->stateBlock->pixelShader, This->stateBlock, &compile_args);=0A=
         pixelshader_compile(This->stateBlock->pixelShader, =
&compile_args);=0A=
 =0A=
-        priv->current_fprogram_id =3D ((IWineD3DPixelShaderImpl =
*)This->stateBlock->pixelShader)->baseShader.prgId;=0A=
+        priv->current_fprogram_id =3D ((IWineD3DPixelShaderImpl =
*)This->stateBlock->pixelShader)->prgId;=0A=
 =0A=
         /* Bind the fragment program */=0A=
         GL_EXTCALL(glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, =
priv->current_fprogram_id));=0A=
@@ -1980,12 +1980,21 @@ static void shader_arb_cleanup(IWineD3DDevice =
*iface) {=0A=
 static void shader_arb_destroy(IWineD3DBaseShader *iface) {=0A=
     IWineD3DBaseShaderImpl *This =3D (IWineD3DBaseShaderImpl *) iface;=0A=
     WineD3D_GL_Info *gl_info =3D &((IWineD3DDeviceImpl *) =
This->baseShader.device)->adapter->gl_info;=0A=
+    char pshader =3D =
shader_is_pshader_version(This->baseShader.hex_version);=0A=
 =0A=
-    ENTER_GL();=0A=
-    GL_EXTCALL(glDeleteProgramsARB(1, &This->baseShader.prgId));=0A=
-    checkGLcall("GL_EXTCALL(glDeleteProgramsARB(1, =
&This->baseShader.prgId))");=0A=
-    LEAVE_GL();=0A=
-    This->baseShader.prgId =3D 0;=0A=
+    if(pshader) {=0A=
+        ENTER_GL();=0A=
+        GL_EXTCALL(glDeleteProgramsARB(1, &((IWineD3DPixelShaderImpl *) =
This)->prgId));=0A=
+        checkGLcall("GL_EXTCALL(glDeleteProgramsARB(1, =
&((IWineD3DPixelShaderImpl *) This)->prgId))");=0A=
+        ((IWineD3DPixelShaderImpl *) This)->prgId =3D 0;=0A=
+        LEAVE_GL();=0A=
+    } else {=0A=
+        ENTER_GL();=0A=
+        GL_EXTCALL(glDeleteProgramsARB(1, &((IWineD3DVertexShaderImpl =
*) This)->prgId));=0A=
+        checkGLcall("GL_EXTCALL(glDeleteProgramsARB(1, =
&((IWineD3DPixelShaderImpl *) This)->prgId))");=0A=
+        ((IWineD3DVertexShaderImpl *) This)->prgId =3D 0;=0A=
+        LEAVE_GL();=0A=
+    }=0A=
     This->baseShader.is_compiled =3D FALSE;=0A=
 }=0A=
 =0A=
@@ -2093,12 +2102,12 @@ static void =
shader_arb_generate_pshader(IWineD3DPixelShader *iface, SHADER_BUFFE=0A=
     shader_addline(buffer, "END\n");=0A=
 =0A=
     /* TODO: change to resource.glObjectHandle or something like that */=0A=
-    GL_EXTCALL(glGenProgramsARB(1, &This->baseShader.prgId));=0A=
+    GL_EXTCALL(glGenProgramsARB(1, &This->prgId));=0A=
 =0A=
-    TRACE("Creating a hw pixel shader, prg=3D%d\n", =
This->baseShader.prgId);=0A=
-    GL_EXTCALL(glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, =
This->baseShader.prgId));=0A=
+    TRACE("Creating a hw pixel shader, prg=3D%d\n", This->prgId);=0A=
+    GL_EXTCALL(glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, This->prgId));=0A=
 =0A=
-    TRACE("Created hw pixel shader, prg=3D%d\n", =
This->baseShader.prgId);=0A=
+    TRACE("Created hw pixel shader, prg=3D%d\n", This->prgId);=0A=
     /* Create the program and check for errors */=0A=
     GL_EXTCALL(glProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, =
GL_PROGRAM_FORMAT_ASCII_ARB,=0A=
                buffer->bsize, buffer->buffer));=0A=
@@ -2108,7 +2117,7 @@ static void =
shader_arb_generate_pshader(IWineD3DPixelShader *iface, SHADER_BUFFE=0A=
         glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &errPos);=0A=
         FIXME("HW PixelShader Error at position %d: %s\n",=0A=
               errPos, debugstr_a((const char =
*)glGetString(GL_PROGRAM_ERROR_STRING_ARB)));=0A=
-        This->baseShader.prgId =3D -1;=0A=
+        This->prgId =3D -1;=0A=
     }=0A=
 =0A=
     /* Load immediate constants */=0A=
@@ -2199,12 +2208,12 @@ static void =
shader_arb_generate_vshader(IWineD3DVertexShader *iface, SHADER_BUFF=0A=
     shader_addline(buffer, "END\n");=0A=
 =0A=
     /* TODO: change to resource.glObjectHandle or something like that */=0A=
-    GL_EXTCALL(glGenProgramsARB(1, &This->baseShader.prgId));=0A=
+    GL_EXTCALL(glGenProgramsARB(1, &This->prgId));=0A=
 =0A=
-    TRACE("Creating a hw vertex shader, prg=3D%d\n", =
This->baseShader.prgId);=0A=
-    GL_EXTCALL(glBindProgramARB(GL_VERTEX_PROGRAM_ARB, =
This->baseShader.prgId));=0A=
+    TRACE("Creating a hw vertex shader, prg=3D%d\n", This->prgId);=0A=
+    GL_EXTCALL(glBindProgramARB(GL_VERTEX_PROGRAM_ARB, This->prgId));=0A=
 =0A=
-    TRACE("Created hw vertex shader, prg=3D%d\n", =
This->baseShader.prgId);=0A=
+    TRACE("Created hw vertex shader, prg=3D%d\n", This->prgId);=0A=
     /* Create the program and check for errors */=0A=
     GL_EXTCALL(glProgramStringARB(GL_VERTEX_PROGRAM_ARB, =
GL_PROGRAM_FORMAT_ASCII_ARB,=0A=
                buffer->bsize, buffer->buffer));=0A=
@@ -2214,7 +2223,7 @@ static void =
shader_arb_generate_vshader(IWineD3DVertexShader *iface, SHADER_BUFF=0A=
         glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &errPos);=0A=
         FIXME("HW VertexShader Error at position %d: %s\n",=0A=
               errPos, debugstr_a((const char =
*)glGetString(GL_PROGRAM_ERROR_STRING_ARB)));=0A=
-        This->baseShader.prgId =3D -1;=0A=
+        This->prgId =3D -1;=0A=
     }=0A=
 =0A=
     /* Load immediate constants */=0A=
diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c=0A=
index 92a6a36..eeec260 100644=0A=
--- a/dlls/wined3d/glsl_shader.c=0A=
+++ b/dlls/wined3d/glsl_shader.c=0A=
@@ -3229,7 +3229,7 @@ static void set_glsl_shader_program(IWineD3DDevice =
*iface, BOOL use_ps, BOOL use=0A=
 =0A=
     if(use_vs) {=0A=
         IWineD3DVertexShaderImpl_CompileShader(vshader);=0A=
-        vshader_id =3D =
((IWineD3DBaseShaderImpl*)vshader)->baseShader.prgId;=0A=
+        vshader_id =3D ((IWineD3DVertexShaderImpl*)vshader)->prgId;=0A=
     } else {=0A=
         vshader_id =3D 0;=0A=
     }=0A=
@@ -3237,7 +3237,7 @@ static void set_glsl_shader_program(IWineD3DDevice =
*iface, BOOL use_ps, BOOL use=0A=
         struct ps_compile_args compile_args;=0A=
         =
find_ps_compile_args((IWineD3DPixelShaderImpl*)This->stateBlock->pixelSha=
der, This->stateBlock, &compile_args);=0A=
         pixelshader_compile(pshader, &compile_args);=0A=
-        pshader_id =3D =
((IWineD3DBaseShaderImpl*)pshader)->baseShader.prgId;=0A=
+        pshader_id =3D ((IWineD3DPixelShaderImpl*)pshader)->prgId;=0A=
     } else {=0A=
         pshader_id =3D 0;=0A=
     }=0A=
@@ -3535,13 +3535,19 @@ static void =
shader_glsl_destroy(IWineD3DBaseShader *iface) {=0A=
     IWineD3DDeviceImpl *device =3D (IWineD3DDeviceImpl =
*)This->baseShader.device;=0A=
     struct shader_glsl_priv *priv =3D (struct shader_glsl_priv =
*)device->shader_priv;=0A=
     WineD3D_GL_Info *gl_info =3D &device->adapter->gl_info;=0A=
+    GLuint *prog;=0A=
 =0A=
     /* Note: Do not use QueryInterface here to find out which shader =
type this is because this code=0A=
      * can be called from IWineD3DBaseShader::Release=0A=
      */=0A=
     char pshader =3D =
shader_is_pshader_version(This->baseShader.hex_version);=0A=
 =0A=
-    if(This->baseShader.prgId =3D=3D 0) return;=0A=
+    if(pshader) {=0A=
+        prog =3D &((IWineD3DPixelShaderImpl *) This)->prgId;=0A=
+    } else {=0A=
+        prog =3D &((IWineD3DVertexShaderImpl *) This)->prgId;=0A=
+    }=0A=
+    if(*prog =3D=3D 0) return;=0A=
     linked_programs =3D &This->baseShader.linked_programs;=0A=
 =0A=
     TRACE("Deleting linked programs\n");=0A=
@@ -3559,10 +3565,10 @@ static void =
shader_glsl_destroy(IWineD3DBaseShader *iface) {=0A=
         }=0A=
     }=0A=
 =0A=
-    TRACE("Deleting shader object %u\n", This->baseShader.prgId);=0A=
-    GL_EXTCALL(glDeleteObjectARB(This->baseShader.prgId));=0A=
+    TRACE("Deleting shader object %u\n", *prog);=0A=
+    GL_EXTCALL(glDeleteObjectARB(*prog));=0A=
     checkGLcall("glDeleteObjectARB");=0A=
-    This->baseShader.prgId =3D 0;=0A=
+    *prog =3D 0;=0A=
     This->baseShader.is_compiled =3D FALSE;=0A=
 }=0A=
 =0A=
@@ -3627,7 +3633,7 @@ static void =
shader_glsl_generate_pshader(IWineD3DPixelShader *iface, SHADER_BUFF=0A=
     const char *fragcolor;=0A=
     WineD3D_GL_Info *gl_info =3D &((IWineD3DDeviceImpl =
*)This->baseShader.device)->adapter->gl_info;=0A=
 =0A=
-    /* Create the hw GLSL shader object and assign it as the =
baseShader.prgId */=0A=
+    /* Create the hw GLSL shader object and assign it as the =
shader->prgId */=0A=
     GLhandleARB shader_obj =3D =
GL_EXTCALL(glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB));=0A=
 =0A=
     shader_addline(buffer, "#version 120\n");=0A=
@@ -3705,7 +3711,7 @@ static void =
shader_glsl_generate_pshader(IWineD3DPixelShader *iface, SHADER_BUFF=0A=
     print_glsl_info_log(&GLINFO_LOCATION, shader_obj);=0A=
 =0A=
     /* Store the shader object */=0A=
-    This->baseShader.prgId =3D shader_obj;=0A=
+    This->prgId =3D shader_obj;=0A=
 }=0A=
 =0A=
 static void shader_glsl_generate_vshader(IWineD3DVertexShader *iface, =
SHADER_BUFFER *buffer) {=0A=
@@ -3714,7 +3720,7 @@ static void =
shader_glsl_generate_vshader(IWineD3DVertexShader *iface, SHADER_BUF=0A=
     CONST DWORD *function =3D This->baseShader.function;=0A=
     WineD3D_GL_Info *gl_info =3D &((IWineD3DDeviceImpl =
*)This->baseShader.device)->adapter->gl_info;=0A=
 =0A=
-    /* Create the hw GLSL shader program and assign it as the =
baseShader.prgId */=0A=
+    /* Create the hw GLSL shader program and assign it as the =
shader->prgId */=0A=
     GLhandleARB shader_obj =3D =
GL_EXTCALL(glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB));=0A=
 =0A=
     shader_addline(buffer, "#version 120\n");=0A=
@@ -3762,7 +3768,7 @@ static void =
shader_glsl_generate_vshader(IWineD3DVertexShader *iface, SHADER_BUF=0A=
     print_glsl_info_log(&GLINFO_LOCATION, shader_obj);=0A=
 =0A=
     /* Store the shader object */=0A=
-    This->baseShader.prgId =3D shader_obj;=0A=
+    This->prgId =3D shader_obj;=0A=
 }=0A=
 =0A=
 static void shader_glsl_get_caps(WINED3DDEVTYPE devtype, =
WineD3D_GL_Info *gl_info, struct shader_caps *pCaps) {=0A=
diff --git a/dlls/wined3d/wined3d_private.h =
b/dlls/wined3d/wined3d_private.h=0A=
index 847d11d..b593354 100644=0A=
--- a/dlls/wined3d/wined3d_private.h=0A=
+++ b/dlls/wined3d/wined3d_private.h=0A=
@@ -2138,7 +2138,6 @@ typedef struct IWineD3DBaseShaderClass=0A=
     CONST SHADER_OPCODE             *shader_ins;=0A=
     DWORD                          *function;=0A=
     UINT                            functionLength;=0A=
-    GLuint                          prgId;=0A=
     BOOL                            is_compiled;=0A=
     UINT                            cur_loop_depth, cur_loop_regno;=0A=
     BOOL                            load_local_constsF;=0A=
@@ -2305,6 +2304,9 @@ typedef struct IWineD3DVertexShaderImpl {=0A=
 =0A=
     DWORD                       usage;=0A=
 =0A=
+    /* The GL shader */=0A=
+    GLuint                          prgId;=0A=
+=0A=
     /* Vertex shader input and output semantics */=0A=
     semantic semantics_in [MAX_ATTRIBS];=0A=
     semantic semantics_out [MAX_REG_OUTPUT];=0A=
@@ -2362,6 +2364,9 @@ typedef struct IWineD3DPixelShaderImpl {=0A=
     BOOL                  input_reg_used[MAX_REG_INPUT];=0A=
     int                         declared_in_count;=0A=
 =0A=
+    /* The GL shader */=0A=
+    GLuint                          prgId;=0A=
+=0A=
     /* Some information about the shader behavior */=0A=
     struct stb_const_desc       bumpenvmatconst[MAX_TEXTURES];=0A=
     char                        numbumpenvmatconsts;=0A=
-- =0A=
1.5.6.4=0A=
=0A=

------=_NextPart_000_000A_01C94E6D.D7CBA8A0--




More information about the wine-patches mailing list