[Mesa-dev] [PATCH 4/4] radeon/winsys: keep screen pointer in winsys v2

Christian König deathsimple at vodafone.de
Wed Sep 25 05:31:01 PDT 2013


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



More information about the mesa-dev mailing list