[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