diff options
| -rw-r--r-- | include/gui/ISurfaceTexture.h | 7 | ||||
| -rw-r--r-- | include/gui/SurfaceTexture.h | 3 | ||||
| -rw-r--r-- | libs/gui/ISurfaceTexture.cpp | 13 | ||||
| -rw-r--r-- | libs/gui/SurfaceTexture.cpp | 40 | ||||
| -rw-r--r-- | libs/gui/SurfaceTextureClient.cpp | 3 | ||||
| -rw-r--r-- | services/surfaceflinger/Layer.cpp | 2 | ||||
| -rw-r--r-- | services/surfaceflinger/SurfaceTextureLayer.cpp | 14 | ||||
| -rw-r--r-- | services/surfaceflinger/SurfaceTextureLayer.h | 3 |
8 files changed, 72 insertions, 13 deletions
diff --git a/include/gui/ISurfaceTexture.h b/include/gui/ISurfaceTexture.h index 1eda646695..50626a0967 100644 --- a/include/gui/ISurfaceTexture.h +++ b/include/gui/ISurfaceTexture.h @@ -111,7 +111,12 @@ protected: // // This method will fail if the connect was previously called on the // SurfaceTexture and no corresponding disconnect call was made. - virtual status_t connect(int api) = 0; + // + // outWidth, outHeight and outTransform are filled with the default width + // and height of the window and current transform applied to buffers, + // respectively. + virtual status_t connect(int api, + uint32_t* outWidth, uint32_t* outHeight, uint32_t* outTransform) = 0; // disconnect attempts to disconnect a client API from the SurfaceTexture. // Calling this method will cause any subsequent calls to other diff --git a/include/gui/SurfaceTexture.h b/include/gui/SurfaceTexture.h index 2a8e725560..3f9e68d81e 100644 --- a/include/gui/SurfaceTexture.h +++ b/include/gui/SurfaceTexture.h @@ -106,7 +106,8 @@ public: // // This method will fail if the connect was previously called on the // SurfaceTexture and no corresponding disconnect call was made. - virtual status_t connect(int api); + virtual status_t connect(int api, + uint32_t* outWidth, uint32_t* outHeight, uint32_t* outTransform); // disconnect attempts to disconnect a client API from the SurfaceTexture. // Calling this method will cause any subsequent calls to other diff --git a/libs/gui/ISurfaceTexture.cpp b/libs/gui/ISurfaceTexture.cpp index 55246dc902..babd2c07bc 100644 --- a/libs/gui/ISurfaceTexture.cpp +++ b/libs/gui/ISurfaceTexture.cpp @@ -162,11 +162,15 @@ public: return result; } - virtual status_t connect(int api) { + virtual status_t connect(int api, + uint32_t* outWidth, uint32_t* outHeight, uint32_t* outTransform) { Parcel data, reply; data.writeInterfaceToken(ISurfaceTexture::getInterfaceDescriptor()); data.writeInt32(api); remote()->transact(CONNECT, data, &reply); + *outWidth = reply.readInt32(); + *outHeight = reply.readInt32(); + *outTransform = reply.readInt32(); status_t result = reply.readInt32(); return result; } @@ -283,7 +287,12 @@ status_t BnSurfaceTexture::onTransact( case CONNECT: { CHECK_INTERFACE(ISurfaceTexture, data, reply); int api = data.readInt32(); - status_t res = connect(api); + uint32_t outWidth, outHeight, outTransform; + status_t res = connect(api, + &outWidth, &outHeight, &outTransform); + reply->writeInt32(outWidth); + reply->writeInt32(outHeight); + reply->writeInt32(outTransform); reply->writeInt32(res); return NO_ERROR; } break; diff --git a/libs/gui/SurfaceTexture.cpp b/libs/gui/SurfaceTexture.cpp index 1a036ee57c..4bbf7ebcf6 100644 --- a/libs/gui/SurfaceTexture.cpp +++ b/libs/gui/SurfaceTexture.cpp @@ -548,7 +548,8 @@ status_t SurfaceTexture::setTransform(uint32_t transform) { return OK; } -status_t SurfaceTexture::connect(int api) { +status_t SurfaceTexture::connect(int api, + uint32_t* outWidth, uint32_t* outHeight, uint32_t* outTransform) { LOGV("SurfaceTexture::connect(this=%p, %d)", this, api); Mutex::Autolock lock(mMutex); @@ -569,6 +570,9 @@ status_t SurfaceTexture::connect(int api) { err = -EINVAL; } else { mConnectedApi = api; + *outWidth = mDefaultWidth; + *outHeight = mDefaultHeight; + *outTransform = 0; } break; default: @@ -595,6 +599,7 @@ status_t SurfaceTexture::disconnect(int api) { case NATIVE_WINDOW_API_CAMERA: if (mConnectedApi == api) { mConnectedApi = NO_CONNECTED_API; + freeAllBuffers(); } else { LOGE("disconnect: connected to another api (cur=%d, req=%d)", mConnectedApi, api); @@ -628,16 +633,32 @@ status_t SurfaceTexture::updateTexImage() { LOGV("SurfaceTexture::updateTexImage"); Mutex::Autolock lock(mMutex); + if (mAbandoned) { + LOGE("calling updateTexImage() on an abandoned SurfaceTexture"); + //return NO_INIT; + } + // In asynchronous mode the list is guaranteed to be one buffer // deep, while in synchronous mode we use the oldest buffer. if (!mQueue.empty()) { Fifo::iterator front(mQueue.begin()); int buf = *front; + if (uint32_t(buf) >= NUM_BUFFER_SLOTS) { + LOGE("buffer index out of range (index=%d)", buf); + //return BAD_VALUE; + } + // Update the GL texture object. EGLImageKHR image = mSlots[buf].mEglImage; if (image == EGL_NO_IMAGE_KHR) { EGLDisplay dpy = eglGetCurrentDisplay(); + + if (mSlots[buf].mGraphicBuffer == 0) { + LOGE("buffer at slot %d is null", buf); + //return BAD_VALUE; + } + image = createImage(dpy, mSlots[buf].mGraphicBuffer); mSlots[buf].mEglImage = image; mSlots[buf].mEglDisplay = dpy; @@ -966,13 +987,24 @@ void SurfaceTexture::dump(String8& result, const char* prefix, for (int i=0 ; i<mBufferCount ; i++) { const BufferSlot& slot(mSlots[i]); snprintf(buffer, SIZE, - "%s%s[%02d] state=%-8s, crop=[%d,%d,%d,%d], transform=0x%02x, " - "timestamp=%lld\n", - prefix, (i==mCurrentTexture)?">":" ", i, stateName(slot.mBufferState), + "%s%s[%02d] " + "state=%-8s, crop=[%d,%d,%d,%d], " + "transform=0x%02x, timestamp=%lld", + prefix, (i==mCurrentTexture)?">":" ", i, + stateName(slot.mBufferState), slot.mCrop.left, slot.mCrop.top, slot.mCrop.right, slot.mCrop.bottom, slot.mTransform, slot.mTimestamp ); result.append(buffer); + + const sp<GraphicBuffer>& buf(slot.mGraphicBuffer); + if (buf != NULL) { + snprintf(buffer, SIZE, + ", %p [%4ux%4u:%4u,%3X]", + buf->handle, buf->width, buf->height, buf->stride, buf->format); + result.append(buffer); + } + result.append("\n"); } } diff --git a/libs/gui/SurfaceTextureClient.cpp b/libs/gui/SurfaceTextureClient.cpp index d1037defc4..e91be84c48 100644 --- a/libs/gui/SurfaceTextureClient.cpp +++ b/libs/gui/SurfaceTextureClient.cpp @@ -385,7 +385,8 @@ int SurfaceTextureClient::dispatchUnlockAndPost(va_list args) { int SurfaceTextureClient::connect(int api) { LOGV("SurfaceTextureClient::connect"); Mutex::Autolock lock(mMutex); - int err = mSurfaceTexture->connect(api); + int err = mSurfaceTexture->connect(api, + &mDefaultWidth, &mDefaultHeight, &mTransformHint); if (!err && api == NATIVE_WINDOW_API_CPU) { mConnectedToCpu = true; } diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp index 383c0454ce..505c843a64 100644 --- a/services/surfaceflinger/Layer.cpp +++ b/services/surfaceflinger/Layer.cpp @@ -533,7 +533,7 @@ void Layer::dump(String8& result, char* buffer, size_t SIZE) const } snprintf(buffer, SIZE, " " - "format=%2d, activeBuffer=[%3ux%3u:%3u,%3u]," + "format=%2d, activeBuffer=[%4ux%4u:%4u,%3X]," " freezeLock=%p, queued-frames=%d\n", mFormat, w0, h0, s0,f0, getFreezeLock().get(), mQueuedFrames); diff --git a/services/surfaceflinger/SurfaceTextureLayer.cpp b/services/surfaceflinger/SurfaceTextureLayer.cpp index 5973e76118..79cd0c3140 100644 --- a/services/surfaceflinger/SurfaceTextureLayer.cpp +++ b/services/surfaceflinger/SurfaceTextureLayer.cpp @@ -86,9 +86,19 @@ status_t SurfaceTextureLayer::dequeueBuffer(int *buf, return res; } -status_t SurfaceTextureLayer::connect(int api) { - status_t err = SurfaceTexture::connect(api); +status_t SurfaceTextureLayer::connect(int api, + uint32_t* outWidth, uint32_t* outHeight, uint32_t* outTransform) { + status_t err = SurfaceTexture::connect(api, + outWidth, outHeight, outTransform); if (err == NO_ERROR) { + sp<Layer> layer(mLayer.promote()); + if (layer != NULL) { + uint32_t orientation = layer->getOrientation(); + if (orientation & Transform::ROT_INVALID) { + orientation = 0; + } + *outTransform = orientation; + } switch(api) { case NATIVE_WINDOW_API_MEDIA: case NATIVE_WINDOW_API_CAMERA: diff --git a/services/surfaceflinger/SurfaceTextureLayer.h b/services/surfaceflinger/SurfaceTextureLayer.h index 5d328b7c6a..9508524af8 100644 --- a/services/surfaceflinger/SurfaceTextureLayer.h +++ b/services/surfaceflinger/SurfaceTextureLayer.h @@ -51,7 +51,8 @@ protected: virtual status_t dequeueBuffer(int *buf, uint32_t w, uint32_t h, uint32_t format, uint32_t usage); - virtual status_t connect(int api); + virtual status_t connect(int api, + uint32_t* outWidth, uint32_t* outHeight, uint32_t* outTransform); }; // --------------------------------------------------------------------------- |