vnc: Use CpuConsumer
There's no need to use a GLConsumer unless we really want to draw
on the surface or send it to a hardware encoder. Get rid of all
this stuff and just use CpuConsumer.
diff --git a/src/VirtualDisplay.cpp b/src/VirtualDisplay.cpp
index b44c64c..27cc00e 100644
--- a/src/VirtualDisplay.cpp
+++ b/src/VirtualDisplay.cpp
@@ -106,10 +106,10 @@
Rect displayRect(offX, offY, offX + outWidth, offY + outHeight);
if (mRotate) {
- printf("Rotated content area is %ux%u at offset x=%d y=%d\n",
+ ALOGV("Rotated content area is %ux%u at offset x=%d y=%d\n",
outHeight, outWidth, offY, offX);
} else {
- printf("Content area is %ux%u at offset x=%d y=%d\n",
+ ALOGV("Content area is %ux%u at offset x=%d y=%d\n",
outWidth, outHeight, offX, offY);
}
@@ -123,6 +123,7 @@
Mutex::Autolock _l(mMutex);
+ ALOGV("Orientation: %d", mainDpyInfo.orientation);
mRotate = isDeviceRotated(mainDpyInfo.orientation);
mWidth = mRotate ? mainDpyInfo.h : mainDpyInfo.w;
mHeight = mRotate ? mainDpyInfo.w : mainDpyInfo.h;
@@ -195,51 +196,14 @@
status_t VirtualDisplay::setup_l() {
status_t err;
- err = mEglWindow.createPbuffer(mWidth, mHeight);
- if (err != NO_ERROR) {
- return err;
- }
- mEglWindow.makeCurrent();
-
- glViewport(0, 0, mWidth, mHeight);
- glDisable(GL_DEPTH_TEST);
- glDisable(GL_CULL_FACE);
-
- // Shader for rendering the external texture.
- err = mExtTexProgram.setup(Program::PROGRAM_EXTERNAL_TEXTURE);
- if (err != NO_ERROR) {
- return err;
- }
-
- // Input side (buffers from virtual display).
- glGenTextures(1, &mExtTextureName);
- if (mExtTextureName == 0) {
- ALOGE("glGenTextures failed: %#x", glGetError());
- return UNKNOWN_ERROR;
- }
-
- mBufSize = mWidth * mHeight * kGlBytesPerPixel;
-
- // pixel buffer for image copy
- mPBO = new GLuint[NUM_PBO];
- glGenBuffers(NUM_PBO, mPBO);
-
- for (unsigned int i = 0; i < NUM_PBO; i++) {
- glBindBuffer(GL_PIXEL_PACK_BUFFER, mPBO[i]);
- glBufferData(GL_PIXEL_PACK_BUFFER, mBufSize, 0, GL_DYNAMIC_READ);
- glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
- }
-
sp<IGraphicBufferConsumer> consumer;
BufferQueue::createBufferQueue(&mProducer, &consumer);
- mGlConsumer = new GLConsumer(consumer, mExtTextureName,
- GL_TEXTURE_EXTERNAL_OES, true, false);
- mGlConsumer->setName(String8("virtual display"));
- mGlConsumer->setDefaultBufferSize(mWidth, mHeight);
+ mCpuConsumer = new CpuConsumer(consumer, 1);
+ mCpuConsumer->setName(String8("vds-to-cpu"));
+ mCpuConsumer->setDefaultBufferSize(mWidth, mHeight);
mProducer->setMaxDequeuedBufferCount(4);
- mGlConsumer->setConsumerUsageBits(GRALLOC_USAGE_HW_TEXTURE);
- mGlConsumer->setFrameAvailableListener(this);
+ mCpuConsumer->setFrameAvailableListener(this);
ALOGD("VirtualDisplay::setup_l OK");
return NO_ERROR;
@@ -248,60 +212,42 @@
void* VirtualDisplay::processFrame_l() {
ALOGD("processFrame_l\n");
- float texMatrix[16];
- mGlConsumer->updateTexImage();
- mGlConsumer->getTransformMatrix(texMatrix);
+ mUpdateMutex->lock();
- int64_t startWhen, blitWhen, readWhen, mapWhen, memcpyWhen, markWhen;
- startWhen = systemTime(CLOCK_MONOTONIC);
-
- // The data is in an external texture, so we need to render it to the
- // pbuffer to get access to RGB pixel data. We also want to flip it
- // upside-down for easy conversion to a bitmap.
- int width = mEglWindow.getWidth();
- int height = mEglWindow.getHeight();
- mExtTexProgram.blit(mExtTextureName, texMatrix, 0, 0, mWidth, mHeight, true);
-
- blitWhen = systemTime(CLOCK_MONOTONIC);
-
- GLenum glErr;
- glBindBuffer(GL_PIXEL_PACK_BUFFER, mPBO[mIndex]);
- glReadPixels(0, 0, mWidth, mHeight, GL_RGBA, GL_UNSIGNED_BYTE, 0);
- if ((glErr = glGetError()) != GL_NO_ERROR) {
- ALOGE("glReadPixels failed: %#x", glErr);
- return NULL;
+ CpuConsumer::LockedBuffer imgBuffer;
+ status_t res = mCpuConsumer->lockNextBuffer(&imgBuffer);
+ if (res != OK) {
+ ALOGE("Failed to lock next buffer: %s (%d)", strerror(-res), res);
+ return nullptr;
}
- readWhen = systemTime(CLOCK_MONOTONIC);
+ ALOGV("imgBuffer ptr: %p format: %x (%dx%d, stride=%d)", imgBuffer.data, imgBuffer.format, imgBuffer.width, imgBuffer.height, imgBuffer.stride);
- void* ptr = glMapBufferRange(GL_PIXEL_PACK_BUFFER, 0, mBufSize, GL_MAP_READ_BIT);
- mapWhen = systemTime(CLOCK_MONOTONIC);
- //memcpy(mVNCScreen->frameBuffer, ptr, mBufSize);
- mVNCScreen->frameBuffer = (char *)ptr;
- memcpyWhen = systemTime(CLOCK_MONOTONIC);
+ void* vncbuf = mVNCScreen->frameBuffer;
+ void* imgbuf = imgBuffer.data;
+
+ for (size_t y = 0; y < mHeight; y++) {
+ memcpy(vncbuf, imgbuf, mWidth * 4);
+ vncbuf = (void *)((char *)vncbuf + mWidth * 4);
+ imgbuf = (void *)((char *)imgbuf + imgBuffer.stride * 4);
+ }
+ ALOGD("buf copied");
+
+ mVNCScreen->frameBuffer = (char *)imgBuffer.data;
+ mVNCScreen->paddedWidthInBytes = imgBuffer.stride * 4;
rfbMarkRectAsModified(mVNCScreen, 0, 0, mWidth, mHeight);
- markWhen = systemTime(CLOCK_MONOTONIC);
- glUnmapBuffer(GL_PIXEL_PACK_BUFFER);
- glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
- ALOGV("processFrame: blit=%.3fms read=%.3fms map=%.3fms memcpy=%.3fms mark=%.3fms",
- (blitWhen - startWhen) / 1000000.0,
- (readWhen - blitWhen) / 1000000.0,
- (mapWhen - readWhen) / 1000000.0,
- (memcpyWhen - mapWhen) / 1000000.0,
- (markWhen - memcpyWhen) / 1000000.0);
+ mCpuConsumer->unlockBuffer(imgBuffer);
+ mUpdateMutex->unlock();
- mIndex = (mIndex + 1) % NUM_PBO;
- return mVNCScreen->frameBuffer;
+ return nullptr;
}
void VirtualDisplay::release_l() {
ALOGD("release_l");
- mGlConsumer.clear();
+ mCpuConsumer.clear();
mProducer.clear();
- mExtTexProgram.release();
- mEglWindow.release();
SurfaceComposerClient::destroyDisplay(mDpy);
}