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:
parent
4d9b822e2c
commit
35ffa6a868
@ -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,
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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)
|
@ -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;
|
||||
}
|
Loading…
Reference in New Issue
Block a user