am ecb4b3f0: Merge "Pass the IGraphicBufferAlloc to SurfaceTextureClient." into honeycomb
* commit 'ecb4b3f02340e21eefabbea78559e85ec7ee0089': Pass the IGraphicBufferAlloc to SurfaceTextureClient.
This commit is contained in:
@@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user