diff options
author | Nicolai Hähnle <[email protected]> | 2016-04-25 21:56:47 -0500 |
---|---|---|
committer | Nicolai Hähnle <[email protected]> | 2016-06-01 22:37:34 +0200 |
commit | 852d3fcd3b4e0a1612540045f18c46975a49dec6 (patch) | |
tree | d3f6af7cda1639c98444aa302372c93d71ec5909 /src | |
parent | 581c001532fb9890b0f66b8e78ab134a16ae56ce (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')
-rw-r--r-- | src/mesa/state_tracker/st_context.h | 2 | ||||
-rw-r--r-- | src/mesa/state_tracker/st_pbo.c | 15 |
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; |