diff options
Diffstat (limited to 'system/renderControl_enc')
7 files changed, 66 insertions, 1 deletions
diff --git a/system/renderControl_enc/renderControl_client_context.cpp b/system/renderControl_enc/renderControl_client_context.cpp index 2b3f0ae4..eb5c921d 100644 --- a/system/renderControl_enc/renderControl_client_context.cpp +++ b/system/renderControl_enc/renderControl_client_context.cpp @@ -74,6 +74,7 @@ int renderControl_client_context_t::initDispatchByName(void *(*getProc)(const ch rcComposeAsyncWithoutPost = (rcComposeAsyncWithoutPost_client_proc_t) getProc("rcComposeAsyncWithoutPost", userData); rcCreateDisplayById = (rcCreateDisplayById_client_proc_t) getProc("rcCreateDisplayById", userData); rcSetDisplayPoseDpi = (rcSetDisplayPoseDpi_client_proc_t) getProc("rcSetDisplayPoseDpi", userData); + rcReadColorBufferDMA = (rcReadColorBufferDMA_client_proc_t) getProc("rcReadColorBufferDMA", userData); return 0; } diff --git a/system/renderControl_enc/renderControl_client_context.h b/system/renderControl_enc/renderControl_client_context.h index cf2f8f05..395e4bbf 100644 --- a/system/renderControl_enc/renderControl_client_context.h +++ b/system/renderControl_enc/renderControl_client_context.h @@ -74,6 +74,7 @@ struct renderControl_client_context_t { rcComposeAsyncWithoutPost_client_proc_t rcComposeAsyncWithoutPost; rcCreateDisplayById_client_proc_t rcCreateDisplayById; rcSetDisplayPoseDpi_client_proc_t rcSetDisplayPoseDpi; + rcReadColorBufferDMA_client_proc_t rcReadColorBufferDMA; 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 2bd5d1fe..2e52898c 100644 --- a/system/renderControl_enc/renderControl_client_proc.h +++ b/system/renderControl_enc/renderControl_client_proc.h @@ -76,6 +76,7 @@ typedef GLint (renderControl_APIENTRY *rcComposeWithoutPost_client_proc_t) (void typedef void (renderControl_APIENTRY *rcComposeAsyncWithoutPost_client_proc_t) (void * ctx, uint32_t, void*); typedef int (renderControl_APIENTRY *rcCreateDisplayById_client_proc_t) (void * ctx, uint32_t); typedef int (renderControl_APIENTRY *rcSetDisplayPoseDpi_client_proc_t) (void * ctx, uint32_t, GLint, GLint, uint32_t, uint32_t, uint32_t); +typedef int (renderControl_APIENTRY *rcReadColorBufferDMA_client_proc_t) (void * ctx, uint32_t, GLint, GLint, GLint, GLint, GLenum, GLenum, void*, uint32_t); #endif diff --git a/system/renderControl_enc/renderControl_enc.cpp b/system/renderControl_enc/renderControl_enc.cpp index 1c544a84..5efed5f2 100644 --- a/system/renderControl_enc/renderControl_enc.cpp +++ b/system/renderControl_enc/renderControl_enc.cpp @@ -2490,6 +2490,58 @@ int rcSetDisplayPoseDpi_enc(void *self , uint32_t displayId, GLint x, GLint y, u return retval; } +int rcReadColorBufferDMA_enc(void *self , uint32_t colorbuffer, GLint x, GLint y, GLint width, GLint height, GLenum format, GLenum type, void* pixels, uint32_t pixels_size) +{ + AEMU_SCOPED_TRACE("rcReadColorBufferDMA encode"); + + 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; + + const unsigned int __size_pixels = pixels_size; + unsigned char *ptr; + unsigned char *buf; + const size_t sizeWithoutChecksum = 8 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + 8 + 4 + 1*4; + const size_t checksumSize = checksumCalculator->checksumByteSize(); + const size_t totalSize = sizeWithoutChecksum + checksumSize; + buf = stream->alloc(totalSize); + ptr = buf; + int tmp = OP_rcReadColorBufferDMA;memcpy(ptr, &tmp, 4); ptr += 4; + memcpy(ptr, &totalSize, 4); ptr += 4; + + memcpy(ptr, &colorbuffer, 4); ptr += 4; + memcpy(ptr, &x, 4); ptr += 4; + memcpy(ptr, &y, 4); ptr += 4; + memcpy(ptr, &width, 4); ptr += 4; + memcpy(ptr, &height, 4); ptr += 4; + memcpy(ptr, &format, 4); ptr += 4; + memcpy(ptr, &type, 4); ptr += 4; + *(uint64_t *)(ptr) = ctx->lockAndWriteDma(pixels, __size_pixels); ptr += 8; + memcpy(ptr, &pixels_size, 4); ptr += 4; + + if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf); + if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize; + + // stream->readback(pixels, __size_pixels); + // if (useChecksum) checksumCalculator->addBuffer(pixels, __size_pixels); + + int 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("rcReadColorBufferDMA: GL communication error, please report this issue to b.android.com.\n"); + abort(); + } + } + return retval; +} + } // namespace renderControl_encoder_context_t::renderControl_encoder_context_t(IOStream *stream, ChecksumCalculator *checksumCalculator) @@ -2561,5 +2613,6 @@ renderControl_encoder_context_t::renderControl_encoder_context_t(IOStream *strea this->rcComposeAsyncWithoutPost = &rcComposeAsyncWithoutPost_enc; this->rcCreateDisplayById = &rcCreateDisplayById_enc; this->rcSetDisplayPoseDpi = &rcSetDisplayPoseDpi_enc; + this->rcReadColorBufferDMA = &rcReadColorBufferDMA_enc; } diff --git a/system/renderControl_enc/renderControl_entry.cpp b/system/renderControl_enc/renderControl_entry.cpp index c58ddf56..5b2bedd6 100644 --- a/system/renderControl_enc/renderControl_entry.cpp +++ b/system/renderControl_enc/renderControl_entry.cpp @@ -69,6 +69,7 @@ extern "C" { void rcComposeAsyncWithoutPost(uint32_t bufferSize, void* buffer); int rcCreateDisplayById(uint32_t displayId); int rcSetDisplayPoseDpi(uint32_t displayId, GLint x, GLint y, uint32_t w, uint32_t h, uint32_t dpi); + int rcReadColorBufferDMA(uint32_t colorbuffer, GLint x, GLint y, GLint width, GLint height, GLenum format, GLenum type, void* pixels, uint32_t pixels_size); }; #ifndef GET_CONTEXT @@ -461,3 +462,9 @@ int rcSetDisplayPoseDpi(uint32_t displayId, GLint x, GLint y, uint32_t w, uint32 return ctx->rcSetDisplayPoseDpi(ctx, displayId, x, y, w, h, dpi); } +int rcReadColorBufferDMA(uint32_t colorbuffer, GLint x, GLint y, GLint width, GLint height, GLenum format, GLenum type, void* pixels, uint32_t pixels_size) +{ + GET_CONTEXT; + return ctx->rcReadColorBufferDMA(ctx, colorbuffer, x, y, width, height, format, type, pixels, pixels_size); +} + diff --git a/system/renderControl_enc/renderControl_ftable.h b/system/renderControl_enc/renderControl_ftable.h index 2adf3bf1..577cbaeb 100644 --- a/system/renderControl_enc/renderControl_ftable.h +++ b/system/renderControl_enc/renderControl_ftable.h @@ -72,6 +72,7 @@ static const struct _renderControl_funcs_by_name { {"rcComposeAsyncWithoutPost", (void*)rcComposeAsyncWithoutPost}, {"rcCreateDisplayById", (void*)rcCreateDisplayById}, {"rcSetDisplayPoseDpi", (void*)rcSetDisplayPoseDpi}, + {"rcReadColorBufferDMA", (void*)rcReadColorBufferDMA}, }; 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 732d3e03..00249d6a 100644 --- a/system/renderControl_enc/renderControl_opcodes.h +++ b/system/renderControl_enc/renderControl_opcodes.h @@ -67,7 +67,8 @@ #define OP_rcComposeAsyncWithoutPost 10061 #define OP_rcCreateDisplayById 10062 #define OP_rcSetDisplayPoseDpi 10063 -#define OP_last 10064 +#define OP_rcReadColorBufferDMA 10064 +#define OP_last 10065 #endif |