Skip to content

Commit 972b648

Browse files
committed
Make LorieBuffer manage all kinds of pixmaps.
1 parent 73f2f99 commit 972b648

File tree

3 files changed

+28
-31
lines changed

3 files changed

+28
-31
lines changed

app/src/main/cpp/lorie/InitOutput.c

Lines changed: 16 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -124,8 +124,7 @@ static char *xstartup = NULL;
124124

125125
typedef struct {
126126
LorieBuffer *buffer;
127-
AHardwareBuffer* ahb;
128-
uint8_t flipped;
127+
bool flipped, imported;
129128
void *locked;
130129
void *mem;
131130
} LoriePixmapPriv;
@@ -806,11 +805,10 @@ void *lorieCreatePixmap(__unused ScreenPtr pScreen, int width, int height, __unu
806805
void lorieExaDestroyPixmap(__unused ScreenPtr pScreen, void *driverPriv) {
807806
LoriePixmapPriv *priv = driverPriv;
808807
if (priv->buffer) {
809-
LorieBuffer_unlock(priv->buffer);
808+
if (!priv->imported)
809+
LorieBuffer_unlock(priv->buffer);
810810
LorieBuffer_release(priv->buffer);
811811
}
812-
if (priv->ahb)
813-
AHardwareBuffer_release(priv->ahb);
814812
free(priv);
815813
}
816814

@@ -826,8 +824,8 @@ Bool loriePrepareAccess(PixmapPtr pPix, int index) {
826824
if (index == EXA_PREPARE_DEST && pScreenPtr->GetScreenPixmap(pScreenPtr) == pPix)
827825
lorie_mutex_lock(&pvfb->state->lock, &pvfb->state->lockingPid);
828826

829-
if (priv->ahb) {
830-
if (AHardwareBuffer_lock(priv->ahb, AHARDWAREBUFFER_USAGE_CPU_READ_OFTEN | AHARDWAREBUFFER_USAGE_CPU_WRITE_OFTEN, -1, NULL, &pPix->devPrivate.ptr))
827+
if (priv->imported) {
828+
if (LorieBuffer_lock(priv->buffer, &pPix->devPrivate.ptr))
831829
return FALSE;
832830
} else
833831
pPix->devPrivate.ptr = priv->locked ?: priv->mem ?: priv + 1;
@@ -839,8 +837,8 @@ void lorieFinishAccess(PixmapPtr pPix, int index) {
839837
if (index == EXA_PREPARE_DEST && pScreenPtr->GetScreenPixmap(pScreenPtr) == pPix)
840838
lorie_mutex_unlock(&pvfb->state->lock, &pvfb->state->lockingPid);
841839

842-
if (priv->ahb)
843-
AHardwareBuffer_unlock(priv->ahb, NULL);
840+
if (priv->imported)
841+
LorieBuffer_unlock(priv->buffer);
844842
}
845843

846844
static ExaDriverRec lorieExa = {
@@ -863,7 +861,6 @@ static PixmapPtr loriePixmapFromFds(ScreenPtr screen, CARD8 num_fds, const int *
863861
AHardwareBuffer_Desc desc = {0};
864862
PixmapPtr pixmap = NullPixmap;
865863
LoriePixmapPriv *priv = NULL;
866-
void *addr = NULL;
867864

868865
check(num_fds > 1, "DRI3: More than 1 fd");
869866
check(modifier != RAW_MMAPPABLE_FD && modifier != AHARDWAREBUFFER_SOCKET_FD && modifier != AHARDWAREBUFFER_FLIPPED_SOCKET_FD &&
@@ -875,14 +872,16 @@ static PixmapPtr loriePixmapFromFds(ScreenPtr screen, CARD8 num_fds, const int *
875872
priv = exaGetPixmapDriverPrivate(pixmap);
876873
check(!priv, "DRI3: failed to obtain pixmap private");
877874

875+
priv->imported = true;
876+
878877
if (modifier == DRM_FORMAT_MOD_INVALID || modifier == RAW_MMAPPABLE_FD) {
879-
addr = mmap(NULL, strides[0] * height, PROT_READ, MAP_SHARED, fds[0], offsets[0]);
880-
check(!addr || addr == MAP_FAILED, "DRI3: RAW_MMAPPABLE_FD: mmap failed");
881-
screen->ModifyPixmapHeader(pixmap, width, height, 0, 0, strides[0], addr);
878+
check(!(priv->buffer = LorieBuffer_wrapFileDescriptor(width, height, AHARDWAREBUFFER_FORMAT_B8G8R8A8_UNORM, fds[0], offsets[0])), "DRI3: LorieBuffer_wrapAHardwareBuffer failed.");
879+
screen->ModifyPixmapHeader(pixmap, width, height, 0, 0, strides[0], NULL);
882880
return pixmap;
883881
}
884882

885883
if (modifier == AHARDWAREBUFFER_SOCKET_FD || modifier == AHARDWAREBUFFER_FLIPPED_SOCKET_FD) {
884+
AHardwareBuffer* buffer;
886885
struct stat info;
887886
uint8_t buf = 1;
888887
int r;
@@ -892,27 +891,22 @@ static PixmapPtr loriePixmapFromFds(ScreenPtr screen, CARD8 num_fds, const int *
892891
check(!S_ISSOCK(info.st_mode), "DRI3: modifier is AHARDWAREBUFFER_SOCKET_FD but fd is not a socket");
893892
// Sending signal to other end of socket to send buffer.
894893
check(write(fds[0], &buf, 1) != 1, "DRI3: AHARDWAREBUFFER_SOCKET_FD: failed to write to socket: %s", strerror(errno));
895-
check((r = AHardwareBuffer_recvHandleFromUnixSocket(fds[0], &priv->ahb)) != 0,
894+
check((r = AHardwareBuffer_recvHandleFromUnixSocket(fds[0], &buffer)) != 0,
896895
"DRI3: AHARDWAREBUFFER_SOCKET_FD: failed to obtain AHardwareBuffer from socket: %d", r);
897-
check(!priv->ahb, "DRI3: AHARDWAREBUFFER_SOCKET_FD: did not receive AHardwareSocket from buffer");
898-
AHardwareBuffer_describe(priv->ahb, &desc);
896+
check(!buffer, "DRI3: AHARDWAREBUFFER_SOCKET_FD: did not receive AHardwareSocket from buffer");
897+
AHardwareBuffer_describe(buffer, &desc);
899898
check(desc.format != AHARDWAREBUFFER_FORMAT_R8G8B8X8_UNORM
900899
&& desc.format != AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM
901900
&& desc.format != AHARDWAREBUFFER_FORMAT_B8G8R8A8_UNORM,
902901
"DRI3: AHARDWAREBUFFER_SOCKET_FD: wrong format of AHardwareBuffer. Must be one of: AHARDWAREBUFFER_FORMAT_R8G8B8X8_UNORM, AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM, AHARDWAREBUFFER_FORMAT_B8G8R8A8_UNORM (stands for 5).");
902+
check(!(priv->buffer = LorieBuffer_wrapAHardwareBuffer(buffer)), "DRI3: LorieBuffer_wrapAHardwareBuffer failed.");
903903

904904
screen->ModifyPixmapHeader(pixmap, desc.width, desc.height, 0, 0, desc.stride * 4, NULL);
905905
}
906906

907907
return pixmap;
908908

909909
fail:
910-
if (priv && priv->ahb) {
911-
AHardwareBuffer_release(priv->ahb);
912-
priv->ahb = NULL;
913-
}
914-
if (addr)
915-
munmap(addr, strides[0] * height);
916910
if (pixmap)
917911
screen->DestroyPixmap(pixmap);
918912

app/src/main/cpp/lorie/buffer.c

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ struct LorieBuffer {
3131
// file descriptor of shared memory fragment for shared memory backed buffer
3232
int fd;
3333
size_t size;
34+
off_t offset;
3435

3536
GLuint id;
3637
EGLImage image;
@@ -93,12 +94,12 @@ int LorieBuffer_createRegion(char const* name, size_t size) {
9394
}
9495
#pragma clang diagnostic pop
9596

96-
static LorieBuffer* allocate(int32_t width, int32_t height, int8_t format, int8_t type, AHardwareBuffer *buf, int fd, size_t size) {
97+
static LorieBuffer* allocate(int32_t width, int32_t height, int8_t format, int8_t type, AHardwareBuffer *buf, int fd, size_t size, off_t offset) {
9798
AHardwareBuffer_Desc desc = {0};
9899
bool acceptable = (format == AHARDWAREBUFFER_FORMAT_B8G8R8A8_UNORM || format == AHARDWAREBUFFER_FORMAT_R8G8B8X8_UNORM) && width > 0 && height > 0;
99-
LorieBuffer b = { .desc = { .width = width, .stride = width, .height = height, .format = format, .type = type, .buffer = buf }, .fd = fd, .size = size };
100+
LorieBuffer b = { .desc = { .width = width, .stride = width, .height = height, .format = format, .type = type, .buffer = buf }, .fd = fd, .size = size, .offset = offset };
100101

101-
if (format != LORIEBUFFER_AHARDWAREBUFFER && !acceptable)
102+
if (type != LORIEBUFFER_AHARDWAREBUFFER && !acceptable)
102103
return NULL;
103104

104105
__sync_fetch_and_add(&b.refcount, 1);
@@ -113,7 +114,7 @@ static LorieBuffer* allocate(int32_t width, int32_t height, int8_t format, int8_
113114
if (b.fd < 0)
114115
return NULL;
115116

116-
b.desc.data = mmap(NULL, b.size, PROT_READ|PROT_WRITE, MAP_SHARED, b.fd, 0);
117+
b.desc.data = mmap(NULL, b.size, PROT_READ|PROT_WRITE, MAP_SHARED, b.fd, b.offset);
117118
if (b.desc.data == NULL || b.desc.data == MAP_FAILED) {
118119
close(b.fd);
119120
return NULL;
@@ -171,15 +172,15 @@ __LIBC_HIDDEN__ LorieBuffer* LorieBuffer_allocate(int32_t width, int32_t height,
171172
dprintf(2, "FATAL: failed to allocate AHardwareBuffer (width %d height %d format %d): error %d\n", width, height, format, err);
172173
}
173174

174-
return allocate(width, height, format, type, ahardwarebuffer, fd, size);
175+
return allocate(width, height, format, type, ahardwarebuffer, fd, size, 0);
175176
}
176177

177-
__LIBC_HIDDEN__ LorieBuffer* LorieBuffer_wrapFileDescriptor(int32_t width, int32_t height, int8_t format, int fd) {
178-
return allocate(width, height, format, LORIEBUFFER_FD, NULL, fd, width * height * sizeof(uint32_t));
178+
__LIBC_HIDDEN__ LorieBuffer* LorieBuffer_wrapFileDescriptor(int32_t width, int32_t height, int8_t format, int fd, off_t offset) {
179+
return allocate(width, height, format, LORIEBUFFER_FD, NULL, fd, width * height * sizeof(uint32_t), offset);
179180
}
180181

181182
__LIBC_HIDDEN__ LorieBuffer* LorieBuffer_wrapAHardwareBuffer(AHardwareBuffer* buffer) {
182-
return allocate(0, 0, 0, LORIEBUFFER_AHARDWAREBUFFER, buffer, -1, 0);
183+
return allocate(0, 0, 0, LORIEBUFFER_AHARDWAREBUFFER, buffer, -1, 0, 0);
183184
}
184185

185186
__LIBC_HIDDEN__ void __LorieBuffer_free(LorieBuffer* buffer) {

app/src/main/cpp/lorie/buffer.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,11 @@ LorieBuffer* LorieBuffer_allocate(int32_t width, int32_t height, int8_t format,
5252
* @param height height of buffer.
5353
* @param format format of buffer. Accepts AHARDWAREBUFFER_FORMAT_B8G8R8A8_UNORM or AHARDWAREBUFFER_FORMAT_R8G8B8X8_UNORM
5454
* @param fd file descriptor of buffer.
55+
* @param size size of memory fragment.
56+
* @param offset offset inside memory fragment.
5557
* @return
5658
*/
57-
LorieBuffer* LorieBuffer_wrapFileDescriptor(int32_t width, int32_t height, int8_t format, int fd);
59+
LorieBuffer* LorieBuffer_wrapFileDescriptor(int32_t width, int32_t height, int8_t format, int fd, off_t offset);
5860

5961
/**
6062
* Wraps given AHardwareBuffer into LorieBuffer.

0 commit comments

Comments
 (0)