From: Nicolai Hähnle Date: Tue, 26 Apr 2016 02:56:47 +0000 (-0500) Subject: st/mesa: add PBO download enable bit and fragment shaders X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=852d3fcd3b4e0a1612540045f18c46975a49dec6;p=mesa.git st/mesa: add PBO download enable bit and fragment shaders 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 --- 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;