From 852d3fcd3b4e0a1612540045f18c46975a49dec6 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Nicolai=20H=C3=A4hnle?= Date: Mon, 25 Apr 2016 21:56:47 -0500 Subject: [PATCH] st/mesa: add PBO download enable bit and fragment shaders MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit For downloads, the fragment shader must know the source texture target, hence we may cache multiple fragment shaders. v2: break long line (Marek) Reviewed-by: Brian Paul Reviewed-by: Marek Olšák --- src/mesa/state_tracker/st_context.h | 2 ++ src/mesa/state_tracker/st_pbo.c | 15 +++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/src/mesa/state_tracker/st_context.h b/src/mesa/state_tracker/st_context.h index 39ea501d93d..a4f56eac7f8 100644 --- a/src/mesa/state_tracker/st_context.h +++ b/src/mesa/state_tracker/st_context.h @@ -240,7 +240,9 @@ struct st_context void *vs; void *gs; void *upload_fs; + void *download_fs[PIPE_MAX_TEXTURE_TYPES]; bool upload_enabled; + bool download_enabled; bool rgba_only; bool layers; bool use_gs; diff --git a/src/mesa/state_tracker/st_pbo.c b/src/mesa/state_tracker/st_pbo.c index 7cb74530ccd..794a1fcbf6c 100644 --- a/src/mesa/state_tracker/st_pbo.c +++ b/src/mesa/state_tracker/st_pbo.c @@ -448,6 +448,12 @@ st_init_pbo_helpers(struct st_context *st) if (!st->pbo.upload_enabled) return; + st->pbo.download_enabled = + st->pbo.upload_enabled && + screen->get_param(screen, PIPE_CAP_FRAMEBUFFER_NO_ATTACHMENT) && + screen->get_shader_param(screen, PIPE_SHADER_FRAGMENT, + PIPE_SHADER_CAP_MAX_SHADER_IMAGES) >= 1; + st->pbo.rgba_only = screen->get_param(screen, PIPE_CAP_BUFFER_SAMPLER_VIEW_RGBA_ONLY); @@ -472,11 +478,20 @@ st_init_pbo_helpers(struct st_context *st) void st_destroy_pbo_helpers(struct st_context *st) { + unsigned i; + if (st->pbo.upload_fs) { cso_delete_fragment_shader(st->cso_context, st->pbo.upload_fs); st->pbo.upload_fs = NULL; } + for (i = 0; i < ARRAY_SIZE(st->pbo.download_fs); ++i) { + if (st->pbo.download_fs[i]) { + cso_delete_fragment_shader(st->cso_context, st->pbo.download_fs[i]); + st->pbo.download_fs[i] = NULL; + } + } + if (st->pbo.gs) { cso_delete_geometry_shader(st->cso_context, st->pbo.gs); st->pbo.gs = NULL; -- 2.30.2