[Mesa-dev] [PATCH 6/6] winsys/radeon: create only one winsys for each fd
Marek Olšák
maraeo at gmail.com
Thu Aug 30 11:06:04 PDT 2012
Reviewed-by: Marek Olšák <maraeo at gmail.com>
Shouldn't accesses to fd_tab be guarded by a mutex?
Marek
On Thu, Aug 30, 2012 at 7:00 PM, Christian König
<deathsimple at vodafone.de> wrote:
> Fixing problems with GLAMOR.
>
> Signed-off-by: Christian König <deathsimple at vodafone.de>
> ---
> src/gallium/winsys/radeon/drm/radeon_drm_winsys.c | 38 +++++++++++++++++++--
> src/gallium/winsys/radeon/drm/radeon_winsys.h | 5 +++
> 2 files changed, 41 insertions(+), 2 deletions(-)
>
> diff --git a/src/gallium/winsys/radeon/drm/radeon_drm_winsys.c b/src/gallium/winsys/radeon/drm/radeon_drm_winsys.c
> index c03dd04..33451ab 100644
> --- a/src/gallium/winsys/radeon/drm/radeon_drm_winsys.c
> +++ b/src/gallium/winsys/radeon/drm/radeon_drm_winsys.c
> @@ -37,6 +37,7 @@
>
> #include "pipebuffer/pb_bufmgr.h"
> #include "util/u_memory.h"
> +#include "util/u_hash_table.h"
>
> #include <xf86drm.h>
> #include <stdio.h>
> @@ -89,6 +90,7 @@
> #define RADEON_INFO_TIMESTAMP 0x11
> #endif
>
> +static struct util_hash_table *fd_tab = NULL;
>
> /* Enable/disable feature access for one command stream.
> * If enable == TRUE, return TRUE on success.
> @@ -318,6 +320,10 @@ static void radeon_winsys_destroy(struct radeon_winsys *rws)
> {
> struct radeon_drm_winsys *ws = (struct radeon_drm_winsys*)rws;
>
> + if (!pipe_reference(&ws->base.reference, NULL)) {
> + return;
> + }
> +
> pipe_mutex_destroy(ws->hyperz_owner_mutex);
> pipe_mutex_destroy(ws->cmask_owner_mutex);
>
> @@ -326,6 +332,9 @@ static void radeon_winsys_destroy(struct radeon_winsys *rws)
> if (ws->gen >= R600) {
> radeon_surface_manager_free(ws->surf_man);
> }
> + if (fd_tab) {
> + util_hash_table_remove(fd_tab, intptr_to_pointer(ws->fd));
> + }
> FREE(rws);
> }
>
> @@ -395,14 +404,36 @@ static uint64_t radeon_query_timestamp(struct radeon_winsys *rws)
> return ts;
> }
>
> +static unsigned hash_fd(void *key)
> +{
> + return pointer_to_intptr(key);
> +}
> +
> +static int compare_fd(void *key1, void *key2)
> +{
> + return pointer_to_intptr(key1) != pointer_to_intptr(key2);
> +}
> +
> struct radeon_winsys *radeon_drm_winsys_create(int fd)
> {
> - struct radeon_drm_winsys *ws = CALLOC_STRUCT(radeon_drm_winsys);
> + struct radeon_drm_winsys *ws;
> +
> + if (!fd_tab) {
> + fd_tab = util_hash_table_create(hash_fd, compare_fd);
> + }
> +
> + ws = util_hash_table_get(fd_tab, intptr_to_pointer(fd));
> + if (ws) {
> + pipe_reference(NULL, &ws->base.reference);
> + return &ws->base;
> + }
> +
> + ws = CALLOC_STRUCT(radeon_drm_winsys);
> if (!ws) {
> return NULL;
> }
> -
> ws->fd = fd;
> + util_hash_table_set(fd_tab, intptr_to_pointer(fd), ws);
>
> if (!do_winsys_init(ws))
> goto fail;
> @@ -421,6 +452,9 @@ struct radeon_winsys *radeon_drm_winsys_create(int fd)
> goto fail;
> }
>
> + /* init reference */
> + pipe_reference_init(&ws->base.reference, 1);
> +
> /* Set functions. */
> ws->base.destroy = radeon_winsys_destroy;
> ws->base.query_info = radeon_query_info;
> diff --git a/src/gallium/winsys/radeon/drm/radeon_winsys.h b/src/gallium/winsys/radeon/drm/radeon_winsys.h
> index 4eb57fb..8e4693b 100644
> --- a/src/gallium/winsys/radeon/drm/radeon_winsys.h
> +++ b/src/gallium/winsys/radeon/drm/radeon_winsys.h
> @@ -108,6 +108,11 @@ enum radeon_feature_id {
>
> struct radeon_winsys {
> /**
> + * Reference counting
> + */
> + struct pipe_reference reference;
> +
> + /**
> * Destroy this winsys.
> *
> * \param ws The winsys this function is called from.
> --
> 1.7.9.5
>
> _______________________________________________
> 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