wined3d: Pass the state and private data to shader_select.
This commit is contained in:
parent
47f385adf0
commit
6fce4d4547
|
@ -640,8 +640,8 @@ static void shader_arb_vs_local_constants(const struct arb_vs_compiled_shader *g
|
|||
checkGLcall("Load vs int consts");
|
||||
}
|
||||
|
||||
static void shader_arb_select(const struct wined3d_context *context, enum wined3d_shader_mode vertex_mode,
|
||||
enum wined3d_shader_mode fragment_mode);
|
||||
static void shader_arb_select(void *shader_priv, const struct wined3d_context *context,
|
||||
const struct wined3d_state *state);
|
||||
|
||||
/**
|
||||
* Loads the app-supplied constants into the currently set ARB_[vertex/fragment]_programs.
|
||||
|
@ -666,9 +666,7 @@ static void shader_arb_load_constants_internal(struct shader_arb_priv *priv,
|
|||
&& (vshader->reg_maps.integer_constants & ~vshader->reg_maps.local_int_consts))))
|
||||
{
|
||||
TRACE("bool/integer vertex shader constants potentially modified, forcing shader reselection.\n");
|
||||
shader_arb_select(context,
|
||||
useVertexShader ? WINED3D_SHADER_MODE_SHADER : WINED3D_SHADER_MODE_FFP,
|
||||
usePixelShader ? WINED3D_SHADER_MODE_SHADER : WINED3D_SHADER_MODE_FFP);
|
||||
shader_arb_select(priv, context, state);
|
||||
}
|
||||
else if (pshader
|
||||
&& (pshader->reg_maps.boolean_constants
|
||||
|
@ -676,9 +674,7 @@ static void shader_arb_load_constants_internal(struct shader_arb_priv *priv,
|
|||
&& (pshader->reg_maps.integer_constants & ~pshader->reg_maps.local_int_consts))))
|
||||
{
|
||||
TRACE("bool/integer pixel shader constants potentially modified, forcing shader reselection.\n");
|
||||
shader_arb_select(context,
|
||||
useVertexShader ? WINED3D_SHADER_MODE_SHADER : WINED3D_SHADER_MODE_FFP,
|
||||
usePixelShader ? WINED3D_SHADER_MODE_SHADER : WINED3D_SHADER_MODE_FFP);
|
||||
shader_arb_select(priv, context, state);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -4605,17 +4601,16 @@ static void find_arb_vs_compile_args(const struct wined3d_state *state,
|
|||
}
|
||||
|
||||
/* Context activation is done by the caller. */
|
||||
static void shader_arb_select(const struct wined3d_context *context, enum wined3d_shader_mode vertex_mode,
|
||||
enum wined3d_shader_mode fragment_mode)
|
||||
static void shader_arb_select(void *shader_priv, const struct wined3d_context *context,
|
||||
const struct wined3d_state *state)
|
||||
{
|
||||
struct wined3d_device *device = context->swapchain->device;
|
||||
struct shader_arb_priv *priv = device->shader_priv;
|
||||
struct shader_arb_priv *priv = shader_priv;
|
||||
const struct wined3d_gl_info *gl_info = context->gl_info;
|
||||
const struct wined3d_state *state = &device->stateBlock->state;
|
||||
int i;
|
||||
|
||||
/* Deal with pixel shaders first so the vertex shader arg function has the input signature ready */
|
||||
if (fragment_mode == WINED3D_SHADER_MODE_SHADER)
|
||||
if (use_ps(state))
|
||||
{
|
||||
struct wined3d_shader *ps = state->pixel_shader;
|
||||
struct arb_ps_compile_args compile_args;
|
||||
|
@ -4653,7 +4648,7 @@ static void shader_arb_select(const struct wined3d_context *context, enum wined3
|
|||
priv->pshader_const_dirty[i] = 1;
|
||||
}
|
||||
/* Also takes care of loading local constants */
|
||||
shader_arb_load_constants_internal(device->shader_priv, context, state, TRUE, FALSE, TRUE);
|
||||
shader_arb_load_constants_internal(shader_priv, context, state, TRUE, FALSE, TRUE);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -4680,7 +4675,7 @@ static void shader_arb_select(const struct wined3d_context *context, enum wined3
|
|||
priv->fragment_pipe->enable_extension(gl_info, TRUE);
|
||||
}
|
||||
|
||||
if (vertex_mode == WINED3D_SHADER_MODE_SHADER)
|
||||
if (use_vs(state))
|
||||
{
|
||||
struct wined3d_shader *vs = state->vertex_shader;
|
||||
struct arb_vs_compile_args compile_args;
|
||||
|
|
|
@ -2403,9 +2403,7 @@ BOOL context_apply_draw_state(struct wined3d_context *context, struct wined3d_de
|
|||
|
||||
if (context->select_shader)
|
||||
{
|
||||
device->shader_backend->shader_select(context,
|
||||
use_vs(state) ? WINED3D_SHADER_MODE_SHADER : WINED3D_SHADER_MODE_FFP,
|
||||
use_ps(state) ? WINED3D_SHADER_MODE_SHADER : WINED3D_SHADER_MODE_FFP);
|
||||
device->shader_backend->shader_select(device->shader_priv, context, state);
|
||||
context->select_shader = 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -5480,13 +5480,11 @@ static void shader_glsl_init_ps_uniform_locations(const struct wined3d_gl_info *
|
|||
}
|
||||
|
||||
/* Context activation is done by the caller. */
|
||||
static void set_glsl_shader_program(const struct wined3d_context *context, struct wined3d_device *device,
|
||||
enum wined3d_shader_mode vertex_mode, enum wined3d_shader_mode fragment_mode)
|
||||
static void set_glsl_shader_program(const struct wined3d_context *context, const struct wined3d_state *state,
|
||||
struct shader_glsl_priv *priv)
|
||||
{
|
||||
const struct wined3d_state *state = &device->stateBlock->state;
|
||||
const struct wined3d_gl_info *gl_info = context->gl_info;
|
||||
const struct ps_np2fixup_info *np2fixup_info = NULL;
|
||||
struct shader_glsl_priv *priv = device->shader_priv;
|
||||
struct glsl_shader_prog_link *entry = NULL;
|
||||
struct wined3d_shader *vshader = NULL;
|
||||
struct wined3d_shader *gshader = NULL;
|
||||
|
@ -5498,8 +5496,9 @@ static void set_glsl_shader_program(const struct wined3d_context *context, struc
|
|||
struct vs_compile_args vs_compile_args;
|
||||
GLhandleARB vs_id, gs_id, ps_id;
|
||||
struct list *ps_list;
|
||||
struct wined3d_device *device = context->swapchain->device;
|
||||
|
||||
if (vertex_mode == WINED3D_SHADER_MODE_SHADER)
|
||||
if (use_vs(state))
|
||||
{
|
||||
vshader = state->vertex_shader;
|
||||
find_vs_compile_args(state, vshader, &vs_compile_args);
|
||||
|
@ -5516,7 +5515,7 @@ static void set_glsl_shader_program(const struct wined3d_context *context, struc
|
|||
gs_id = 0;
|
||||
}
|
||||
|
||||
if (fragment_mode == WINED3D_SHADER_MODE_SHADER)
|
||||
if (use_ps(state))
|
||||
{
|
||||
pshader = state->pixel_shader;
|
||||
find_ps_compile_args(state, pshader, &ps_compile_args);
|
||||
|
@ -5524,7 +5523,7 @@ static void set_glsl_shader_program(const struct wined3d_context *context, struc
|
|||
pshader, &ps_compile_args, &np2fixup_info);
|
||||
ps_list = &pshader->linked_programs;
|
||||
}
|
||||
else if (fragment_mode == WINED3D_SHADER_MODE_FFP && priv->fragment_pipe == &glsl_fragment_pipe)
|
||||
else if (priv->fragment_pipe == &glsl_fragment_pipe)
|
||||
{
|
||||
struct glsl_ffp_fragment_shader *ffp_shader;
|
||||
struct ffp_frag_settings settings;
|
||||
|
@ -5781,20 +5780,19 @@ static GLhandleARB create_glsl_blt_shader(const struct wined3d_gl_info *gl_info,
|
|||
}
|
||||
|
||||
/* Context activation is done by the caller. */
|
||||
static void shader_glsl_select(const struct wined3d_context *context, enum wined3d_shader_mode vertex_mode,
|
||||
enum wined3d_shader_mode fragment_mode)
|
||||
static void shader_glsl_select(void *shader_priv, const struct wined3d_context *context,
|
||||
const struct wined3d_state *state)
|
||||
{
|
||||
const struct wined3d_gl_info *gl_info = context->gl_info;
|
||||
struct wined3d_device *device = context->swapchain->device;
|
||||
struct shader_glsl_priv *priv = device->shader_priv;
|
||||
struct shader_glsl_priv *priv = shader_priv;
|
||||
GLhandleARB program_id = 0;
|
||||
GLenum old_vertex_color_clamp, current_vertex_color_clamp;
|
||||
|
||||
priv->vertex_pipe->vp_enable(gl_info, vertex_mode == WINED3D_SHADER_MODE_FFP);
|
||||
priv->fragment_pipe->enable_extension(gl_info, fragment_mode == WINED3D_SHADER_MODE_FFP);
|
||||
priv->vertex_pipe->vp_enable(gl_info, !use_vs(state));
|
||||
priv->fragment_pipe->enable_extension(gl_info, !use_ps(state));
|
||||
|
||||
old_vertex_color_clamp = priv->glsl_program ? priv->glsl_program->vs.vertex_color_clamp : GL_FIXED_ONLY_ARB;
|
||||
set_glsl_shader_program(context, device, vertex_mode, fragment_mode);
|
||||
set_glsl_shader_program(context, state, priv);
|
||||
current_vertex_color_clamp = priv->glsl_program ? priv->glsl_program->vs.vertex_color_clamp : GL_FIXED_ONLY_ARB;
|
||||
if (old_vertex_color_clamp != current_vertex_color_clamp)
|
||||
{
|
||||
|
@ -5819,7 +5817,7 @@ static void shader_glsl_select(const struct wined3d_context *context, enum wined
|
|||
* called between selecting the shader and using it, which results in wrong fixup for some frames. */
|
||||
if (priv->glsl_program && priv->glsl_program->ps.np2_fixup_info)
|
||||
{
|
||||
shader_glsl_load_np2fixup_constants(priv, gl_info, &device->stateBlock->state);
|
||||
shader_glsl_load_np2fixup_constants(priv, gl_info, state);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1517,15 +1517,14 @@ 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)
|
||||
static void shader_none_select(void *shader_priv, const struct wined3d_context *context,
|
||||
const struct wined3d_state *state)
|
||||
{
|
||||
const struct wined3d_gl_info *gl_info = context->gl_info;
|
||||
struct wined3d_device *device = context->swapchain->device;
|
||||
struct shader_none_priv *priv = device->shader_priv;
|
||||
struct shader_none_priv *priv = shader_priv;
|
||||
|
||||
priv->vertex_pipe->vp_enable(gl_info, vertex_mode == WINED3D_SHADER_MODE_FFP);
|
||||
priv->fragment_pipe->enable_extension(gl_info, fragment_mode == WINED3D_SHADER_MODE_FFP);
|
||||
priv->vertex_pipe->vp_enable(gl_info, !use_vs(state));
|
||||
priv->fragment_pipe->enable_extension(gl_info, !use_ps(state));
|
||||
}
|
||||
|
||||
/* Context activation is done by the caller. */
|
||||
|
|
|
@ -785,12 +785,6 @@ struct vs_compile_args {
|
|||
WORD swizzle_map; /* MAX_ATTRIBS, 16 */
|
||||
};
|
||||
|
||||
enum wined3d_shader_mode
|
||||
{
|
||||
WINED3D_SHADER_MODE_FFP,
|
||||
WINED3D_SHADER_MODE_SHADER,
|
||||
};
|
||||
|
||||
struct wined3d_context;
|
||||
struct wined3d_state;
|
||||
struct fragment_pipeline;
|
||||
|
@ -799,8 +793,8 @@ struct wined3d_vertex_pipe_ops;
|
|||
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_select)(void *shader_priv, const struct wined3d_context *context,
|
||||
const struct wined3d_state *state);
|
||||
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);
|
||||
|
|
Loading…
Reference in New Issue