wined3d: Keep track of enabled clip distances.
Signed-off-by: Józef Kucia <jkucia@codeweavers.com> Signed-off-by: Henri Verbeet <hverbeet@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
cf0f523243
commit
46cf12318b
|
@ -2352,6 +2352,33 @@ static void context_get_rt_size(const struct wined3d_context *context, SIZE *siz
|
||||||
size->cy = wined3d_texture_get_level_height(rt, level);
|
size->cy = wined3d_texture_get_level_height(rt, level);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void context_enable_clip_distances(struct wined3d_context *context, unsigned int enable_mask)
|
||||||
|
{
|
||||||
|
const struct wined3d_gl_info *gl_info = context->gl_info;
|
||||||
|
unsigned int clip_distance_count = gl_info->limits.user_clip_distances;
|
||||||
|
unsigned int i, disable_mask, current_mask;
|
||||||
|
|
||||||
|
disable_mask = ~enable_mask;
|
||||||
|
enable_mask &= (1u << clip_distance_count) - 1;
|
||||||
|
disable_mask &= (1u << clip_distance_count) - 1;
|
||||||
|
current_mask = context->clip_distance_mask;
|
||||||
|
context->clip_distance_mask = enable_mask;
|
||||||
|
|
||||||
|
enable_mask &= ~current_mask;
|
||||||
|
for (i = 0; enable_mask; enable_mask >>= 1, ++i)
|
||||||
|
{
|
||||||
|
if (enable_mask & 1)
|
||||||
|
gl_info->gl_ops.gl.p_glEnable(GL_CLIP_DISTANCE0 + i);
|
||||||
|
}
|
||||||
|
disable_mask &= current_mask;
|
||||||
|
for (i = 0; disable_mask; disable_mask >>= 1, ++i)
|
||||||
|
{
|
||||||
|
if (disable_mask & 1)
|
||||||
|
gl_info->gl_ops.gl.p_glDisable(GL_CLIP_DISTANCE0 + i);
|
||||||
|
}
|
||||||
|
checkGLcall("toggle clip distances");
|
||||||
|
}
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* SetupForBlit
|
* SetupForBlit
|
||||||
*
|
*
|
||||||
|
@ -2530,9 +2557,7 @@ static void SetupForBlit(const struct wined3d_device *device, struct wined3d_con
|
||||||
context->last_was_rhw = TRUE;
|
context->last_was_rhw = TRUE;
|
||||||
context_invalidate_state(context, STATE_VDECL); /* because of last_was_rhw = TRUE */
|
context_invalidate_state(context, STATE_VDECL); /* because of last_was_rhw = TRUE */
|
||||||
|
|
||||||
for (i = 0; i < gl_info->limits.user_clip_distances; ++i)
|
context_enable_clip_distances(context, 0);
|
||||||
gl_info->gl_ops.gl.p_glDisable(GL_CLIP_DISTANCE0 + i);
|
|
||||||
checkGLcall("disable clip planes");
|
|
||||||
context_invalidate_state(context, STATE_RENDER(WINED3D_RS_CLIPPING));
|
context_invalidate_state(context, STATE_RENDER(WINED3D_RS_CLIPPING));
|
||||||
|
|
||||||
/* FIXME: Make draw_textured_quad() able to work with a upper left origin. */
|
/* FIXME: Make draw_textured_quad() able to work with a upper left origin. */
|
||||||
|
|
|
@ -611,9 +611,7 @@ void state_alpha_test(struct wined3d_context *context, const struct wined3d_stat
|
||||||
|
|
||||||
void state_clipping(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id)
|
void state_clipping(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id)
|
||||||
{
|
{
|
||||||
const struct wined3d_gl_info *gl_info = context->gl_info;
|
unsigned int enable_mask;
|
||||||
unsigned int clipplane_count = gl_info->limits.user_clip_distances;
|
|
||||||
unsigned int i, enable_mask, disable_mask;
|
|
||||||
|
|
||||||
if (use_vs(state) && !context->d3d_info->vs_clipping)
|
if (use_vs(state) && !context->d3d_info->vs_clipping)
|
||||||
{
|
{
|
||||||
|
@ -626,7 +624,7 @@ void state_clipping(struct wined3d_context *context, const struct wined3d_state
|
||||||
* disables all clip planes because of that - don't do anything here
|
* disables all clip planes because of that - don't do anything here
|
||||||
* and keep them disabled. */
|
* and keep them disabled. */
|
||||||
if (state->render_states[WINED3D_RS_CLIPPLANEENABLE] && !warned++)
|
if (state->render_states[WINED3D_RS_CLIPPLANEENABLE] && !warned++)
|
||||||
FIXME("Clipping not supported with vertex shaders\n");
|
FIXME("Clipping not supported with vertex shaders.\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -636,36 +634,12 @@ void state_clipping(struct wined3d_context *context, const struct wined3d_state
|
||||||
* need to update the clipping field from ffp_vertex_settings. */
|
* need to update the clipping field from ffp_vertex_settings. */
|
||||||
context->shader_update_mask |= 1u << WINED3D_SHADER_TYPE_VERTEX;
|
context->shader_update_mask |= 1u << WINED3D_SHADER_TYPE_VERTEX;
|
||||||
|
|
||||||
/* TODO: Keep track of previously enabled clipplanes to avoid unnecessary resetting
|
|
||||||
* of already set values
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* If enabling / disabling all
|
/* If enabling / disabling all
|
||||||
* TODO: Is this correct? Doesn't D3DRS_CLIPPING disable clipping on the viewport frustrum?
|
* TODO: Is this correct? Doesn't D3DRS_CLIPPING disable clipping on the viewport frustrum?
|
||||||
*/
|
*/
|
||||||
if (state->render_states[WINED3D_RS_CLIPPING])
|
enable_mask = state->render_states[WINED3D_RS_CLIPPING] ?
|
||||||
{
|
state->render_states[WINED3D_RS_CLIPPLANEENABLE] : 0;
|
||||||
enable_mask = state->render_states[WINED3D_RS_CLIPPLANEENABLE];
|
context_enable_clip_distances(context, enable_mask);
|
||||||
disable_mask = ~state->render_states[WINED3D_RS_CLIPPLANEENABLE];
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
enable_mask = 0;
|
|
||||||
disable_mask = ~0u;
|
|
||||||
}
|
|
||||||
|
|
||||||
enable_mask &= (1u << clipplane_count) - 1;
|
|
||||||
disable_mask &= (1u << clipplane_count) - 1;
|
|
||||||
|
|
||||||
for (i = 0; enable_mask && i < clipplane_count; enable_mask >>= 1, ++i)
|
|
||||||
if (enable_mask & 1)
|
|
||||||
gl_info->gl_ops.gl.p_glEnable(GL_CLIP_DISTANCE0 + i);
|
|
||||||
checkGLcall("clip plane enable");
|
|
||||||
|
|
||||||
for (i = 0; disable_mask && i < clipplane_count; disable_mask >>= 1, ++i)
|
|
||||||
if (disable_mask & 1)
|
|
||||||
gl_info->gl_ops.gl.p_glDisable(GL_CLIP_DISTANCE0 + i);
|
|
||||||
checkGLcall("clip plane disable");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void state_specularenable(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id)
|
static void state_specularenable(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id)
|
||||||
|
@ -4532,22 +4506,19 @@ static void vertexdeclaration(struct wined3d_context *context, const struct wine
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if(!context->last_was_vshader) {
|
if (!context->last_was_vshader)
|
||||||
|
{
|
||||||
static BOOL warned = FALSE;
|
static BOOL warned = FALSE;
|
||||||
if (!context->d3d_info->vs_clipping)
|
if (!context->d3d_info->vs_clipping)
|
||||||
{
|
{
|
||||||
/* Disable all clip planes to get defined results on all drivers. See comment in the
|
/* Disable all clip planes to get defined results on all drivers. See comment in the
|
||||||
* state_clipping state handler
|
* state_clipping state handler
|
||||||
*/
|
*/
|
||||||
for (i = 0; i < gl_info->limits.user_clip_distances; ++i)
|
context_enable_clip_distances(context, 0);
|
||||||
{
|
|
||||||
gl_info->gl_ops.gl.p_glDisable(GL_CLIP_PLANE0 + i);
|
|
||||||
checkGLcall("glDisable(GL_CLIP_PLANE0 + i)");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!warned && state->render_states[WINED3D_RS_CLIPPLANEENABLE])
|
if (!warned && state->render_states[WINED3D_RS_CLIPPLANEENABLE])
|
||||||
{
|
{
|
||||||
FIXME("Clipping not supported with vertex shaders\n");
|
FIXME("Clipping not supported with vertex shaders.\n");
|
||||||
warned = TRUE;
|
warned = TRUE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1901,7 +1901,8 @@ struct wined3d_context
|
||||||
DWORD transform_feedback_active : 1;
|
DWORD transform_feedback_active : 1;
|
||||||
DWORD transform_feedback_paused : 1;
|
DWORD transform_feedback_paused : 1;
|
||||||
DWORD shader_update_mask : 6; /* WINED3D_SHADER_TYPE_COUNT, 6 */
|
DWORD shader_update_mask : 6; /* WINED3D_SHADER_TYPE_COUNT, 6 */
|
||||||
DWORD padding : 17;
|
DWORD clip_distance_mask : 8; /* MAX_CLIP_DISTANCES, 8 */
|
||||||
|
DWORD padding : 9;
|
||||||
DWORD constant_update_mask;
|
DWORD constant_update_mask;
|
||||||
DWORD numbered_array_mask;
|
DWORD numbered_array_mask;
|
||||||
GLenum tracking_parm; /* Which source is tracking current colour */
|
GLenum tracking_parm; /* Which source is tracking current colour */
|
||||||
|
@ -2146,6 +2147,7 @@ struct wined3d_context *context_create(struct wined3d_swapchain *swapchain, stru
|
||||||
const struct wined3d_format *ds_format) DECLSPEC_HIDDEN;
|
const struct wined3d_format *ds_format) DECLSPEC_HIDDEN;
|
||||||
HGLRC context_create_wgl_attribs(const struct wined3d_gl_info *gl_info, HDC hdc, HGLRC share_ctx) DECLSPEC_HIDDEN;
|
HGLRC context_create_wgl_attribs(const struct wined3d_gl_info *gl_info, HDC hdc, HGLRC share_ctx) DECLSPEC_HIDDEN;
|
||||||
void context_destroy(struct wined3d_device *device, struct wined3d_context *context) DECLSPEC_HIDDEN;
|
void context_destroy(struct wined3d_device *device, struct wined3d_context *context) DECLSPEC_HIDDEN;
|
||||||
|
void context_enable_clip_distances(struct wined3d_context *context, unsigned int mask) DECLSPEC_HIDDEN;
|
||||||
void context_end_transform_feedback(struct wined3d_context *context) DECLSPEC_HIDDEN;
|
void context_end_transform_feedback(struct wined3d_context *context) DECLSPEC_HIDDEN;
|
||||||
void context_free_fence(struct wined3d_fence *fence) DECLSPEC_HIDDEN;
|
void context_free_fence(struct wined3d_fence *fence) DECLSPEC_HIDDEN;
|
||||||
void context_free_occlusion_query(struct wined3d_occlusion_query *query) DECLSPEC_HIDDEN;
|
void context_free_occlusion_query(struct wined3d_occlusion_query *query) DECLSPEC_HIDDEN;
|
||||||
|
|
Loading…
Reference in New Issue