[Mesa-dev] [PATCH 3/4] st/mesa: add ARB_texture_stencil8 support (v2)
Marek Olšák
maraeo at gmail.com
Mon Apr 6 03:55:04 PDT 2015
Putting S8 last in the list is like not putting it there at all.
Marek
On Mon, Apr 6, 2015 at 5:07 AM, Dave Airlie <airlied at gmail.com> wrote:
> if we support stencil texturing, enable texture_stencil8
> there is no requirement to support native S8 for this,
> the texture can be converted to x24s8 fine.
>
> v2: fold fixes from Marek in:
> a) put S8 last in the list
> b) fix renderable to always test for d/s renderable
> fixup the texture case to use a stencil only format
> for picking the format for the texture view.
>
> Signed-off-by: Dave Airlie <airlied at redhat.com>
> ---
> src/mesa/state_tracker/st_atom_texture.c | 14 ++++++++++----
> src/mesa/state_tracker/st_extensions.c | 3 +++
> src/mesa/state_tracker/st_format.c | 23 ++++++++++-------------
> 3 files changed, 23 insertions(+), 17 deletions(-)
>
> diff --git a/src/mesa/state_tracker/st_atom_texture.c b/src/mesa/state_tracker/st_atom_texture.c
> index eff28fc..04ba864 100644
> --- a/src/mesa/state_tracker/st_atom_texture.c
> +++ b/src/mesa/state_tracker/st_atom_texture.c
> @@ -287,16 +287,22 @@ st_get_texture_sampler_view_from_stobj(struct st_context *st,
> enum pipe_format format)
> {
> struct pipe_sampler_view **sv;
> -
> + const struct st_texture_image *firstImage;
> if (!stObj || !stObj->pt) {
> return NULL;
> }
>
> sv = st_texture_get_sampler_view(st, stObj);
>
> - if (stObj->base.StencilSampling &&
> - util_format_is_depth_and_stencil(format))
> - format = util_format_stencil_only(format);
> + if (util_format_is_depth_and_stencil(format)) {
> + if (stObj->base.StencilSampling)
> + format = util_format_stencil_only(format);
> + else {
> + firstImage = st_texture_image_const(_mesa_base_tex_image(&stObj->base));
> + if (firstImage->base._BaseFormat == GL_STENCIL_INDEX)
> + format = util_format_stencil_only(format);
> + }
> + }
>
> /* if sampler view has changed dereference it */
> if (*sv) {
> diff --git a/src/mesa/state_tracker/st_extensions.c b/src/mesa/state_tracker/st_extensions.c
> index bc20f73..25932dd 100644
> --- a/src/mesa/state_tracker/st_extensions.c
> +++ b/src/mesa/state_tracker/st_extensions.c
> @@ -650,6 +650,9 @@ void st_init_extensions(struct pipe_screen *screen,
> ARRAY_SIZE(vertex_mapping), PIPE_BUFFER,
> PIPE_BIND_VERTEX_BUFFER);
>
> + if (extensions->ARB_stencil_texturing)
> + extensions->ARB_texture_stencil8 = GL_TRUE;
> +
> /* Figure out GLSL support. */
> glsl_feature_level = screen->get_param(screen, PIPE_CAP_GLSL_FEATURE_LEVEL);
>
> diff --git a/src/mesa/state_tracker/st_format.c b/src/mesa/state_tracker/st_format.c
> index 72dbf3b..b9afb91 100644
> --- a/src/mesa/state_tracker/st_format.c
> +++ b/src/mesa/state_tracker/st_format.c
> @@ -1167,8 +1167,8 @@ static const struct format_mapping format_map[] = {
> { GL_STENCIL_INDEX, GL_STENCIL_INDEX1_EXT, GL_STENCIL_INDEX4_EXT,
> GL_STENCIL_INDEX8_EXT, GL_STENCIL_INDEX16_EXT, 0 },
> {
> - PIPE_FORMAT_S8_UINT, PIPE_FORMAT_Z24_UNORM_S8_UINT,
> - PIPE_FORMAT_S8_UINT_Z24_UNORM, 0
> + PIPE_FORMAT_Z24_UNORM_S8_UINT,
> + PIPE_FORMAT_S8_UINT_Z24_UNORM, PIPE_FORMAT_S8_UINT, 0
> }
> },
>
> @@ -1942,11 +1942,6 @@ st_ChooseTextureFormat(struct gl_context *ctx, GLenum target,
> GLint internalFormat,
> GLenum format, GLenum type)
> {
> - const boolean want_renderable =
> - internalFormat == 3 || internalFormat == 4 ||
> - internalFormat == GL_RGB || internalFormat == GL_RGBA ||
> - internalFormat == GL_RGB8 || internalFormat == GL_RGBA8 ||
> - internalFormat == GL_BGRA;
> struct st_context *st = st_context(ctx);
> enum pipe_format pFormat;
> unsigned bindings;
> @@ -1962,15 +1957,17 @@ st_ChooseTextureFormat(struct gl_context *ctx, GLenum target,
> }
>
> /* GL textures may wind up being render targets, but we don't know
> - * that in advance. Specify potential render target flags now.
> + * that in advance. Specify potential render target flags now for formats
> + * that we know should always be renderable.
> */
> bindings = PIPE_BIND_SAMPLER_VIEW;
> - if (want_renderable) {
> - if (_mesa_is_depth_or_stencil_format(internalFormat))
> - bindings |= PIPE_BIND_DEPTH_STENCIL;
> - else
> + if (_mesa_is_depth_or_stencil_format(internalFormat))
> + bindings |= PIPE_BIND_DEPTH_STENCIL;
> + else if (internalFormat == 3 || internalFormat == 4 ||
> + internalFormat == GL_RGB || internalFormat == GL_RGBA ||
> + internalFormat == GL_RGB8 || internalFormat == GL_RGBA8 ||
> + internalFormat == GL_BGRA)
> bindings |= PIPE_BIND_RENDER_TARGET;
> - }
>
> /* GLES allows the driver to choose any format which matches
> * the format+type combo, because GLES only supports unsized internal
> --
> 2.3.4
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list