From: Nicolai Hähnle <nicolai.haeh...@amd.com> For downloads, the fragment shader must know the source texture target, hence we may cache multiple fragment shaders. --- src/mesa/state_tracker/st_context.h | 2 ++ src/mesa/state_tracker/st_pbo.c | 14 ++++++++++++++ 2 files changed, 16 insertions(+)
diff --git a/src/mesa/state_tracker/st_context.h b/src/mesa/state_tracker/st_context.h index 39ea501..a4f56ea 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 5bebfc6..57ff9b0 100644 --- a/src/mesa/state_tracker/st_pbo.c +++ b/src/mesa/state_tracker/st_pbo.c @@ -447,6 +447,11 @@ 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); @@ -471,11 +476,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.7.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev