[Mesa-dev] [PATCH 10/14] st/mesa: add PBO download enable bit and fragment shaders

Nicolai Hähnle nhaehnle at gmail.com
Wed May 18 15:25:40 UTC 2016


From: Nicolai Hähnle <nicolai.haehnle at 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



More information about the mesa-dev mailing list