mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 09:38:07 +02:00
mesa/st: Add depth clamping to rasterizer code
implemented by Erik Faye-Lund <erik.faye-lund@collabora.com> v2: Use current depth range values for clamping (Erik) v3: fix scons-win64 build Signed-off-by: Gert Wollny <gert.wollny@collabora.com> Reviewed-by: Reviewed-by: Marek Olšák <marek.olsak@amd.com>
This commit is contained in:
parent
57361d89fa
commit
d004fcc04a
2 changed files with 39 additions and 6 deletions
|
|
@ -295,8 +295,10 @@ st_update_rasterizer(struct st_context *st)
|
|||
}
|
||||
|
||||
/* _NEW_TRANSFORM */
|
||||
raster->depth_clip_near = !ctx->Transform.DepthClampNear;
|
||||
raster->depth_clip_far = !ctx->Transform.DepthClampFar;
|
||||
raster->depth_clip_near = st->clamp_frag_depth_in_shader ||
|
||||
!ctx->Transform.DepthClampNear;
|
||||
raster->depth_clip_far = st->clamp_frag_depth_in_shader ||
|
||||
!ctx->Transform.DepthClampFar;
|
||||
raster->clip_plane_enable = ctx->Transform.ClipPlanesEnabled;
|
||||
raster->clip_halfz = (ctx->Transform.ClipDepthMode == GL_ZERO_TO_ONE);
|
||||
|
||||
|
|
|
|||
|
|
@ -787,8 +787,10 @@ draw_textured_quad(struct gl_context *ctx, GLint x, GLint y, GLfloat z,
|
|||
ctx->Color._ClampFragmentColor;
|
||||
rasterizer.half_pixel_center = 1;
|
||||
rasterizer.bottom_edge_rule = 1;
|
||||
rasterizer.depth_clip_near = !ctx->Transform.DepthClampNear;
|
||||
rasterizer.depth_clip_far = !ctx->Transform.DepthClampFar;
|
||||
rasterizer.depth_clip_near = st->clamp_frag_depth_in_shader ||
|
||||
!ctx->Transform.DepthClampNear;
|
||||
rasterizer.depth_clip_far = st->clamp_frag_depth_in_shader ||
|
||||
!ctx->Transform.DepthClampFar;
|
||||
rasterizer.scissor = ctx->Scissor.EnableFlags;
|
||||
cso_set_rasterizer(cso, &rasterizer);
|
||||
}
|
||||
|
|
@ -1260,6 +1262,34 @@ setup_sampler_swizzle(struct pipe_sampler_view *sv, GLenum format, GLenum type)
|
|||
}
|
||||
|
||||
|
||||
/**
|
||||
* Compute the effective raster z position. This performs depth-clamping
|
||||
* if needed.
|
||||
*/
|
||||
static float
|
||||
get_effective_raster_z(struct gl_context *ctx)
|
||||
{
|
||||
float z = ctx->Current.RasterPos[2];
|
||||
if (st_context(ctx)->clamp_frag_depth_in_shader) {
|
||||
GLfloat depth_near;
|
||||
GLfloat depth_far;
|
||||
if (ctx->ViewportArray[0].Near < ctx->ViewportArray[0].Far) {
|
||||
depth_near = ctx->ViewportArray[0].Near;
|
||||
depth_far = ctx->ViewportArray[0].Far;
|
||||
} else {
|
||||
depth_near = ctx->ViewportArray[0].Far;
|
||||
depth_far = ctx->ViewportArray[0].Near;
|
||||
}
|
||||
|
||||
if (ctx->Transform.DepthClampNear)
|
||||
z = MAX2(z, depth_near);
|
||||
if (ctx->Transform.DepthClampFar)
|
||||
z = MIN2(z, depth_far);
|
||||
}
|
||||
return z;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Called via ctx->Driver.DrawPixels()
|
||||
*/
|
||||
|
|
@ -1376,7 +1406,7 @@ st_DrawPixels(struct gl_context *ctx, GLint x, GLint y,
|
|||
num_sampler_view++;
|
||||
}
|
||||
|
||||
draw_textured_quad(ctx, x, y, ctx->Current.RasterPos[2],
|
||||
draw_textured_quad(ctx, x, y, get_effective_raster_z(ctx),
|
||||
width, height,
|
||||
ctx->Pixel.ZoomX, ctx->Pixel.ZoomY,
|
||||
sv,
|
||||
|
|
@ -1851,7 +1881,8 @@ st_CopyPixels(struct gl_context *ctx, GLint srcx, GLint srcy,
|
|||
/* OK, the texture 'pt' contains the src image/pixels. Now draw a
|
||||
* textured quad with that texture.
|
||||
*/
|
||||
draw_textured_quad(ctx, dstx, dsty, ctx->Current.RasterPos[2],
|
||||
|
||||
draw_textured_quad(ctx, dstx, dsty, get_effective_raster_z(ctx),
|
||||
width, height, ctx->Pixel.ZoomX, ctx->Pixel.ZoomY,
|
||||
sv,
|
||||
num_sampler_view,
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue