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

Commit 57f89fd7 authored by Chia-I Wu's avatar Chia-I Wu Committed by android-build-merger
Browse files

Merge "libgui: support 64-bit BQ consumer usage" into oc-mr1-dev

am: 64c9a3ee

Change-Id: I19a73bf1e6d82e64e8d8f3165e47f0ad73651e98
parents 7321cedf 64c9a3ee
Loading
Loading
Loading
Loading
+4 −2
Original line number Original line Diff line number Diff line
@@ -19,6 +19,8 @@
//#define ATRACE_TAG ATRACE_TAG_GRAPHICS
//#define ATRACE_TAG ATRACE_TAG_GRAPHICS
#include <utils/Log.h>
#include <utils/Log.h>


#include <inttypes.h>

#include <gui/BufferItem.h>
#include <gui/BufferItem.h>
#include <gui/BufferItemConsumer.h>
#include <gui/BufferItemConsumer.h>


@@ -31,13 +33,13 @@
namespace android {
namespace android {


BufferItemConsumer::BufferItemConsumer(
BufferItemConsumer::BufferItemConsumer(
        const sp<IGraphicBufferConsumer>& consumer, uint32_t consumerUsage,
        const sp<IGraphicBufferConsumer>& consumer, uint64_t consumerUsage,
        int bufferCount, bool controlledByApp) :
        int bufferCount, bool controlledByApp) :
    ConsumerBase(consumer, controlledByApp)
    ConsumerBase(consumer, controlledByApp)
{
{
    status_t err = mConsumer->setConsumerUsageBits(consumerUsage);
    status_t err = mConsumer->setConsumerUsageBits(consumerUsage);
    LOG_ALWAYS_FATAL_IF(err != OK,
    LOG_ALWAYS_FATAL_IF(err != OK,
            "Failed to set consumer usage bits to %#x", consumerUsage);
            "Failed to set consumer usage bits to %#" PRIx64, consumerUsage);
    if (bufferCount != DEFAULT_MAX_BUFFERS) {
    if (bufferCount != DEFAULT_MAX_BUFFERS) {
        err = mConsumer->setMaxAcquiredBufferCount(bufferCount);
        err = mConsumer->setMaxAcquiredBufferCount(bufferCount);
        LOG_ALWAYS_FATAL_IF(err != OK,
        LOG_ALWAYS_FATAL_IF(err != OK,
+9 −0
Original line number Original line Diff line number Diff line
@@ -1102,6 +1102,7 @@ int BufferQueueProducer::query(int what, int *outValue) {
            value = (mCore->mQueue.size() > 1);
            value = (mCore->mQueue.size() > 1);
            break;
            break;
        case NATIVE_WINDOW_CONSUMER_USAGE_BITS:
        case NATIVE_WINDOW_CONSUMER_USAGE_BITS:
            // deprecated; higher 32 bits are truncated
            value = static_cast<int32_t>(mCore->mConsumerUsageBits);
            value = static_cast<int32_t>(mCore->mConsumerUsageBits);
            break;
            break;
        case NATIVE_WINDOW_DEFAULT_DATASPACE:
        case NATIVE_WINDOW_DEFAULT_DATASPACE:
@@ -1547,4 +1548,12 @@ status_t BufferQueueProducer::getUniqueId(uint64_t* outId) const {
    return NO_ERROR;
    return NO_ERROR;
}
}


status_t BufferQueueProducer::getConsumerUsage(uint64_t* outUsage) const {
    BQ_LOGV("getConsumerUsage");

    Mutex::Autolock lock(mCore->mMutex);
    *outUsage = mCore->mConsumerUsageBits;
    return NO_ERROR;
}

} // namespace android
} // namespace android
+1 −1
Original line number Original line Diff line number Diff line
@@ -1115,7 +1115,7 @@ status_t GLConsumer::setDefaultBufferDataSpace(
    return mConsumer->setDefaultBufferDataSpace(defaultDataSpace);
    return mConsumer->setDefaultBufferDataSpace(defaultDataSpace);
}
}


status_t GLConsumer::setConsumerUsageBits(uint32_t usage) {
status_t GLConsumer::setConsumerUsageBits(uint64_t usage) {
    Mutex::Autolock lock(mMutex);
    Mutex::Autolock lock(mMutex);
    if (mAbandoned) {
    if (mAbandoned) {
        GLC_LOGE("setConsumerUsageBits: GLConsumer is abandoned!");
        GLC_LOGE("setConsumerUsageBits: GLConsumer is abandoned!");
+39 −1
Original line number Original line Diff line number Diff line
@@ -62,7 +62,8 @@ enum {
    SET_DEQUEUE_TIMEOUT,
    SET_DEQUEUE_TIMEOUT,
    GET_LAST_QUEUED_BUFFER,
    GET_LAST_QUEUED_BUFFER,
    GET_FRAME_TIMESTAMPS,
    GET_FRAME_TIMESTAMPS,
    GET_UNIQUE_ID
    GET_UNIQUE_ID,
    GET_CONSUMER_USAGE,
};
};


class BpGraphicBufferProducer : public BpInterface<IGraphicBufferProducer>
class BpGraphicBufferProducer : public BpInterface<IGraphicBufferProducer>
@@ -504,6 +505,25 @@ public:
        }
        }
        return actualResult;
        return actualResult;
    }
    }

    virtual status_t getConsumerUsage(uint64_t* outUsage) const {
        Parcel data, reply;
        data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
        status_t result = remote()->transact(GET_CONSUMER_USAGE, data, &reply);
        if (result != NO_ERROR) {
            ALOGE("getConsumerUsage failed to transact: %d", result);
        }
        status_t actualResult = NO_ERROR;
        result = reply.readInt32(&actualResult);
        if (result != NO_ERROR) {
            return result;
        }
        result = reply.readUint64(outUsage);
        if (result != NO_ERROR) {
            return result;
        }
        return actualResult;
    }
};
};


// Out-of-line virtual method definition to trigger vtable emission in this
// Out-of-line virtual method definition to trigger vtable emission in this
@@ -622,6 +642,10 @@ public:
    status_t getUniqueId(uint64_t* outId) const override {
    status_t getUniqueId(uint64_t* outId) const override {
        return mBase->getUniqueId(outId);
        return mBase->getUniqueId(outId);
    }
    }

