[Mesa-dev] [PATCH 2/4] st/mesa: add ARB_texture_stencil8 support (v4)

Marek Olšák maraeo at gmail.com
Wed Apr 22 02:30:25 PDT 2015


Reviewed-by: Marek Olšák <marek.olsak at amd.com>

Marek

On Wed, Apr 22, 2015 at 3:43 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.
> v3: hit fallback for getteximage
> v4: put s8 back in front, it shouldn't get picked now (Ilia)
>
> Signed-off-by: Dave Airlie <airlied at redhat.com>
> ---
>  src/mesa/state_tracker/st_atom_texture.c | 14 ++++++++++----
>  src/mesa/state_tracker/st_cb_texture.c   |  2 +-
>  src/mesa/state_tracker/st_extensions.c   |  3 +++
>  src/mesa/state_tracker/st_format.c       | 19 ++++++++-----------
>  4 files changed, 22 insertions(+), 16 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_cb_texture.c b/src/mesa/state_tracker/st_cb_texture.c
> index bdf236e..7ea3846 100644
> --- a/src/mesa/state_tracker/st_cb_texture.c
> +++ b/src/mesa/state_tracker/st_cb_texture.c
> @@ -950,7 +950,7 @@ st_GetTexImage(struct gl_context * ctx,
>
>     /* XXX Fallback to _mesa_GetTexImage_sw for depth-stencil formats
>      * due to an incomplete stencil blit implementation in some drivers. */
> -   if (format == GL_DEPTH_STENCIL) {
> +   if (format == GL_DEPTH_STENCIL || format == GL_STENCIL_INDEX) {
>        goto fallback;
>     }
>
> 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..181465d 100644
> --- a/src/mesa/state_tracker/st_format.c
> +++ b/src/mesa/state_tracker/st_format.c
> @@ -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.1.0
>
> _______________________________________________
> 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