From f47b64f646b8ae9dc674a3fc19f0de40f539d0f6 Mon Sep 17 00:00:00 2001 From: Roman Gilg Date: Wed, 26 Feb 2020 00:47:09 +0100 Subject: [PATCH 1/3] fix: continue layering when fbs available Trying to layer onto planes should be continued when fb ids are set and not the other way around. Here the assert also failed when only having one layer. --- src/drm.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/drm.cpp b/src/drm.cpp index 2c07a42d60..5af6ba8a4b 100644 --- a/src/drm.cpp +++ b/src/drm.cpp @@ -701,8 +701,8 @@ bool drm_can_avoid_composite( struct drm_t *drm, struct Composite_t *pComposite, { liftoff_layer_set_property( drm->lo_layers[ i ], "rotation", DRM_MODE_ROTATE_270); } - - if ( pPipeline->layerBindings[ i ].fbid != 0 ) + + if ( pPipeline->layerBindings[ i ].fbid == 0 ) { return false; } From 96ff20952fd08d4f61ca56320e50dce7e1ef3fcc Mon Sep 17 00:00:00 2001 From: Roman Gilg Date: Wed, 26 Feb 2020 00:38:57 +0100 Subject: [PATCH 2/3] feat: add layer debugging via libliftoff log Activate libliftoff's internal log when layers are enabled and the parameter 'd' is provided. Note: this needs some patches to libliftoff to make the debug readable that I have proposed upstream. --- src/drm.cpp | 9 +++++++-- src/drm.hpp | 1 + src/main.cpp | 5 ++++- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/drm.cpp b/src/drm.cpp index 5af6ba8a4b..aef079ffaf 100644 --- a/src/drm.cpp +++ b/src/drm.cpp @@ -27,6 +27,7 @@ uint32_t g_nDRMFormat; bool g_bRotated; bool g_bUseLayers; +bool g_bDebugLayers; static int s_drm_log = 0; @@ -458,6 +459,10 @@ int init_drm(struct drm_t *drm, const char *device, const char *mode_str, unsign g_nOutputWidth = drm->mode->vdisplay; g_nOutputHeight = drm->mode->hdisplay; } + + if (g_bUseLayers) { + liftoff_log_init(g_bDebugLayers ? LIFTOFF_DEBUG : LIFTOFF_ERROR, NULL); + } drm->lo_device = liftoff_device_create( drm->fd ); drm->lo_output = liftoff_output_create( drm->lo_device, drm->crtc_id ); @@ -701,8 +706,8 @@ bool drm_can_avoid_composite( struct drm_t *drm, struct Composite_t *pComposite, { liftoff_layer_set_property( drm->lo_layers[ i ], "rotation", DRM_MODE_ROTATE_270); } - - if ( pPipeline->layerBindings[ i ].fbid == 0 ) + + if ( pPipeline->layerBindings[ i ].fbid != 0 ) { return false; } diff --git a/src/drm.hpp b/src/drm.hpp index c512f7e1b9..6af589105f 100644 --- a/src/drm.hpp +++ b/src/drm.hpp @@ -86,6 +86,7 @@ extern uint32_t g_nDRMFormat; extern bool g_bUseLayers; extern bool g_bRotated; +extern bool g_bDebugLayers; int init_drm(struct drm_t *drm, const char *device, const char *mode_str, unsigned int vrefresh); int drm_atomic_commit(struct drm_t *drm, struct Composite_t *pComposite, struct VulkanPipeline_t *pPipeline ); diff --git a/src/main.cpp b/src/main.cpp index 51320fd2c0..dfb7f77c24 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -59,7 +59,7 @@ int main(int argc, char **argv) bool bSleepAtStartup = false; - while ((o = getopt (argc, argv, ":R:T:w:h:W:H:r:NSvVecslnb")) != -1) + while ((o = getopt (argc, argv, ":R:T:w:h:W:H:r:NSvVecsdlnb")) != -1) { switch (o) { case 'w': @@ -83,6 +83,9 @@ int main(int argc, char **argv) case 'l': g_bUseLayers = true; break; + case 'd': + g_bDebugLayers = true; + break; case 'n': g_bFilterGameWindow = false; break; From 9fa45f80a85964614a10abc673e2979f13f30860 Mon Sep 17 00:00:00 2001 From: Roman Gilg Date: Wed, 26 Feb 2020 16:22:54 +0100 Subject: [PATCH 3/3] refactor: clean up layers properties loop Restructure the loop a bit to have less code repetition and make it easier to understand. --- src/drm.cpp | 72 +++++++++++++++++++++++++++-------------------------- 1 file changed, 37 insertions(+), 35 deletions(-) diff --git a/src/drm.cpp b/src/drm.cpp index aef079ffaf..4538d9493e 100644 --- a/src/drm.cpp +++ b/src/drm.cpp @@ -698,61 +698,63 @@ bool drm_can_avoid_composite( struct drm_t *drm, struct Composite_t *pComposite, if ( g_bUseLayers == true ) { + for ( int i = 0; i < k_nMaxLayers; i++ ) { if ( i < nLayerCount ) { - if ( g_bRotated ) - { - liftoff_layer_set_property( drm->lo_layers[ i ], "rotation", DRM_MODE_ROTATE_270); - } - - if ( pPipeline->layerBindings[ i ].fbid != 0 ) + if ( pPipeline->layerBindings[ i ].fbid == 0 ) { return false; } + liftoff_layer_set_property( drm->lo_layers[ i ], "FB_ID", pPipeline->layerBindings[ i ].fbid); drm->fbids_in_req.push_back( pPipeline->layerBindings[ i ].fbid ); - - if ( g_bUseLayers == true ) + + liftoff_layer_set_property( drm->lo_layers[ i ], "zpos", pPipeline->layerBindings[ i ].zpos ); + liftoff_layer_set_property( drm->lo_layers[ i ], "alpha", pComposite->layers[ i ].flOpacity * 0xffff); + + if ( pPipeline->layerBindings[ i ].zpos == 0 ) { - liftoff_layer_set_property( drm->lo_layers[ i ], "zpos", pPipeline->layerBindings[ i ].zpos ); - liftoff_layer_set_property( drm->lo_layers[ i ], "alpha", pComposite->layers[ i ].flOpacity * 0xffff); - - if ( pPipeline->layerBindings[ i ].zpos == 0 ) - { - assert( ( pComposite->layers[ i ].flOpacity * 0xffff ) == 0xffff ); - } + assert( ( pComposite->layers[ i ].flOpacity * 0xffff ) == 0xffff ); } - + + const uint16_t srcWidth = pPipeline->layerBindings[ i ].surfaceWidth; + const uint16_t srcHeight = pPipeline->layerBindings[ i ].surfaceHeight; + liftoff_layer_set_property( drm->lo_layers[ i ], "SRC_X", 0); liftoff_layer_set_property( drm->lo_layers[ i ], "SRC_Y", 0); - liftoff_layer_set_property( drm->lo_layers[ i ], "SRC_W", pPipeline->layerBindings[ i ].surfaceWidth << 16); - liftoff_layer_set_property( drm->lo_layers[ i ], "SRC_H", pPipeline->layerBindings[ i ].surfaceHeight << 16); - - if ( g_bRotated ) - { - liftoff_layer_set_property( drm->lo_layers[ i ], "CRTC_X", pComposite->layers[ i ].flOffsetY * -1); - liftoff_layer_set_property( drm->lo_layers[ i ], "CRTC_Y", pComposite->layers[ i ].flOffsetX * -1); - - liftoff_layer_set_property( drm->lo_layers[ i ], "CRTC_H", pPipeline->layerBindings[ i ].surfaceWidth / pComposite->layers[ i ].flScaleX); - liftoff_layer_set_property( drm->lo_layers[ i ], "CRTC_W", pPipeline->layerBindings[ i ].surfaceHeight / pComposite->layers[ i ].flScaleY); - - } - else - { - liftoff_layer_set_property( drm->lo_layers[ i ], "CRTC_X", pComposite->layers[ i ].flOffsetX * -1); - liftoff_layer_set_property( drm->lo_layers[ i ], "CRTC_Y", pComposite->layers[ i ].flOffsetY * -1); - - liftoff_layer_set_property( drm->lo_layers[ i ], "CRTC_W", pPipeline->layerBindings[ i ].surfaceWidth / pComposite->layers[ i ].flScaleX); - liftoff_layer_set_property( drm->lo_layers[ i ], "CRTC_H", pPipeline->layerBindings[ i ].surfaceHeight / pComposite->layers[ i ].flScaleY); + liftoff_layer_set_property( drm->lo_layers[ i ], "SRC_W", srcWidth << 16); + liftoff_layer_set_property( drm->lo_layers[ i ], "SRC_H", srcHeight << 16); + + int32_t crtcX = -pComposite->layers[ i ].flOffsetX; + int32_t crtcY = -pComposite->layers[ i ].flOffsetY; + uint64_t crtcW = srcWidth / pComposite->layers[ i ].flScaleX; + uint64_t crtcH = srcHeight / pComposite->layers[ i ].flScaleY; + + if (g_bRotated) { + const int32_t x = crtcX; + const uint64_t w = crtcW; + crtcX = crtcY; + crtcY = x; + crtcW = crtcH; + crtcH = w; + + liftoff_layer_set_property( drm->lo_layers[ i ], "rotation", DRM_MODE_ROTATE_270); } + + liftoff_layer_set_property( drm->lo_layers[ i ], "CRTC_X", crtcX); + liftoff_layer_set_property( drm->lo_layers[ i ], "CRTC_Y", crtcY); + + liftoff_layer_set_property( drm->lo_layers[ i ], "CRTC_W", crtcW); + liftoff_layer_set_property( drm->lo_layers[ i ], "CRTC_H", crtcH); } else { liftoff_layer_set_property( drm->lo_layers[ i ], "FB_ID", 0 ); } } + } assert( drm->req == nullptr );