    status_t getConsumerUsage(uint64_t* outUsage) const override {
        return mBase->getConsumerUsage(outUsage);
    }
};
};


IMPLEMENT_HYBRID_META_INTERFACE(GraphicBufferProducer, HGraphicBufferProducer,
IMPLEMENT_HYBRID_META_INTERFACE(GraphicBufferProducer, HGraphicBufferProducer,
@@ -889,6 +913,20 @@ status_t BnGraphicBufferProducer::onTransact(
            }
            }
            return NO_ERROR;
            return NO_ERROR;
        }
        }
        case GET_CONSUMER_USAGE: {
            CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
            uint64_t outUsage = 0;
            status_t actualResult = getConsumerUsage(&outUsage);
            status_t result = reply->writeInt32(actualResult);
            if (result != NO_ERROR) {
                return result;
            }
            result = reply->writeUint64(outUsage);
            if (result != NO_ERROR) {
                return result;
            }
            return NO_ERROR;
        }
    }
    }
    return BBinder::onTransact(code, data, reply, flags);
    return BBinder::onTransact(code, data, reply, flags);
}
}
+13 −0
Original line number Original line Diff line number Diff line
@@ -974,6 +974,9 @@ int Surface::perform(int operation, va_list args)
    case NATIVE_WINDOW_SET_USAGE64:
    case NATIVE_WINDOW_SET_USAGE64:
        res = dispatchSetUsage64(args);
        res = dispatchSetUsage64(args);
        break;
        break;
    case NATIVE_WINDOW_GET_CONSUMER_USAGE64:
        res = dispatchGetConsumerUsage64(args);
        break;
    default:
    default:
        res = NAME_NOT_FOUND;
        res = NAME_NOT_FOUND;
        break;
        break;
@@ -1152,6 +1155,11 @@ int Surface::dispatchGetHdrSupport(va_list args) {
    return getHdrSupport(outSupport);
    return getHdrSupport(outSupport);
}
}


int Surface::dispatchGetConsumerUsage64(va_list args) {
    uint64_t* usage = va_arg(args, uint64_t*);
    return getConsumerUsage(usage);
}

int Surface::connect(int api) {
int Surface::connect(int api) {
    static sp<IProducerListener> listener = new DummyProducerListener();
    static sp<IProducerListener> listener = new DummyProducerListener();
    return connect(api, listener);
    return connect(api, listener);
@@ -1721,6 +1729,11 @@ status_t Surface::getUniqueId(uint64_t* outId) const {
    return mGraphicBufferProducer->getUniqueId(outId);
    return mGraphicBufferProducer->getUniqueId(outId);
}
}


int Surface::getConsumerUsage(uint64_t* outUsage) const {
    Mutex::Autolock lock(mMutex);
    return mGraphicBufferProducer->getConsumerUsage(outUsage);
}

nsecs_t Surface::getLastDequeueStartTime() const {
nsecs_t Surface::getLastDequeueStartTime() const {
    Mutex::Autolock lock(mMutex);
    Mutex::Autolock lock(mMutex);
    return mLastDequeueStartTime;
    return mLastDequeueStartTime;
Loading