diff options
author | Matt Hoosier <matt.hoosier@garmin.com> | 2019-11-15 14:35:50 -0600 |
---|---|---|
committer | Matt Hoosier <matt.hoosier@garmin.com> | 2019-11-18 15:56:57 -0600 |
commit | cc6e6b22af6b962a10eb862986ecbe1f135f2f7d (patch) | |
tree | 023bb4a36c94d7b1ba5290c7fd404d1d1cc075ce /kms++/src | |
parent | f824cccac7311647a8bd22d193d3aac2b961a1dd (diff) |
Allow making extframebuffer and dmabufframebuffer with modifiers
Many GPUs use bandwidth compression or tiling, and this information
must be passed along to KMS when constructing the framebuffer object
around the GEM handle or prime filedescriptor.
Add an vector of modifiers as an optional parameter to both of these
classes.
Bump the minimum required version of libdrm to 2.4.17 to ensure
drmModeAddFB2WithModifiers() is available.
Signed-off-by: Matt Hoosier <matt.hoosier@garmin.com>
Diffstat (limited to 'kms++/src')
-rw-r--r-- | kms++/src/dmabufframebuffer.cpp | 21 | ||||
-rw-r--r-- | kms++/src/extframebuffer.cpp | 14 |
2 files changed, 28 insertions, 7 deletions
diff --git a/kms++/src/dmabufframebuffer.cpp b/kms++/src/dmabufframebuffer.cpp index d36eb89..1e8c914 100644 --- a/kms++/src/dmabufframebuffer.cpp +++ b/kms++/src/dmabufframebuffer.cpp @@ -17,7 +17,7 @@ namespace kms { DmabufFramebuffer::DmabufFramebuffer(Card& card, uint32_t width, uint32_t height, PixelFormat format, - vector<int> fds, vector<uint32_t> pitches, vector<uint32_t> offsets) + vector<int> fds, vector<uint32_t> pitches, vector<uint32_t> offsets, vector<uint64_t> modifiers) : Framebuffer(card, width, height) { int r; @@ -42,6 +42,7 @@ DmabufFramebuffer::DmabufFramebuffer(Card& card, uint32_t width, uint32_t height plane.stride = pitches[i]; plane.offset = offsets[i]; + plane.modifier = modifiers.empty() ? 0 : modifiers[i]; plane.size = plane.stride * height; plane.map = 0; } @@ -50,10 +51,20 @@ DmabufFramebuffer::DmabufFramebuffer(Card& card, uint32_t width, uint32_t height uint32_t bo_handles[4] = { m_planes[0].handle, m_planes[1].handle, m_planes[2].handle, m_planes[3].handle }; pitches.resize(4); offsets.resize(4); - r = drmModeAddFB2(card.fd(), width, height, (uint32_t)format, - bo_handles, pitches.data(), offsets.data(), &id, 0); - if (r) - throw invalid_argument(string("drmModeAddFB2 failed: ") + strerror(errno)); + + if (modifiers.empty()) { + r = drmModeAddFB2(card.fd(), width, height, (uint32_t)format, + bo_handles, pitches.data(), offsets.data(), &id, 0); + if (r) + throw invalid_argument(string("drmModeAddFB2 failed: ") + strerror(errno)); + } + else { + modifiers.resize(4); + r = drmModeAddFB2WithModifiers(card.fd(), width, height, (uint32_t)format, + bo_handles, pitches.data(), offsets.data(), modifiers.data(), &id, DRM_MODE_FB_MODIFIERS); + if (r) + throw invalid_argument(string("drmModeAddFB2WithModifiers failed: ") + strerror(errno)); + } set_id(id); } diff --git a/kms++/src/extframebuffer.cpp b/kms++/src/extframebuffer.cpp index 23aed50..4ea563c 100644 --- a/kms++/src/extframebuffer.cpp +++ b/kms++/src/extframebuffer.cpp @@ -15,7 +15,7 @@ namespace kms { ExtFramebuffer::ExtFramebuffer(Card& card, uint32_t width, uint32_t height, PixelFormat format, - vector<uint32_t> handles, vector<uint32_t> pitches, vector<uint32_t> offsets) + vector<uint32_t> handles, vector<uint32_t> pitches, vector<uint32_t> offsets, vector<uint64_t> modifiers) : Framebuffer(card, width, height) { m_format = format; @@ -33,6 +33,7 @@ ExtFramebuffer::ExtFramebuffer(Card& card, uint32_t width, uint32_t height, Pixe plane.handle = handles[i]; plane.stride = pitches[i]; plane.offset = offsets[i]; + plane.modifier = modifiers.empty() ? 0 : modifiers[i]; plane.size = plane.stride * height; plane.map = 0; } @@ -41,7 +42,16 @@ ExtFramebuffer::ExtFramebuffer(Card& card, uint32_t width, uint32_t height, Pixe handles.resize(4); pitches.resize(4); offsets.resize(4); - int r = drmModeAddFB2(card.fd(), width, height, (uint32_t)format, handles.data(), pitches.data(), offsets.data(), &id, 0); + int r; + + if (modifiers.empty()) { + r = drmModeAddFB2(card.fd(), width, height, (uint32_t)format, handles.data(), pitches.data(), offsets.data(), &id, 0); + } + else { + modifiers.resize(4); + r = drmModeAddFB2WithModifiers(card.fd(), width, height, (uint32_t)format, handles.data(), pitches.data(), offsets.data(), modifiers.data(), &id, DRM_MODE_FB_MODIFIERS); + } + if (r) throw std::invalid_argument(string("Failed to create ExtFramebuffer: ") + strerror(r)); |