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

Commit f0c9a391 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Have the Surface class track the buffer age." into oc-mr1-dev

parents a5fef4c0 a2eb34cf
Loading
Loading
Loading
Loading
+7 −4
Original line number Original line Diff line number Diff line
@@ -347,9 +347,9 @@ status_t BufferQueueProducer::waitForFreeSlotThenRelock(FreeSlotCaller caller,
    return NO_ERROR;
    return NO_ERROR;
}
}


status_t BufferQueueProducer::dequeueBuffer(int *outSlot,
status_t BufferQueueProducer::dequeueBuffer(int* outSlot, sp<android::Fence>* outFence,
        sp<android::Fence> *outFence, uint32_t width, uint32_t height,
                                            uint32_t width, uint32_t height, PixelFormat format,
        PixelFormat format, uint64_t usage,
                                            uint64_t usage, uint64_t* outBufferAge,
                                            FrameEventHistoryDelta* outTimestamps) {
                                            FrameEventHistoryDelta* outTimestamps) {
    ATRACE_CALL();
    ATRACE_CALL();
    { // Autolock scope
    { // Autolock scope
@@ -558,6 +558,9 @@ status_t BufferQueueProducer::dequeueBuffer(int *outSlot,
            mSlots[*outSlot].mFrameNumber,
            mSlots[*outSlot].mFrameNumber,
            mSlots[*outSlot].mGraphicBuffer->handle, returnFlags);
            mSlots[*outSlot].mGraphicBuffer->handle, returnFlags);


    if (outBufferAge) {
        *outBufferAge = mCore->mBufferAge;
    }
    addAndGetFrameTimestamps(nullptr, outTimestamps);
    addAndGetFrameTimestamps(nullptr, outTimestamps);


    return returnFlags;
    return returnFlags;
+22 −10
Original line number Original line Diff line number Diff line
@@ -124,8 +124,8 @@ public:
        return result;
        return result;
    }
    }


    virtual status_t dequeueBuffer(int *buf, sp<Fence>* fence, uint32_t width,
    virtual status_t dequeueBuffer(int* buf, sp<Fence>* fence, uint32_t width, uint32_t height,
            uint32_t height, PixelFormat format, uint64_t usage,
                                   PixelFormat format, uint64_t usage, uint64_t* outBufferAge,
                                   FrameEventHistoryDelta* outTimestamps) {
                                   FrameEventHistoryDelta* outTimestamps) {
        Parcel data, reply;
        Parcel data, reply;
        bool getFrameTimestamps = (outTimestamps != nullptr);
        bool getFrameTimestamps = (outTimestamps != nullptr);
@@ -149,6 +149,17 @@ public:
            fence->clear();
            fence->clear();
            return result;
            return result;
        }
        }
        if (outBufferAge) {
            result = reply.readUint64(outBufferAge);
        } else {
            // Read the value even if outBufferAge is nullptr:
            uint64_t bufferAge;
            result = reply.readUint64(&bufferAge);
        }
        if (result != NO_ERROR) {
            ALOGE("IGBP::dequeueBuffer failed to read buffer age: %d", result);
            return result;
        }
        if (getFrameTimestamps) {
        if (getFrameTimestamps) {
            result = reply.read(*outTimestamps);
            result = reply.read(*outTimestamps);
            if (result != NO_ERROR) {
            if (result != NO_ERROR) {
@@ -516,11 +527,10 @@ public:
        return mBase->setAsyncMode(async);
        return mBase->setAsyncMode(async);
    }
    }


    status_t dequeueBuffer(int* slot, sp<Fence>* fence, uint32_t w, uint32_t h,
    status_t dequeueBuffer(int* slot, sp<Fence>* fence, uint32_t w, uint32_t h, PixelFormat format,
            PixelFormat format, uint64_t usage,
                           uint64_t usage, uint64_t* outBufferAge,
                           FrameEventHistoryDelta* outTimestamps) override {
                           FrameEventHistoryDelta* outTimestamps) override {
        return mBase->dequeueBuffer(
        return mBase->dequeueBuffer(slot, fence, w, h, format, usage, outBufferAge, outTimestamps);
                slot, fence, w, h, format, usage, outTimestamps);
    }
    }


    status_t detachBuffer(int slot) override {
    status_t detachBuffer(int slot) override {
@@ -655,16 +665,18 @@ status_t BnGraphicBufferProducer::onTransact(
            uint32_t height = data.readUint32();
            uint32_t height = data.readUint32();
            PixelFormat format = static_cast<PixelFormat>(data.readInt32());
            PixelFormat format = static_cast<PixelFormat>(data.readInt32());
            uint64_t usage = data.readUint64();
            uint64_t usage = data.readUint64();
            uint64_t bufferAge = 0;
            bool getTimestamps = data.readBool();
            bool getTimestamps = data.readBool();


            int buf = 0;
            int buf = 0;
            sp<Fence> fence = Fence::NO_FENCE;
            sp<Fence> fence = Fence::NO_FENCE;
            FrameEventHistoryDelta frameTimestamps;
            FrameEventHistoryDelta frameTimestamps;
            int result = dequeueBuffer(&buf, &fence, width, height, format,
            int result = dequeueBuffer(&buf, &fence, width, height, format, usage, &bufferAge,
                    usage, getTimestamps ? &frameTimestamps : nullptr);
                                       getTimestamps ? &frameTimestamps : nullptr);


            reply->writeInt32(buf);
            reply->writeInt32(buf);
            reply->write(*fence);
            reply->write(*fence);
            reply->writeUint64(bufferAge);
            if (getTimestamps) {
            if (getTimestamps) {
                reply->write(frameTimestamps);
                reply->write(frameTimestamps);
            }
            }
+25 −18
Original line number Original line Diff line number Diff line
@@ -44,11 +44,10 @@


namespace android {
namespace android {


Surface::Surface(
Surface::Surface(const sp<IGraphicBufferProducer>& bufferProducer, bool controlledByApp)
        const sp<IGraphicBufferProducer>& bufferProducer,
        bool controlledByApp)
      : mGraphicBufferProducer(bufferProducer),
      : mGraphicBufferProducer(bufferProducer),
        mCrop(Rect::EMPTY_RECT),
        mCrop(Rect::EMPTY_RECT),
        mBufferAge(0),
        mGenerationNumber(0),
        mGenerationNumber(0),
        mSharedBufferMode(false),
        mSharedBufferMode(false),
        mAutoRefresh(false),
        mAutoRefresh(false),
@@ -57,8 +56,7 @@ Surface::Surface(
        mQueriedSupportedTimestamps(false),
        mQueriedSupportedTimestamps(false),
        mFrameTimestampsSupportsPresent(false),
        mFrameTimestampsSupportsPresent(false),
        mEnableFrameTimestamps(false),
        mEnableFrameTimestamps(false),
      mFrameEventHistory(std::make_unique<ProducerFrameEventHistory>())
        mFrameEventHistory(std::make_unique<ProducerFrameEventHistory>()) {
{
    // Initialize the ANativeWindow function pointers.
    // Initialize the ANativeWindow function pointers.
    ANativeWindow::setSwapInterval  = hook_setSwapInterval;
    ANativeWindow::setSwapInterval  = hook_setSwapInterval;
    ANativeWindow::dequeueBuffer    = hook_dequeueBuffer;
    ANativeWindow::dequeueBuffer    = hook_dequeueBuffer;
@@ -506,9 +504,10 @@ int Surface::dequeueBuffer(android_native_buffer_t** buffer, int* fenceFd) {
    nsecs_t startTime = systemTime();
    nsecs_t startTime = systemTime();


    FrameEventHistoryDelta frameTimestamps;
    FrameEventHistoryDelta frameTimestamps;
    status_t result = mGraphicBufferProducer->dequeueBuffer(&buf, &fence,
    status_t result = mGraphicBufferProducer->dequeueBuffer(&buf, &fence, reqWidth, reqHeight,
            reqWidth, reqHeight, reqFormat, reqUsage,
                                                            reqFormat, reqUsage, &mBufferAge,
            enableFrameTimestamps ? &frameTimestamps : nullptr);
                                                            enableFrameTimestamps ? &frameTimestamps
                                                                                  : nullptr);
    mLastDequeueDuration = systemTime() - startTime;
    mLastDequeueDuration = systemTime() - startTime;


    if (result < 0) {
    if (result < 0) {
@@ -845,6 +844,14 @@ int Surface::query(int what, int* value) const {
                }
                }
                return err;
                return err;
            }
            }
            case NATIVE_WINDOW_BUFFER_AGE: {
                if (mBufferAge > INT32_MAX) {
                    *value = 0;
                } else {
                    *value = static_cast<int32_t>(mBufferAge);
                }
                return NO_ERROR;
            }
            case NATIVE_WINDOW_LAST_DEQUEUE_DURATION: {
            case NATIVE_WINDOW_LAST_DEQUEUE_DURATION: {
                int64_t durationUs = mLastDequeueDuration / 1000;
                int64_t durationUs = mLastDequeueDuration / 1000;
                *value = durationUs > std::numeric_limits<int>::max() ?
                *value = durationUs > std::numeric_limits<int>::max() ?
+8 −4
Original line number Original line Diff line number Diff line
@@ -989,10 +989,10 @@ status_t H2BGraphicBufferProducer::setAsyncMode(bool async) {
}
}


// FIXME: usage bits truncated -- needs a 64-bits usage version
// FIXME: usage bits truncated -- needs a 64-bits usage version
status_t H2BGraphicBufferProducer::dequeueBuffer(
status_t H2BGraphicBufferProducer::dequeueBuffer(int* slot, sp<Fence>* fence, uint32_t w,
        int* slot, sp<Fence>* fence,
                                                 uint32_t h, ::android::PixelFormat format,
        uint32_t w, uint32_t h, ::android::PixelFormat format,
                                                 uint64_t usage, uint64_t* outBufferAge,
        uint64_t usage, FrameEventHistoryDelta* outTimestamps) {
                                                 FrameEventHistoryDelta* outTimestamps) {
    *fence = new Fence();
    *fence = new Fence();
    status_t fnStatus;
    status_t fnStatus;
    status_t transStatus = toStatusT(mBase->dequeueBuffer(
    status_t transStatus = toStatusT(mBase->dequeueBuffer(
@@ -1016,6 +1016,10 @@ status_t H2BGraphicBufferProducer::dequeueBuffer(
                    fnStatus = fnStatus == NO_ERROR ? BAD_VALUE : fnStatus;
                    fnStatus = fnStatus == NO_ERROR ? BAD_VALUE : fnStatus;
                }
                }
            }));
            }));
    if (outBufferAge) {
        // Since the HAL version doesn't return the buffer age, set it to 0:
        *outBufferAge = 0;
    }
    return transStatus == NO_ERROR ? fnStatus : transStatus;
    return transStatus == NO_ERROR ? fnStatus : transStatus;
}
}


+4 −3
Original line number Original line Diff line number Diff line
@@ -80,9 +80,10 @@ public:
    //
    //
    // In both cases, the producer will need to call requestBuffer to get a
    // In both cases, the producer will need to call requestBuffer to get a
    // GraphicBuffer handle for the returned slot.
    // GraphicBuffer handle for the returned slot.
    virtual status_t dequeueBuffer(int *outSlot, sp<Fence>* outFence,
    virtual status_t dequeueBuffer(int* outSlot, sp<Fence>* outFence, uint32_t width,
            uint32_t width, uint32_t height, PixelFormat format,
                                   uint32_t height, PixelFormat format, uint64_t usage,
            uint64_t usage, FrameEventHistoryDelta* outTimestamps) override;
                                   uint64_t* outBufferAge,
                                   FrameEventHistoryDelta* outTimestamps) override;


    // See IGraphicBufferProducer::detachBuffer
    // See IGraphicBufferProducer::detachBuffer
    virtual status_t detachBuffer(int slot);
    virtual status_t detachBuffer(int slot);
Loading