wined3d: Add a separate function for disabling shaders.
This commit is contained in:
parent
036a62a245
commit
47f385adf0
|
@ -4677,7 +4677,7 @@ static void shader_arb_select(const struct wined3d_context *context, enum wined3
|
||||||
checkGLcall("glDisable(GL_FRAGMENT_PROGRAM_ARB)");
|
checkGLcall("glDisable(GL_FRAGMENT_PROGRAM_ARB)");
|
||||||
priv->current_fprogram_id = 0;
|
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)
|
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;
|
priv->current_vprogram_id = 0;
|
||||||
gl_info->gl_ops.gl.p_glDisable(GL_VERTEX_PROGRAM_ARB);
|
gl_info->gl_ops.gl.p_glDisable(GL_VERTEX_PROGRAM_ARB);
|
||||||
checkGLcall("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. */
|
/* 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_handle_instruction,
|
||||||
shader_arb_select,
|
shader_arb_select,
|
||||||
|
shader_arb_disable,
|
||||||
shader_arb_select_depth_blt,
|
shader_arb_select_depth_blt,
|
||||||
shader_arb_deselect_depth_blt,
|
shader_arb_deselect_depth_blt,
|
||||||
shader_arb_update_float_vertex_constants,
|
shader_arb_update_float_vertex_constants,
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* Context and render target management in wined3d
|
* 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
|
* Copyright 2009-2011 Henri Verbeet for CodeWeavers
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* 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);
|
set_blit_dimension(gl_info, rt_size.cx, rt_size.cy);
|
||||||
|
|
||||||
/* Disable shaders */
|
/* 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->select_shader = 1;
|
||||||
context->load_constants = 1;
|
context->load_constants = 1;
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
*
|
*
|
||||||
* Copyright 2006 Jason Green
|
* Copyright 2006 Jason Green
|
||||||
* Copyright 2006-2007 Henri Verbeet
|
* 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
|
* Copyright 2009-2011 Henri Verbeet for CodeWeavers
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* 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. */
|
/* Context activation is done by the caller. */
|
||||||
static void shader_glsl_select_depth_blt(void *shader_priv, const struct wined3d_gl_info *gl_info,
|
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)
|
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);
|
TRACE("Deleting pixel shader %u.\n", gl_shaders[i].prgId);
|
||||||
if (priv->glsl_program && priv->glsl_program->ps.id == 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));
|
GL_EXTCALL(glDeleteObjectARB(gl_shaders[i].prgId));
|
||||||
checkGLcall("glDeleteObjectARB");
|
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);
|
TRACE("Deleting vertex shader %u.\n", gl_shaders[i].prgId);
|
||||||
if (priv->glsl_program && priv->glsl_program->vs.id == 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));
|
GL_EXTCALL(glDeleteObjectARB(gl_shaders[i].prgId));
|
||||||
checkGLcall("glDeleteObjectARB");
|
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);
|
TRACE("Deleting geometry shader %u.\n", gl_shaders[i].id);
|
||||||
if (priv->glsl_program && priv->glsl_program->gs.id == 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));
|
GL_EXTCALL(glDeleteObjectARB(gl_shaders[i].id));
|
||||||
checkGLcall("glDeleteObjectARB");
|
checkGLcall("glDeleteObjectARB");
|
||||||
}
|
}
|
||||||
|
@ -6342,6 +6362,7 @@ const struct wined3d_shader_backend_ops glsl_shader_backend =
|
||||||
{
|
{
|
||||||
shader_glsl_handle_instruction,
|
shader_glsl_handle_instruction,
|
||||||
shader_glsl_select,
|
shader_glsl_select,
|
||||||
|
shader_glsl_disable,
|
||||||
shader_glsl_select_depth_blt,
|
shader_glsl_select_depth_blt,
|
||||||
shader_glsl_deselect_depth_blt,
|
shader_glsl_deselect_depth_blt,
|
||||||
shader_glsl_update_float_vertex_constants,
|
shader_glsl_update_float_vertex_constants,
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
* Copyright 2004 Christian Costa
|
* Copyright 2004 Christian Costa
|
||||||
* Copyright 2005 Oliver Stieber
|
* Copyright 2005 Oliver Stieber
|
||||||
* Copyright 2006 Ivan Gyurdiev
|
* 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
|
* Copyright 2009-2011 Henri Verbeet for CodeWeavers
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* 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_destroy(struct wined3d_shader *shader) {}
|
||||||
static void shader_none_context_destroyed(void *shader_priv, const struct wined3d_context *context) {}
|
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,
|
static void shader_none_select(const struct wined3d_context *context, enum wined3d_shader_mode vertex_mode,
|
||||||
enum wined3d_shader_mode fragment_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);
|
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,
|
static HRESULT shader_none_alloc(struct wined3d_device *device, const struct wined3d_vertex_pipe_ops *vertex_pipe,
|
||||||
const struct fragment_pipeline *fragment_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_handle_instruction,
|
||||||
shader_none_select,
|
shader_none_select,
|
||||||
|
shader_none_disable,
|
||||||
shader_none_select_depth_blt,
|
shader_none_select_depth_blt,
|
||||||
shader_none_deselect_depth_blt,
|
shader_none_deselect_depth_blt,
|
||||||
shader_none_update_float_vertex_constants,
|
shader_none_update_float_vertex_constants,
|
||||||
|
|
|
@ -787,7 +787,6 @@ struct vs_compile_args {
|
||||||
|
|
||||||
enum wined3d_shader_mode
|
enum wined3d_shader_mode
|
||||||
{
|
{
|
||||||
WINED3D_SHADER_MODE_NONE,
|
|
||||||
WINED3D_SHADER_MODE_FFP,
|
WINED3D_SHADER_MODE_FFP,
|
||||||
WINED3D_SHADER_MODE_SHADER,
|
WINED3D_SHADER_MODE_SHADER,
|
||||||
};
|
};
|
||||||
|
@ -802,6 +801,7 @@ struct wined3d_shader_backend_ops
|
||||||
void (*shader_handle_instruction)(const struct wined3d_shader_instruction *);
|
void (*shader_handle_instruction)(const struct wined3d_shader_instruction *);
|
||||||
void (*shader_select)(const struct wined3d_context *context, enum wined3d_shader_mode vertex_mode,
|
void (*shader_select)(const struct wined3d_context *context, enum wined3d_shader_mode vertex_mode,
|
||||||
enum wined3d_shader_mode fragment_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,
|
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);
|
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);
|
void (*shader_deselect_depth_blt)(void *shader_priv, const struct wined3d_gl_info *gl_info);
|
||||||
|
|
Loading…
Reference in New Issue