Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
Plasma
KWin
Commits
ca23bca8
Commit
ca23bca8
authored
Mar 06, 2021
by
Xaver Hugl
Browse files
Port DrmSurfaceBuffer to drmModeAddFB2
parent
a82be242
Changes
2
Hide whitespace changes
Inline
Side-by-side
src/plugins/platforms/drm/drm_buffer_gbm.cpp
View file @
ca23bca8
...
...
@@ -22,6 +22,7 @@
#include <gbm.h>
// KWaylandServer
#include "KWaylandServer/buffer_interface.h"
#include <drm_fourcc.h>
namespace
KWin
{
...
...
@@ -36,11 +37,7 @@ DrmSurfaceBuffer::DrmSurfaceBuffer(int fd, const std::shared_ptr<GbmSurface> &su
qCWarning
(
KWIN_DRM
)
<<
"Locking front buffer failed"
;
return
;
}
m_size
=
QSize
(
gbm_bo_get_width
(
m_bo
),
gbm_bo_get_height
(
m_bo
));
if
(
drmModeAddFB
(
fd
,
m_size
.
width
(),
m_size
.
height
(),
24
,
32
,
gbm_bo_get_stride
(
m_bo
),
gbm_bo_get_handle
(
m_bo
).
u32
,
&
m_bufferId
)
!=
0
)
{
qCWarning
(
KWIN_DRM
)
<<
"drmModeAddFB failed"
;
}
gbm_bo_set_user_data
(
m_bo
,
this
,
nullptr
);
initialize
();
}
DrmSurfaceBuffer
::
DrmSurfaceBuffer
(
int
fd
,
gbm_bo
*
buffer
,
KWaylandServer
::
BufferInterface
*
bufferInterface
)
...
...
@@ -52,11 +49,7 @@ DrmSurfaceBuffer::DrmSurfaceBuffer(int fd, gbm_bo *buffer, KWaylandServer::Buffe
m_bufferInterface
->
ref
();
connect
(
m_bufferInterface
,
&
KWaylandServer
::
BufferInterface
::
aboutToBeDestroyed
,
this
,
&
DrmSurfaceBuffer
::
clearBufferInterface
);
}
m_size
=
QSize
(
gbm_bo_get_width
(
m_bo
),
gbm_bo_get_height
(
m_bo
));
if
(
drmModeAddFB
(
fd
,
m_size
.
width
(),
m_size
.
height
(),
24
,
32
,
gbm_bo_get_stride
(
m_bo
),
gbm_bo_get_handle
(
m_bo
).
u32
,
&
m_bufferId
)
!=
0
)
{
qCWarning
(
KWIN_DRM
)
<<
"drmModeAddFB failed"
;
}
gbm_bo_set_user_data
(
m_bo
,
this
,
nullptr
);
initialize
();
}
DrmSurfaceBuffer
::~
DrmSurfaceBuffer
()
...
...
@@ -85,4 +78,41 @@ void DrmSurfaceBuffer::clearBufferInterface()
m_bufferInterface
=
nullptr
;
}
void
DrmSurfaceBuffer
::
initialize
()
{
m_size
=
QSize
(
gbm_bo_get_width
(
m_bo
),
gbm_bo_get_height
(
m_bo
));
uint32_t
handles
[
4
]
=
{
};
uint32_t
strides
[
4
]
=
{
};
uint32_t
offsets
[
4
]
=
{
};
uint64_t
modifiers
[
4
]
=
{
};
if
(
gbm_bo_get_handle_for_plane
(
m_bo
,
0
).
s32
!=
-
1
)
{
for
(
int
i
=
0
;
i
<
gbm_bo_get_plane_count
(
m_bo
);
i
++
)
{
handles
[
i
]
=
gbm_bo_get_handle_for_plane
(
m_bo
,
i
).
u32
;
strides
[
i
]
=
gbm_bo_get_stride_for_plane
(
m_bo
,
i
);
offsets
[
i
]
=
gbm_bo_get_offset
(
m_bo
,
i
);
modifiers
[
i
]
=
gbm_bo_get_modifier
(
m_bo
);
}
}
else
{
handles
[
0
]
=
gbm_bo_get_format
(
m_bo
);
strides
[
0
]
=
gbm_bo_get_stride
(
m_bo
);
modifiers
[
0
]
=
DRM_FORMAT_MOD_INVALID
;
}
if
(
modifiers
[
0
]
!=
DRM_FORMAT_MOD_INVALID
)
{
if
(
drmModeAddFB2WithModifiers
(
m_fd
,
m_size
.
width
(),
m_size
.
height
(),
gbm_bo_get_format
(
m_bo
),
handles
,
strides
,
offsets
,
modifiers
,
&
m_bufferId
,
DRM_MODE_FB_MODIFIERS
))
{
qCWarning
(
KWIN_DRM
)
<<
"drmModeAddFB2WithModifiers failed!"
<<
strerror
(
errno
);
}
}
else
{
if
(
drmModeAddFB2
(
m_fd
,
m_size
.
width
(),
m_size
.
height
(),
gbm_bo_get_format
(
m_bo
),
handles
,
strides
,
offsets
,
&
m_bufferId
,
0
))
{
// fallback
if
(
drmModeAddFB
(
m_fd
,
m_size
.
width
(),
m_size
.
height
(),
24
,
32
,
strides
[
0
],
handles
[
0
],
&
m_bufferId
)
!=
0
)
{
qCWarning
(
KWIN_DRM
)
<<
"drmModeAddFB2 and drmModeAddFB both failed!"
<<
strerror
(
errno
);
}
}
}
gbm_bo_set_user_data
(
m_bo
,
this
,
nullptr
);
}
}
src/plugins/platforms/drm/drm_buffer_gbm.h
View file @
ca23bca8
...
...
@@ -57,6 +57,7 @@ private:
KWaylandServer
::
BufferInterface
*
m_bufferInterface
=
nullptr
;
void
clearBufferInterface
();
void
initialize
();
};
}
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment