From: Elizabeth Figura zfigura@codeweavers.com
--- dlls/wined3d/cs.c | 31 ------------------ dlls/wined3d/glsl_shader.c | 57 +++++++--------------------------- dlls/wined3d/stateblock.c | 28 +++++------------ dlls/wined3d/utils.c | 2 -- dlls/wined3d/wined3d_private.h | 11 +++---- 5 files changed, 22 insertions(+), 107 deletions(-)
diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c index 0404674fa9d..8fd7af86442 100644 --- a/dlls/wined3d/cs.c +++ b/dlls/wined3d/cs.c @@ -119,7 +119,6 @@ enum wined3d_cs_op WINED3D_CS_OP_SET_RENDER_STATE, WINED3D_CS_OP_SET_TEXTURE_STATE, WINED3D_CS_OP_SET_TRANSFORM, - WINED3D_CS_OP_SET_CLIP_PLANE, WINED3D_CS_OP_SET_COLOR_KEY, WINED3D_CS_OP_SET_LIGHT, WINED3D_CS_OP_SET_LIGHT_ENABLE, @@ -386,13 +385,6 @@ struct wined3d_cs_set_transform struct wined3d_matrix matrix; };
-struct wined3d_cs_set_clip_plane -{ - enum wined3d_cs_op opcode; - UINT plane_idx; - struct wined3d_vec4 plane; -}; - struct wined3d_cs_set_light { enum wined3d_cs_op opcode; @@ -612,7 +604,6 @@ static const char *debug_cs_op(enum wined3d_cs_op op) WINED3D_TO_STR(WINED3D_CS_OP_SET_RENDER_STATE); WINED3D_TO_STR(WINED3D_CS_OP_SET_TEXTURE_STATE); WINED3D_TO_STR(WINED3D_CS_OP_SET_TRANSFORM); - WINED3D_TO_STR(WINED3D_CS_OP_SET_CLIP_PLANE); WINED3D_TO_STR(WINED3D_CS_OP_SET_COLOR_KEY); WINED3D_TO_STR(WINED3D_CS_OP_SET_LIGHT); WINED3D_TO_STR(WINED3D_CS_OP_SET_LIGHT_ENABLE); @@ -1958,27 +1949,6 @@ void wined3d_device_context_emit_set_transform(struct wined3d_device_context *co wined3d_device_context_submit(context, WINED3D_CS_QUEUE_DEFAULT); }
-static void wined3d_cs_exec_set_clip_plane(struct wined3d_cs *cs, const void *data) -{ - const struct wined3d_cs_set_clip_plane *op = data; - - cs->state.clip_planes[op->plane_idx] = op->plane; - device_invalidate_state(cs->c.device, STATE_CLIPPLANE(op->plane_idx)); -} - -void wined3d_device_context_emit_set_clip_plane(struct wined3d_device_context *context, - unsigned int plane_idx, const struct wined3d_vec4 *plane) -{ - struct wined3d_cs_set_clip_plane *op; - - op = wined3d_device_context_require_space(context, sizeof(*op), WINED3D_CS_QUEUE_DEFAULT); - op->opcode = WINED3D_CS_OP_SET_CLIP_PLANE; - op->plane_idx = plane_idx; - op->plane = *plane; - - wined3d_device_context_submit(context, WINED3D_CS_QUEUE_DEFAULT); -} - static void wined3d_cs_exec_set_color_key(struct wined3d_cs *cs, const void *data) { const struct wined3d_cs_set_color_key *op = data; @@ -3016,7 +2986,6 @@ static void (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void /* WINED3D_CS_OP_SET_RENDER_STATE */ wined3d_cs_exec_set_render_state, /* WINED3D_CS_OP_SET_TEXTURE_STATE */ wined3d_cs_exec_set_texture_state, /* WINED3D_CS_OP_SET_TRANSFORM */ wined3d_cs_exec_set_transform, - /* WINED3D_CS_OP_SET_CLIP_PLANE */ wined3d_cs_exec_set_clip_plane, /* WINED3D_CS_OP_SET_COLOR_KEY */ wined3d_cs_exec_set_color_key, /* WINED3D_CS_OP_SET_LIGHT */ wined3d_cs_exec_set_light, /* WINED3D_CS_OP_SET_LIGHT_ENABLE */ wined3d_cs_exec_set_light_enable, diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c index afa7d1248cc..4082c96f60c 100644 --- a/dlls/wined3d/glsl_shader.c +++ b/dlls/wined3d/glsl_shader.c @@ -1696,16 +1696,8 @@ static void shader_glsl_load_fog_uniform(struct wined3d_context_gl *context_gl, checkGLcall("fog emulation uniforms"); }
-static void shader_glsl_clip_plane_uniform(const struct wined3d_context_gl *context_gl, - const struct wined3d_state *state, unsigned int index, struct glsl_shader_prog_link *prog) -{ - const struct wined3d_gl_info *gl_info = context_gl->gl_info; - - GL_EXTCALL(glUniform4fv(prog->vs.clip_planes_location + index, 1, &state->clip_planes[index].x)); -} - static void ffp_vertex_update_clip_plane_constants(const struct wined3d_gl_info *gl_info, - const struct wined3d_state *state) + const struct wined3d_ffp_vs_constants *constants) { for (unsigned int i = 0; i < gl_info->limits.user_clip_distances; ++i) { @@ -1715,10 +1707,10 @@ static void ffp_vertex_update_clip_plane_constants(const struct wined3d_gl_info gl_info->gl_ops.gl.p_glPushMatrix(); gl_info->gl_ops.gl.p_glLoadIdentity();
- plane[0] = state->clip_planes[i].x; - plane[1] = state->clip_planes[i].y; - plane[2] = state->clip_planes[i].z; - plane[3] = state->clip_planes[i].w; + plane[0] = constants->clip_planes[i].x; + plane[1] = constants->clip_planes[i].y; + plane[2] = constants->clip_planes[i].z; + plane[3] = constants->clip_planes[i].w;
gl_info->gl_ops.gl.p_glClipPlane(GL_CLIP_PLANE0 + i, plane); checkGLcall("glClipPlane"); @@ -1784,14 +1776,18 @@ static void shader_glsl_load_constants(struct shader_glsl_priv *priv,
if (update_mask & WINED3D_SHADER_CONST_VS_CLIP_PLANES) { + const struct wined3d_ffp_vs_constants *constants; + + constants = wined3d_buffer_load_sysmem(context->device->push_constants[WINED3D_PUSH_CONSTANTS_VS_FFP], context); + if (gl_info->supported[WINED3D_GLSL_130]) { for (i = 0; i < gl_info->limits.user_clip_distances; ++i) - shader_glsl_clip_plane_uniform(context_gl, state, i, prog); + GL_EXTCALL(glUniform4fv(prog->vs.clip_planes_location + i, 1, &constants->clip_planes[i].x)); } else { - ffp_vertex_update_clip_plane_constants(gl_info, state); + ffp_vertex_update_clip_plane_constants(gl_info, constants); } }
@@ -11908,19 +11904,6 @@ static void glsl_vertex_pipe_shademode(struct wined3d_context *context, context->shader_update_mask |= 1u << WINED3D_SHADER_TYPE_VERTEX; }
-static void glsl_vertex_pipe_clip_plane(struct wined3d_context *context, - const struct wined3d_state *state, DWORD state_id) -{ - struct wined3d_context_gl *context_gl = wined3d_context_gl(context); - const struct wined3d_gl_info *gl_info = context_gl->gl_info; - UINT index = state_id - STATE_CLIPPLANE(0); - - if (index >= gl_info->limits.user_clip_distances) - return; - - context->constant_update_mask |= WINED3D_SHADER_CONST_VS_CLIP_PLANES; -} - static const struct wined3d_state_entry_template glsl_vertex_pipe_vp_states[] = { {STATE_VDECL, {STATE_VDECL, glsl_vertex_pipe_vdecl }, WINED3D_GL_EXT_NONE }, @@ -11928,24 +11911,6 @@ static const struct wined3d_state_entry_template glsl_vertex_pipe_vp_states[] = {STATE_SHADER(WINED3D_SHADER_TYPE_HULL), {STATE_SHADER(WINED3D_SHADER_TYPE_HULL), glsl_vertex_pipe_hs }, WINED3D_GL_EXT_NONE }, {STATE_SHADER(WINED3D_SHADER_TYPE_GEOMETRY), {STATE_SHADER(WINED3D_SHADER_TYPE_GEOMETRY), glsl_vertex_pipe_geometry_shader}, WINED3D_GL_EXT_NONE }, {STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL), {STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL), glsl_vertex_pipe_pixel_shader}, WINED3D_GL_EXT_NONE }, - /* Clip planes */ - {STATE_CLIPPLANE(0), {STATE_CLIPPLANE(0), glsl_vertex_pipe_clip_plane}, WINED3D_GLSL_130 }, - {STATE_CLIPPLANE(0), {STATE_CLIPPLANE(0), clipplane }, WINED3D_GL_EXT_NONE }, - {STATE_CLIPPLANE(1), {STATE_CLIPPLANE(1), glsl_vertex_pipe_clip_plane}, WINED3D_GLSL_130 }, - {STATE_CLIPPLANE(1), {STATE_CLIPPLANE(1), clipplane }, WINED3D_GL_EXT_NONE }, - {STATE_CLIPPLANE(2), {STATE_CLIPPLANE(2), glsl_vertex_pipe_clip_plane}, WINED3D_GLSL_130 }, - {STATE_CLIPPLANE(2), {STATE_CLIPPLANE(2), clipplane }, WINED3D_GL_EXT_NONE }, - {STATE_CLIPPLANE(3), {STATE_CLIPPLANE(3), glsl_vertex_pipe_clip_plane}, WINED3D_GLSL_130 }, - {STATE_CLIPPLANE(3), {STATE_CLIPPLANE(3), clipplane }, WINED3D_GL_EXT_NONE }, - {STATE_CLIPPLANE(4), {STATE_CLIPPLANE(4), glsl_vertex_pipe_clip_plane}, WINED3D_GLSL_130 }, - {STATE_CLIPPLANE(4), {STATE_CLIPPLANE(4), clipplane }, WINED3D_GL_EXT_NONE }, - {STATE_CLIPPLANE(5), {STATE_CLIPPLANE(5), glsl_vertex_pipe_clip_plane}, WINED3D_GLSL_130 }, - {STATE_CLIPPLANE(5), {STATE_CLIPPLANE(5), clipplane }, WINED3D_GL_EXT_NONE }, - {STATE_CLIPPLANE(6), {STATE_CLIPPLANE(6), glsl_vertex_pipe_clip_plane}, WINED3D_GLSL_130 }, - {STATE_CLIPPLANE(6), {STATE_CLIPPLANE(6), clipplane }, WINED3D_GL_EXT_NONE }, - {STATE_CLIPPLANE(7), {STATE_CLIPPLANE(7), glsl_vertex_pipe_clip_plane}, WINED3D_GLSL_130 }, - {STATE_CLIPPLANE(7), {STATE_CLIPPLANE(7), clipplane }, WINED3D_GL_EXT_NONE }, - /* Viewport */ {STATE_VIEWPORT, {STATE_VIEWPORT, glsl_vertex_pipe_viewport}, WINED3D_GL_EXT_NONE }, /* Fog */ {STATE_RENDER(WINED3D_RS_AMBIENTMATERIALSOURCE), {STATE_RENDER(WINED3D_RS_FOGENABLE), NULL }, WINED3D_GL_EXT_NONE }, diff --git a/dlls/wined3d/stateblock.c b/dlls/wined3d/stateblock.c index c89fa9df0c6..3cc9bd429a4 100644 --- a/dlls/wined3d/stateblock.c +++ b/dlls/wined3d/stateblock.c @@ -2727,24 +2727,6 @@ static void wined3d_device_set_light_enable(struct wined3d_device *device, unsig wined3d_device_context_emit_set_light_enable(&device->cs->c, light_idx, enable); }
-static void wined3d_device_set_clip_plane(struct wined3d_device *device, - unsigned int plane_idx, const struct wined3d_vec4 *plane) -{ - struct wined3d_vec4 *clip_planes = device->cs->c.state->clip_planes; - - TRACE("device %p, plane_idx %u, plane %p.\n", device, plane_idx, plane); - - if (!memcmp(&clip_planes[plane_idx], plane, sizeof(*plane))) - { - TRACE("Application is setting old values over, nothing to do.\n"); - return; - } - - clip_planes[plane_idx] = *plane; - - wined3d_device_context_emit_set_clip_plane(&device->cs->c, plane_idx, plane); -} - static void resolve_depth_buffer(struct wined3d_device *device) { const struct wined3d_state *state = device->cs->c.state; @@ -3735,6 +3717,8 @@ void CDECL wined3d_device_apply_stateblock(struct wined3d_device *device, map = changed->clipplane; while (map) { + struct wined3d_vec4 plane; + i = wined3d_bit_scan(&map);
/* In Direct3D, clipping is done based on the position as transformed @@ -3757,17 +3741,19 @@ void CDECL wined3d_device_apply_stateblock(struct wined3d_device *device, if (!state->vs) { struct wined3d_matrix matrix; - struct wined3d_vec4 plane;
invert_matrix(&matrix, &state->transforms[WINED3D_TS_VIEW]); transpose_matrix(&matrix, &matrix); wined3d_vec4_transform(&plane, &state->clip_planes[i], &matrix); - wined3d_device_set_clip_plane(device, i, &plane); } else { - wined3d_device_set_clip_plane(device, i, &state->clip_planes[i]); + plane = state->clip_planes[i]; } + + wined3d_device_context_push_constants(context, + WINED3D_PUSH_CONSTANTS_VS_FFP, WINED3D_SHADER_CONST_VS_CLIP_PLANES, + offsetof(struct wined3d_ffp_vs_constants, clip_planes[i]), sizeof(plane), &plane); }
if (changed->material) diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c index 33b30b1d0bd..731be808f50 100644 --- a/dlls/wined3d/utils.c +++ b/dlls/wined3d/utils.c @@ -5451,8 +5451,6 @@ const char *debug_d3dstate(uint32_t state) return "STATE_VIEWPORT"; if (STATE_IS_SCISSORRECT(state)) return "STATE_SCISSORRECT"; - if (STATE_IS_CLIPPLANE(state)) - return wine_dbg_sprintf("STATE_CLIPPLANE(%#x)", state - STATE_CLIPPLANE(0)); if (STATE_IS_RASTERIZER(state)) return "STATE_RASTERIZER"; if (STATE_IS_DEPTH_BOUNDS(state)) diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index 0bb86cc8b9c..7f20d618c5c 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -1752,10 +1752,7 @@ void dispatch_compute(struct wined3d_device *device, const struct wined3d_state #define STATE_SCISSORRECT (STATE_VIEWPORT + 1) #define STATE_IS_SCISSORRECT(a) ((a) == STATE_SCISSORRECT)
-#define STATE_CLIPPLANE(a) (STATE_SCISSORRECT + 1 + (a)) -#define STATE_IS_CLIPPLANE(a) ((a) >= STATE_CLIPPLANE(0) && (a) <= STATE_CLIPPLANE(WINED3D_MAX_CLIP_DISTANCES - 1)) - -#define STATE_RASTERIZER (STATE_CLIPPLANE(WINED3D_MAX_CLIP_DISTANCES)) +#define STATE_RASTERIZER (STATE_SCISSORRECT + 1) #define STATE_IS_RASTERIZER(a) ((a) == STATE_RASTERIZER)
#define STATE_DEPTH_BOUNDS (STATE_RASTERIZER + 1) @@ -2819,6 +2816,9 @@ struct wined3d_ffp_vs_constants struct wined3d_color ambient; struct wined3d_light_constants lights[8]; } light; + + /* States not used by the HLSL pipeline. */ + struct wined3d_vec4 clip_planes[WINED3D_MAX_CLIP_DISTANCES]; };
struct wined3d_ffp_ps_constants @@ -2971,7 +2971,6 @@ struct wined3d_state uint32_t texture_states[WINED3D_MAX_FFP_TEXTURES][WINED3D_HIGHEST_TEXTURE_STATE + 1];
struct wined3d_matrix transforms[WINED3D_HIGHEST_TRANSFORM_STATE + 1]; - struct wined3d_vec4 clip_planes[WINED3D_MAX_CLIP_DISTANCES]; struct wined3d_viewport viewports[WINED3D_MAX_VIEWPORTS]; unsigned int viewport_count; RECT scissor_rects[WINED3D_MAX_VIEWPORTS]; @@ -3764,8 +3763,6 @@ void wined3d_device_context_emit_reset_state(struct wined3d_device_context *cont void wined3d_device_context_emit_set_blend_state(struct wined3d_device_context *context, struct wined3d_blend_state *state, const struct wined3d_color *blend_factor, unsigned int sample_mask); -void wined3d_device_context_emit_set_clip_plane(struct wined3d_device_context *context, unsigned int plane_idx, - const struct wined3d_vec4 *plane); void wined3d_device_context_emit_set_constant_buffers(struct wined3d_device_context *context, enum wined3d_shader_type type, unsigned int start_idx, unsigned int count, const struct wined3d_constant_buffer_state *buffers);