gallium: add util_format_stencil_only helper function

used for stencil sampler views.

Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
Marek Olšák 2012-07-07 23:23:49 +02:00
parent a730838a42
commit 76db2c121c
2 changed files with 31 additions and 21 deletions

View File

@ -881,6 +881,35 @@ util_format_linear(enum pipe_format format)
}
}
/**
* Given a depth-stencil format, return the corresponding stencil-only format.
* For stencil-only formats, return the format unchanged.
*/
static INLINE enum pipe_format
util_format_stencil_only(enum pipe_format format)
{
switch (format) {
/* mask out the depth component */
case PIPE_FORMAT_Z24_UNORM_S8_UINT:
return PIPE_FORMAT_X24S8_UINT;
case PIPE_FORMAT_S8_UINT_Z24_UNORM:
return PIPE_FORMAT_S8X24_UINT;
case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT:
return PIPE_FORMAT_X32_S8X24_UINT;
/* stencil only formats */
case PIPE_FORMAT_X24S8_UINT:
case PIPE_FORMAT_S8X24_UINT:
case PIPE_FORMAT_X32_S8X24_UINT:
case PIPE_FORMAT_S8_UINT:
return format;
default:
assert(0);
return PIPE_FORMAT_NONE;
}
}
/**
* Return the number of components stored.
* Formats with block size != 1x1 will always have 1 component (the block).

View File

@ -1165,27 +1165,8 @@ st_DrawPixels(struct gl_context *ctx, GLint x, GLint y,
* The stencil is written using the shader stencil export
* functionality. */
if (write_stencil) {
enum pipe_format stencil_format = PIPE_FORMAT_NONE;
switch (pt->format) {
case PIPE_FORMAT_Z24_UNORM_S8_UINT:
case PIPE_FORMAT_X24S8_UINT:
stencil_format = PIPE_FORMAT_X24S8_UINT;
break;
case PIPE_FORMAT_S8_UINT_Z24_UNORM:
case PIPE_FORMAT_S8X24_UINT:
stencil_format = PIPE_FORMAT_S8X24_UINT;
break;
case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT:
case PIPE_FORMAT_X32_S8X24_UINT:
stencil_format = PIPE_FORMAT_X32_S8X24_UINT;
break;
case PIPE_FORMAT_S8_UINT:
stencil_format = PIPE_FORMAT_S8_UINT;
break;
default:
assert(0);
}
enum pipe_format stencil_format =
util_format_stencil_only(pt->format);
sv[1] = st_create_texture_sampler_view_format(st->pipe, pt,
stencil_format);