aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLingfeng Yang <lfy@google.com>2021-08-06 21:08:07 +0000
committerAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>2021-08-06 21:08:07 +0000
commit678da9fbc2705ed29cd02731c3f404c879370fea (patch)
treec040f04e84716e1fa72adad515152ea4de5f58e1
parent1d9729421e1da56b28aefe8a444cd0877c985008 (diff)
parentf0d3efea3eb607b83268277c587879e821c80fc8 (diff)
downloadgoldfish-opengl-678da9fbc2705ed29cd02731c3f404c879370fea.tar.gz
rcReadColoBufferDMA codegen am: f0d3efea3e
Original change: https://googleplex-android-review.googlesource.com/c/device/generic/goldfish-opengl/+/15474865 Change-Id: Id7d6695c1f0ddefad7f83d408ebd398cbec53d45
-rw-r--r--system/renderControl_enc/renderControl_client_context.cpp1
-rw-r--r--system/renderControl_enc/renderControl_client_context.h1
-rw-r--r--system/renderControl_enc/renderControl_client_proc.h1
-rw-r--r--system/renderControl_enc/renderControl_enc.cpp53
-rw-r--r--system/renderControl_enc/renderControl_entry.cpp7
-rw-r--r--system/renderControl_enc/renderControl_ftable.h1
-rw-r--r--system/renderControl_enc/renderControl_opcodes.h3
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