Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 74620c55 authored by Mathias Agopian's avatar Mathias Agopian Committed by Android Git Automerger
Browse files

am 1ffc0e7a: am 35ffa6a8: Surface can now be created only from an IGraphicBufferProducer

* commit '1ffc0e7a':
  Surface can now be created only from an IGraphicBufferProducer
parents 75c207ae 1ffc0e7a
Loading
Loading
Loading
Loading
+0 −11
Original line number Diff line number Diff line
@@ -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,
+5 −36
Original line number Diff line number Diff line
@@ -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)
{
+0 −18
Original line number Diff line number Diff line
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)
+0 −66
Original line number Diff line number Diff line
/*
 * 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;
}