18
18
#include <EGL/eglext.h>
19
19
#include <GLES2/gl2.h>
20
20
#include <GLES2/gl2ext.h>
21
- #include "misc .h"
21
+ #include "list .h"
22
22
#include "buffer.h"
23
23
24
24
struct LorieBuffer {
@@ -35,6 +35,7 @@ struct LorieBuffer {
35
35
36
36
GLuint id ;
37
37
EGLImage image ;
38
+ struct xorg_list link ;
38
39
};
39
40
40
41
__attribute__((unused ))
@@ -96,7 +97,7 @@ int LorieBuffer_createRegion(char const* name, size_t size) {
96
97
97
98
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 ) {
98
99
AHardwareBuffer_Desc desc = {0 };
99
- static unsigned long id = 0 ;
100
+ static uint64_t id = 0 ;
100
101
bool acceptable = (format == AHARDWAREBUFFER_FORMAT_B8G8R8A8_UNORM || format == AHARDWAREBUFFER_FORMAT_R8G8B8X8_UNORM ) && width > 0 && height > 0 ;
101
102
LorieBuffer b = { .desc = { .width = width , .stride = stride , .height = height , .format = format , .type = type , .buffer = buf , .id = id ++ }, .fd = fd , .size = size , .offset = offset };
102
103
@@ -152,6 +153,7 @@ static LorieBuffer* allocate(int32_t width, int32_t stride, int32_t height, int8
152
153
}
153
154
154
155
* buffer = b ;
156
+ xorg_list_init (& buffer -> link );
155
157
return buffer ;
156
158
}
157
159
@@ -177,7 +179,7 @@ __LIBC_HIDDEN__ LorieBuffer* LorieBuffer_allocate(int32_t width, int32_t height,
177
179
}
178
180
179
181
__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 );
181
183
}
182
184
183
185
__LIBC_HIDDEN__ LorieBuffer * LorieBuffer_wrapAHardwareBuffer (AHardwareBuffer * buffer ) {
@@ -188,6 +190,8 @@ __LIBC_HIDDEN__ void __LorieBuffer_free(LorieBuffer* buffer) {
188
190
if (!buffer )
189
191
return ;
190
192
193
+ xorg_list_del (& buffer -> link );
194
+
191
195
if (eglGetCurrentContext ())
192
196
glDeleteTextures (1 , & buffer -> id );
193
197
@@ -321,10 +325,11 @@ __LIBC_HIDDEN__ void LorieBuffer_recvHandleFromUnixSocket(int socketFd, LorieBuf
321
325
}
322
326
323
327
* ret = buffer ;
328
+ xorg_list_init (& ret -> link );
324
329
* outBuffer = ret ;
325
330
}
326
331
327
- void LorieBuffer_attachToGL (LorieBuffer * buffer ) {
332
+ __LIBC_HIDDEN__ void LorieBuffer_attachToGL (LorieBuffer * buffer ) {
328
333
const EGLint imageAttributes [] = { EGL_IMAGE_PRESERVED_KHR , EGL_TRUE , EGL_NONE };
329
334
if (!eglGetCurrentDisplay () || !buffer )
330
335
return ;
@@ -348,7 +353,7 @@ void LorieBuffer_attachToGL(LorieBuffer* buffer) {
348
353
}
349
354
}
350
355
351
- void LorieBuffer_bindTexture (LorieBuffer * buffer ) {
356
+ __LIBC_HIDDEN__ void LorieBuffer_bindTexture (LorieBuffer * buffer ) {
352
357
if (!buffer )
353
358
return ;
354
359
@@ -357,18 +362,40 @@ void LorieBuffer_bindTexture(LorieBuffer *buffer) {
357
362
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 );
358
363
}
359
364
360
- int LorieBuffer_getWidth (LorieBuffer * buffer ) {
365
+ __LIBC_HIDDEN__ int LorieBuffer_getWidth (LorieBuffer * buffer ) {
361
366
return LorieBuffer_description (buffer )-> width ;
362
367
}
363
368
364
- int LorieBuffer_getHeight (LorieBuffer * buffer ) {
369
+ __LIBC_HIDDEN__ int LorieBuffer_getHeight (LorieBuffer * buffer ) {
365
370
return LorieBuffer_description (buffer )-> height ;
366
371
}
367
372
368
- bool LorieBuffer_isRgba (LorieBuffer * buffer ) {
373
+ __LIBC_HIDDEN__ bool LorieBuffer_isRgba (LorieBuffer * buffer ) {
369
374
return LorieBuffer_description (buffer )-> format != AHARDWAREBUFFER_FORMAT_B8G8R8A8_UNORM ;
370
375
}
371
376
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
+
372
399
__LIBC_HIDDEN__ int ancil_send_fd (int sock , int fd ) {
373
400
char nothing = '!' ;
374
401
struct iovec nothing_ptr = { .iov_base = & nothing , .iov_len = 1 };
0 commit comments