Skip to content

Commit b61b564

Browse files
committed
Refactor renderer to support multiple buffers simultaneously
1 parent 9c9e533 commit b61b564

File tree

6 files changed

+142
-54
lines changed

6 files changed

+142
-54
lines changed

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

+4-4
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ static int xcallback(int fd, int events, __unused void* data) {
140140
close(conn_fd);
141141
conn_fd = -1;
142142
rendererSetSharedState(NULL);
143-
rendererSetBuffer(NULL);
143+
rendererRemoveAllBuffers();
144144
log(DEBUG, "disconnected");
145145
return 1;
146146
}
@@ -197,8 +197,8 @@ static int xcallback(int fd, int events, __unused void* data) {
197197
LorieBuffer_recvHandleFromUnixSocket(conn_fd, &buffer);
198198
desc = LorieBuffer_description(buffer);
199199
log(INFO, "Received shared buffer width %d height %d format %d", desc->width, desc->height, desc->format);
200-
rendererSetBuffer(buffer);
201-
LorieBuffer_release(buffer);
200+
rendererRemoveAllBuffers();
201+
rendererAddBuffer(buffer);
202202
break;
203203
}
204204
}
@@ -217,7 +217,7 @@ static void connect_(__unused JNIEnv* env, __unused jobject cls, jint fd) {
217217
ALooper_removeFd(ALooper_forThread(), conn_fd);
218218
close(conn_fd);
219219
rendererSetSharedState(NULL);
220-
rendererSetBuffer(NULL);
220+
rendererRemoveAllBuffers();
221221
log(DEBUG, "disconnected");
222222
}
223223

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

+35-8
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
#include <EGL/eglext.h>
1919
#include <GLES2/gl2.h>
2020
#include <GLES2/gl2ext.h>
21-
#include "misc.h"
21+
#include "list.h"
2222
#include "buffer.h"
2323

