From 4871128e58402385dc6f920884273c003a1124e1 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Christian=20K=C3=B6nig?= Date: Wed, 25 Sep 2013 13:59:56 +0200 Subject: [PATCH] radeon/winsys: keep screen pointer in winsys v2 MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Only create one screen for each winsys instance. This helps with buffer sharing and interop handling. v2: rebased and some minor cleanup Signed-off-by: Christian König Reviewed-by: Marek Olšák --- src/gallium/drivers/r300/r300_screen.c | 3 +++ src/gallium/drivers/r600/r600_pipe.c | 3 +++ src/gallium/drivers/radeonsi/radeonsi_pipe.c | 3 +++ src/gallium/targets/r300/drm_target.c | 14 ++++++++------ src/gallium/targets/r600/drm_target.c | 14 ++++++++------ src/gallium/targets/radeonsi/drm_target.c | 14 ++++++++------ src/gallium/winsys/radeon/drm/radeon_drm_winsys.c | 4 ---- 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 063bc0922a1..125a1b59520 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 50ff06c9f0d..d86bb18034a 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 138268ca418..16ec51fa63b 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 111abd41856..2c10bbd7bb1 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 c93c4dbe529..28004ac58e2 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 7e124cae129..9eef368529f 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 61f091323f4..4f43093d71d 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 1367982850c..581cd841cd8 100644 --- a/src/gallium/winsys/radeon/drm/radeon_winsys.h +++ b/src/gallium/winsys/radeon/drm/radeon_winsys.h @@ -207,6 +207,11 @@ struct radeon_winsys { */ struct pipe_reference reference; + /** + * The screen object this winsys was created for + */ + struct pipe_screen *screen; + /** * Destroy this winsys. * @@ -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; -- 2.30.2