diff --git a/src/drm.cpp b/src/drm.cpp index 2c07a42d60..4538d9493e 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 ); @@ -693,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 ); 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;