[Mesa-dev] [PATCH 4/4] radeon/winsys: keep screen pointer in winsys v2
Marek Olšák
maraeo at gmail.com
Wed Sep 25 09:44:30 PDT 2013
For this patch:
Reviewed-by: Marek Olšák <marek.olsak at amd.com>
For the rest:
Acked-by: Marek Olšák <marek.olsak at amd.com>
I don't know much about the build system, so I can't say if the
patches are correct. If all the targets build successfully, then it's
probably fine.
Marek
On Wed, Sep 25, 2013 at 2:31 PM, Christian König
<deathsimple at vodafone.de> wrote:
> From: Christian König <christian.koenig at amd.com>
>
> 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 <christian.koenig at amd.com>
> ---
> 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 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;
> --
> 1.8.1.2
>
> _______________________________________________
> 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