summaryrefslogtreecommitdiff
path: root/kms++/src/omap
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>2016-12-08 01:44:33 +0200
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2017-04-16 19:12:43 +0300
commitf3a478951ac576c69a5828d80ff23d02e0940b9e (patch)
tree9341af022ea38c2f19100eb59e3243f0f9380424 /kms++/src/omap
parent5610b6440617246972105a93ca6a35c9ed045db4 (diff)
omap: Add support for cached GEM objects
OMAP buffers are mapped to userspace in write-combining mode by default. Add support for cached mappings. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Diffstat (limited to 'kms++/src/omap')
-rw-r--r--kms++/src/omap/omapframebuffer.cpp13
1 files changed, 7 insertions, 6 deletions
diff --git a/kms++/src/omap/omapframebuffer.cpp b/kms++/src/omap/omapframebuffer.cpp
index 312552c..0c8489e 100644
--- a/kms++/src/omap/omapframebuffer.cpp
+++ b/kms++/src/omap/omapframebuffer.cpp
@@ -19,15 +19,15 @@ using namespace std;
namespace kms
{
-OmapFramebuffer::OmapFramebuffer(OmapCard& card, uint32_t width, uint32_t height, const string& fourcc)
- : OmapFramebuffer(card, width, height, FourCCToPixelFormat(fourcc))
+OmapFramebuffer::OmapFramebuffer(OmapCard& card, uint32_t width, uint32_t height, const string& fourcc, bool cached)
+ : OmapFramebuffer(card, width, height, FourCCToPixelFormat(fourcc), cached)
{
}
-OmapFramebuffer::OmapFramebuffer(OmapCard& card, uint32_t width, uint32_t height, PixelFormat format)
+OmapFramebuffer::OmapFramebuffer(OmapCard& card, uint32_t width, uint32_t height, PixelFormat format, bool cached)
: MappedFramebuffer(card, width, height), m_format(format)
{
- Create();
+ Create(cached);
}
OmapFramebuffer::~OmapFramebuffer()
@@ -35,7 +35,7 @@ OmapFramebuffer::~OmapFramebuffer()
Destroy();
}
-void OmapFramebuffer::Create()
+void OmapFramebuffer::Create(bool cached)
{
const PixelFormatInfo& format_info = get_pixel_format_info(m_format);
@@ -49,8 +49,9 @@ void OmapFramebuffer::Create()
uint32_t size = stride * height();
struct drm_omap_gem_new creq = {
.size = { .bytes = size },
- .flags = OMAP_BO_SCANOUT | OMAP_BO_WC,
};
+ creq.flags = (cached ? OMAP_BO_CACHED : OMAP_BO_WC)
+ | OMAP_BO_SCANOUT;
int r = drmIoctl(card().fd(), DRM_IOCTL_OMAP_GEM_NEW, &creq);
if (r)
throw invalid_argument(string("DRM_IOCTL_OMAP_GEM_NEW failed: ") + strerror(errno));