wined3d: Store shader IDs in the vs and ps impl structures.
This commit is contained in:
parent
dd8905543b
commit
aed9305c78
|
@ -1878,7 +1878,7 @@ static void shader_arb_select(IWineD3DDevice *iface, BOOL usePS, BOOL useVS) {
|
||||||
TRACE("Using vertex shader\n");
|
TRACE("Using vertex shader\n");
|
||||||
IWineD3DVertexShaderImpl_CompileShader(This->stateBlock->vertexShader);
|
IWineD3DVertexShaderImpl_CompileShader(This->stateBlock->vertexShader);
|
||||||
|
|
||||||
priv->current_vprogram_id = ((IWineD3DVertexShaderImpl *)This->stateBlock->vertexShader)->baseShader.prgId;
|
priv->current_vprogram_id = ((IWineD3DVertexShaderImpl *)This->stateBlock->vertexShader)->prgId;
|
||||||
|
|
||||||
/* Bind the vertex program */
|
/* Bind the vertex program */
|
||||||
GL_EXTCALL(glBindProgramARB(GL_VERTEX_PROGRAM_ARB, priv->current_vprogram_id));
|
GL_EXTCALL(glBindProgramARB(GL_VERTEX_PROGRAM_ARB, priv->current_vprogram_id));
|
||||||
|
@ -1900,7 +1900,7 @@ static void shader_arb_select(IWineD3DDevice *iface, BOOL usePS, BOOL useVS) {
|
||||||
find_ps_compile_args((IWineD3DPixelShaderImpl *) This->stateBlock->pixelShader, This->stateBlock, &compile_args);
|
find_ps_compile_args((IWineD3DPixelShaderImpl *) This->stateBlock->pixelShader, This->stateBlock, &compile_args);
|
||||||
pixelshader_compile(This->stateBlock->pixelShader, &compile_args);
|
pixelshader_compile(This->stateBlock->pixelShader, &compile_args);
|
||||||
|
|
||||||
priv->current_fprogram_id = ((IWineD3DPixelShaderImpl *)This->stateBlock->pixelShader)->baseShader.prgId;
|
priv->current_fprogram_id = ((IWineD3DPixelShaderImpl *)This->stateBlock->pixelShader)->prgId;
|
||||||
|
|
||||||
/* Bind the fragment program */
|
/* Bind the fragment program */
|
||||||
GL_EXTCALL(glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, priv->current_fprogram_id));
|
GL_EXTCALL(glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, priv->current_fprogram_id));
|
||||||
|
@ -1980,12 +1980,21 @@ static void shader_arb_cleanup(IWineD3DDevice *iface) {
|
||||||
static void shader_arb_destroy(IWineD3DBaseShader *iface) {
|
static void shader_arb_destroy(IWineD3DBaseShader *iface) {
|
||||||
IWineD3DBaseShaderImpl *This = (IWineD3DBaseShaderImpl *) iface;
|
IWineD3DBaseShaderImpl *This = (IWineD3DBaseShaderImpl *) iface;
|
||||||
WineD3D_GL_Info *gl_info = &((IWineD3DDeviceImpl *) This->baseShader.device)->adapter->gl_info;
|
WineD3D_GL_Info *gl_info = &((IWineD3DDeviceImpl *) This->baseShader.device)->adapter->gl_info;
|
||||||
|
char pshader = shader_is_pshader_version(This->baseShader.hex_version);
|
||||||
|
|
||||||
ENTER_GL();
|
if(pshader) {
|
||||||
GL_EXTCALL(glDeleteProgramsARB(1, &This->baseShader.prgId));
|
ENTER_GL();
|
||||||
checkGLcall("GL_EXTCALL(glDeleteProgramsARB(1, &This->baseShader.prgId))");
|
GL_EXTCALL(glDeleteProgramsARB(1, &((IWineD3DPixelShaderImpl *) This)->prgId));
|
||||||
LEAVE_GL();
|
checkGLcall("GL_EXTCALL(glDeleteProgramsARB(1, &((IWineD3DPixelShaderImpl *) This)->prgId))");
|
||||||
This->baseShader.prgId = 0;
|
((IWineD3DPixelShaderImpl *) This)->prgId = 0;
|
||||||
|
LEAVE_GL();
|
||||||
|
} else {
|
||||||
|
ENTER_GL();
|
||||||
|
GL_EXTCALL(glDeleteProgramsARB(1, &((IWineD3DVertexShaderImpl *) This)->prgId));
|
||||||
|
checkGLcall("GL_EXTCALL(glDeleteProgramsARB(1, &((IWineD3DPixelShaderImpl *) This)->prgId))");
|
||||||
|
((IWineD3DVertexShaderImpl *) This)->prgId = 0;
|
||||||
|
LEAVE_GL();
|
||||||
|
}
|
||||||
This->baseShader.is_compiled = FALSE;
|
This->baseShader.is_compiled = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2093,12 +2102,12 @@ static void shader_arb_generate_pshader(IWineD3DPixelShader *iface, SHADER_BUFFE
|
||||||
shader_addline(buffer, "END\n");
|
shader_addline(buffer, "END\n");
|
||||||
|
|
||||||
/* TODO: change to resource.glObjectHandle or something like that */
|
/* TODO: change to resource.glObjectHandle or something like that */
|
||||||
GL_EXTCALL(glGenProgramsARB(1, &This->baseShader.prgId));
|
GL_EXTCALL(glGenProgramsARB(1, &This->prgId));
|
||||||
|
|
||||||
TRACE("Creating a hw pixel shader, prg=%d\n", This->baseShader.prgId);
|
TRACE("Creating a hw pixel shader, prg=%d\n", This->prgId);
|
||||||
GL_EXTCALL(glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, This->baseShader.prgId));
|
GL_EXTCALL(glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, This->prgId));
|
||||||
|
|
||||||
TRACE("Created hw pixel shader, prg=%d\n", This->baseShader.prgId);
|
TRACE("Created hw pixel shader, prg=%d\n", This->prgId);
|
||||||
/* Create the program and check for errors */
|
/* Create the program and check for errors */
|
||||||
GL_EXTCALL(glProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB,
|
GL_EXTCALL(glProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB,
|
||||||
buffer->bsize, buffer->buffer));
|
buffer->bsize, buffer->buffer));
|
||||||
|
@ -2108,7 +2117,7 @@ static void shader_arb_generate_pshader(IWineD3DPixelShader *iface, SHADER_BUFFE
|
||||||
glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &errPos);
|
glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &errPos);
|
||||||
FIXME("HW PixelShader Error at position %d: %s\n",
|
FIXME("HW PixelShader Error at position %d: %s\n",
|
||||||
errPos, debugstr_a((const char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB)));
|
errPos, debugstr_a((const char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB)));
|
||||||
This->baseShader.prgId = -1;
|
This->prgId = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Load immediate constants */
|
/* Load immediate constants */
|
||||||
|
@ -2199,12 +2208,12 @@ static void shader_arb_generate_vshader(IWineD3DVertexShader *iface, SHADER_BUFF
|
||||||
shader_addline(buffer, "END\n");
|
shader_addline(buffer, "END\n");
|
||||||
|
|
||||||
/* TODO: change to resource.glObjectHandle or something like that */
|
/* TODO: change to resource.glObjectHandle or something like that */
|
||||||
GL_EXTCALL(glGenProgramsARB(1, &This->baseShader.prgId));
|
GL_EXTCALL(glGenProgramsARB(1, &This->prgId));
|
||||||
|
|
||||||
TRACE("Creating a hw vertex shader, prg=%d\n", This->baseShader.prgId);
|
TRACE("Creating a hw vertex shader, prg=%d\n", This->prgId);
|
||||||
GL_EXTCALL(glBindProgramARB(GL_VERTEX_PROGRAM_ARB, This->baseShader.prgId));
|
GL_EXTCALL(glBindProgramARB(GL_VERTEX_PROGRAM_ARB, This->prgId));
|
||||||
|
|
||||||
TRACE("Created hw vertex shader, prg=%d\n", This->baseShader.prgId);
|
TRACE("Created hw vertex shader, prg=%d\n", This->prgId);
|
||||||
/* Create the program and check for errors */
|
/* Create the program and check for errors */
|
||||||
GL_EXTCALL(glProgramStringARB(GL_VERTEX_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB,
|
GL_EXTCALL(glProgramStringARB(GL_VERTEX_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB,
|
||||||
buffer->bsize, buffer->buffer));
|
buffer->bsize, buffer->buffer));
|
||||||
|
@ -2214,7 +2223,7 @@ static void shader_arb_generate_vshader(IWineD3DVertexShader *iface, SHADER_BUFF
|
||||||
glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &errPos);
|
glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &errPos);
|
||||||
FIXME("HW VertexShader Error at position %d: %s\n",
|
FIXME("HW VertexShader Error at position %d: %s\n",
|
||||||
errPos, debugstr_a((const char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB)));
|
errPos, debugstr_a((const char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB)));
|
||||||
This->baseShader.prgId = -1;
|
This->prgId = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Load immediate constants */
|
/* Load immediate constants */
|
||||||
|
|
|
@ -3229,7 +3229,7 @@ static void set_glsl_shader_program(IWineD3DDevice *iface, BOOL use_ps, BOOL use
|
||||||
|
|
||||||
if(use_vs) {
|
if(use_vs) {
|
||||||
IWineD3DVertexShaderImpl_CompileShader(vshader);
|
IWineD3DVertexShaderImpl_CompileShader(vshader);
|
||||||
vshader_id = ((IWineD3DBaseShaderImpl*)vshader)->baseShader.prgId;
|
vshader_id = ((IWineD3DVertexShaderImpl*)vshader)->prgId;
|
||||||
} else {
|
} else {
|
||||||
vshader_id = 0;
|
vshader_id = 0;
|
||||||
}
|
}
|
||||||
|
@ -3237,7 +3237,7 @@ static void set_glsl_shader_program(IWineD3DDevice *iface, BOOL use_ps, BOOL use
|
||||||
struct ps_compile_args compile_args;
|
struct ps_compile_args compile_args;
|
||||||
find_ps_compile_args((IWineD3DPixelShaderImpl*)This->stateBlock->pixelShader, This->stateBlock, &compile_args);
|
find_ps_compile_args((IWineD3DPixelShaderImpl*)This->stateBlock->pixelShader, This->stateBlock, &compile_args);
|
||||||
pixelshader_compile(pshader, &compile_args);
|
pixelshader_compile(pshader, &compile_args);
|
||||||
pshader_id = ((IWineD3DBaseShaderImpl*)pshader)->baseShader.prgId;
|
pshader_id = ((IWineD3DPixelShaderImpl*)pshader)->prgId;
|
||||||
} else {
|
} else {
|
||||||
pshader_id = 0;
|
pshader_id = 0;
|
||||||
}
|
}
|
||||||
|
@ -3535,13 +3535,19 @@ static void shader_glsl_destroy(IWineD3DBaseShader *iface) {
|
||||||
IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *)This->baseShader.device;
|
IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *)This->baseShader.device;
|
||||||
struct shader_glsl_priv *priv = (struct shader_glsl_priv *)device->shader_priv;
|
struct shader_glsl_priv *priv = (struct shader_glsl_priv *)device->shader_priv;
|
||||||
WineD3D_GL_Info *gl_info = &device->adapter->gl_info;
|
WineD3D_GL_Info *gl_info = &device->adapter->gl_info;
|
||||||
|
GLuint *prog;
|
||||||
|
|
||||||
/* Note: Do not use QueryInterface here to find out which shader type this is because this code
|
/* Note: Do not use QueryInterface here to find out which shader type this is because this code
|
||||||
* can be called from IWineD3DBaseShader::Release
|
* can be called from IWineD3DBaseShader::Release
|
||||||
*/
|
*/
|
||||||
char pshader = shader_is_pshader_version(This->baseShader.hex_version);
|
char pshader = shader_is_pshader_version(This->baseShader.hex_version);
|
||||||
|
|
||||||
if(This->baseShader.prgId == 0) return;
|
if(pshader) {
|
||||||
|
prog = &((IWineD3DPixelShaderImpl *) This)->prgId;
|
||||||
|
} else {
|
||||||
|
prog = &((IWineD3DVertexShaderImpl *) This)->prgId;
|
||||||
|
}
|
||||||
|
if(*prog == 0) return;
|
||||||
linked_programs = &This->baseShader.linked_programs;
|
linked_programs = &This->baseShader.linked_programs;
|
||||||
|
|
||||||
TRACE("Deleting linked programs\n");
|
TRACE("Deleting linked programs\n");
|
||||||
|
@ -3559,10 +3565,10 @@ static void shader_glsl_destroy(IWineD3DBaseShader *iface) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TRACE("Deleting shader object %u\n", This->baseShader.prgId);
|
TRACE("Deleting shader object %u\n", *prog);
|
||||||
GL_EXTCALL(glDeleteObjectARB(This->baseShader.prgId));
|
GL_EXTCALL(glDeleteObjectARB(*prog));
|
||||||
checkGLcall("glDeleteObjectARB");
|
checkGLcall("glDeleteObjectARB");
|
||||||
This->baseShader.prgId = 0;
|
*prog = 0;
|
||||||
This->baseShader.is_compiled = FALSE;
|
This->baseShader.is_compiled = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3627,7 +3633,7 @@ static void shader_glsl_generate_pshader(IWineD3DPixelShader *iface, SHADER_BUFF
|
||||||
const char *fragcolor;
|
const char *fragcolor;
|
||||||
WineD3D_GL_Info *gl_info = &((IWineD3DDeviceImpl *)This->baseShader.device)->adapter->gl_info;
|
WineD3D_GL_Info *gl_info = &((IWineD3DDeviceImpl *)This->baseShader.device)->adapter->gl_info;
|
||||||
|
|
||||||
/* Create the hw GLSL shader object and assign it as the baseShader.prgId */
|
/* Create the hw GLSL shader object and assign it as the shader->prgId */
|
||||||
GLhandleARB shader_obj = GL_EXTCALL(glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB));
|
GLhandleARB shader_obj = GL_EXTCALL(glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB));
|
||||||
|
|
||||||
shader_addline(buffer, "#version 120\n");
|
shader_addline(buffer, "#version 120\n");
|
||||||
|
@ -3705,7 +3711,7 @@ static void shader_glsl_generate_pshader(IWineD3DPixelShader *iface, SHADER_BUFF
|
||||||
print_glsl_info_log(&GLINFO_LOCATION, shader_obj);
|
print_glsl_info_log(&GLINFO_LOCATION, shader_obj);
|
||||||
|
|
||||||
/* Store the shader object */
|
/* Store the shader object */
|
||||||
This->baseShader.prgId = shader_obj;
|
This->prgId = shader_obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void shader_glsl_generate_vshader(IWineD3DVertexShader *iface, SHADER_BUFFER *buffer) {
|
static void shader_glsl_generate_vshader(IWineD3DVertexShader *iface, SHADER_BUFFER *buffer) {
|
||||||
|
@ -3714,7 +3720,7 @@ static void shader_glsl_generate_vshader(IWineD3DVertexShader *iface, SHADER_BUF
|
||||||
CONST DWORD *function = This->baseShader.function;
|
CONST DWORD *function = This->baseShader.function;
|
||||||
WineD3D_GL_Info *gl_info = &((IWineD3DDeviceImpl *)This->baseShader.device)->adapter->gl_info;
|
WineD3D_GL_Info *gl_info = &((IWineD3DDeviceImpl *)This->baseShader.device)->adapter->gl_info;
|
||||||
|
|
||||||
/* Create the hw GLSL shader program and assign it as the baseShader.prgId */
|
/* Create the hw GLSL shader program and assign it as the shader->prgId */
|
||||||
GLhandleARB shader_obj = GL_EXTCALL(glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB));
|
GLhandleARB shader_obj = GL_EXTCALL(glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB));
|
||||||
|
|
||||||
shader_addline(buffer, "#version 120\n");
|
shader_addline(buffer, "#version 120\n");
|
||||||
|
@ -3762,7 +3768,7 @@ static void shader_glsl_generate_vshader(IWineD3DVertexShader *iface, SHADER_BUF
|
||||||
print_glsl_info_log(&GLINFO_LOCATION, shader_obj);
|
print_glsl_info_log(&GLINFO_LOCATION, shader_obj);
|
||||||
|
|
||||||
/* Store the shader object */
|
/* Store the shader object */
|
||||||
This->baseShader.prgId = shader_obj;
|
This->prgId = shader_obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void shader_glsl_get_caps(WINED3DDEVTYPE devtype, WineD3D_GL_Info *gl_info, struct shader_caps *pCaps) {
|
static void shader_glsl_get_caps(WINED3DDEVTYPE devtype, WineD3D_GL_Info *gl_info, struct shader_caps *pCaps) {
|
||||||
|
|
|
@ -2138,7 +2138,6 @@ typedef struct IWineD3DBaseShaderClass
|
||||||
CONST SHADER_OPCODE *shader_ins;
|
CONST SHADER_OPCODE *shader_ins;
|
||||||
DWORD *function;
|
DWORD *function;
|
||||||
UINT functionLength;
|
UINT functionLength;
|
||||||
GLuint prgId;
|
|
||||||
BOOL is_compiled;
|
BOOL is_compiled;
|
||||||
UINT cur_loop_depth, cur_loop_regno;
|
UINT cur_loop_depth, cur_loop_regno;
|
||||||
BOOL load_local_constsF;
|
BOOL load_local_constsF;
|
||||||
|
@ -2305,6 +2304,9 @@ typedef struct IWineD3DVertexShaderImpl {
|
||||||
|
|
||||||
DWORD usage;
|
DWORD usage;
|
||||||
|
|
||||||
|
/* The GL shader */
|
||||||
|
GLuint prgId;
|
||||||
|
|
||||||
/* Vertex shader input and output semantics */
|
/* Vertex shader input and output semantics */
|
||||||
semantic semantics_in [MAX_ATTRIBS];
|
semantic semantics_in [MAX_ATTRIBS];
|
||||||
semantic semantics_out [MAX_REG_OUTPUT];
|
semantic semantics_out [MAX_REG_OUTPUT];
|
||||||
|
@ -2362,6 +2364,9 @@ typedef struct IWineD3DPixelShaderImpl {
|
||||||
BOOL input_reg_used[MAX_REG_INPUT];
|
BOOL input_reg_used[MAX_REG_INPUT];
|
||||||
int declared_in_count;
|
int declared_in_count;
|
||||||
|
|
||||||
|
/* The GL shader */
|
||||||
|
GLuint prgId;
|
||||||
|
|
||||||
/* Some information about the shader behavior */
|
/* Some information about the shader behavior */
|
||||||
struct stb_const_desc bumpenvmatconst[MAX_TEXTURES];
|
struct stb_const_desc bumpenvmatconst[MAX_TEXTURES];
|
||||||
char numbumpenvmatconsts;
|
char numbumpenvmatconsts;
|
||||||
|
|
Loading…
Reference in New Issue