diff --git a/src/AndroidDesktop.cpp b/src/AndroidDesktop.cpp index 90f1699b5adc48cff2c79aeefb8d84c50eb7db37..253eefe1f2cd6295d4850bb7f28bf4ceb4b8aac5 100644 --- a/src/AndroidDesktop.cpp +++ b/src/AndroidDesktop.cpp @@ -168,9 +168,21 @@ status_t AndroidDesktop::updateDisplayInfo() { ALOGE("Failed to get display characteristics\n"); return err; } - //ALOGV("updateDisplayInfo: [%d:%d]", mDisplayInfo.w, mDisplayInfo.h); + + err = SurfaceComposerClient::getActiveDisplayConfig(displayToken, &mDisplayConfig); + if (err != NO_ERROR) { + ALOGE("Failed to get display configuration\n"); + return err; + } + ALOGV("updateDisplayInfo: [%d:%d]", mDisplayConfig.resolution.width, mDisplayConfig.resolution.height); + + err = SurfaceComposerClient::getDisplayState(displayToken, &mDisplayState); + if (err != NO_ERROR) { + ALOGE("Failed to get current display status"); + return err; + } - mPixels->setDisplayInfo(&mDisplayInfo); + mPixels->setDisplayInfo(&mDisplayConfig, &mDisplayState); return NO_ERROR; } @@ -187,7 +199,8 @@ void AndroidDesktop::onBufferDimensionsChanged(uint32_t width, uint32_t height) mDisplayRect.getHeight(), width, height); mVirtualDisplay.clear(); - mVirtualDisplay = new VirtualDisplay(&mDisplayInfo, mPixels->width(), mPixels->height(), this); + mVirtualDisplay = new VirtualDisplay(&mDisplayConfig, &mDisplayState, + mPixels->width(), mPixels->height(), this); mDisplayRect = mVirtualDisplay->getDisplayRect(); diff --git a/src/AndroidDesktop.h b/src/AndroidDesktop.h index 1ceecc2901c4a05270a73690977dd0573ef76493..993f466d1cc38cee454cdd186f2659a1a6064987 100644 --- a/src/AndroidDesktop.h +++ b/src/AndroidDesktop.h @@ -11,6 +11,8 @@ #include <gui/CpuConsumer.h> #include <ui/DisplayInfo.h> +#include <ui/DisplayConfig.h> +#include <ui/DisplayState.h> #include <rfb/PixelBuffer.h> #include <rfb/SDesktop.h> @@ -79,6 +81,8 @@ class AndroidDesktop : public rfb::SDesktop, // Primary display DisplayInfo mDisplayInfo; + DisplayConfig mDisplayConfig = {}; + ui::DisplayState mDisplayState = {}; // Virtual input device sp<InputDevice> mInputDevice; diff --git a/src/AndroidPixelBuffer.cpp b/src/AndroidPixelBuffer.cpp index 8af6c39e1c97dd0a44b8e089b66834fa81f99cfa..b6ab0cb3916f12f1878fbdd8e4744c13c3745d68 100644 --- a/src/AndroidPixelBuffer.cpp +++ b/src/AndroidPixelBuffer.cpp @@ -37,8 +37,8 @@ AndroidPixelBuffer::~AndroidPixelBuffer() { mListener = nullptr; } -bool AndroidPixelBuffer::isDisplayRotated(uint8_t orientation) { - return orientation != DISPLAY_ORIENTATION_0 && orientation != DISPLAY_ORIENTATION_180; +bool AndroidPixelBuffer::isDisplayRotated(ui::Rotation orientation) { + return orientation != ui::ROTATION_0 && orientation != ui::ROTATION_180; } void AndroidPixelBuffer::setBufferRotation(bool rotated) { @@ -98,12 +98,12 @@ void AndroidPixelBuffer::setWindowSize(uint32_t width, uint32_t height) { } } -void AndroidPixelBuffer::setDisplayInfo(DisplayInfo* info) { - bool rotated = isDisplayRotated(info->orientation); +void AndroidPixelBuffer::setDisplayInfo(DisplayConfig* config, ui::DisplayState* state) { + bool rotated = isDisplayRotated(state->orientation); setBufferRotation(rotated); - uint32_t w = rotated ? info->h : info->w; - uint32_t h = rotated ? info->w : info->h; + uint32_t w = rotated ? config->resolution.height : config->resolution.width; + uint32_t h = rotated ? config->resolution.width : config->resolution.height; if (w != mSourceWidth || h != mSourceHeight) { ALOGV("Display dimensions changed: old=(%dx%d) new=(%dx%d)", mSourceWidth, mSourceHeight, w, diff --git a/src/AndroidPixelBuffer.h b/src/AndroidPixelBuffer.h index 44e7dbdda4a3897d2de0f018ac5038a649ef3031..174665fe66b95caa1551d17eb322599907a563f1 100644 --- a/src/AndroidPixelBuffer.h +++ b/src/AndroidPixelBuffer.h @@ -21,7 +21,9 @@ #include <utils/Mutex.h> #include <utils/RefBase.h> +#include <ui/DisplayConfig.h> #include <ui/DisplayInfo.h> +#include <ui/DisplayState.h> #include <ui/Rect.h> #include <rfb/PixelBuffer.h> @@ -35,7 +37,7 @@ class AndroidPixelBuffer : public RefBase, public rfb::ManagedPixelBuffer { public: AndroidPixelBuffer(); - virtual void setDisplayInfo(DisplayInfo* info); + virtual void setDisplayInfo(DisplayConfig* config, ui::DisplayState* state); virtual void setWindowSize(uint32_t width, uint32_t height); @@ -61,7 +63,7 @@ class AndroidPixelBuffer : public RefBase, public rfb::ManagedPixelBuffer { void reset(); private: - static bool isDisplayRotated(uint8_t orientation); + static bool isDisplayRotated(ui::Rotation orientation); virtual void setBufferRotation(bool rotated); diff --git a/src/VirtualDisplay.cpp b/src/VirtualDisplay.cpp index 1854a55655237205457de80454e3264ff5548454..1f616d1550b9de5912211573d9cc1f58451b8231 100644 --- a/src/VirtualDisplay.cpp +++ b/src/VirtualDisplay.cpp @@ -22,20 +22,21 @@ #include <gui/CpuConsumer.h> #include <gui/IGraphicBufferConsumer.h> #include <gui/SurfaceComposerClient.h> - +#include <input/DisplayViewport.h> #include "VirtualDisplay.h" using namespace vncflinger; -VirtualDisplay::VirtualDisplay(DisplayInfo* info, uint32_t width, uint32_t height, +VirtualDisplay::VirtualDisplay(DisplayConfig* config, ui::DisplayState* state, + uint32_t width, uint32_t height, sp<CpuConsumer::FrameAvailableListener> listener) { mWidth = width; mHeight = height; - if (info->orientation == DISPLAY_ORIENTATION_0 || info->orientation == DISPLAY_ORIENTATION_180) { - mSourceRect = Rect(info->w, info->h); + if (state->orientation == ui::ROTATION_0 || state->orientation == ui::ROTATION_180) { + mSourceRect = Rect(config->resolution.width, config->resolution.height); } else { - mSourceRect = Rect(info->h, info->w); + mSourceRect = Rect(config->resolution.height, config->resolution.width); } Rect displayRect = getDisplayRect(); @@ -54,7 +55,7 @@ VirtualDisplay::VirtualDisplay(DisplayInfo* info, uint32_t width, uint32_t heigh SurfaceComposerClient::Transaction t; t.setDisplaySurface(mDisplayToken, mProducer); - t.setDisplayProjection(mDisplayToken, 0, mSourceRect, displayRect); + t.setDisplayProjection(mDisplayToken, state->orientation, mSourceRect, displayRect); t.setDisplayLayerStack(mDisplayToken, 0); // default stack t.apply(); diff --git a/src/VirtualDisplay.h b/src/VirtualDisplay.h index 02a85c7025f0fa0a211f8a57ee2f2deda7688ceb..cd2356ede3dfdd906fdc7daa13929884c40c0699 100644 --- a/src/VirtualDisplay.h +++ b/src/VirtualDisplay.h @@ -23,7 +23,9 @@ #include <gui/CpuConsumer.h> #include <gui/IGraphicBufferProducer.h> +#include <ui/DisplayConfig.h> #include <ui/DisplayInfo.h> +#include <ui/DisplayState.h> #include <ui/Rect.h> using namespace android; @@ -32,7 +34,8 @@ namespace vncflinger { class VirtualDisplay : public RefBase { public: - VirtualDisplay(DisplayInfo* info, uint32_t width, uint32_t height, + VirtualDisplay(DisplayConfig *config, ui::DisplayState* state, + uint32_t width, uint32_t height, sp<CpuConsumer::FrameAvailableListener> listener); virtual ~VirtualDisplay();