Add support for modifiers in drm_fbid_from_dmabuf
This commit is contained in:
parent
c7c917e39a
commit
bb205a41b0
1 changed files with 30 additions and 5 deletions
33
src/drm.cpp
33
src/drm.cpp
|
@ -690,19 +690,44 @@ out:
|
||||||
uint32_t drm_fbid_from_dmabuf( struct drm_t *drm, struct wlr_buffer *buf, struct wlr_dmabuf_attributes *dma_buf )
|
uint32_t drm_fbid_from_dmabuf( struct drm_t *drm, struct wlr_buffer *buf, struct wlr_dmabuf_attributes *dma_buf )
|
||||||
{
|
{
|
||||||
uint32_t fb_id = 0;
|
uint32_t fb_id = 0;
|
||||||
uint32_t handles[4] = { 0 };
|
|
||||||
|
uint32_t handles[4];
|
||||||
|
uint64_t modifiers[4];
|
||||||
for ( int i = 0; i < dma_buf->n_planes; i++ ) {
|
for ( int i = 0; i < dma_buf->n_planes; i++ ) {
|
||||||
if ( drmPrimeFDToHandle( drm->fd, dma_buf->fd[i], &handles[i] ) != 0 )
|
if ( drmPrimeFDToHandle( drm->fd, dma_buf->fd[i], &handles[i] ) != 0 )
|
||||||
{
|
{
|
||||||
perror("drmPrimeFDToHandle failed");
|
perror("drmPrimeFDToHandle failed");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* KMS requires all planes to have the same modifier */
|
||||||
|
modifiers[i] = dma_buf->modifier;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( drmModeAddFB2( drm->fd, dma_buf->width, dma_buf->height, dma_buf->format, handles, dma_buf->stride, dma_buf->offset, &fb_id, 0 ) != 0 )
|
if ( dma_buf->modifier != DRM_FORMAT_MOD_INVALID )
|
||||||
{
|
{
|
||||||
perror("drmModeAddFB2 failed");
|
if ( !drm->allow_modifiers )
|
||||||
return 0;
|
{
|
||||||
|
if ( s_drm_log != 0 )
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Canot import DMA-BUF: has a modifier (0x%" PRIX64 ", but KMS doesn't support them\n", dma_buf->modifier);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( drmModeAddFB2WithModifiers( drm->fd, dma_buf->width, dma_buf->height, dma_buf->format, handles, dma_buf->stride, dma_buf->offset, modifiers, &fb_id, 0 ) != 0 )
|
||||||
|
{
|
||||||
|
perror("drmModeAddFB2WithModifiers failed");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ( drmModeAddFB2( drm->fd, dma_buf->width, dma_buf->height, dma_buf->format, handles, dma_buf->stride, dma_buf->offset, &fb_id, 0 ) != 0 )
|
||||||
|
{
|
||||||
|
perror("drmModeAddFB2 failed");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( s_drm_log != 0 )
|
if ( s_drm_log != 0 )
|
||||||
|
|
Loading…
Reference in a new issue