Mesa (master): st/mesa: add PBO download enable bit and fragment shaders

Nicolai Hähnle nh at kemper.freedesktop.org
Wed Jun 1 20:44:10 UTC 2016


Module: Mesa
Branch: master
Commit: 852d3fcd3b4e0a1612540045f18c46975a49dec6
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=852d3fcd3b4e0a1612540045f18c46975a49dec6

Author: Nicolai Hähnle <nicolai.haehnle at amd.com>
Date:   Mon Apr 25 21:56:47 2016 -0500

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 <brianp at vmware.com>
Reviewed-by: Marek Olšák <marek.olsak at amd.com>

---

 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 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 7cb7453..794a1fc 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;




More information about the mesa-commit mailing list