diff options
-rw-r--r-- | src/gallium/drivers/r300/r300_screen.c | 3 | ||||
-rw-r--r-- | src/gallium/drivers/r600/r600_pipe.c | 3 | ||||
-rw-r--r-- | src/gallium/drivers/radeonsi/radeonsi_pipe.c | 3 | ||||
-rw-r--r-- | src/gallium/targets/r300/drm_target.c | 14 | ||||
-rw-r--r-- | src/gallium/targets/r600/drm_target.c | 14 | ||||
-rw-r--r-- | src/gallium/targets/radeonsi/drm_target.c | 14 | ||||
-rw-r--r-- | src/gallium/winsys/radeon/drm/radeon_drm_winsys.c | 4 | ||||
-rw-r--r-- | src/gallium/winsys/radeon/drm/radeon_winsys.h | 15 |
8 files changed, 48 insertions, 22 deletions
diff --git a/src/gallium/drivers/r300/r300_screen.c b/src/gallium/drivers/r300/r300_screen.c index 063bc09..125a1b5 100644 --- a/src/gallium/drivers/r300/r300_screen.c +++ b/src/gallium/drivers/r300/r300_screen.c @@ -540,6 +540,9 @@ static void r300_destroy_screen(struct pipe_screen* pscreen) struct r300_screen* r300screen = r300_screen(pscreen); struct radeon_winsys *rws = radeon_winsys(pscreen); + if (rws && !radeon_winsys_unref(rws)) + return; + pipe_mutex_destroy(r300screen->cmask_mutex); if (rws) diff --git a/src/gallium/drivers/r600/r600_pipe.c b/src/gallium/drivers/r600/r600_pipe.c index 50ff06c..d86bb18 100644 --- a/src/gallium/drivers/r600/r600_pipe.c +++ b/src/gallium/drivers/r600/r600_pipe.c @@ -958,6 +958,9 @@ static void r600_destroy_screen(struct pipe_screen* pscreen) if (rscreen == NULL) return; + if (!radeon_winsys_unref(rscreen->b.ws)) + return; + pipe_mutex_destroy(rscreen->aux_context_lock); rscreen->aux_context->destroy(rscreen->aux_context); diff --git a/src/gallium/drivers/radeonsi/radeonsi_pipe.c b/src/gallium/drivers/radeonsi/radeonsi_pipe.c index 138268c..16ec51f 100644 --- a/src/gallium/drivers/radeonsi/radeonsi_pipe.c +++ b/src/gallium/drivers/radeonsi/radeonsi_pipe.c @@ -648,6 +648,9 @@ static void r600_destroy_screen(struct pipe_screen* pscreen) if (rscreen == NULL) return; + if (!radeon_winsys_unref(rscreen->b.ws)) + return; + if (rscreen->fences.bo) { struct r600_fence_block *entry, *tmp; diff --git a/src/gallium/targets/r300/drm_target.c b/src/gallium/targets/r300/drm_target.c index 111abd4..2c10bbd 100644 --- a/src/gallium/targets/r300/drm_target.c +++ b/src/gallium/targets/r300/drm_target.c @@ -28,25 +28,27 @@ #include "target-helpers/inline_debug_helper.h" #include "state_tracker/drm_driver.h" #include "radeon/drm/radeon_drm_public.h" +#include "radeon/drm/radeon_winsys.h" #include "r300/r300_public.h" static struct pipe_screen * create_screen(int fd) { struct radeon_winsys *sws; - struct pipe_screen *screen; sws = radeon_drm_winsys_create(fd); if (!sws) return NULL; - screen = r300_screen_create(sws); - if (!screen) - return NULL; + if (!sws->screen) { + sws->screen = r300_screen_create(sws); + if (!sws->screen) + return NULL; - screen = debug_screen_wrap(screen); + sws->screen = debug_screen_wrap(sws->screen); + } - return screen; + return sws->screen; } DRM_DRIVER_DESCRIPTOR("r300", "radeon", create_screen, NULL) diff --git a/src/gallium/targets/r600/drm_target.c b/src/gallium/targets/r600/drm_target.c index c93c4db..28004ac 100644 --- a/src/gallium/targets/r600/drm_target.c +++ b/src/gallium/targets/r600/drm_target.c @@ -28,24 +28,26 @@ #include "state_tracker/drm_driver.h" #include "target-helpers/inline_debug_helper.h" #include "radeon/drm/radeon_drm_public.h" +#include "radeon/drm/radeon_winsys.h" #include "r600/r600_public.h" static struct pipe_screen *create_screen(int fd) { struct radeon_winsys *radeon; - struct pipe_screen *screen; radeon = radeon_drm_winsys_create(fd); if (!radeon) return NULL; - screen = r600_screen_create(radeon); - if (!screen) - return NULL; + if (!radeon->screen) { + radeon->screen = r600_screen_create(radeon); + if (!radeon->screen) + return NULL; - screen = debug_screen_wrap(screen); + radeon->screen = debug_screen_wrap(radeon->screen); + } - return screen; + return radeon->screen; } static const struct drm_conf_ret throttle_ret = { diff --git a/src/gallium/targets/radeonsi/drm_target.c b/src/gallium/targets/radeonsi/drm_target.c index 7e124ca..9eef368 100644 --- a/src/gallium/targets/radeonsi/drm_target.c +++ b/src/gallium/targets/radeonsi/drm_target.c @@ -28,24 +28,26 @@ #include "state_tracker/drm_driver.h" #include "target-helpers/inline_debug_helper.h" #include "radeon/drm/radeon_drm_public.h" +#include "radeon/drm/radeon_winsys.h" #include "radeonsi/radeonsi_public.h" static struct pipe_screen *create_screen(int fd) { struct radeon_winsys *radeon; - struct pipe_screen *screen; radeon = radeon_drm_winsys_create(fd); if (!radeon) return NULL; - screen = radeonsi_screen_create(radeon); - if (!screen) - return NULL; + if (!radeon->screen) { + radeon->screen = radeonsi_screen_create(radeon); + if (!radeon->screen) + return NULL; - screen = debug_screen_wrap(screen); + radeon->screen = debug_screen_wrap(radeon->screen); + } - return screen; + return radeon->screen; } static const struct drm_conf_ret throttle_ret = { diff --git a/src/gallium/winsys/radeon/drm/radeon_drm_winsys.c b/src/gallium/winsys/radeon/drm/radeon_drm_winsys.c index 61f0913..4f43093 100644 --- a/src/gallium/winsys/radeon/drm/radeon_drm_winsys.c +++ b/src/gallium/winsys/radeon/drm/radeon_drm_winsys.c @@ -424,10 +424,6 @@ 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; - } - if (ws->thread) { ws->kill_thread = 1; pipe_semaphore_signal(&ws->cs_queued); diff --git a/src/gallium/winsys/radeon/drm/radeon_winsys.h b/src/gallium/winsys/radeon/drm/radeon_winsys.h index 1367982..581cd84 100644 --- a/src/gallium/winsys/radeon/drm/radeon_winsys.h +++ b/src/gallium/winsys/radeon/drm/radeon_winsys.h @@ -208,6 +208,11 @@ struct radeon_winsys { struct pipe_reference reference; /** + * The screen object this winsys was created for + */ + struct pipe_screen *screen; + + /** * Destroy this winsys. * * \param ws The winsys this function is called from. @@ -501,6 +506,16 @@ struct radeon_winsys { enum radeon_value_id value); }; +/** + * Decrement the winsys reference count. + * + * \param ws The winsys this function is called for. + */ +static INLINE boolean radeon_winsys_unref(struct radeon_winsys *ws) +{ + return pipe_reference(&ws->reference, NULL); +} + static INLINE void radeon_emit(struct radeon_winsys_cs *cs, uint32_t value) { cs->buf[cs->cdw++] = value; |