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"
@@ -1358,6 +1359,9 @@ sp<ISurface> SurfaceFlinger::createSurface(
13581359 case eFXSurfaceDim:
13591360 layer = createDimSurface (client, d, w, h, flags);
13601361 break ;
1362+ case eFXSurfaceScreenshot:
1363+ layer = createScreenshotSurface (client, d, w, h, flags);
1364+ break ;
13611365 }
13621366
13631367 if (layer != 0 ) {
@@ -1420,7 +1424,19 @@ sp<LayerDim> SurfaceFlinger::createDimSurface(
14201424 uint32_t w, uint32_t h, uint32_t flags)
14211425{
14221426 sp<LayerDim> layer = new LayerDim (this , display, client);
1423- layer->initStates (w, h, flags);
1427+ return layer;
1428+ }
1429+
1430+ sp<LayerScreenshot> SurfaceFlinger::createScreenshotSurface (
1431+ const sp<Client>& client, DisplayID display,
1432+ uint32_t w, uint32_t h, uint32_t flags)
1433+ {
1434+ sp<LayerScreenshot> layer = new LayerScreenshot (this , display, client);
1435+ status_t err = layer->capture ();
1436+ if (err != NO_ERROR) {
1437+ layer.clear ();
1438+ LOGW (" createScreenshotSurface failed (%s)" , strerror (-err));
1439+ }
14241440 return layer;
14251441}
14261442
@@ -1783,6 +1799,13 @@ void SurfaceFlinger::repaintEverything() {
17831799
17841800// ---------------------------------------------------------------------------
17851801
1802+ status_t SurfaceFlinger::renderScreenToTexture (DisplayID dpy,
1803+ GLuint* textureName, GLfloat* uOut, GLfloat* vOut)
1804+ {
1805+ Mutex::Autolock _l (mStateLock );
1806+ return renderScreenToTextureLocked (dpy, textureName, uOut, vOut);
1807+ }
1808+
17861809status_t SurfaceFlinger::renderScreenToTextureLocked (DisplayID dpy,
17871810 GLuint* textureName, GLfloat* uOut, GLfloat* vOut)
17881811{
@@ -1833,6 +1856,8 @@ status_t SurfaceFlinger::renderScreenToTextureLocked(DisplayID dpy,
18331856 layer->drawForSreenShot ();
18341857 }
18351858
1859+ hw.compositionComplete ();
1860+
18361861 // back to main framebuffer
18371862 glBindFramebufferOES (GL_FRAMEBUFFER_OES, 0 );
18381863 glDisable (GL_SCISSOR_TEST);
@@ -1848,11 +1873,6 @@ status_t SurfaceFlinger::renderScreenToTextureLocked(DisplayID dpy,
18481873
18491874status_t SurfaceFlinger::electronBeamOffAnimationImplLocked ()
18501875{
1851- status_t result = PERMISSION_DENIED;
1852-
1853- if (!GLExtensions::getInstance ().haveFramebufferObject ())
1854- return INVALID_OPERATION;
1855-
18561876 // get screen geometry
18571877 const DisplayHardware& hw (graphicPlane (0 ).displayHardware ());
18581878 const uint32_t hw_w = hw.getWidth ();
@@ -1861,7 +1881,7 @@ status_t SurfaceFlinger::electronBeamOffAnimationImplLocked()
18611881
18621882 GLfloat u, v;
18631883 GLuint tname;
1864- result = renderScreenToTextureLocked (0 , &tname, &u, &v);
1884+ status_t result = renderScreenToTextureLocked (0 , &tname, &u, &v);
18651885 if (result != NO_ERROR) {
18661886 return result;
18671887 }
@@ -2038,10 +2058,6 @@ status_t SurfaceFlinger::electronBeamOnAnimationImplLocked()
20382058 return result;
20392059 }
20402060
2041- // back to main framebuffer
2042- glBindFramebufferOES (GL_FRAMEBUFFER_OES, 0 );
2043- glDisable (GL_SCISSOR_TEST);
2044-
20452061 GLfloat vtx[8 ];
20462062 const GLfloat texCoords[4 ][2 ] = { {0 ,v}, {0 ,0 }, {u,0 }, {u,v} };
20472063 glBindTexture (GL_TEXTURE_2D, tname);
0 commit comments