[Mesa-dev] [PATCH] winsys/radeon: Use a single buffer cache manager again
Marek Olšák
maraeo at gmail.com
Thu Oct 16 10:18:49 PDT 2014
Reviewed-by: Marek Olšák <marek.olsak at amd.com>
Marek
On Thu, Oct 16, 2014 at 8:58 AM, Michel Dänzer <michel at daenzer.net> wrote:
> From: Michel Dänzer <michel.daenzer at amd.com>
>
> The trick is to generate a unique buffer usage value for each possible
> combination of domains and flags, with only one bit set each for the
> domains and flags. This ensures pb_check_usage() only returns TRUE when
> the domains and flags the cached buffer was created for exactly match
> the requested ones.
>
> Signed-off-by: Michel Dänzer <michel.daenzer at amd.com>
> ---
> src/gallium/winsys/radeon/drm/radeon_drm_bo.c | 23 +++++++++--------
> src/gallium/winsys/radeon/drm/radeon_drm_winsys.c | 30 ++++++-----------------
> src/gallium/winsys/radeon/drm/radeon_drm_winsys.h | 5 +---
> 3 files changed, 21 insertions(+), 37 deletions(-)
>
> diff --git a/src/gallium/winsys/radeon/drm/radeon_drm_bo.c b/src/gallium/winsys/radeon/drm/radeon_drm_bo.c
> index 9518e53..2cfa43b 100644
> --- a/src/gallium/winsys/radeon/drm/radeon_drm_bo.c
> +++ b/src/gallium/winsys/radeon/drm/radeon_drm_bo.c
> @@ -816,21 +816,24 @@ radeon_winsys_bo_create(struct radeon_winsys *rws,
> memset(&desc, 0, sizeof(desc));
> desc.base.alignment = alignment;
>
> - /* Additional criteria for the cache manager. */
> - desc.base.usage = domain;
> + /* Only set one usage bit each for domains and flags, or the cache manager
> + * might consider different sets of domains / flags compatible
> + */
> + if (domain == RADEON_DOMAIN_VRAM_GTT)
> + desc.base.usage = 1 << 2;
> + else
> + desc.base.usage = domain >> 1;
> + assert(flags < sizeof(desc.base.usage) * 8 - 3);
> + desc.base.usage |= 1 << (flags + 3);
> +
> desc.initial_domains = domain;
> desc.flags = flags;
>
> /* Assign a buffer manager. */
> - assert(flags < RADEON_NUM_CACHE_MANAGERS);
> - if (use_reusable_pool) {
> - if (domain == RADEON_DOMAIN_VRAM)
> - provider = ws->cman_vram[flags];
> - else
> - provider = ws->cman_gtt[flags];
> - } else {
> + if (use_reusable_pool)
> + provider = ws->cman;
> + else
> provider = ws->kman;
> - }
>
> buffer = provider->create_buffer(provider, size, &desc.base);
> if (!buffer)
> diff --git a/src/gallium/winsys/radeon/drm/radeon_drm_winsys.c b/src/gallium/winsys/radeon/drm/radeon_drm_winsys.c
> index c67549e..caba373 100644
> --- a/src/gallium/winsys/radeon/drm/radeon_drm_winsys.c
> +++ b/src/gallium/winsys/radeon/drm/radeon_drm_winsys.c
> @@ -441,7 +441,6 @@ static boolean do_winsys_init(struct radeon_drm_winsys *ws)
> static void radeon_winsys_destroy(struct radeon_winsys *rws)
> {
> struct radeon_drm_winsys *ws = (struct radeon_drm_winsys*)rws;
> - int i;
>
> if (ws->thread) {
> ws->kill_thread = 1;
> @@ -454,10 +453,7 @@ static void radeon_winsys_destroy(struct radeon_winsys *rws)
> pipe_mutex_destroy(ws->cmask_owner_mutex);
> pipe_mutex_destroy(ws->cs_stack_lock);
>
> - for (i = 0; i < RADEON_NUM_CACHE_MANAGERS; i++) {
> - ws->cman_gtt[i]->destroy(ws->cman_gtt[i]);
> - ws->cman_vram[i]->destroy(ws->cman_vram[i]);
> - }
> + ws->cman->destroy(ws->cman);
> ws->kman->destroy(ws->kman);
> if (ws->gen >= DRV_R600) {
> radeon_surface_manager_free(ws->surf_man);
> @@ -644,7 +640,6 @@ PUBLIC struct radeon_winsys *
> radeon_drm_winsys_create(int fd, radeon_screen_create_t screen_create)
> {
> struct radeon_drm_winsys *ws;
> - int i;
>
> pipe_mutex_lock(fd_tab_mutex);
> if (!fd_tab) {
> @@ -674,17 +669,10 @@ radeon_drm_winsys_create(int fd, radeon_screen_create_t screen_create)
> if (!ws->kman)
> goto fail;
>
> - for (i = 0; i < RADEON_NUM_CACHE_MANAGERS; i++) {
> - ws->cman_vram[i] = pb_cache_manager_create(ws->kman, 1000000, 2.0f, 0,
> - ws->info.vram_size / 8);
> - if (!ws->cman_vram[i])
> - goto fail;
> -
> - ws->cman_gtt[i] = pb_cache_manager_create(ws->kman, 1000000, 2.0f, 0,
> - ws->info.gart_size / 8);
> - if (!ws->cman_gtt[i])
> - goto fail;
> - }
> + ws->cman = pb_cache_manager_create(ws->kman, 1000000, 2.0f, 0,
> + (ws->info.vram_size + ws->info.gart_size) / 8);
> + if (!ws->cman)
> + goto fail;
>
> if (ws->gen >= DRV_R600) {
> ws->surf_man = radeon_surface_manager_new(fd);
> @@ -739,12 +727,8 @@ radeon_drm_winsys_create(int fd, radeon_screen_create_t screen_create)
>
> fail:
> pipe_mutex_unlock(fd_tab_mutex);
> - for (i = 0; i < RADEON_NUM_CACHE_MANAGERS; i++) {
> - if (ws->cman_gtt[i])
> - ws->cman_gtt[i]->destroy(ws->cman_gtt[i]);
> - if (ws->cman_vram[i])
> - ws->cman_vram[i]->destroy(ws->cman_vram[i]);
> - }
> + if (ws->cman)
> + ws->cman->destroy(ws->cman);
> if (ws->kman)
> ws->kman->destroy(ws->kman);
> if (ws->surf_man)
> diff --git a/src/gallium/winsys/radeon/drm/radeon_drm_winsys.h b/src/gallium/winsys/radeon/drm/radeon_drm_winsys.h
> index a2adf4b..1e0c632 100644
> --- a/src/gallium/winsys/radeon/drm/radeon_drm_winsys.h
> +++ b/src/gallium/winsys/radeon/drm/radeon_drm_winsys.h
> @@ -41,8 +41,6 @@ enum radeon_generation {
> DRV_SI
> };
>
> -#define RADEON_NUM_CACHE_MANAGERS 8
> -
> struct radeon_drm_winsys {
> struct radeon_winsys base;
> struct pipe_reference reference;
> @@ -60,8 +58,7 @@ struct radeon_drm_winsys {
> uint32_t accel_working2;
>
> struct pb_manager *kman;
> - struct pb_manager *cman_vram[RADEON_NUM_CACHE_MANAGERS];
> - struct pb_manager *cman_gtt[RADEON_NUM_CACHE_MANAGERS];
> + struct pb_manager *cman;
> struct radeon_surface_manager *surf_man;
>
> uint32_t num_cpus; /* Number of CPUs. */
> --
> 2.1.1
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list