[Mesa-dev] [PATCH 6/6] winsys/radeon: create only one winsys for each fd

Christian König deathsimple at vodafone.de
Fri Aug 31 01:50:15 PDT 2012


On 30.08.2012 20:06, Marek Olšák wrote:
> Reviewed-by: Marek Olšák <maraeo at gmail.com>
>
> Shouldn't accesses to fd_tab be guarded by a mutex?
Yes probably, but I'm still not sure if this solution to the problem is 
a good idea or not.

That both GLAMOR and GLX end up creating a separate winsys with the same 
fd inside one X-Server looks like a bug itself.

It's just not more than a big ugly hack for a problem that should 
probably be solved in an upper layer.

Christian.

>
> 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