From 827e0d6654a2dba0c2090abde84ccef8c8d8ec7e Mon Sep 17 00:00:00 2001 From: Rob Herring Date: Wed, 23 Jan 2019 16:08:08 -0600 Subject: [PATCH] kmsro: Add etnaviv renderonly support Enable using etnaviv for KMS renderonly. This still needs KMS driver name mapping to kmsro to be used automatically. Acked-by: Eric Anholt Signed-off-by: Rob Herring --- meson.build | 4 +-- src/gallium/meson.build | 12 +++---- src/gallium/winsys/kmsro/drm/Makefile.am | 8 +++++ .../winsys/kmsro/drm/kmsro_drm_winsys.c | 36 ++++++++++++++----- src/gallium/winsys/kmsro/drm/meson.build | 11 ++++-- 5 files changed, 52 insertions(+), 19 deletions(-) diff --git a/meson.build b/meson.build index 2ebce75b13b..344140d6a4a 100644 --- a/meson.build +++ b/meson.build @@ -213,8 +213,8 @@ endif if with_gallium_imx and not with_gallium_etnaviv error('IMX driver requires etnaviv driver') endif -if with_gallium_kmsro and not with_gallium_vc4 - error('kmsro driver requires vc4 driver') +if with_gallium_kmsro and not (with_gallium_vc4 or with_gallium_etnaviv) + error('kmsro driver requires one or more renderonly drivers (vc4, etnaviv)') endif if with_gallium_tegra and not with_gallium_nouveau error('tegra driver requires nouveau driver') diff --git a/src/gallium/meson.build b/src/gallium/meson.build index a3679e5ef62..5b0ce81d1e4 100644 --- a/src/gallium/meson.build +++ b/src/gallium/meson.build @@ -89,6 +89,12 @@ if with_gallium_vc4 else driver_vc4 = declare_dependency() endif +if with_gallium_etnaviv + subdir('winsys/etnaviv/drm') + subdir('drivers/etnaviv') +else + driver_etnaviv = declare_dependency() +endif if with_gallium_kmsro subdir('winsys/kmsro/drm') else @@ -100,12 +106,6 @@ if with_gallium_v3d else driver_v3d = declare_dependency() endif -if with_gallium_etnaviv - subdir('winsys/etnaviv/drm') - subdir('drivers/etnaviv') -else - driver_etnaviv = declare_dependency() -endif if with_gallium_imx subdir('winsys/imx/drm') else diff --git a/src/gallium/winsys/kmsro/drm/Makefile.am b/src/gallium/winsys/kmsro/drm/Makefile.am index ad471d31d4f..0092206539c 100644 --- a/src/gallium/winsys/kmsro/drm/Makefile.am +++ b/src/gallium/winsys/kmsro/drm/Makefile.am @@ -29,6 +29,14 @@ AM_CFLAGS = \ $(GALLIUM_WINSYS_CFLAGS) \ $(LIBDRM_CFLAGS) +if HAVE_GALLIUM_ETNAVIV +AM_CFLAGS += -DGALLIUM_ETNAVIV +endif + +if HAVE_GALLIUM_VC4 +AM_CFLAGS += -DGALLIUM_VC4 +endif + noinst_LTLIBRARIES = libkmsrodrm.la libkmsrodrm_la_SOURCES = $(C_SOURCES) diff --git a/src/gallium/winsys/kmsro/drm/kmsro_drm_winsys.c b/src/gallium/winsys/kmsro/drm/kmsro_drm_winsys.c index 4448150cc0c..e086c0858f0 100644 --- a/src/gallium/winsys/kmsro/drm/kmsro_drm_winsys.c +++ b/src/gallium/winsys/kmsro/drm/kmsro_drm_winsys.c @@ -27,6 +27,7 @@ #include "kmsro_drm_public.h" #include "vc4/drm/vc4_drm_public.h" +#include "etnaviv/drm/etnaviv_drm_public.h" #include "xf86drm.h" #include "pipe/p_screen.h" @@ -34,22 +35,39 @@ struct pipe_screen *kmsro_drm_screen_create(int fd) { + struct pipe_screen *screen = NULL; struct renderonly ro = { + .kms_fd = fd, + .gpu_fd = -1, + }; + +#if defined(GALLIUM_VC4) + ro.gpu_fd = drmOpenWithType("vc4", NULL, DRM_NODE_RENDER); + if (ro.gpu_fd >= 0) { /* Passes the vc4-allocated BO through to the KMS-only DRM device using * PRIME buffer sharing. The VC4 BO must be linear, which the SCANOUT * flag on allocation will have ensured. */ - .create_for_resource = renderonly_create_gpu_import_for_resource, - .kms_fd = fd, - .gpu_fd = drmOpenWithType("vc4", NULL, DRM_NODE_RENDER), - }; + ro.create_for_resource = renderonly_create_gpu_import_for_resource, + screen = vc4_drm_screen_create_renderonly(&ro); + if (!screen) + close(ro.gpu_fd); + + return screen; + } +#endif - if (ro.gpu_fd < 0) - return NULL; +#if defined(GALLIUM_ETNAVIV) + ro.gpu_fd = drmOpenWithType("etnaviv", NULL, DRM_NODE_RENDER); + if (ro.gpu_fd >= 0) { + ro.create_for_resource = renderonly_create_kms_dumb_buffer_for_resource, + screen = etna_drm_screen_create_renderonly(&ro); + if (!screen) + close(ro.gpu_fd); - struct pipe_screen *screen = vc4_drm_screen_create_renderonly(&ro); - if (!screen) - close(ro.gpu_fd); + return screen; + } +#endif return screen; } diff --git a/src/gallium/winsys/kmsro/drm/meson.build b/src/gallium/winsys/kmsro/drm/meson.build index f157982d728..e8c350e081b 100644 --- a/src/gallium/winsys/kmsro/drm/meson.build +++ b/src/gallium/winsys/kmsro/drm/meson.build @@ -18,6 +18,14 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. +kmsro_c_args = [] +if with_gallium_etnaviv + kmsro_c_args += '-DGALLIUM_ETNAVIV' +endif +if with_gallium_vc4 + kmsro_c_args += '-DGALLIUM_VC4' +endif + libkmsrowinsys = static_library( 'kmsrowinsys', files('kmsro_drm_winsys.c'), @@ -25,9 +33,8 @@ libkmsrowinsys = static_library( inc_src, inc_include, inc_gallium, inc_gallium_aux, inc_gallium_winsys, ], - c_args : [c_vis_args], + c_args : [c_vis_args, kmsro_c_args], dependencies: dep_libdrm, - link_with : libvc4winsys, ) driver_kmsro = declare_dependency( -- 2.30.2