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

Commit 52f95ffc authored by Jerome Gaillard's avatar Jerome Gaillard
Browse files

Add missing methods in host version of Surface

The version of Surface in libhostgraphics was not complete enough to
render on host platforms.

Bug: 322360037
Test: build libhwui on host
Change-Id: I701dba9ed2eb8d7958082df4d27e03ebdd907d8f
parent e9093b4f
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;
};