st/mesa: derive a stencil sampler format from the actual texture format
Reviewed-by: Brian Paul <brianp@vmware.com>
This commit is contained in:
@@ -272,26 +272,6 @@ make_passthrough_vertex_shader(struct st_context *st,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Return a texture base format for drawing/copying an image
|
|
||||||
* of the given format.
|
|
||||||
*/
|
|
||||||
static GLenum
|
|
||||||
base_format(GLenum format)
|
|
||||||
{
|
|
||||||
switch (format) {
|
|
||||||
case GL_DEPTH_COMPONENT:
|
|
||||||
return GL_DEPTH_COMPONENT;
|
|
||||||
case GL_DEPTH_STENCIL:
|
|
||||||
return GL_DEPTH_STENCIL;
|
|
||||||
case GL_STENCIL_INDEX:
|
|
||||||
return GL_STENCIL_INDEX;
|
|
||||||
default:
|
|
||||||
return GL_RGBA;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return a texture internalFormat for drawing/copying an image
|
* Return a texture internalFormat for drawing/copying an image
|
||||||
* of the given format and type.
|
* of the given format and type.
|
||||||
@@ -999,7 +979,6 @@ st_DrawPixels(struct gl_context *ctx, GLint x, GLint y,
|
|||||||
GLboolean write_stencil = GL_FALSE, write_depth = GL_FALSE;
|
GLboolean write_stencil = GL_FALSE, write_depth = GL_FALSE;
|
||||||
struct pipe_sampler_view *sv[2];
|
struct pipe_sampler_view *sv[2];
|
||||||
int num_sampler_view = 1;
|
int num_sampler_view = 1;
|
||||||
enum pipe_format stencil_format = PIPE_FORMAT_NONE;
|
|
||||||
struct st_fp_variant *fpv;
|
struct st_fp_variant *fpv;
|
||||||
|
|
||||||
if (format == GL_DEPTH_STENCIL)
|
if (format == GL_DEPTH_STENCIL)
|
||||||
@@ -1014,28 +993,6 @@ st_DrawPixels(struct gl_context *ctx, GLint x, GLint y,
|
|||||||
/* can we write to stencil if not fallback */
|
/* can we write to stencil if not fallback */
|
||||||
if (!pipe->screen->get_param(pipe->screen, PIPE_CAP_SHADER_STENCIL_EXPORT))
|
if (!pipe->screen->get_param(pipe->screen, PIPE_CAP_SHADER_STENCIL_EXPORT))
|
||||||
goto stencil_fallback;
|
goto stencil_fallback;
|
||||||
|
|
||||||
tex_format = st_choose_format(st->pipe->screen, base_format(format),
|
|
||||||
GL_NONE, GL_NONE,
|
|
||||||
PIPE_TEXTURE_2D,
|
|
||||||
0, PIPE_BIND_SAMPLER_VIEW);
|
|
||||||
|
|
||||||
switch (tex_format) {
|
|
||||||
case PIPE_FORMAT_Z24_UNORM_S8_USCALED:
|
|
||||||
stencil_format = PIPE_FORMAT_X24S8_USCALED;
|
|
||||||
break;
|
|
||||||
case PIPE_FORMAT_S8_USCALED_Z24_UNORM:
|
|
||||||
stencil_format = PIPE_FORMAT_S8X24_USCALED;
|
|
||||||
break;
|
|
||||||
case PIPE_FORMAT_Z32_FLOAT_S8X24_USCALED:
|
|
||||||
stencil_format = PIPE_FORMAT_X32_S8X24_USCALED;
|
|
||||||
break;
|
|
||||||
case PIPE_FORMAT_S8_USCALED:
|
|
||||||
stencil_format = PIPE_FORMAT_S8_USCALED;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
goto stencil_fallback;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Mesa state should be up to date by now */
|
/* Mesa state should be up to date by now */
|
||||||
@@ -1080,7 +1037,32 @@ st_DrawPixels(struct gl_context *ctx, GLint x, GLint y,
|
|||||||
sv[0] = st_create_texture_sampler_view(st->pipe, pt);
|
sv[0] = st_create_texture_sampler_view(st->pipe, pt);
|
||||||
|
|
||||||
if (sv[0]) {
|
if (sv[0]) {
|
||||||
if (write_stencil) {
|
/* Create a second sampler view to read stencil.
|
||||||
|
* 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_USCALED:
|
||||||
|
case PIPE_FORMAT_X24S8_USCALED:
|
||||||
|
stencil_format = PIPE_FORMAT_X24S8_USCALED;
|
||||||
|
break;
|
||||||
|
case PIPE_FORMAT_S8_USCALED_Z24_UNORM:
|
||||||
|
case PIPE_FORMAT_S8X24_USCALED:
|
||||||
|
stencil_format = PIPE_FORMAT_S8X24_USCALED;
|
||||||
|
break;
|
||||||
|
case PIPE_FORMAT_Z32_FLOAT_S8X24_USCALED:
|
||||||
|
case PIPE_FORMAT_X32_S8X24_USCALED:
|
||||||
|
stencil_format = PIPE_FORMAT_X32_S8X24_USCALED;
|
||||||
|
break;
|
||||||
|
case PIPE_FORMAT_S8_USCALED:
|
||||||
|
stencil_format = PIPE_FORMAT_S8_USCALED;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
assert(0);
|
||||||
|
}
|
||||||
|
|
||||||
sv[1] = st_create_texture_sampler_view_format(st->pipe, pt,
|
sv[1] = st_create_texture_sampler_view_format(st->pipe, pt,
|
||||||
stencil_format);
|
stencil_format);
|
||||||
num_sampler_view++;
|
num_sampler_view++;
|
||||||
|
Reference in New Issue
Block a user