am ecb4b3f0: Merge "Pass the IGraphicBufferAlloc to SurfaceTextureClient." into honeycomb

* commit 'ecb4b3f02340e21eefabbea78559e85ec7ee0089':
  Pass the IGraphicBufferAlloc to SurfaceTextureClient.
This commit is contained in:
Jamie Gennis
2011-02-02 15:56:20 -08:00
committed by Android Git Automerger
6 changed files with 40 additions and 2 deletions

View File

@@ -72,6 +72,12 @@ public:
virtual status_t setCrop(const Rect& reg) = 0; virtual status_t setCrop(const Rect& reg) = 0;
virtual status_t setTransform(uint32_t transform) = 0; virtual status_t setTransform(uint32_t transform) = 0;
// getAllocator retrieves the binder object that must be referenced as long
// as the GraphicBuffers dequeued from this ISurfaceTexture are referenced.
// Holding this binder reference prevents SurfaceFlinger from freeing the
// buffers before the client is done with them.
virtual sp<IBinder> getAllocator() = 0;
}; };
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------

View File

@@ -101,6 +101,12 @@ public:
// when a new frame becomes available. // when a new frame becomes available.
void setFrameAvailableListener(const sp<FrameAvailableListener>& l); void setFrameAvailableListener(const sp<FrameAvailableListener>& l);
// getAllocator retrieves the binder object that must be referenced as long
// as the GraphicBuffers dequeued from this SurfaceTexture are referenced.
// Holding this binder reference prevents SurfaceFlinger from freeing the
// buffers before the client is done with them.
sp<IBinder> getAllocator();
private: private:
// freeAllBuffers frees the resources (both GraphicBuffer and EGLImage) for // freeAllBuffers frees the resources (both GraphicBuffer and EGLImage) for

View File

@@ -83,6 +83,10 @@ private:
// interactions with the server using this interface. // interactions with the server using this interface.
sp<ISurfaceTexture> mSurfaceTexture; sp<ISurfaceTexture> mSurfaceTexture;
// mAllocator is the binder object that is referenced to prevent the
// dequeued buffers from being freed prematurely.
sp<IBinder> mAllocator;
// mSlots stores the buffers that have been allocated for each buffer slot. // mSlots stores the buffers that have been allocated for each buffer slot.
// It is initialized to null pointers, and gets filled in with the result of // It is initialized to null pointers, and gets filled in with the result of
// ISurfaceTexture::requestBuffer when the client dequeues a buffer from a // ISurfaceTexture::requestBuffer when the client dequeues a buffer from a

View File

@@ -38,6 +38,7 @@ enum {
CANCEL_BUFFER, CANCEL_BUFFER,
SET_CROP, SET_CROP,
SET_TRANSFORM, SET_TRANSFORM,
GET_ALLOCATOR,
}; };
@@ -123,6 +124,13 @@ public:
status_t result = reply.readInt32(); status_t result = reply.readInt32();
return result; return result;
} }
virtual sp<IBinder> getAllocator() {
Parcel data, reply;
data.writeInterfaceToken(ISurfaceTexture::getInterfaceDescriptor());
remote()->transact(GET_ALLOCATOR, data, &reply);
return reply.readStrongBinder();
}
}; };
IMPLEMENT_META_INTERFACE(SurfaceTexture, "android.gui.SurfaceTexture"); IMPLEMENT_META_INTERFACE(SurfaceTexture, "android.gui.SurfaceTexture");
@@ -195,6 +203,12 @@ status_t BnSurfaceTexture::onTransact(
reply->writeInt32(result); reply->writeInt32(result);
return NO_ERROR; return NO_ERROR;
} break; } break;
case GET_ALLOCATOR: {
CHECK_INTERFACE(ISurfaceTexture, data, reply);
sp<IBinder> result = getAllocator();
reply->writeStrongBinder(result);
return NO_ERROR;
} break;
} }
return BBinder::onTransact(code, data, reply, flags); return BBinder::onTransact(code, data, reply, flags);
} }

View File

@@ -304,6 +304,11 @@ void SurfaceTexture::setFrameAvailableListener(
mFrameAvailableListener = l; mFrameAvailableListener = l;
} }
sp<IBinder> SurfaceTexture::getAllocator() {
LOGV("SurfaceTexture::getAllocator");
return mGraphicBufferAlloc->asBinder();
}
void SurfaceTexture::freeAllBuffers() { void SurfaceTexture::freeAllBuffers() {
for (int i = 0; i < NUM_BUFFER_SLOTS; i++) { for (int i = 0; i < NUM_BUFFER_SLOTS; i++) {
mSlots[i].mGraphicBuffer = 0; mSlots[i].mGraphicBuffer = 0;

View File

@@ -25,8 +25,8 @@ namespace android {
SurfaceTextureClient::SurfaceTextureClient( SurfaceTextureClient::SurfaceTextureClient(
const sp<ISurfaceTexture>& surfaceTexture): const sp<ISurfaceTexture>& surfaceTexture):
mSurfaceTexture(surfaceTexture), mReqWidth(1), mReqHeight(1), mSurfaceTexture(surfaceTexture), mAllocator(0), mReqWidth(1),
mReqFormat(DEFAULT_FORMAT), mReqUsage(0), mMutex() { mReqHeight(1), mReqFormat(DEFAULT_FORMAT), mReqUsage(0), mMutex() {
// Initialize the ANativeWindow function pointers. // Initialize the ANativeWindow function pointers.
ANativeWindow::setSwapInterval = setSwapInterval; ANativeWindow::setSwapInterval = setSwapInterval;
ANativeWindow::dequeueBuffer = dequeueBuffer; ANativeWindow::dequeueBuffer = dequeueBuffer;
@@ -35,6 +35,9 @@ SurfaceTextureClient::SurfaceTextureClient(
ANativeWindow::queueBuffer = queueBuffer; ANativeWindow::queueBuffer = queueBuffer;
ANativeWindow::query = query; ANativeWindow::query = query;
ANativeWindow::perform = perform; ANativeWindow::perform = perform;
// Get a reference to the allocator.
mAllocator = mSurfaceTexture->getAllocator();
} }
int SurfaceTextureClient::setSwapInterval(ANativeWindow* window, int interval) { int SurfaceTextureClient::setSwapInterval(ANativeWindow* window, int interval) {