summaryrefslogtreecommitdiffstats
path: root/src/mesa/state_tracker
diff options
context:
space:
mode:
authorNicolai Hähnle <[email protected]>2016-04-25 21:56:47 -0500
committerNicolai Hähnle <[email protected]>2016-06-01 22:37:34 +0200
commit852d3fcd3b4e0a1612540045f18c46975a49dec6 (patch)
treed3f6af7cda1639c98444aa302372c93d71ec5909 /src/mesa/state_tracker
parent581c001532fb9890b0f66b8e78ab134a16ae56ce (diff)
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 <[email protected]> Reviewed-by: Marek Olšák <[email protected]>
Diffstat (limited to 'src/mesa/state_tracker')
-rw-r--r--src/mesa/state_tracker/st_context.h2
-rw-r--r--src/mesa/state_tracker/st_pbo.c15
2 files changed, 17 insertions, 0 deletions
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;