[Mesa-dev] [PATCH 6/6] st/mesa: skip any extra handling of YUV textures if driver supports them

Lucas Stach l.stach at pengutronix.de
Fri Apr 12 17:33:35 UTC 2019


If the driver provides native support for YUV textures we can skip
adding additional samplers and re-writing the shaders.

Signed-off-by: Lucas Stach <l.stach at pengutronix.de>
---
 src/mesa/state_tracker/st_atom_sampler.c |  6 ++++++
 src/mesa/state_tracker/st_atom_texture.c |  6 ++++++
 src/mesa/state_tracker/st_program.h      |  6 ++++++
 src/mesa/state_tracker/st_sampler_view.c | 21 +++++++++++++--------
 4 files changed, 31 insertions(+), 8 deletions(-)

diff --git a/src/mesa/state_tracker/st_atom_sampler.c b/src/mesa/state_tracker/st_atom_sampler.c
index 27e4da315817..9def70c9432a 100644
--- a/src/mesa/state_tracker/st_atom_sampler.c
+++ b/src/mesa/state_tracker/st_atom_sampler.c
@@ -303,10 +303,16 @@ update_shader_samplers(struct st_context *st,
       struct st_texture_object *stObj =
             st_get_texture_object(st->ctx, prog, unit);
       struct pipe_sampler_state *sampler = samplers + unit;
+      struct pipe_screen *pscreen = st->pipe->screen;
 
       if (!stObj)
          continue;
 
+      if (pscreen->is_format_supported(pscreen, st_get_view_format(stObj),
+                                       PIPE_TEXTURE_2D, 0, 0,
+                                       PIPE_BIND_SAMPLER_VIEW))
+         continue;
+
       switch (st_get_view_format(stObj)) {
       case PIPE_FORMAT_NV12:
          /* we need one additional sampler: */
diff --git a/src/mesa/state_tracker/st_atom_texture.c b/src/mesa/state_tracker/st_atom_texture.c
index ce7755f0c588..df84a472e722 100644
--- a/src/mesa/state_tracker/st_atom_texture.c
+++ b/src/mesa/state_tracker/st_atom_texture.c
@@ -174,11 +174,17 @@ update_textures(struct st_context *st,
       GLuint extra = 0;
       struct st_texture_object *stObj =
             st_get_texture_object(st->ctx, prog, unit);
+      struct pipe_screen *pscreen = st->pipe->screen;
       struct pipe_sampler_view tmpl;
 
       if (!stObj)
          continue;
 
+      if (pscreen->is_format_supported(pscreen, st_get_view_format(stObj),
+                                       sampler_views[unit]->target, 0, 0,
+                                       PIPE_BIND_SAMPLER_VIEW))
+         continue;
+
       /* use original view as template: */
       tmpl = *sampler_views[unit];
 
diff --git a/src/mesa/state_tracker/st_program.h b/src/mesa/state_tracker/st_program.h
index f67ea5eb2087..bc5f3e3d9642 100644
--- a/src/mesa/state_tracker/st_program.h
+++ b/src/mesa/state_tracker/st_program.h
@@ -67,6 +67,12 @@ st_get_external_sampler_key(struct st_context *st, struct gl_program *prog)
       unsigned unit = u_bit_scan(&mask);
       struct st_texture_object *stObj =
             st_get_texture_object(st->ctx, prog, unit);
+      struct pipe_screen *pscreen = st->pipe->screen;
+
+      if (pscreen->is_format_supported(pscreen, st_get_view_format(stObj),
+                                       PIPE_TEXTURE_2D, 0, 0,
+                                       PIPE_BIND_SAMPLER_VIEW))
+         continue;
 
       switch (st_get_view_format(stObj)) {
       case PIPE_FORMAT_NV12:
diff --git a/src/mesa/state_tracker/st_sampler_view.c b/src/mesa/state_tracker/st_sampler_view.c
index eb97f2bb6b7d..30dfa20af6b5 100644
--- a/src/mesa/state_tracker/st_sampler_view.c
+++ b/src/mesa/state_tracker/st_sampler_view.c
@@ -471,6 +471,7 @@ get_sampler_view_format(struct st_context *st,
                         const struct st_texture_object *stObj,
                         bool srgb_skip_decode)
 {
+   struct pipe_screen *pscreen = st->pipe->screen;
    enum pipe_format format;
 
    GLenum baseFormat = _mesa_base_tex_image(&stObj->base)->_BaseFormat;
@@ -489,15 +490,19 @@ get_sampler_view_format(struct st_context *st,
    if (srgb_skip_decode)
       format = util_format_linear(format);
 
-   /* Use R8_UNORM for video formats */
-   switch (format) {
-   case PIPE_FORMAT_NV12:
-   case PIPE_FORMAT_IYUV:
-      format = PIPE_FORMAT_R8_UNORM;
-      break;
-   default:
-      break;
+   if (!pscreen->is_format_supported(pscreen, format, PIPE_TEXTURE_2D, 0, 0,
+                                     PIPE_BIND_SAMPLER_VIEW)) {
+      /* Use R8_UNORM for video formats */
+      switch (format) {
+      case PIPE_FORMAT_NV12:
+      case PIPE_FORMAT_IYUV:
+         format = PIPE_FORMAT_R8_UNORM;
+         break;
+      default:
+         break;
+      }
    }
+
    return format;
 }
 
-- 
2.20.1



More information about the mesa-dev mailing list