wined3d: Add a separate function for disabling shaders.

This commit is contained in:
Stefan Dösinger 2013-05-14 17:38:18 +02:00 committed by Alexandre Julliard
parent 036a62a245
commit 47f385adf0
5 changed files with 79 additions and 11 deletions

View File

@ -4677,7 +4677,7 @@ static void shader_arb_select(const struct wined3d_context *context, enum wined3
checkGLcall("glDisable(GL_FRAGMENT_PROGRAM_ARB)");
priv->current_fprogram_id = 0;
}
priv->fragment_pipe->enable_extension(gl_info, fragment_mode == WINED3D_SHADER_MODE_FFP);
priv->fragment_pipe->enable_extension(gl_info, TRUE);
}
if (vertex_mode == WINED3D_SHADER_MODE_SHADER)
@ -4724,13 +4724,47 @@ static void shader_arb_select(const struct wined3d_context *context, enum wined3
}
}
}
else if (gl_info->supported[ARB_VERTEX_PROGRAM])
else
{
if (gl_info->supported[ARB_VERTEX_PROGRAM])
{
priv->current_vprogram_id = 0;
gl_info->gl_ops.gl.p_glDisable(GL_VERTEX_PROGRAM_ARB);
checkGLcall("glDisable(GL_VERTEX_PROGRAM_ARB)");
}
priv->vertex_pipe->vp_enable(gl_info, TRUE);
}
}
/* Context activation is done by the caller. */
static void shader_arb_disable(void *shader_priv, const struct wined3d_context *context)
{
const struct wined3d_gl_info *gl_info = context->gl_info;
struct shader_arb_priv *priv = shader_priv;
if (gl_info->supported[ARB_FRAGMENT_PROGRAM])
{
gl_info->gl_ops.gl.p_glDisable(GL_FRAGMENT_PROGRAM_ARB);
checkGLcall("glDisable(GL_FRAGMENT_PROGRAM_ARB)");
priv->current_fprogram_id = 0;
}
priv->fragment_pipe->enable_extension(gl_info, FALSE);
if (gl_info->supported[ARB_VERTEX_PROGRAM])
{
priv->current_vprogram_id = 0;
gl_info->gl_ops.gl.p_glDisable(GL_VERTEX_PROGRAM_ARB);
checkGLcall("glDisable(GL_VERTEX_PROGRAM_ARB)");
}
priv->vertex_pipe->vp_enable(gl_info, vertex_mode == WINED3D_SHADER_MODE_FFP);
priv->vertex_pipe->vp_enable(gl_info, FALSE);
if (gl_info->supported[ARB_COLOR_BUFFER_FLOAT] && priv->last_vs_color_unclamp)
{
GL_EXTCALL(glClampColorARB(GL_CLAMP_VERTEX_COLOR_ARB, GL_FIXED_ONLY_ARB));
checkGLcall("glClampColorARB");
priv->last_vs_color_unclamp = FALSE;
}
}
/* Context activation is done by the caller. */
@ -5628,6 +5662,7 @@ const struct wined3d_shader_backend_ops arb_program_shader_backend =
{
shader_arb_handle_instruction,
shader_arb_select,
shader_arb_disable,
shader_arb_select_depth_blt,
shader_arb_deselect_depth_blt,
shader_arb_update_float_vertex_constants,

View File

@ -1,7 +1,7 @@
/*
* Context and render target management in wined3d
*
* Copyright 2007-2008 Stefan Dösinger for CodeWeavers
* Copyright 2007-2011, 2013 Stefan Dösinger for CodeWeavers
* Copyright 2009-2011 Henri Verbeet for CodeWeavers
*
* This library is free software; you can redistribute it and/or
@ -1922,7 +1922,7 @@ static void SetupForBlit(const struct wined3d_device *device, struct wined3d_con
set_blit_dimension(gl_info, rt_size.cx, rt_size.cy);
/* Disable shaders */
device->shader_backend->shader_select(context, WINED3D_SHADER_MODE_NONE, WINED3D_SHADER_MODE_NONE);
device->shader_backend->shader_disable(device->shader_priv, context);
context->select_shader = 1;
context->load_constants = 1;

View File

@ -3,7 +3,7 @@
*
* Copyright 2006 Jason Green
* Copyright 2006-2007 Henri Verbeet
* Copyright 2007-2008 Stefan Dösinger for CodeWeavers
* Copyright 2007-2009, 2013 Stefan Dösinger for CodeWeavers
* Copyright 2009-2011 Henri Verbeet for CodeWeavers
*
* This library is free software; you can redistribute it and/or
@ -5823,6 +5823,26 @@ static void shader_glsl_select(const struct wined3d_context *context, enum wined
}
}
/* Context activation is done by the caller. */
static void shader_glsl_disable(void *shader_priv, const struct wined3d_context *context)
{
const struct wined3d_gl_info *gl_info = context->gl_info;
struct shader_glsl_priv *priv = shader_priv;
priv->glsl_program = NULL;
GL_EXTCALL(glUseProgramObjectARB(0));
checkGLcall("glUseProgramObjectARB");
priv->vertex_pipe->vp_enable(gl_info, FALSE);
priv->fragment_pipe->enable_extension(gl_info, FALSE);
if (gl_info->supported[ARB_COLOR_BUFFER_FLOAT])
{
GL_EXTCALL(glClampColorARB(GL_CLAMP_VERTEX_COLOR_ARB, GL_FIXED_ONLY_ARB));
checkGLcall("glClampColorARB");
}
}
/* Context activation is done by the caller. */
static void shader_glsl_select_depth_blt(void *shader_priv, const struct wined3d_gl_info *gl_info,
enum tex_types tex_type, const SIZE *ds_mask_size)
@ -5907,7 +5927,7 @@ static void shader_glsl_destroy(struct wined3d_shader *shader)
{
TRACE("Deleting pixel shader %u.\n", gl_shaders[i].prgId);
if (priv->glsl_program && priv->glsl_program->ps.id == gl_shaders[i].prgId)
shader_glsl_select(context, WINED3D_SHADER_MODE_NONE, WINED3D_SHADER_MODE_NONE);
shader_glsl_disable(priv, context);
GL_EXTCALL(glDeleteObjectARB(gl_shaders[i].prgId));
checkGLcall("glDeleteObjectARB");
}
@ -5930,7 +5950,7 @@ static void shader_glsl_destroy(struct wined3d_shader *shader)
{
TRACE("Deleting vertex shader %u.\n", gl_shaders[i].prgId);
if (priv->glsl_program && priv->glsl_program->vs.id == gl_shaders[i].prgId)
shader_glsl_select(context, WINED3D_SHADER_MODE_NONE, WINED3D_SHADER_MODE_NONE);
shader_glsl_disable(priv, context);
GL_EXTCALL(glDeleteObjectARB(gl_shaders[i].prgId));
checkGLcall("glDeleteObjectARB");
}
@ -5953,7 +5973,7 @@ static void shader_glsl_destroy(struct wined3d_shader *shader)
{
TRACE("Deleting geometry shader %u.\n", gl_shaders[i].id);
if (priv->glsl_program && priv->glsl_program->gs.id == gl_shaders[i].id)
shader_glsl_select(context, WINED3D_SHADER_MODE_NONE, WINED3D_SHADER_MODE_NONE);
shader_glsl_disable(priv, context);
GL_EXTCALL(glDeleteObjectARB(gl_shaders[i].id));
checkGLcall("glDeleteObjectARB");
}
@ -6342,6 +6362,7 @@ const struct wined3d_shader_backend_ops glsl_shader_backend =
{
shader_glsl_handle_instruction,
shader_glsl_select,
shader_glsl_disable,
shader_glsl_select_depth_blt,
shader_glsl_deselect_depth_blt,
shader_glsl_update_float_vertex_constants,

View File

@ -4,7 +4,7 @@
* Copyright 2004 Christian Costa
* Copyright 2005 Oliver Stieber
* Copyright 2006 Ivan Gyurdiev
* Copyright 2007-2008 Stefan Dösinger for CodeWeavers
* Copyright 2007-2008, 2013 Stefan Dösinger for CodeWeavers
* Copyright 2009-2011 Henri Verbeet for CodeWeavers
*
* This library is free software; you can redistribute it and/or
@ -1516,6 +1516,7 @@ static void shader_none_load_np2fixup_constants(void *shader_priv,
static void shader_none_destroy(struct wined3d_shader *shader) {}
static void shader_none_context_destroyed(void *shader_priv, const struct wined3d_context *context) {}
/* Context activation is done by the caller. */
static void shader_none_select(const struct wined3d_context *context, enum wined3d_shader_mode vertex_mode,
enum wined3d_shader_mode fragment_mode)
{
@ -1527,6 +1528,16 @@ static void shader_none_select(const struct wined3d_context *context, enum wined
priv->fragment_pipe->enable_extension(gl_info, fragment_mode == WINED3D_SHADER_MODE_FFP);
}
/* Context activation is done by the caller. */
static void shader_none_disable(void *shader_priv, const struct wined3d_context *context)
{
struct shader_none_priv *priv = shader_priv;
const struct wined3d_gl_info *gl_info = context->gl_info;
priv->vertex_pipe->vp_enable(gl_info, FALSE);
priv->fragment_pipe->enable_extension(gl_info, FALSE);
}
static HRESULT shader_none_alloc(struct wined3d_device *device, const struct wined3d_vertex_pipe_ops *vertex_pipe,
const struct fragment_pipeline *fragment_pipe)
{
@ -1603,6 +1614,7 @@ const struct wined3d_shader_backend_ops none_shader_backend =
{
shader_none_handle_instruction,
shader_none_select,
shader_none_disable,
shader_none_select_depth_blt,
shader_none_deselect_depth_blt,
shader_none_update_float_vertex_constants,

View File

@ -787,7 +787,6 @@ struct vs_compile_args {
enum wined3d_shader_mode
{
WINED3D_SHADER_MODE_NONE,
WINED3D_SHADER_MODE_FFP,
WINED3D_SHADER_MODE_SHADER,
};
@ -802,6 +801,7 @@ struct wined3d_shader_backend_ops
void (*shader_handle_instruction)(const struct wined3d_shader_instruction *);
void (*shader_select)(const struct wined3d_context *context, enum wined3d_shader_mode vertex_mode,
enum wined3d_shader_mode fragment_mode);
void (*shader_disable)(void *shader_priv, const struct wined3d_context *context);
void (*shader_select_depth_blt)(void *shader_priv, const struct wined3d_gl_info *gl_info,
enum tex_types tex_type, const SIZE *ds_mask_size);
void (*shader_deselect_depth_blt)(void *shader_priv, const struct wined3d_gl_info *gl_info);