Merge "Fix rotation displays frame N-1 briefly while rotating" into ics-mr1
This commit is contained in:
committed by
Android (Google) Code Review
commit
7f1c94e198
@@ -88,13 +88,14 @@ class ScreenRotationAnimation {
|
||||
try {
|
||||
try {
|
||||
mSurface = new Surface(session, 0, "FreezeSurface",
|
||||
-1, mWidth, mHeight, PixelFormat.OPAQUE, Surface.FX_SURFACE_SCREENSHOT);
|
||||
-1, mWidth, mHeight, PixelFormat.OPAQUE, Surface.FX_SURFACE_SCREENSHOT | Surface.HIDDEN);
|
||||
if (mSurface == null || !mSurface.isValid()) {
|
||||
// Screenshot failed, punt.
|
||||
mSurface = null;
|
||||
return;
|
||||
}
|
||||
mSurface.setLayer(FREEZE_LAYER + 1);
|
||||
mSurface.show();
|
||||
} catch (Surface.OutOfResourcesException e) {
|
||||
Slog.w(TAG, "Unable to allocate freeze surface", e);
|
||||
}
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
#include "SurfaceFlinger.h"
|
||||
#include "DisplayHardware/DisplayHardware.h"
|
||||
|
||||
|
||||
namespace android {
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
@@ -45,23 +46,64 @@ LayerScreenshot::~LayerScreenshot()
|
||||
}
|
||||
}
|
||||
|
||||
status_t LayerScreenshot::captureLocked() {
|
||||
GLfloat u, v;
|
||||
status_t result = mFlinger->renderScreenToTextureLocked(0, &mTextureName, &u, &v);
|
||||
if (result != NO_ERROR) {
|
||||
return result;
|
||||
}
|
||||
initTexture(u, v);
|
||||
return NO_ERROR;
|
||||
}
|
||||
|
||||
status_t LayerScreenshot::capture() {
|
||||
GLfloat u, v;
|
||||
status_t result = mFlinger->renderScreenToTexture(0, &mTextureName, &u, &v);
|
||||
if (result != NO_ERROR) {
|
||||
return result;
|
||||
}
|
||||
initTexture(u, v);
|
||||
return NO_ERROR;
|
||||
}
|
||||
|
||||
void LayerScreenshot::initTexture(GLfloat u, GLfloat v) {
|
||||
glBindTexture(GL_TEXTURE_2D, mTextureName);
|
||||
glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||
glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||
|
||||
mTexCoords[0] = 0; mTexCoords[1] = v;
|
||||
mTexCoords[2] = 0; mTexCoords[3] = 0;
|
||||
mTexCoords[4] = u; mTexCoords[5] = 0;
|
||||
mTexCoords[6] = u; mTexCoords[7] = v;
|
||||
}
|
||||
|
||||
return NO_ERROR;
|
||||
void LayerScreenshot::initStates(uint32_t w, uint32_t h, uint32_t flags) {
|
||||
LayerBaseClient::initStates(w, h, flags);
|
||||
if (!(flags & ISurfaceComposer::eHidden)) {
|
||||
capture();
|
||||
}
|
||||
}
|
||||
|
||||
uint32_t LayerScreenshot::doTransaction(uint32_t flags)
|
||||
{
|
||||
const Layer::State& draw(drawingState());
|
||||
const Layer::State& curr(currentState());
|
||||
|
||||
if (draw.flags & ISurfaceComposer::eLayerHidden) {
|
||||
if (!(curr.flags & ISurfaceComposer::eLayerHidden)) {
|
||||
// we're going from hidden to visible
|
||||
status_t err = captureLocked();
|
||||
if (err != NO_ERROR) {
|
||||
LOGW("createScreenshotSurface failed (%s)", strerror(-err));
|
||||
}
|
||||
}
|
||||
} else if (curr.flags & ISurfaceComposer::eLayerHidden) {
|
||||
// we're going from visible to hidden
|
||||
if (mTextureName) {
|
||||
glDeleteTextures(1, &mTextureName);
|
||||
mTextureName = 0;
|
||||
}
|
||||
}
|
||||
return LayerBaseClient::doTransaction(flags);
|
||||
}
|
||||
|
||||
void LayerScreenshot::onDraw(const Region& clip) const
|
||||
|
||||
@@ -41,12 +41,18 @@ public:
|
||||
|
||||
status_t capture();
|
||||
|
||||
virtual void initStates(uint32_t w, uint32_t h, uint32_t flags);
|
||||
virtual uint32_t doTransaction(uint32_t flags);
|
||||
virtual void onDraw(const Region& clip) const;
|
||||
virtual bool isOpaque() const { return false; }
|
||||
virtual bool isSecure() const { return false; }
|
||||
virtual bool isProtectedByApp() const { return false; }
|
||||
virtual bool isProtectedByDRM() const { return false; }
|
||||
virtual const char* getTypeId() const { return "LayerScreenshot"; }
|
||||
|
||||
private:
|
||||
status_t captureLocked();
|
||||
void initTexture(GLfloat u, GLfloat v);
|
||||
};
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
@@ -1360,11 +1360,6 @@ sp<LayerScreenshot> SurfaceFlinger::createScreenshotSurface(
|
||||
uint32_t w, uint32_t h, uint32_t flags)
|
||||
{
|
||||
sp<LayerScreenshot> layer = new LayerScreenshot(this, display, client);
|
||||
status_t err = layer->capture();
|
||||
if (err != NO_ERROR) {
|
||||
layer.clear();
|
||||
LOGW("createScreenshotSurface failed (%s)", strerror(-err));
|
||||
}
|
||||
return layer;
|
||||
}
|
||||
|
||||
|
||||
@@ -186,6 +186,8 @@ public:
|
||||
|
||||
status_t renderScreenToTexture(DisplayID dpy,
|
||||
GLuint* textureName, GLfloat* uOut, GLfloat* vOut);
|
||||
status_t renderScreenToTextureLocked(DisplayID dpy,
|
||||
GLuint* textureName, GLfloat* uOut, GLfloat* vOut);
|
||||
|
||||
status_t postMessageAsync(const sp<MessageBase>& msg,
|
||||
nsecs_t reltime=0, uint32_t flags = 0);
|
||||
@@ -328,8 +330,6 @@ private:
|
||||
status_t turnElectronBeamOnImplLocked(int32_t mode);
|
||||
status_t electronBeamOffAnimationImplLocked();
|
||||
status_t electronBeamOnAnimationImplLocked();
|
||||
status_t renderScreenToTextureLocked(DisplayID dpy,
|
||||
GLuint* textureName, GLfloat* uOut, GLfloat* vOut);
|
||||
|
||||
void debugFlashRegions();
|
||||
void debugShowFPS() const;
|
||||
|
||||
Reference in New Issue
Block a user