Commit 9d43e618 authored by lionel.g.landwerlin's avatar lionel.g.landwerlin Committed by Commit bot

ui: ozone: drm: synchronize mapped dmabuf with read&write

We're currently starting the synchronization of memory mapped dmabufs only
for reading, which means the driver will not flush the CPU cache on
DMA_BUF_SYNC_END. As a result we tend to see cache lines on platforms
where we don't have an additional cache level like Atom platforms.

BUG=475633
TEST=run chrome on chromeos with --enable-native-gpu-memory-buffers and
     verify we don't have image corruptions when hovering the close/minimize
     buttons

Review-Url: https://codereview.chromium.org/2297783006
Cr-Commit-Position: refs/heads/master@{#417585}
parent e616ac00
...@@ -24,6 +24,8 @@ struct local_dma_buf_sync { ...@@ -24,6 +24,8 @@ struct local_dma_buf_sync {
#define LOCAL_DMA_BUF_SYNC_READ (1 << 0) #define LOCAL_DMA_BUF_SYNC_READ (1 << 0)
#define LOCAL_DMA_BUF_SYNC_WRITE (2 << 0) #define LOCAL_DMA_BUF_SYNC_WRITE (2 << 0)
#define LOCAL_DMA_BUF_SYNC_RW \
(LOCAL_DMA_BUF_SYNC_READ | LOCAL_DMA_BUF_SYNC_WRITE)
#define LOCAL_DMA_BUF_SYNC_START (0 << 2) #define LOCAL_DMA_BUF_SYNC_START (0 << 2)
#define LOCAL_DMA_BUF_SYNC_END (1 << 2) #define LOCAL_DMA_BUF_SYNC_END (1 << 2)
...@@ -39,7 +41,7 @@ namespace { ...@@ -39,7 +41,7 @@ namespace {
void PrimeSyncStart(int dmabuf_fd) { void PrimeSyncStart(int dmabuf_fd) {
struct local_dma_buf_sync sync_start = {0}; struct local_dma_buf_sync sync_start = {0};
sync_start.flags = LOCAL_DMA_BUF_SYNC_START | LOCAL_DMA_BUF_SYNC_READ; sync_start.flags = LOCAL_DMA_BUF_SYNC_START | LOCAL_DMA_BUF_SYNC_RW;
if (drmIoctl(dmabuf_fd, LOCAL_DMA_BUF_IOCTL_SYNC, &sync_start)) if (drmIoctl(dmabuf_fd, LOCAL_DMA_BUF_IOCTL_SYNC, &sync_start))
PLOG(ERROR) << "Failed DMA_BUF_SYNC_START"; PLOG(ERROR) << "Failed DMA_BUF_SYNC_START";
} }
...@@ -47,7 +49,7 @@ void PrimeSyncStart(int dmabuf_fd) { ...@@ -47,7 +49,7 @@ void PrimeSyncStart(int dmabuf_fd) {
void PrimeSyncEnd(int dmabuf_fd) { void PrimeSyncEnd(int dmabuf_fd) {
struct local_dma_buf_sync sync_end = {0}; struct local_dma_buf_sync sync_end = {0};
sync_end.flags = LOCAL_DMA_BUF_SYNC_END | LOCAL_DMA_BUF_SYNC_WRITE; sync_end.flags = LOCAL_DMA_BUF_SYNC_END | LOCAL_DMA_BUF_SYNC_RW;
if (drmIoctl(dmabuf_fd, LOCAL_DMA_BUF_IOCTL_SYNC, &sync_end)) if (drmIoctl(dmabuf_fd, LOCAL_DMA_BUF_IOCTL_SYNC, &sync_end))
PLOG(ERROR) << "Failed DMA_BUF_SYNC_END"; PLOG(ERROR) << "Failed DMA_BUF_SYNC_END";
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment