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

Commit ecc4a4ed authored by Dan Stoza's avatar Dan Stoza Committed by android-build-merger
Browse files

Surface: Add LAST_[DE]QUEUE_DURATION queries

am: 70ccba59

Change-Id: I635453d221d45c690ef222cbf9ac0df80497d249
parents d5193eb9 70ccba59
Loading
Loading
Loading
Loading
+5 −1
Original line number Diff line number Diff line
@@ -198,7 +198,6 @@ protected:
    virtual int cancelBuffer(ANativeWindowBuffer* buffer, int fenceFd);
    virtual int queueBuffer(ANativeWindowBuffer* buffer, int fenceFd);
    virtual int perform(int operation, va_list args);
    virtual int query(int what, int* value) const;
    virtual int setSwapInterval(int interval);

    virtual int lockBuffer_DEPRECATED(ANativeWindowBuffer* buffer);
@@ -224,6 +223,7 @@ public:
    virtual int setAutoRefresh(bool autoRefresh);
    virtual int lock(ANativeWindow_Buffer* outBuffer, ARect* inOutDirtyBounds);
    virtual int unlockAndPost();
    virtual int query(int what, int* value) const;

    virtual int connect(int api, const sp<IProducerListener>& listener);
    virtual int detachNextBuffer(sp<GraphicBuffer>* outBuffer,
@@ -370,6 +370,10 @@ private:
    // used to prevent a mismatch between the number of queue/dequeue calls.
    bool mSharedBufferHasBeenQueued;

    // These are used to satisfy the NATIVE_WINDOW_LAST_*_DURATION queries
    nsecs_t mLastDequeueDuration = 0;
    nsecs_t mLastQueueDuration = 0;

    Condition mQueueBufferCondition;
};

+18 −0
Original line number Diff line number Diff line
@@ -292,8 +292,10 @@ int Surface::dequeueBuffer(android_native_buffer_t** buffer, int* fenceFd) {

    int buf = -1;
    sp<Fence> fence;
    nsecs_t now = systemTime();
    status_t result = mGraphicBufferProducer->dequeueBuffer(&buf, &fence,
            reqWidth, reqHeight, reqFormat, reqUsage);
    mLastDequeueDuration = systemTime() - now;

    if (result < 0) {
        ALOGV("dequeueBuffer: IGraphicBufferProducer::dequeueBuffer"
@@ -496,7 +498,9 @@ int Surface::queueBuffer(android_native_buffer_t* buffer, int fenceFd) {
        input.setSurfaceDamage(flippedRegion);
    }

    nsecs_t now = systemTime();
    status_t err = mGraphicBufferProducer->queueBuffer(i, input, &output);
    mLastQueueDuration = systemTime() - now;
    if (err != OK)  {
        ALOGE("queueBuffer: error queuing buffer to SurfaceTexture, %d", err);
    }
@@ -575,6 +579,20 @@ int Surface::query(int what, int* value) const {
                }
                return err;
            }
            case NATIVE_WINDOW_LAST_DEQUEUE_DURATION: {
                int64_t durationUs = mLastDequeueDuration / 1000;
                *value = durationUs > std::numeric_limits<int>::max() ?
                        std::numeric_limits<int>::max() :
                        static_cast<int>(durationUs);
                return NO_ERROR;
            }
            case NATIVE_WINDOW_LAST_QUEUE_DURATION: {
                int64_t durationUs = mLastQueueDuration / 1000;
                *value = durationUs > std::numeric_limits<int>::max() ?
                        std::numeric_limits<int>::max() :
                        static_cast<int>(durationUs);
                return NO_ERROR;
            }
        }
    }
    return mGraphicBufferProducer->query(what, value);