Eradicate DisplayID.
DisplayDevices are now keyed of the wp<IBinder> the client uses.
DisplayID has now become DisplayType which is just used to identify
physical displays (as opposed to virtual displays such as wifi displays).
Change-Id: I0c5968f2c902dcd699a7e0afacf833ff070c12ea
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
index ed687e3..09ade12 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -155,24 +155,6 @@
return bclient;
}
-int32_t SurfaceFlinger::chooseNewDisplayIdLocked() const
-{
- int32_t id = DisplayDevice::DISPLAY_ID_COUNT - 1;
- bool available;
- do {
- id++;
- available = true;
- for (size_t i = 0; i < mCurrentState.displays.size(); i++) {
- const DisplayDeviceState& dds(mCurrentState.displays.valueAt(i));
- if (dds.id == id) {
- available = false;
- break;
- }
- }
- } while (!available);
- return id;
-}
-
sp<IBinder> SurfaceFlinger::createDisplay()
{
class DisplayToken : public BBinder {
@@ -192,15 +174,14 @@
sp<BBinder> token = new DisplayToken(this);
Mutex::Autolock _l(mStateLock);
- int32_t id = chooseNewDisplayIdLocked();
- DisplayDeviceState info(id);
+ DisplayDeviceState info(DisplayDevice::DISPLAY_VIRTUAL);
mCurrentState.displays.add(token, info);
return token;
}
sp<IBinder> SurfaceFlinger::getBuiltInDisplay(int32_t id) {
- if (uint32_t(id) >= DisplayDevice::DISPLAY_ID_COUNT) {
+ if (uint32_t(id) >= DisplayDevice::NUM_DISPLAY_TYPES) {
ALOGE("getDefaultDisplay: id=%d is not a valid default display id", id);
return NULL;
}
@@ -416,14 +397,16 @@
// initialize our main display hardware
- for (size_t i=0 ; i<DisplayDevice::DISPLAY_ID_COUNT ; i++) {
+ for (size_t i=0 ; i<DisplayDevice::NUM_DISPLAY_TYPES ; i++) {
mDefaultDisplays[i] = new BBinder();
- mCurrentState.displays.add(mDefaultDisplays[i], DisplayDeviceState(i));
+ mCurrentState.displays.add(mDefaultDisplays[i],
+ DisplayDeviceState((DisplayDevice::DisplayType)i));
}
sp<DisplayDevice> hw = new DisplayDevice(this,
- DisplayDevice::DISPLAY_ID_MAIN, HWC_DISPLAY_PRIMARY,
+ DisplayDevice::DISPLAY_PRIMARY,
+ mDefaultDisplays[DisplayDevice::DISPLAY_PRIMARY],
anw, fbs, mEGLConfig);
- mDisplays.add(hw->getDisplayId(), hw);
+ mDisplays.add(mDefaultDisplays[DisplayDevice::DISPLAY_PRIMARY], hw);
// initialize OpenGL ES
EGLSurface surface = hw->getEGLSurface();
@@ -453,6 +436,11 @@
return NO_ERROR;
}
+int32_t SurfaceFlinger::allocateHwcDisplayId(DisplayDevice::DisplayType type) {
+ return (uint32_t(type) < DisplayDevice::NUM_DISPLAY_TYPES) ?
+ type : mHwc->allocateDisplayId();
+}
+
void SurfaceFlinger::startBootAnim() {
// start boot animation
property_set("service.bootanim.exit", "0");
@@ -637,8 +625,12 @@
return true;
}
-void SurfaceFlinger::onVSyncReceived(int dpy, nsecs_t timestamp) {
- mEventThread->onVSyncReceived(dpy, timestamp);
+void SurfaceFlinger::onVSyncReceived(int type, nsecs_t timestamp) {
+ if (uint32_t(type) < DisplayDevice::NUM_DISPLAY_TYPES) {
+ // we should only receive DisplayDevice::DisplayType from the vsync callback
+ const wp<IBinder>& token(mDefaultDisplays[type]);
+ mEventThread->onVSyncReceived(token, timestamp);
+ }
}
void SurfaceFlinger::eventControl(int event, int enabled) {
@@ -718,7 +710,7 @@
}
hw->compositionComplete();
// FIXME
- if (hw->getDisplayId() >= DisplayDevice::DISPLAY_ID_COUNT) {
+ if (hw->getDisplayType() >= DisplayDevice::DISPLAY_VIRTUAL) {
eglSwapBuffers(mEGLDisplay, hw->getEGLSurface());
}
}
@@ -863,8 +855,7 @@
// FIXME: EGL spec says:
// "surface must be bound to the calling thread's current context,
// for the current rendering API."
- DisplayDevice::makeCurrent(
- getDisplayDevice(DisplayDevice::DISPLAY_ID_MAIN), mEGLContext);
+ DisplayDevice::makeCurrent(getDefaultDisplayDevice(), mEGLContext);
hwc.commit();
}
@@ -958,40 +949,36 @@
const ssize_t j = curr.indexOfKey(draw.keyAt(i));
if (j < 0) {
// in drawing state but not in current state
- if (draw[i].id != DisplayDevice::DISPLAY_ID_MAIN) {
- mDisplays.removeItem(draw[i].id);
+ if (!draw[i].isMainDisplay()) {
+ mDisplays.removeItem(draw.keyAt(i));
} else {
ALOGW("trying to remove the main display");
}
} else {
// this display is in both lists. see if something changed.
const DisplayDeviceState& state(curr[j]);
+ const wp<IBinder>& display(curr.keyAt(j));
if (state.surface->asBinder() != draw[i].surface->asBinder()) {
// changing the surface is like destroying and
// recreating the DisplayDevice
- const int32_t hwcDisplayId =
- (uint32_t(state.id) < DisplayDevice::DISPLAY_ID_COUNT) ?
- state.id : getHwComposer().allocateDisplayId();
-
sp<SurfaceTextureClient> stc(
new SurfaceTextureClient(state.surface));
-
sp<DisplayDevice> disp = new DisplayDevice(this,
- state.id, hwcDisplayId, stc, 0, mEGLConfig);
+ state.type, display, stc, NULL, mEGLConfig);
disp->setLayerStack(state.layerStack);
disp->setOrientation(state.orientation);
// TODO: take viewport and frame into account
- mDisplays.replaceValueFor(state.id, disp);
+ mDisplays.replaceValueFor(display, disp);
}
if (state.layerStack != draw[i].layerStack) {
- const sp<DisplayDevice>& disp(getDisplayDevice(state.id));
+ const sp<DisplayDevice>& disp(getDisplayDevice(display));
disp->setLayerStack(state.layerStack);
}
if (state.orientation != draw[i].orientation ||
state.viewport != draw[i].viewport ||
state.frame != draw[i].frame) {
- const sp<DisplayDevice>& disp(getDisplayDevice(state.id));
+ const sp<DisplayDevice>& disp(getDisplayDevice(display));
disp->setOrientation(state.orientation);
// TODO: take viewport and frame into account
}
@@ -1003,15 +990,12 @@
for (size_t i=0 ; i<cc ; i++) {
if (draw.indexOfKey(curr.keyAt(i)) < 0) {
const DisplayDeviceState& state(curr[i]);
- const int32_t hwcDisplayId =
- (uint32_t(state.id) < DisplayDevice::DISPLAY_ID_COUNT) ?
- state.id : getHwComposer().allocateDisplayId();
-
sp<SurfaceTextureClient> stc(
new SurfaceTextureClient(state.surface));
+ const wp<IBinder>& display(curr.keyAt(i));
sp<DisplayDevice> disp = new DisplayDevice(this,
- state.id, hwcDisplayId, stc, 0, mEGLConfig);
- mDisplays.add(state.id, disp);
+ state.type, display, stc, 0, mEGLConfig);
+ mDisplays.add(display, disp);
}
}
}
@@ -1262,7 +1246,7 @@
// GL composition and only on those.
// however, currently hwc.commit() already does that for the main
// display and never for the other ones
- if (hw->getDisplayId() >= DisplayDevice::DISPLAY_ID_COUNT) {
+ if (hw->getDisplayType() >= DisplayDevice::DISPLAY_VIRTUAL) {
// FIXME: EGL spec says:
// "surface must be bound to the calling thread's current context,
// for the current rendering API."
@@ -1485,7 +1469,7 @@
{
uint32_t flags = 0;
DisplayDeviceState& disp(mCurrentState.displays.editValueFor(s.token));
- if (disp.id >= 0) {
+ if (disp.isValid()) {
const uint32_t what = s.what;
if (what & DisplayState::eSurfaceChanged) {
if (disp.surface->asBinder() != s.surface->asBinder()) {
@@ -1588,7 +1572,7 @@
ISurfaceComposerClient::surface_data_t* params,
const String8& name,
const sp<Client>& client,
- DisplayID d, uint32_t w, uint32_t h, PixelFormat format,
+ uint32_t w, uint32_t h, PixelFormat format,
uint32_t flags)
{
sp<LayerBaseClient> layer;
@@ -1603,14 +1587,14 @@
//ALOGD("createLayer for (%d x %d), name=%s", w, h, name.string());
switch (flags & ISurfaceComposerClient::eFXSurfaceMask) {
case ISurfaceComposerClient::eFXSurfaceNormal:
- layer = createNormalLayer(client, d, w, h, flags, format);
+ layer = createNormalLayer(client, w, h, flags, format);
break;
case ISurfaceComposerClient::eFXSurfaceBlur:
case ISurfaceComposerClient::eFXSurfaceDim:
- layer = createDimLayer(client, d, w, h, flags);
+ layer = createDimLayer(client, w, h, flags);
break;
case ISurfaceComposerClient::eFXSurfaceScreenshot:
- layer = createScreenshotLayer(client, d, w, h, flags);
+ layer = createScreenshotLayer(client, w, h, flags);
break;
}
@@ -1630,7 +1614,7 @@
}
sp<Layer> SurfaceFlinger::createNormalLayer(
- const sp<Client>& client, DisplayID display,
+ const sp<Client>& client,
uint32_t w, uint32_t h, uint32_t flags,
PixelFormat& format)
{
@@ -1654,7 +1638,7 @@
format = PIXEL_FORMAT_RGBA_8888;
#endif
- sp<Layer> layer = new Layer(this, display, client);
+ sp<Layer> layer = new Layer(this, client);
status_t err = layer->setBuffers(w, h, format, flags);
if (CC_LIKELY(err != NO_ERROR)) {
ALOGE("createNormalLayer() failed (%s)", strerror(-err));
@@ -1664,18 +1648,18 @@
}
sp<LayerDim> SurfaceFlinger::createDimLayer(
- const sp<Client>& client, DisplayID display,
+ const sp<Client>& client,
uint32_t w, uint32_t h, uint32_t flags)
{
- sp<LayerDim> layer = new LayerDim(this, display, client);
+ sp<LayerDim> layer = new LayerDim(this, client);
return layer;
}
sp<LayerScreenshot> SurfaceFlinger::createScreenshotLayer(
- const sp<Client>& client, DisplayID display,
+ const sp<Client>& client,
uint32_t w, uint32_t h, uint32_t flags)
{
- sp<LayerScreenshot> layer = new LayerScreenshot(this, display, client);
+ sp<LayerScreenshot> layer = new LayerScreenshot(this, client);
return layer;
}
@@ -1733,7 +1717,7 @@
Vector<DisplayState> displays;
DisplayState d;
d.what = DisplayState::eOrientationChanged;
- d.token = mDefaultDisplays[DisplayDevice::DISPLAY_ID_MAIN];
+ d.token = mDefaultDisplays[DisplayDevice::DISPLAY_PRIMARY];
d.orientation = DisplayState::eOrientationDefault;
displays.add(d);
setTransactionState(state, displays, 0);
@@ -1973,7 +1957,7 @@
" id=%x, layerStack=%u, (%4dx%4d), orient=%2d, tr=%08x, "
"flips=%u, secure=%d, numLayers=%u\n",
dpy,
- hw->getDisplayId(), hw->getLayerStack(),
+ hw->getDisplayType(), hw->getLayerStack(),
hw->getWidth(), hw->getHeight(),
hw->getOrientation(), hw->getTransform().getType(),
hw->getPageFlipCount(),
@@ -2169,14 +2153,14 @@
// ---------------------------------------------------------------------------
-status_t SurfaceFlinger::renderScreenToTexture(DisplayID dpy,
+status_t SurfaceFlinger::renderScreenToTexture(uint32_t layerStack,
GLuint* textureName, GLfloat* uOut, GLfloat* vOut)
{
Mutex::Autolock _l(mStateLock);
- return renderScreenToTextureLocked(dpy, textureName, uOut, vOut);
+ return renderScreenToTextureLocked(layerStack, textureName, uOut, vOut);
}
-status_t SurfaceFlinger::renderScreenToTextureLocked(DisplayID dpy,
+status_t SurfaceFlinger::renderScreenToTextureLocked(uint32_t layerStack,
GLuint* textureName, GLfloat* uOut, GLfloat* vOut)
{
ATRACE_CALL();
@@ -2185,7 +2169,8 @@
return INVALID_OPERATION;
// get screen geometry
- sp<const DisplayDevice> hw(getDisplayDevice(dpy));
+ // FIXME: figure out what it means to have a screenshot texture w/ multi-display
+ sp<const DisplayDevice> hw(getDefaultDisplayDevice());
const uint32_t hw_w = hw->getWidth();
const uint32_t hw_h = hw->getHeight();
GLfloat u = 1;
@@ -2254,17 +2239,12 @@
status_t result = PERMISSION_DENIED;
- const DisplayDeviceState& disp(mDrawingState.displays.valueFor(display));
- if (CC_UNLIKELY(disp.id < 0)) {
- return BAD_VALUE;
- }
-
if (!GLExtensions::getInstance().haveFramebufferObject()) {
return INVALID_OPERATION;
}
// get screen geometry
- sp<const DisplayDevice> hw(getDisplayDevice(disp.id));
+ sp<const DisplayDevice> hw(getDisplayDevice(display));
const uint32_t hw_w = hw->getWidth();
const uint32_t hw_h = hw->getHeight();
@@ -2317,19 +2297,15 @@
glClearColor(0,0,0,1);
glClear(GL_COLOR_BUFFER_BIT);
- // TODO: filter the layers that are drawn based on the layer stack of the display.
- const LayerVector& layers(mDrawingState.layersSortedByZ);
+ const Vector< sp<LayerBase> >& layers(hw->getVisibleLayersSortedByZ());
const size_t count = layers.size();
for (size_t i=0 ; i<count ; ++i) {
const sp<LayerBase>& layer(layers[i]);
- const uint32_t flags = layer->drawingState().flags;
- if (!(flags & layer_state_t::eLayerHidden)) {
- const uint32_t z = layer->drawingState().z;
- if (z >= minLayerZ && z <= maxLayerZ) {
- if (filtering) layer->setFiltering(true);
- layer->draw(hw);
- if (filtering) layer->setFiltering(false);
- }
+ const uint32_t z = layer->drawingState().z;
+ if (z >= minLayerZ && z <= maxLayerZ) {
+ if (filtering) layer->setFiltering(true);
+ layer->draw(hw);
+ if (filtering) layer->setFiltering(false);
}
}
@@ -2465,11 +2441,12 @@
// ---------------------------------------------------------------------------
-SurfaceFlinger::DisplayDeviceState::DisplayDeviceState() : id(-1) {
+SurfaceFlinger::DisplayDeviceState::DisplayDeviceState()
+ : type(DisplayDevice::DISPLAY_ID_INVALID) {
}
-SurfaceFlinger::DisplayDeviceState::DisplayDeviceState(int32_t id)
- : id(id), layerStack(0), orientation(0) {
+SurfaceFlinger::DisplayDeviceState::DisplayDeviceState(DisplayDevice::DisplayType type)
+ : type(type), layerStack(0), orientation(0) {
}
// ---------------------------------------------------------------------------