(1/8) renderControl: Add two new methods. GL_ENTRY(uint32_t, rcCreateBuffer, uint32_t size) GL_ENTRY(void, rcCloseBuffer, uint32_t buffer) These are used to support exportable VkBuffers. Change-Id: Ifecf0df0dd8d7f3aee8800aa70585f5b983c0391
diff --git a/system/renderControl_enc/renderControl_client_context.cpp b/system/renderControl_enc/renderControl_client_context.cpp index bf22e55..ca38884 100644 --- a/system/renderControl_enc/renderControl_client_context.cpp +++ b/system/renderControl_enc/renderControl_client_context.cpp
@@ -59,6 +59,8 @@ rcReadColorBufferYUV = (rcReadColorBufferYUV_client_proc_t) getProc("rcReadColorBufferYUV", userData); rcIsSyncSignaled = (rcIsSyncSignaled_client_proc_t) getProc("rcIsSyncSignaled", userData); rcCreateColorBufferWithHandle = (rcCreateColorBufferWithHandle_client_proc_t) getProc("rcCreateColorBufferWithHandle", userData); + rcCreateBuffer = (rcCreateBuffer_client_proc_t) getProc("rcCreateBuffer", userData); + rcCloseBuffer = (rcCloseBuffer_client_proc_t) getProc("rcCloseBuffer", userData); return 0; }
diff --git a/system/renderControl_enc/renderControl_client_context.h b/system/renderControl_enc/renderControl_client_context.h index 7f20e97..c9dc410 100644 --- a/system/renderControl_enc/renderControl_client_context.h +++ b/system/renderControl_enc/renderControl_client_context.h
@@ -59,6 +59,8 @@ rcReadColorBufferYUV_client_proc_t rcReadColorBufferYUV; rcIsSyncSignaled_client_proc_t rcIsSyncSignaled; rcCreateColorBufferWithHandle_client_proc_t rcCreateColorBufferWithHandle; + rcCreateBuffer_client_proc_t rcCreateBuffer; + rcCloseBuffer_client_proc_t rcCloseBuffer; virtual ~renderControl_client_context_t() {} typedef renderControl_client_context_t *CONTEXT_ACCESSOR_TYPE(void);
diff --git a/system/renderControl_enc/renderControl_client_proc.h b/system/renderControl_enc/renderControl_client_proc.h index 53535d6..4192b0e 100644 --- a/system/renderControl_enc/renderControl_client_proc.h +++ b/system/renderControl_enc/renderControl_client_proc.h
@@ -61,6 +61,8 @@ typedef void (renderControl_APIENTRY *rcReadColorBufferYUV_client_proc_t) (void * ctx, uint32_t, GLint, GLint, GLint, GLint, void*, uint32_t); typedef int (renderControl_APIENTRY *rcIsSyncSignaled_client_proc_t) (void * ctx, uint64_t); typedef void (renderControl_APIENTRY *rcCreateColorBufferWithHandle_client_proc_t) (void * ctx, uint32_t, uint32_t, GLenum, uint32_t); +typedef uint32_t (renderControl_APIENTRY *rcCreateBuffer_client_proc_t) (void * ctx, uint32_t); +typedef void (renderControl_APIENTRY *rcCloseBuffer_client_proc_t) (void * ctx, uint32_t); #endif
diff --git a/system/renderControl_enc/renderControl_enc.cpp b/system/renderControl_enc/renderControl_enc.cpp index b352527..b841bf1 100644 --- a/system/renderControl_enc/renderControl_enc.cpp +++ b/system/renderControl_enc/renderControl_enc.cpp
@@ -1901,6 +1901,71 @@ } +uint32_t rcCreateBuffer_enc(void *self , uint32_t size) +{ + + renderControl_encoder_context_t *ctx = (renderControl_encoder_context_t *)self; + IOStream *stream = ctx->m_stream; + ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator; + bool useChecksum = checksumCalculator->getVersion() > 0; + + unsigned char *ptr; + unsigned char *buf; + const size_t sizeWithoutChecksum = 8 + 4; + const size_t checksumSize = checksumCalculator->checksumByteSize(); + const size_t totalSize = sizeWithoutChecksum + checksumSize; + buf = stream->alloc(totalSize); + ptr = buf; + int tmp = OP_rcCreateBuffer;memcpy(ptr, &tmp, 4); ptr += 4; + memcpy(ptr, &totalSize, 4); ptr += 4; + + memcpy(ptr, &size, 4); ptr += 4; + + if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf); + if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize; + + + uint32_t retval; + stream->readback(&retval, 4); + if (useChecksum) checksumCalculator->addBuffer(&retval, 4); + if (useChecksum) { + unsigned char *checksumBufPtr = NULL; + unsigned char checksumBuf[ChecksumCalculator::kMaxChecksumSize]; + if (checksumSize > 0) checksumBufPtr = &checksumBuf[0]; + stream->readback(checksumBufPtr, checksumSize); + if (!checksumCalculator->validate(checksumBufPtr, checksumSize)) { + ALOGE("rcCreateBuffer: GL communication error, please report this issue to b.android.com.\n"); + abort(); + } + } + return retval; +} + +void rcCloseBuffer_enc(void *self , uint32_t buffer) +{ + + renderControl_encoder_context_t *ctx = (renderControl_encoder_context_t *)self; + IOStream *stream = ctx->m_stream; + ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator; + bool useChecksum = checksumCalculator->getVersion() > 0; + + unsigned char *ptr; + unsigned char *buf; + const size_t sizeWithoutChecksum = 8 + 4; + const size_t checksumSize = checksumCalculator->checksumByteSize(); + const size_t totalSize = sizeWithoutChecksum + checksumSize; + buf = stream->alloc(totalSize); + ptr = buf; + int tmp = OP_rcCloseBuffer;memcpy(ptr, &tmp, 4); ptr += 4; + memcpy(ptr, &totalSize, 4); ptr += 4; + + memcpy(ptr, &buffer, 4); ptr += 4; + + if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf); + if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize; + +} + } // namespace renderControl_encoder_context_t::renderControl_encoder_context_t(IOStream *stream, ChecksumCalculator *checksumCalculator) @@ -1957,5 +2022,7 @@ this->rcReadColorBufferYUV = &rcReadColorBufferYUV_enc; this->rcIsSyncSignaled = &rcIsSyncSignaled_enc; this->rcCreateColorBufferWithHandle = &rcCreateColorBufferWithHandle_enc; + this->rcCreateBuffer = &rcCreateBuffer_enc; + this->rcCloseBuffer = &rcCloseBuffer_enc; }
diff --git a/system/renderControl_enc/renderControl_entry.cpp b/system/renderControl_enc/renderControl_entry.cpp index 35876cb..ffa0cdd 100644 --- a/system/renderControl_enc/renderControl_entry.cpp +++ b/system/renderControl_enc/renderControl_entry.cpp
@@ -54,6 +54,8 @@ void rcReadColorBufferYUV(uint32_t colorbuffer, GLint x, GLint y, GLint width, GLint height, void* pixels, uint32_t pixels_size); int rcIsSyncSignaled(uint64_t sync); void rcCreateColorBufferWithHandle(uint32_t width, uint32_t height, GLenum internalFormat, uint32_t handle); + uint32_t rcCreateBuffer(uint32_t size); + void rcCloseBuffer(uint32_t buffer); }; #ifndef GET_CONTEXT @@ -356,3 +358,15 @@ ctx->rcCreateColorBufferWithHandle(ctx, width, height, internalFormat, handle); } +uint32_t rcCreateBuffer(uint32_t size) +{ + GET_CONTEXT; + return ctx->rcCreateBuffer(ctx, size); +} + +void rcCloseBuffer(uint32_t buffer) +{ + GET_CONTEXT; + ctx->rcCloseBuffer(ctx, buffer); +} +
diff --git a/system/renderControl_enc/renderControl_ftable.h b/system/renderControl_enc/renderControl_ftable.h index 165def5..13aebed 100644 --- a/system/renderControl_enc/renderControl_ftable.h +++ b/system/renderControl_enc/renderControl_ftable.h
@@ -57,6 +57,8 @@ {"rcReadColorBufferYUV", (void*)rcReadColorBufferYUV}, {"rcIsSyncSignaled", (void*)rcIsSyncSignaled}, {"rcCreateColorBufferWithHandle", (void*)rcCreateColorBufferWithHandle}, + {"rcCreateBuffer", (void*)rcCreateBuffer}, + {"rcCloseBuffer", (void*)rcCloseBuffer}, }; static const int renderControl_num_funcs = sizeof(renderControl_funcs_by_name) / sizeof(struct _renderControl_funcs_by_name);
diff --git a/system/renderControl_enc/renderControl_opcodes.h b/system/renderControl_enc/renderControl_opcodes.h index 57edad5..f1207f2 100644 --- a/system/renderControl_enc/renderControl_opcodes.h +++ b/system/renderControl_enc/renderControl_opcodes.h
@@ -52,7 +52,9 @@ #define OP_rcReadColorBufferYUV 10046 #define OP_rcIsSyncSignaled 10047 #define OP_rcCreateColorBufferWithHandle 10048 -#define OP_last 10049 +#define OP_rcCreateBuffer 10049 +#define OP_rcCloseBuffer 10050 +#define OP_last 10051 #endif