2424
struct LorieBuffer {
@@ -35,6 +35,7 @@ struct LorieBuffer {
3535

3636
GLuint id;
3737
EGLImage image;
38+
struct xorg_list link;
3839
};
3940

4041
__attribute__((unused))
@@ -96,7 +97,7 @@ int LorieBuffer_createRegion(char const* name, size_t size) {
9697

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

@@ -152,6 +153,7 @@ static LorieBuffer* allocate(int32_t width, int32_t stride, int32_t height, int8
152153
}
153154

154155
*buffer = b;
156+
xorg_list_init(&buffer->link);
155157
return buffer;
156158
}
157159

@@ -177,7 +179,7 @@ __LIBC_HIDDEN__ LorieBuffer* LorieBuffer_allocate(int32_t width, int32_t height,
177179
}
178180

179181
__LIBC_HIDDEN__ LorieBuffer* LorieBuffer_wrapFileDescriptor(int32_t width, int32_t stride, int32_t height, int8_t format, int fd, off_t offset) {
180-
return allocate(width, stride, height, format, LORIEBUFFER_FD, NULL, fd, width * height * sizeof(uint32_t), offset);
182+
return allocate(width, stride, height, format, LORIEBUFFER_FD, NULL, fd, stride * height * sizeof(uint32_t), offset);
181183
}
182184

183185
__LIBC_HIDDEN__ LorieBuffer* LorieBuffer_wrapAHardwareBuffer(AHardwareBuffer* buffer) {
@@ -188,6 +190,8 @@ __LIBC_HIDDEN__ void __LorieBuffer_free(LorieBuffer* buffer) {
188190
if (!buffer)
189191
return;
190192

193+
xorg_list_del(&buffer->link);
194+
191195
if (eglGetCurrentContext())
192196
glDeleteTextures(1, &buffer->id);
193197

@@ -321,10 +325,11 @@ __LIBC_HIDDEN__ void LorieBuffer_recvHandleFromUnixSocket(int socketFd, LorieBuf
321325
}
322326

323327
*ret = buffer;
328+
xorg_list_init(&ret->link);
324329
*outBuffer = ret;
325330
}
326331

327-
void LorieBuffer_attachToGL(LorieBuffer* buffer) {
332+
__LIBC_HIDDEN__ void LorieBuffer_attachToGL(LorieBuffer* buffer) {
328333
const EGLint imageAttributes[] = { EGL_IMAGE_PRESERVED_KHR, EGL_TRUE, EGL_NONE };
329334
if (!eglGetCurrentDisplay() || !buffer)
330335
return;
@@ -348,7 +353,7 @@ void LorieBuffer_attachToGL(LorieBuffer* buffer) {
348353
}
349354
}
350355

351-
void LorieBuffer_bindTexture(LorieBuffer *buffer) {
356+
__LIBC_HIDDEN__ void LorieBuffer_bindTexture(LorieBuffer *buffer) {
352357
if (!buffer)
353358
return;
354359

@@ -357,18 +362,40 @@ void LorieBuffer_bindTexture(LorieBuffer *buffer) {
357362
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, buffer->desc.width, buffer->desc.height, buffer->desc.format == AHARDWAREBUFFER_FORMAT_B8G8R8A8_UNORM ? GL_BGRA_EXT : GL_RGBA, GL_UNSIGNED_BYTE, buffer->desc.data);
358363
}
359364

360-
int LorieBuffer_getWidth(LorieBuffer *buffer) {
365+
__LIBC_HIDDEN__ int LorieBuffer_getWidth(LorieBuffer *buffer) {
361366
return LorieBuffer_description(buffer)->width;
362367
}
363368

364-
int LorieBuffer_getHeight(LorieBuffer *buffer) {
369+
__LIBC_HIDDEN__ int LorieBuffer_getHeight(LorieBuffer *buffer) {
365370
return LorieBuffer_description(buffer)->height;
366371
}
367372

368-
bool LorieBuffer_isRgba(LorieBuffer *buffer) {
373+
__LIBC_HIDDEN__ bool LorieBuffer_isRgba(LorieBuffer *buffer) {
369374
return LorieBuffer_description(buffer)->format != AHARDWAREBUFFER_FORMAT_B8G8R8A8_UNORM;
370375
}
371376

377+
__LIBC_HIDDEN__ void LorieBuffer_addToList(LorieBuffer* _Nullable buffer, struct xorg_list* _Nullable list) {
378+
if (buffer && list)
379+
xorg_list_add(&buffer->link, list);
380+
}
381+
382+
__LIBC_HIDDEN__ void LorieBuffer_removeFromList(LorieBuffer* _Nullable buffer) {
383+
if (buffer)
384+
xorg_list_del(&buffer->link);
385+
}
386+
387+
__LIBC_HIDDEN__ LorieBuffer* _Nullable LorieBufferList_first(struct xorg_list* _Nullable list) {
388+
return xorg_list_is_empty(list) ? NULL : xorg_list_first_entry(list, LorieBuffer, link);
389+
}
390+
391+
__LIBC_HIDDEN__ LorieBuffer* _Nullable LorieBufferList_findById(struct xorg_list* _Nullable list, uint64_t id) {
392+
LorieBuffer *buffer;
393+
xorg_list_for_each_entry(buffer, list, link)
394+
if (buffer->desc.id == id)
395+
return buffer;
396+
return NULL;
397+
}
398+
372399
__LIBC_HIDDEN__ int ancil_send_fd(int sock, int fd) {
373400
char nothing = '!';
374401
struct iovec nothing_ptr = { .iov_base = &nothing, .iov_len = 1 };

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

+36-2
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ enum {
1717
typedef struct {
1818
int32_t width, height, stride;
1919
uint8_t format, type;
20-
unsigned long id;
20+
uint64_t id;
2121
AHardwareBuffer* _Nullable buffer;
2222
void* _Nullable data;
2323
} LorieBuffer_Desc;
@@ -91,7 +91,7 @@ STATIC_INLINE void LorieBuffer_acquire(LorieBuffer* _Nullable buffer) {
9191
*/
9292
STATIC_INLINE void LorieBuffer_release(LorieBuffer* _Nullable buffer) {
9393
void __LorieBuffer_free(LorieBuffer* buffer);
94-
if (buffer && __sync_fetch_and_sub((int*) buffer, 1) == 1) // refcount is the first object in the struct
94+
if (buffer && __sync_fetch_and_sub((int16_t*) buffer, 1) == 1) // refcount is the first object in the struct
9595
__LorieBuffer_free(buffer);
9696
}
9797

@@ -178,6 +178,40 @@ int LorieBuffer_getHeight(LorieBuffer* _Nullable buffer);
178178
*/
179179
bool LorieBuffer_isRgba(LorieBuffer* _Nullable buffer);
180180

181+
struct xorg_list;
182+
183+
/**
184+
* Add the buffer to xorg_list.
185+
*
186+
* @param buffer
187+
* @param list
188+
*/
189+
void LorieBuffer_addToList(LorieBuffer* _Nullable buffer, struct xorg_list* _Nullable list);
190+
191+
/**
192+
* Remove the buffer from xorg_list.
193+
*
194+
* @param buffer
195+
*/
196+
void LorieBuffer_removeFromList(LorieBuffer* _Nullable buffer);
197+
198+
/**
199+
* Get the first buffer in the list.
200+
*
201+
* @param list
202+
* @return buffer if it is present, NULL otherwise.
203+
*/
204+
LorieBuffer* _Nullable LorieBufferList_first(struct xorg_list* _Nullable list);
205+
206+
/**
207+
* Find the buffer with given ID in the list
208+
*
209+
* @param list
210+
* @param id
211+
* @return buffer if it is present, NULL otherwise.
212+
*/
213+
LorieBuffer* _Nullable LorieBufferList_findById(struct xorg_list* _Nullable list, uint64_t id);
214+
181215
#undef STATIC_INLINE
182216

183217
int ancil_send_fd(int sock, int fd);

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

-1
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@ static Bool detectTracer(void)
4747
FILE *fp;
4848
char line[256];
4949
int pid = 0;
50-
Bool detected = FALSE;
5150

5251
fp = fopen("/proc/self/status", "r");
5352
if (!fp)

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

+4-2
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,11 @@ bool lorieConnectionAlive(void);
3737

3838
__unused void rendererInit(JNIEnv* env);
3939
__unused void rendererTestCapabilities(int* legacy_drawing, uint8_t* flip);
40-
__unused void rendererSetBuffer(LorieBuffer* buf);
4140
__unused void rendererSetWindow(ANativeWindow* newWin);
4241
__unused void rendererSetSharedState(struct lorie_shared_server_state* newState);
42+
__unused void rendererAddBuffer(LorieBuffer* buf);
43+
__unused void rendererRemoveBuffer(uint64_t id);
44+
__unused void rendererRemoveAllBuffers(void);
4345

4446
static inline __always_inline void lorie_mutex_lock(pthread_mutex_t* mutex, pid_t* lockingPid) {
4547
// Unfortunately there is no robust mutexes in bionic.
@@ -163,7 +165,7 @@ struct lorie_shared_server_state {
163165
pthread_cond_t cond; // initialized at X server side.
164166

165167
/* ID of root window texture to be drawn. */
166-
unsigned long rootWindowTextureID;
168+
uint64_t rootWindowTextureID;
167169

168170
/* A signal to renderer to update root window texture content from shared fragment if needed */
169171
volatile uint8_t drawRequested;

0 commit comments

Comments
 (0)