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.st...@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 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev