From 122405627bcbcff56bc0bc3700e498335b7e5c1e Mon Sep 17 00:00:00 2001 From: Huan Song Date: Thu, 29 Apr 2021 14:34:41 -0700 Subject: multidisplay for gfx stream Test: run cuttlefish Change-Id: I7ab5fccc78adbfb4d3d042eb8b00aaa7de5a06f0 --- stream-servers/GfxStreamAgents.cpp | 80 ++++++++++++++++++++++++++++++++------ 1 file changed, 69 insertions(+), 11 deletions(-) diff --git a/stream-servers/GfxStreamAgents.cpp b/stream-servers/GfxStreamAgents.cpp index b8fef7cd..74c1651f 100644 --- a/stream-servers/GfxStreamAgents.cpp +++ b/stream-servers/GfxStreamAgents.cpp @@ -24,10 +24,12 @@ #include "host-common/multi_display_agent.h" // for QAndroidM... #include "host-common/vm_operations.h" // for SnapshotC... #include "host-common/window_agent.h" // for WindowMes... -#include "host-common/misc.h" +#include "host-common/misc.h" std::map mMultiDisplay; +using namespace android; + static const QAndroidMultiDisplayAgent sMultiDisplayAgent = { .setMultiDisplay = [](uint32_t id, int32_t x, @@ -41,8 +43,6 @@ static const QAndroidMultiDisplayAgent sMultiDisplayAgent = { "setMultiDisplay (mock): %d, x: %d, y: %d, w: %d, h: %d, " "dpi: %d, flag: %d\n", id, x, y, w, h, dpi, flag); - mMultiDisplay[id] = - android::MultiDisplayInfo(x, y, w, h, dpi, flag, add); return 0; }, .getMultiDisplay = [](uint32_t id, @@ -52,19 +52,35 @@ static const QAndroidMultiDisplayAgent sMultiDisplayAgent = { uint32_t* h, uint32_t* dpi, uint32_t* flag, - bool* enable) -> bool { + bool* enabled) -> bool { fprintf(stderr, "getMultiDisplay (mock) id %u\n", id); - if (x) + if (mMultiDisplay.find(id) == mMultiDisplay.end()) { + if (enabled) { + *enabled = false; + } + return false; + } + if (x) { *x = mMultiDisplay[id].pos_x; - if (y) + } + if (y) { *y = mMultiDisplay[id].pos_y; - if (w) + } + if (w) { *w = mMultiDisplay[id].width; - if (h) + } + if (h) { *h = mMultiDisplay[id].height; - if (dpi) + } + if (dpi) { *dpi = mMultiDisplay[id].dpi; - + } + if (flag) { + *flag = mMultiDisplay[id].flag; + } + if (enabled) { + *enabled = mMultiDisplay[id].enabled; + } return true; }, .getNextMultiDisplay = [](int32_t start_id, @@ -131,11 +147,37 @@ static const QAndroidMultiDisplayAgent sMultiDisplayAgent = { }, .setGpuMode = [](bool isGuestMode, uint32_t w, uint32_t h) {}, .createDisplay = [](uint32_t* displayId) -> int { + if (displayId == nullptr) { + fprintf(stderr, "null displayId pointer\n"); + return -1; + } + if (mMultiDisplay.size() >= MultiDisplay::s_maxNumMultiDisplay) { + fprintf(stderr, "cannot create more displays, exceeding limits %d\n", + MultiDisplay::s_maxNumMultiDisplay); + return -1; + } + if (mMultiDisplay.find(*displayId) != mMultiDisplay.end()) { + return 0; + } + // displays created by internal rcCommands + if (*displayId == MultiDisplay::s_invalidIdMultiDisplay) { + for (int i = MultiDisplay::s_displayIdInternalBegin; i < MultiDisplay::s_maxNumMultiDisplay; i++) { + if (mMultiDisplay.find(i) == mMultiDisplay.end()) { + *displayId = i; + break; + } + } + } + if (*displayId == MultiDisplay::s_invalidIdMultiDisplay) { + fprintf(stderr, "cannot create more internaldisplays, exceeding limits %d\n", + MultiDisplay::s_maxNumMultiDisplay - MultiDisplay::s_displayIdInternalBegin); + return -1; + } + mMultiDisplay.emplace(*displayId, android::MultiDisplayInfo()); return 0; }, .destroyDisplay = [](uint32_t displayId) -> int { - fprintf(stderr, "destroyDisplay (mock): %d\n", displayId); mMultiDisplay.erase(displayId); return 0; }, @@ -145,6 +187,10 @@ static const QAndroidMultiDisplayAgent sMultiDisplayAgent = { uint32_t w, uint32_t h, uint32_t dpi) -> int { + if (mMultiDisplay.find(displayId) == mMultiDisplay.end()) { + fprintf(stderr, "cannot find display %d\n", displayId); + return -1; + } mMultiDisplay[displayId].pos_x = x; mMultiDisplay[displayId].pos_y = y; mMultiDisplay[displayId].width = w; @@ -157,6 +203,10 @@ static const QAndroidMultiDisplayAgent sMultiDisplayAgent = { int32_t* y, uint32_t* w, uint32_t* h) -> int { + if (mMultiDisplay.find(displayId) == mMultiDisplay.end()) { + fprintf(stderr, "cannot find display %d\n", displayId); + return -1; + } if (x) *x = mMultiDisplay[displayId].pos_x; if (y) @@ -169,6 +219,10 @@ static const QAndroidMultiDisplayAgent sMultiDisplayAgent = { }, .getDisplayColorBuffer = [](uint32_t displayId, uint32_t* colorBuffer) -> int { + if (mMultiDisplay.find(displayId) == mMultiDisplay.end()) { + fprintf(stderr, "cannot find display %d\n", displayId); + return -1; + } *colorBuffer = mMultiDisplay[displayId].cb; return 0; }, @@ -184,6 +238,10 @@ static const QAndroidMultiDisplayAgent sMultiDisplayAgent = { }, .setDisplayColorBuffer = [](uint32_t displayId, uint32_t colorBuffer) -> int { + if (mMultiDisplay.find(displayId) == mMultiDisplay.end()) { + fprintf(stderr, "cannot find display %d\n", displayId); + return -1; + } mMultiDisplay[displayId].cb = colorBuffer; return 0; }}; -- cgit v1.2.3