Mesa (main): etnaviv: add etna_lookup_or_create_screen(..)

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri Oct 1 10:22:21 UTC 2021


Module: Mesa
Branch: main
Commit: 8f118b5011020bf379ae8cd502bc4df4c0f1379d
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=8f118b5011020bf379ae8cd502bc4df4c0f1379d

Author: Christian Gmeiner <christian.gmeiner at gmail.com>
Date:   Thu Sep 16 19:42:58 2021 +0200

etnaviv: add etna_lookup_or_create_screen(..)

It is an improved version of etna_drm_screen_create_renderonly(..)
which also needs the gpu fd. Also switch etna_drm_screen_create(..)
and etna_drm_screen_create_renderonly(..) to use the new function.

This follows how other driver's winsys code looks like and fixes a
crash I when running piglit with PIGLIT_PLATFORM="gbm".

Signed-off-by: Christian Gmeiner <christian.gmeiner at gmail.com>
Tested-by: Philipp Zabel p.zabel at pengutronix.de
Reviewed-by: Simon Ser <contact at emersion.fr>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12904>

---

 .../winsys/etnaviv/drm/etnaviv_drm_winsys.c        | 32 ++++++----------------
 1 file changed, 8 insertions(+), 24 deletions(-)

diff --git a/src/gallium/winsys/etnaviv/drm/etnaviv_drm_winsys.c b/src/gallium/winsys/etnaviv/drm/etnaviv_drm_winsys.c
index e0be8810fe0..03dac93741d 100644
--- a/src/gallium/winsys/etnaviv/drm/etnaviv_drm_winsys.c
+++ b/src/gallium/winsys/etnaviv/drm/etnaviv_drm_winsys.c
@@ -28,7 +28,6 @@
 
 #include "util/os_file.h"
 #include "util/u_hash_table.h"
-#include "util/u_memory.h"
 #include "util/u_pointer.h"
 
 #include "etnaviv/etnaviv_screen.h"
@@ -156,8 +155,8 @@ etna_drm_screen_destroy(struct pipe_screen *pscreen)
    }
 }
 
-struct pipe_screen *
-etna_drm_screen_create_renderonly(struct renderonly *ro)
+static struct pipe_screen *
+etna_lookup_or_create_screen(int gpu_fd, struct renderonly *ro)
 {
    struct pipe_screen *pscreen = NULL;
 
@@ -168,11 +167,11 @@ etna_drm_screen_create_renderonly(struct renderonly *ro)
          goto unlock;
    }
 
-   pscreen = util_hash_table_get(fd_tab, intptr_to_pointer(ro->gpu_fd));
+   pscreen = util_hash_table_get(fd_tab, intptr_to_pointer(gpu_fd));
    if (pscreen) {
       etna_screen(pscreen)->refcnt++;
    } else {
-      pscreen = screen_create(ro->gpu_fd, ro);
+      pscreen = screen_create(gpu_fd, ro);
       if (pscreen) {
          int fd = etna_device_fd(etna_screen(pscreen)->dev);
          _mesa_hash_table_insert(fd_tab, intptr_to_pointer(fd), pscreen);
@@ -190,29 +189,14 @@ unlock:
    return pscreen;
 }
 
-static void etnaviv_ro_destroy(struct renderonly *ro)
+struct pipe_screen *
+etna_drm_screen_create_renderonly(struct renderonly *ro)
 {
-   FREE(ro);
+   return etna_lookup_or_create_screen(ro->gpu_fd, ro);
 }
 
 struct pipe_screen *
 etna_drm_screen_create(int fd)
 {
-
-   struct renderonly *ro = CALLOC_STRUCT(renderonly);
-   struct pipe_screen *screen;
-
-   if (!ro)
-      return NULL;
-
-   ro->create_for_resource = renderonly_create_gpu_import_for_resource;
-   ro->destroy = etnaviv_ro_destroy;
-   ro->kms_fd = -1;
-   ro->gpu_fd = fd;
-
-   screen = etna_drm_screen_create_renderonly(ro);
-   if (!screen)
-      FREE(ro);
-
-   return screen;
+   return etna_lookup_or_create_screen(fd, NULL);
 }



More information about the mesa-commit mailing list