5050#include " DdmConnection.h"
5151#include " Layer.h"
5252#include " LayerDim.h"
53+ #include " LayerScreenshot.h"
5354#include " SurfaceFlinger.h"
5455
5556#include " DisplayHardware/DisplayHardware.h"
@@ -1284,6 +1285,9 @@ sp<ISurface> SurfaceFlinger::createSurface(
12841285 case eFXSurfaceDim:
12851286 layer = createDimSurface (client, d, w, h, flags);
12861287 break ;
1288+ case eFXSurfaceScreenshot:
1289+ layer = createScreenshotSurface (client, d, w, h, flags);
1290+ break ;
12871291 }
12881292
12891293 if (layer != 0 ) {
@@ -1346,7 +1350,19 @@ sp<LayerDim> SurfaceFlinger::createDimSurface(
13461350 uint32_t w, uint32_t h, uint32_t flags)
13471351{
13481352 sp<LayerDim> layer = new LayerDim (this , display, client);
1349- layer->initStates (w, h, flags);
1353+ return layer;
1354+ }
1355+
1356+ sp<LayerScreenshot> SurfaceFlinger::createScreenshotSurface (
1357+ const sp<Client>& client, DisplayID display,
1358+ uint32_t w, uint32_t h, uint32_t flags)
1359+ {
1360+ sp<LayerScreenshot> layer = new LayerScreenshot (this , display, client);
1361+ status_t err = layer->capture ();
1362+ if (err != NO_ERROR) {
1363+ layer.clear ();
1364+ LOGW (" createScreenshotSurface failed (%s)" , strerror (-err));
1365+ }
13501366 return layer;
13511367}
13521368
@@ -1701,6 +1717,13 @@ void SurfaceFlinger::repaintEverything() {
17011717
17021718// ---------------------------------------------------------------------------
17031719
1720+ status_t SurfaceFlinger::renderScreenToTexture (DisplayID dpy,
1721+ GLuint* textureName, GLfloat* uOut, GLfloat* vOut)
1722+ {
1723+ Mutex::Autolock _l (mStateLock );
1724+ return renderScreenToTextureLocked (dpy, textureName, uOut, vOut);
1725+ }
1726+
17041727status_t SurfaceFlinger::renderScreenToTextureLocked (DisplayID dpy,
17051728 GLuint* textureName, GLfloat* uOut, GLfloat* vOut)
17061729{
@@ -1751,6 +1774,8 @@ status_t SurfaceFlinger::renderScreenToTextureLocked(DisplayID dpy,
17511774 layer->drawForSreenShot ();
17521775 }
17531776
1777+ hw.compositionComplete ();
1778+
17541779 // back to main framebuffer
17551780 glBindFramebufferOES (GL_FRAMEBUFFER_OES, 0 );
17561781 glDisable (GL_SCISSOR_TEST);
@@ -1766,11 +1791,6 @@ status_t SurfaceFlinger::renderScreenToTextureLocked(DisplayID dpy,
17661791
17671792status_t SurfaceFlinger::electronBeamOffAnimationImplLocked ()
17681793{
1769- status_t result = PERMISSION_DENIED;
1770-
1771- if (!GLExtensions::getInstance ().haveFramebufferObject ())
1772- return INVALID_OPERATION;
1773-
17741794 // get screen geometry
17751795 const DisplayHardware& hw (graphicPlane (0 ).displayHardware ());
17761796 const uint32_t hw_w = hw.getWidth ();
@@ -1779,7 +1799,7 @@ status_t SurfaceFlinger::electronBeamOffAnimationImplLocked()
17791799
17801800 GLfloat u, v;
17811801 GLuint tname;
1782- result = renderScreenToTextureLocked (0 , &tname, &u, &v);
1802+ status_t result = renderScreenToTextureLocked (0 , &tname, &u, &v);
17831803 if (result != NO_ERROR) {
17841804 return result;
17851805 }
@@ -1956,10 +1976,6 @@ status_t SurfaceFlinger::electronBeamOnAnimationImplLocked()
19561976 return result;
19571977 }
19581978
1959- // back to main framebuffer
1960- glBindFramebufferOES (GL_FRAMEBUFFER_OES, 0 );
1961- glDisable (GL_SCISSOR_TEST);
1962-
19631979 GLfloat vtx[8 ];
19641980 const GLfloat texCoords[4 ][2 ] = { {0 ,v}, {0 ,0 }, {u,0 }, {u,v} };
19651981 glBindTexture (GL_TEXTURE_2D, tname);
0 commit comments