Surface can now be created only from an IGraphicBufferProducer

it can't write itself to a parcel, nor can it be created from a
parcel.

Change-Id: I69165d5c54d6024b3e546e80d8b57e3dedda7893
This commit is contained in:
Mathias Agopian 2013-03-12 18:45:09 -07:00
parent 4d9b822e2c
commit 35ffa6a868
4 changed files with 5 additions and 131 deletions

View File

@ -76,24 +76,13 @@ public:
return surface != NULL && surface->getIGraphicBufferProducer() != NULL;
}
/* writes the given Surface into a Parcel */
static status_t writeToParcel(const sp<Surface>& surface, Parcel* parcel);
/* constructs a Surface from a Parcel. see Surface::writeToParcel()
* and SurfaceControl::writeToParcel() */
static sp<Surface> readFromParcel(const Parcel& data);
protected:
Surface();
virtual ~Surface();
void setIGraphicBufferProducer(const sp<IGraphicBufferProducer>& bufferProducer);
private:
// can't be copied
Surface& operator = (const Surface& rhs);
Surface(const Surface& rhs);
void init();
// ANativeWindow hooks
static int hook_cancelBuffer(ANativeWindow* window,

View File

@ -38,22 +38,8 @@ namespace android {
Surface::Surface(
const sp<IGraphicBufferProducer>& bufferProducer)
: mGraphicBufferProducer(bufferProducer)
{
Surface::init();
Surface::setIGraphicBufferProducer(bufferProducer);
}
Surface::Surface() {
Surface::init();
}
Surface::~Surface() {
if (mConnectedToCpu) {
Surface::disconnect(NATIVE_WINDOW_API_CPU);
}
}
void Surface::init() {
// Initialize the ANativeWindow function pointers.
ANativeWindow::setSwapInterval = hook_setSwapInterval;
ANativeWindow::dequeueBuffer = hook_dequeueBuffer;
@ -87,10 +73,10 @@ void Surface::init() {
mConnectedToCpu = false;
}
void Surface::setIGraphicBufferProducer(
const sp<IGraphicBufferProducer>& bufferProducer)
{
mGraphicBufferProducer = bufferProducer;
Surface::~Surface() {
if (mConnectedToCpu) {
Surface::disconnect(NATIVE_WINDOW_API_CPU);
}
}
sp<IGraphicBufferProducer> Surface::getIGraphicBufferProducer() const {
@ -723,23 +709,6 @@ static status_t copyBlt(
// ----------------------------------------------------------------------------
status_t Surface::writeToParcel(
const sp<Surface>& surface, Parcel* parcel) {
sp<IGraphicBufferProducer> bp;
if (surface != NULL) {
bp = surface->mGraphicBufferProducer;
}
return parcel->writeStrongBinder(bp->asBinder());
}
sp<Surface> Surface::readFromParcel(const Parcel& data) {
sp<IBinder> binder(data.readStrongBinder());
sp<IGraphicBufferProducer> bp(interface_cast<IGraphicBufferProducer>(binder));
return bp != NULL ? new Surface(bp): NULL;
}
// ----------------------------------------------------------------------------
status_t Surface::lock(
ANativeWindow_Buffer* outBuffer, ARect* inOutDirtyBounds)
{

View File

@ -1,18 +0,0 @@
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= \
surface.cpp
LOCAL_SHARED_LIBRARIES := \
libcutils \
libutils \
libbinder \
libui \
libgui
LOCAL_MODULE:= test-surface
LOCAL_MODULE_TAGS := tests
include $(BUILD_EXECUTABLE)

View File

@ -1,66 +0,0 @@
/*
* Copyright (C) 2010 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <cutils/memory.h>
#include <utils/Log.h>
#include <binder/IPCThreadState.h>
#include <binder/ProcessState.h>
#include <binder/IServiceManager.h>
#include <gui/Surface.h>
#include <gui/SurfaceComposerClient.h>
using namespace android;
int main(int argc, char** argv)
{
// set up the thread-pool
sp<ProcessState> proc(ProcessState::self());
ProcessState::self()->startThreadPool();
// create a client to surfaceflinger
sp<SurfaceComposerClient> client = new SurfaceComposerClient();
sp<SurfaceControl> surfaceControl = client->createSurface(
String8("surface"), 160, 240, PIXEL_FORMAT_RGB_565, 0);
SurfaceComposerClient::openGlobalTransaction();
surfaceControl->setLayer(100000);
SurfaceComposerClient::closeGlobalTransaction();
// pretend it went cross-process
Parcel parcel;
SurfaceControl::writeSurfaceToParcel(surfaceControl, &parcel);
parcel.setDataPosition(0);
sp<Surface> surface = Surface::readFromParcel(parcel);
ANativeWindow* window = surface.get();
printf("window=%p\n", window);
int err = native_window_set_buffer_count(window, 8);
ANativeWindowBuffer* buffer;
for (int i=0 ; i<8 ; i++) {
window->dequeueBuffer(window, &buffer);
printf("buffer %d: %p\n", i, buffer);
}
printf("test complete. CTRL+C to finish.\n");
IPCThreadState::self()->joinThreadPool();
return 0;
}