diff options
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; |