For this patch: Reviewed-by: Marek Olšák <marek.ol...@amd.com>
For the rest: Acked-by: Marek Olšák <marek.ol...@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 <deathsim...@vodafone.de> wrote: > From: Christian König <christian.koe...@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.koe...@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@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev