display projection API now has a single function instead of 3

Change-Id: I9bf46d372b77d547486d4bbe6f1953ec8c65e98f
This commit is contained in:
Mathias Agopian 2012-09-04 19:30:46 -07:00
parent da8d0a5c0c
commit 00e8c7a88a
6 changed files with 51 additions and 89 deletions

View File

@ -121,11 +121,21 @@ public:
const sp<ISurfaceTexture>& surface); const sp<ISurfaceTexture>& surface);
static void setDisplayLayerStack(const sp<IBinder>& token, static void setDisplayLayerStack(const sp<IBinder>& token,
uint32_t layerStack); uint32_t layerStack);
static void setDisplayOrientation(const sp<IBinder>& token,
uint32_t orientation); /* setDisplayProjection() defines the projection of layer stacks
static void setDisplayViewport(const sp<IBinder>& token, * to a given display.
const Rect& viewport); *
static void setDisplayFrame(const sp<IBinder>& token, const Rect& frame); * - orientation defines the display's orientation.
* - layerStackRect defines which area of the window manager coordinate
* space will be used.
* - displayRect defines where on the display will layerStackRect be
* mapped to. displayRect is specified post-orientation, that is
* it uses the orientation seen by the end-user.
*/
static void setDisplayProjection(const sp<IBinder>& token,
uint32_t orientation,
const Rect& layerStackRect,
const Rect& displayRect);
private: private:
virtual void onFirstRef(); virtual void onFirstRef();

View File

@ -107,11 +107,9 @@ struct DisplayState {
}; };
enum { enum {
eSurfaceChanged = 0x01, eSurfaceChanged = 0x01,
eLayerStackChanged = 0x02, eLayerStackChanged = 0x02,
eOrientationChanged = 0x04, eDisplayProjectionChanged = 0x04
eViewportChanged = 0x08,
eFrameChanged = 0x10
}; };
uint32_t what; uint32_t what;

View File

@ -119,9 +119,10 @@ public:
void setDisplaySurface(const sp<IBinder>& token, const sp<ISurfaceTexture>& surface); void setDisplaySurface(const sp<IBinder>& token, const sp<ISurfaceTexture>& surface);
void setDisplayLayerStack(const sp<IBinder>& token, uint32_t layerStack); void setDisplayLayerStack(const sp<IBinder>& token, uint32_t layerStack);
void setDisplayOrientation(const sp<IBinder>& token, uint32_t orientation); void setDisplayProjection(const sp<IBinder>& token,
void setDisplayViewport(const sp<IBinder>& token, const Rect& viewport); uint32_t orientation,
void setDisplayFrame(const sp<IBinder>& token, const Rect& frame); const Rect& layerStackRect,
const Rect& displayRect);
static void closeGlobalTransaction(bool synchronous) { static void closeGlobalTransaction(bool synchronous) {
Composer::getInstance().closeGlobalTransactionImpl(synchronous); Composer::getInstance().closeGlobalTransactionImpl(synchronous);
@ -326,39 +327,19 @@ void Composer::setDisplayLayerStack(const sp<IBinder>& token,
s.what |= DisplayState::eLayerStackChanged; s.what |= DisplayState::eLayerStackChanged;
} }
void Composer::setDisplayOrientation(const sp<IBinder>& token, void Composer::setDisplayProjection(const sp<IBinder>& token,
uint32_t orientation) { uint32_t orientation,
const Rect& layerStackRect,
const Rect& displayRect) {
Mutex::Autolock _l(mLock); Mutex::Autolock _l(mLock);
DisplayState& s(getDisplayStateLocked(token)); DisplayState& s(getDisplayStateLocked(token));
s.orientation = orientation; s.orientation = orientation;
s.what |= DisplayState::eOrientationChanged; s.viewport = layerStackRect;
s.frame = displayRect;
s.what |= DisplayState::eDisplayProjectionChanged;
mForceSynchronous = true; // TODO: do we actually still need this? mForceSynchronous = true; // TODO: do we actually still need this?
} }
// FIXME: get rid of this eventually
status_t Composer::setOrientation(int orientation) {
sp<ISurfaceComposer> sm(ComposerService::getComposerService());
sp<IBinder> token(sm->getBuiltInDisplay(ISurfaceComposer::eDisplayIdMain));
Composer::setDisplayOrientation(token, orientation);
return NO_ERROR;
}
void Composer::setDisplayViewport(const sp<IBinder>& token,
const Rect& viewport) {
Mutex::Autolock _l(mLock);
DisplayState& s(getDisplayStateLocked(token));
s.viewport = viewport;
s.what |= DisplayState::eViewportChanged;
}
void Composer::setDisplayFrame(const sp<IBinder>& token,
const Rect& frame) {
Mutex::Autolock _l(mLock);
DisplayState& s(getDisplayStateLocked(token));
s.frame = frame;
s.what |= DisplayState::eFrameChanged;
}
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
SurfaceComposerClient::SurfaceComposerClient() SurfaceComposerClient::SurfaceComposerClient()
@ -520,19 +501,12 @@ void SurfaceComposerClient::setDisplayLayerStack(const sp<IBinder>& token,
Composer::getInstance().setDisplayLayerStack(token, layerStack); Composer::getInstance().setDisplayLayerStack(token, layerStack);
} }
void SurfaceComposerClient::setDisplayOrientation(const sp<IBinder>& token, void SurfaceComposerClient::setDisplayProjection(const sp<IBinder>& token,
uint32_t orientation) { uint32_t orientation,
Composer::getInstance().setDisplayOrientation(token, orientation); const Rect& layerStackRect,
} const Rect& displayRect) {
Composer::getInstance().setDisplayProjection(token, orientation,
void SurfaceComposerClient::setDisplayViewport(const sp<IBinder>& token, layerStackRect, displayRect);
const Rect& viewport) {
Composer::getInstance().setDisplayViewport(token, viewport);
}
void SurfaceComposerClient::setDisplayFrame(const sp<IBinder>& token,
const Rect& frame) {
Composer::getInstance().setDisplayFrame(token, frame);
} }
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------

View File

