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/VNCFlinger.cpp b/src/VNCFlinger.cpp
index 70f741a..efd6cbc 100644
--- a/src/VNCFlinger.cpp
+++ b/src/VNCFlinger.cpp
@@ -14,6 +14,8 @@
using namespace android;
+Mutex VNCFlinger::sUpdateMutex;
+
status_t VNCFlinger::start() {
Mutex::Autolock _l(mMutex);
@@ -74,19 +76,20 @@
mVNCScreen->newClientHook = (rfbNewClientHookPtr) VNCFlinger::onNewClient;
mVNCScreen->kbdAddEvent = InputDevice::keyEvent;
mVNCScreen->ptrAddEvent = InputDevice::pointerEvent;
+ mVNCScreen->displayHook = (rfbDisplayHookPtr) VNCFlinger::onFrameStart;
+ mVNCScreen->displayFinishedHook = (rfbDisplayFinishedHookPtr) VNCFlinger::onFrameDone;
mVNCScreen->serverFormat.trueColour = true;
mVNCScreen->serverFormat.bitsPerPixel = 32;
mVNCScreen->handleEventsEagerly = true;
- mVNCScreen->deferUpdateTime = 16;
+ mVNCScreen->deferUpdateTime = 0;
mVNCScreen->screenData = this;
-
rfbInitServer(mVNCScreen);
/* Mark as dirty since we haven't sent any updates at all yet. */
rfbMarkRectAsModified(mVNCScreen, 0, 0, mWidth, mHeight);
- mVirtualDisplay = new VirtualDisplay(mVNCScreen);
+ mVirtualDisplay = new VirtualDisplay(mVNCScreen, &sUpdateMutex);
return err;
}
@@ -147,6 +150,23 @@
return RFB_CLIENT_ACCEPT;
}
+void VNCFlinger::onFrameStart(rfbClientPtr /* cl */) {
+ sUpdateMutex.lock();
+ ALOGV("frame start");
+}
+
+void VNCFlinger::onFrameDone(rfbClientPtr /* cl */, int status) {
+ sUpdateMutex.unlock();
+ ALOGV("frame done! %d", status);
+}
+
+void VNCFlinger::markFrame(void* frame, size_t stride) {
+ Mutex::Autolock _l(sUpdateMutex);
+ mVNCScreen->frameBuffer = (char *)frame;
+ mVNCScreen->paddedWidthInBytes = stride * 4;
+ rfbMarkRectAsModified(mVNCScreen, 0, 0, mWidth, mHeight);
+}
+
void VNCFlinger::rfbLogger(const char *format, ...) {
va_list args;
char buf[256];