Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
77 changes: 42 additions & 35 deletions src/drm.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ uint32_t g_nDRMFormat;
bool g_bRotated;

bool g_bUseLayers;
bool g_bDebugLayers;

static int s_drm_log = 0;

Expand Down Expand Up @@ -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 );
Expand Down Expand Up @@ -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 );
Expand Down
1 change: 1 addition & 0 deletions src/drm.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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 );
Expand Down
5 changes: 4 additions & 1 deletion src/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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':
Expand All @@ -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;
Expand Down