@ -150,7 +150,7 @@ void DisplayDevice::init(EGLConfig config)
mHwcDisplayId = mFlinger->allocateHwcDisplayId(mType); mHwcDisplayId = mFlinger->allocateHwcDisplayId(mType);
// initialize the display orientation transform. // initialize the display orientation transform.
DisplayDevice::setOrientation(DisplayState::eOrientationDefault); setProjection(DisplayState::eOrientationDefault, mViewport, mFrame);
} }
uint32_t DisplayDevice::getPageFlipCount() const { uint32_t DisplayDevice::getPageFlipCount() const {
@ -298,25 +298,14 @@ status_t DisplayDevice::orientationToTransfrom(
return NO_ERROR; return NO_ERROR;
} }
void DisplayDevice::setOrientation(int orientation) { void DisplayDevice::setProjection(int orientation,
const Rect& viewport, const Rect& frame) {
mOrientation = orientation; mOrientation = orientation;
mViewport = viewport;
mFrame = frame;
updateGeometryTransform(); updateGeometryTransform();
} }
void DisplayDevice::setViewport(const Rect& viewport) {
if (viewport.isValid()) {
mViewport = viewport;
updateGeometryTransform();
}
}
void DisplayDevice::setFrame(const Rect& frame) {
if (frame.isValid()) {
mFrame = frame;
updateGeometryTransform();
}
}
void DisplayDevice::updateGeometryTransform() { void DisplayDevice::updateGeometryTransform() {
int w = mDisplayWidth; int w = mDisplayWidth;
int h = mDisplayHeight; int h = mDisplayHeight;

View File

@ -94,9 +94,7 @@ public:
Region getDirtyRegion(bool repaintEverything) const; Region getDirtyRegion(bool repaintEverything) const;
void setLayerStack(uint32_t stack); void setLayerStack(uint32_t stack);
void setOrientation(int orientation); void setProjection(int orientation, const Rect& viewport, const Rect& frame);
void setViewport(const Rect& viewport);
void setFrame(const Rect& frame);
int getOrientation() const { return mOrientation; } int getOrientation() const { return mOrientation; }
const Transform& getTransform() const { return mGlobalTransform; } const Transform& getTransform() const { return mGlobalTransform; }

View File

@ -972,14 +972,12 @@ void SurfaceFlinger::handleTransactionLocked(uint32_t transactionFlags)
if (state.layerStack != draw[i].layerStack) { if (state.layerStack != draw[i].layerStack) {
disp->setLayerStack(state.layerStack); disp->setLayerStack(state.layerStack);
} }
if (state.orientation != draw[i].orientation) { if ((state.orientation != draw[i].orientation)
disp->setOrientation(state.orientation); || (state.viewport != draw[i].viewport)
} || (state.frame != draw[i].frame))
if (state.viewport != draw[i].viewport) { {
disp->setViewport(state.viewport); disp->setProjection(state.orientation,
} state.viewport, state.viewport);
if (state.frame != draw[i].frame) {
disp->setFrame(state.frame);
} }
} }
} }
@ -997,9 +995,8 @@ void SurfaceFlinger::handleTransactionLocked(uint32_t transactionFlags)
sp<DisplayDevice> disp = new DisplayDevice(this, sp<DisplayDevice> disp = new DisplayDevice(this,
state.type, display, stc, 0, mEGLConfig); state.type, display, stc, 0, mEGLConfig);
disp->setLayerStack(state.layerStack); disp->setLayerStack(state.layerStack);
disp->setOrientation(state.orientation); disp->setProjection(state.orientation,
disp->setViewport(state.viewport); state.viewport, state.viewport);
disp->setFrame(state.frame);
mDisplays.add(display, disp); mDisplays.add(display, disp);
} }
} }
@ -1499,19 +1496,15 @@ uint32_t SurfaceFlinger::setDisplayStateLocked(const DisplayState& s)
flags |= eDisplayTransactionNeeded; flags |= eDisplayTransactionNeeded;
} }
} }
if (what & DisplayState::eOrientationChanged) { if (what & DisplayState::eDisplayProjectionChanged) {
if (disp.orientation != s.orientation) { if (disp.orientation != s.orientation) {
disp.orientation = s.orientation; disp.orientation = s.orientation;
flags |= eDisplayTransactionNeeded; flags |= eDisplayTransactionNeeded;
} }
}
if (what & DisplayState::eFrameChanged) {
if (disp.frame != s.frame) { if (disp.frame != s.frame) {
disp.frame = s.frame; disp.frame = s.frame;
flags |= eDisplayTransactionNeeded; flags |= eDisplayTransactionNeeded;
} }
}
if (what & DisplayState::eViewportChanged) {
if (disp.viewport != s.viewport) { if (disp.viewport != s.viewport) {
disp.viewport = s.viewport; disp.viewport = s.viewport;
flags |= eDisplayTransactionNeeded; flags |= eDisplayTransactionNeeded;
@ -1732,7 +1725,7 @@ void SurfaceFlinger::onInitializeDisplays() {
Vector<ComposerState> state; Vector<ComposerState> state;
Vector<DisplayState> displays; Vector<DisplayState> displays;
DisplayState d; DisplayState d;
d.what = DisplayState::eOrientationChanged; d.what = DisplayState::eDisplayProjectionChanged;
d.token = mDefaultDisplays[DisplayDevice::DISPLAY_PRIMARY]; d.token = mDefaultDisplays[DisplayDevice::DISPLAY_PRIMARY];
d.orientation = DisplayState::eOrientationDefault; d.orientation = DisplayState::eOrientationDefault;
displays.add(d); displays.add(d);