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

Commit 1824134a authored by Jerome Gaillard's avatar Jerome Gaillard Committed by Android (Google) Code Review
Browse files

Merge "Add missing methods in host version of Surface" into main

parents bc4eac82 52f95ffc
Loading
Loading
Loading
Loading
+25 −0
Original line number Diff line number Diff line
@@ -16,12 +16,15 @@

#include <gui/BufferQueue.h>

#include <system/window.h>

namespace android {

class HostBufferQueue : public IGraphicBufferProducer, public IGraphicBufferConsumer {
public:
    HostBufferQueue() : mWidth(0), mHeight(0) { }

// Consumer
    virtual status_t setConsumerIsProtected(bool isProtected) { return OK; }

    virtual status_t detachBuffer(int slot) { return OK; }
@@ -51,6 +54,28 @@ public:
    virtual status_t setMaxAcquiredBufferCount(int maxAcquiredBuffers) { return OK; }

    virtual status_t setConsumerUsageBits(uint64_t usage) { return OK; }

// Producer
    virtual int query(int what, int* value) {
        switch(what) {
            case NATIVE_WINDOW_WIDTH:
                *value = mWidth;
                break;
            case NATIVE_WINDOW_HEIGHT:
                *value = mHeight;
                break;
            default:
                *value = 0;
                break;
        }
        return OK;
    }

    virtual status_t requestBuffer(int slot, sp<GraphicBuffer>* buf) {
        *buf = mBuffer;
        return OK;
    }

private:
    sp<GraphicBuffer> mBuffer;
    uint32_t mWidth;
+4 −0
Original line number Diff line number Diff line
@@ -31,6 +31,10 @@ public:
        // Disconnect any API originally connected from the process calling disconnect.
        AllLocal
    };

    virtual int query(int what, int* value) = 0;

    virtual status_t requestBuffer(int slot, sp<GraphicBuffer>* buf) = 0;
};

} // namespace android
+45 −6
Original line number Diff line number Diff line
@@ -17,18 +17,21 @@
#ifndef ANDROID_GUI_SURFACE_H
#define ANDROID_GUI_SURFACE_H

#include <gui/IGraphicBufferProducer.h>
#include <system/window.h>
#include <ui/ANativeObjectBase.h>
#include <utils/RefBase.h>
#include <system/window.h>

#include "gui/IGraphicBufferProducer.h"

namespace android {

class Surface : public ANativeObjectBase<ANativeWindow, Surface, RefBase> {
public:
    explicit Surface(const sp<IGraphicBufferProducer>& bufferProducer,
                     bool controlledByApp = false) {
    explicit Surface(const sp<IGraphicBufferProducer>& bufferProducer, bool controlledByApp = false)
            : mBufferProducer(bufferProducer) {
        ANativeWindow::perform = hook_perform;
        ANativeWindow::dequeueBuffer = hook_dequeueBuffer;
        ANativeWindow::query = hook_query;
    }
    static bool isValid(const sp<Surface>& surface) { return surface != nullptr; }
    void allocateBuffers() {}
@@ -48,7 +51,11 @@ public:
        return 0;
    }
    virtual int unlockAndPost() { return 0; }
    virtual int query(int what, int* value) const { return 0; }
    virtual int query(int what, int* value) const { return mBufferProducer->query(what, value); }

    status_t setDequeueTimeout(nsecs_t timeout) { return OK; }

    nsecs_t getLastDequeueStartTime() const { return 0; }

    virtual void destroy() {}

@@ -57,12 +64,44 @@ public:
protected:
    virtual ~Surface() {}

    static int hook_perform(ANativeWindow* window, int operation, ...) { return 0; }
    static int hook_perform(ANativeWindow* window, int operation, ...) {
        va_list args;
        va_start(args, operation);
        Surface* c = getSelf(window);
        int result = c->perform(operation, args);
        va_end(args);
        return result;
    }

    static int hook_query(const ANativeWindow* window, int what, int* value) {
        const Surface* c = getSelf(window);
        return c->query(what, value);
    }

    static int hook_dequeueBuffer(ANativeWindow* window, ANativeWindowBuffer** buffer,
                                  int* fenceFd) {
        Surface* c = getSelf(window);
        return c->dequeueBuffer(buffer, fenceFd);
    }

    virtual int dequeueBuffer(ANativeWindowBuffer** buffer, int* fenceFd) {
        mBufferProducer->requestBuffer(0, &mBuffer);
        *buffer = mBuffer.get();
        return OK;
    }
    virtual int cancelBuffer(ANativeWindowBuffer* buffer, int fenceFd) { return 0; }
    virtual int queueBuffer(ANativeWindowBuffer* buffer, int fenceFd) { return 0; }
    virtual int perform(int operation, va_list args) { return 0; }
    virtual int setSwapInterval(int interval) { return 0; }
    virtual int setBufferCount(int bufferCount) { return 0; }

private:
    // can't be copied
    Surface& operator=(const Surface& rhs);
    Surface(const Surface& rhs);

    const sp<IGraphicBufferProducer> mBufferProducer;
    sp<GraphicBuffer> mBuffer;
};

} // namespace android
+7 −6
Original line number Diff line number Diff line
@@ -22,24 +22,27 @@

#include <vector>

#include <ui/ANativeObjectBase.h>
#include <ui/PixelFormat.h>
#include <ui/Rect.h>

#include <utils/RefBase.h>

namespace android {

class GraphicBuffer : virtual public RefBase {
class GraphicBuffer : public ANativeObjectBase<ANativeWindowBuffer, GraphicBuffer, RefBase> {
public:
    GraphicBuffer(uint32_t w, uint32_t h):width(w),height(h) {
    GraphicBuffer(uint32_t w, uint32_t h) {
        data.resize(w*h);
        reserved[0] = data.data();
        width = w;
        height = h;
    }
    uint32_t getWidth() const           { return static_cast<uint32_t>(width); }
    uint32_t getHeight() const          { return static_cast<uint32_t>(height); }
    uint32_t getStride() const          { return static_cast<uint32_t>(width); }
    uint64_t getUsage() const           { return 0; }
    PixelFormat getPixelFormat() const  { return PIXEL_FORMAT_RGBA_8888; }
    //uint32_t getLayerCount() const      { return static_cast<uint32_t>(layerCount); }

    Rect getBounds() const              { return Rect(width, height); }

    status_t lockAsyncYCbCr(uint32_t inUsage, const Rect& rect,
@@ -54,8 +57,6 @@ public:
    status_t unlockAsync(int *fenceFd) { return OK; }

private:
    uint32_t width;
    uint32_t height;
    std::vector<uint32_t> data;
};