[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