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