Example #1
0
int SurfaceTextureClient::queueBuffer(android_native_buffer_t* buffer) {
    LOGV("SurfaceTextureClient::queueBuffer");
#ifdef GFX_TESTFRAMEWORK
    char eventID[TF_EVENT_ID_SIZE_MAX];
    int idx = getSlotFromBufferLocked(buffer);
    snprintf(eventID, TF_EVENT_ID_SIZE_MAX, "Q-%d", idx);
    TF_PRINT(TF_EVENT_START, "STClient", eventID, "BUFFER:STC queue start");
    sQueueStartTime[idx] = systemTime();
#endif
    Mutex::Autolock lock(mMutex);
    int64_t timestamp;
    if (mTimestamp == NATIVE_WINDOW_TIMESTAMP_AUTO) {
        timestamp = systemTime(SYSTEM_TIME_MONOTONIC);
        LOGV("SurfaceTextureClient::queueBuffer making up timestamp: %.2f ms",
             timestamp / 1000000.f);
    } else {
        timestamp = mTimestamp;
    }
    int i = getSlotFromBufferLocked(buffer);
    if (i < 0) {
        return i;
    }
    status_t err = mSurfaceTexture->queueBuffer(i, timestamp,
            &mDefaultWidth, &mDefaultHeight, &mTransformHint);
    if (err != OK)  {
        LOGE("queueBuffer: error queuing buffer to SurfaceTexture, %d", err);
    }
#ifdef GFX_TESTFRAMEWORK
    sQueueEndTime[i] = systemTime();
    TF_PRINT(TF_EVENT_STOP, "STClient", eventID, "BUFFER:STC queue end, buffer=%p",
             mSlots[i]->handle);
    {
        int dqTime = ns2ms(sDequeueEndTime[i] - sDequeueStartTime[i]);
        int dqToLock = ns2ms(sLockStartTime[i] - sDequeueEndTime[i]);
        int qTime = ns2ms(sQueueEndTime[i] - sQueueStartTime[i]);
        int renderingTime = ns2ms(sQueueStartTime[i] - sLockStartTime[i]);
        int totalTime = ns2ms(sQueueEndTime[i] - sDequeueStartTime[i]);
        TF_PRINT(TF_EVENT, "STClient", "GFX-Timelines", "DequeueTime %d LockTime Unk QueueTime %d "
                 "RenderingTime %d DequeueToLockTime %d TotalTime %d bufSlot %d PID %d TID %d",
                 dqTime, qTime, renderingTime, dqToLock, totalTime,
                 i, getpid(), gettid());
    }
#endif
    return err;
}
int FramebufferNativeWindow::dequeueBuffer(ANativeWindow* window, 
        android_native_buffer_t** buffer)
{
    FramebufferNativeWindow* self = getSelf(window);
    framebuffer_device_t* fb = self->fbDev;

    int index = self->mBufferHead;
#ifdef GFX_TESTFRAMEWORK
    char eventID[TF_EVENT_ID_SIZE_MAX];
    snprintf(eventID, TF_EVENT_ID_SIZE_MAX, "Dequeue-%d", index);
    nsecs_t start = systemTime();
    TF_PRINT(TF_EVENT_START, "FBNW", eventID, "BUFFER:FBNW dequeue start");
#endif
    GraphicLog& logger(GraphicLog::getInstance());
    logger.log(GraphicLog::SF_FB_DEQUEUE_BEFORE, index);

    /* The buffer is available, return it */
    Mutex::Autolock _l(self->mutex);

    // wait if the number of free buffers <= 0
    while (self->mNumFreeBuffers <= 0) {
        self->mCondition.wait(self->mutex);
    }
    self->mBufferHead++;
    if (self->mBufferHead >= self->mNumBuffers)
        self->mBufferHead = 0;

    // get this buffer
    self->mNumFreeBuffers--;
    self->mCurrentBufferIndex = index;

    *buffer = self->buffers[index].get();
#ifdef GFX_TESTFRAMEWORK
    nsecs_t end = systemTime();
    int dqtime = ns2ms(end - start);
    TF_PRINT(TF_EVENT_STOP, "FBNW", eventID,
             "BUFFER:FBNW dequeue end, DequeueTime %d on buf %d",
             dqtime, index);
#endif
    logger.log(GraphicLog::SF_FB_DEQUEUE_AFTER, index);
    return 0;
}
Example #3
0
int SurfaceTextureClient::dequeueBuffer(android_native_buffer_t** buffer) {
    LOGV("SurfaceTextureClient::dequeueBuffer");
#ifdef GFX_TESTFRAMEWORK
    nsecs_t startTime = systemTime();
    TF_PRINT(TF_EVENT_START, "STClient", "DQ", "BUFFER:STC dequeue start");
#endif
    Mutex::Autolock lock(mMutex);
    int buf = -1;
    status_t result = mSurfaceTexture->dequeueBuffer(&buf, mReqWidth, mReqHeight,
            mReqFormat, mReqUsage);
    if (result < 0) {
        LOGV("dequeueBuffer: ISurfaceTexture::dequeueBuffer(%d, %d, %d, %d)"
             "failed: %d", mReqWidth, mReqHeight, mReqFormat, mReqUsage,
             result);
        return result;
    }
    sp<GraphicBuffer>& gbuf(mSlots[buf]);
    if (result & ISurfaceTexture::RELEASE_ALL_BUFFERS) {
        freeAllBuffers();
    }

    if ((result & ISurfaceTexture::BUFFER_NEEDS_REALLOCATION) || gbuf == 0) {
        result = mSurfaceTexture->requestBuffer(buf, &gbuf);
        if (result != NO_ERROR) {
            LOGE("dequeueBuffer: ISurfaceTexture::requestBuffer failed: %d",
                    result);
            return result;
        }
    }
    *buffer = gbuf.get();
#ifdef GFX_TESTFRAMEWORK
    sDequeueEndTime[buf] = systemTime();
    sDequeueStartTime[buf] = startTime;
    TF_PRINT(TF_EVENT_STOP, "STClient", "DQ",
             "BUFFER:STC dequeue end bufSlot=%d buffer=%p",
             buf, mSlots[buf]->handle);
#endif

    return OK;
}
int FramebufferNativeWindow::lockBuffer(ANativeWindow* window, 
        android_native_buffer_t* buffer)
{
    FramebufferNativeWindow* self = getSelf(window);
    framebuffer_device_t* fb = self->fbDev;
    int index = -1;

#ifdef GFX_TESTFRAMEWORK
    char eventID[TF_EVENT_ID_SIZE_MAX];
    index = self->mCurrentBufferIndex;
    snprintf(eventID, TF_EVENT_ID_SIZE_MAX, "lock-%d", index);
    nsecs_t start = systemTime();
    TF_PRINT(TF_EVENT_START, "FBNW", eventID, "BUFFER:FBNW lock start");
#endif
    {
        Mutex::Autolock _l(self->mutex);
        index = self->mCurrentBufferIndex;
    }
    GraphicLog& logger(GraphicLog::getInstance());
    logger.log(GraphicLog::SF_FB_LOCK_BEFORE, index);

    if (!fb->lockBuffer) {
        while (self->front == buffer) {
            self->mCondition.wait(self->mutex);
        }
    }
    else {
        fb->lockBuffer(fb, index);
    }

    logger.log(GraphicLog::SF_FB_LOCK_AFTER, index);
#ifdef GFX_TESTFRAMEWORK
    nsecs_t end = systemTime();
    int lktime = ns2ms(end - start);
    TF_PRINT(TF_EVENT_STOP, "FBNW", eventID,
             "BUFFER:FBNW lock end, LockTime %d on buf %d",
             lktime, index);
#endif
    return NO_ERROR;
}
Example #5
0
int SurfaceTextureClient::lockBuffer(android_native_buffer_t* buffer) {
    LOGV("SurfaceTextureClient::lockBuffer");
#ifdef GFX_TESTFRAMEWORK
    int i = getSlotFromBufferLocked(buffer);
    char eventID[TF_EVENT_ID_SIZE_MAX];
    snprintf(eventID, TF_EVENT_ID_SIZE_MAX, "Lock-%d", i);
    TF_PRINT(TF_EVENT, "STClient", eventID, "BUFFER:STC lock, buffer=%p",
             mSlots[i]->handle);
    sLockStartTime[i] = systemTime();
#endif
    Mutex::Autolock lock(mMutex);
    return OK;
}
int FramebufferNativeWindow::queueBuffer(ANativeWindow* window, 
        ANativeWindowBuffer* buffer)
{
    FramebufferNativeWindow* self = getSelf(window);
    int index = -1;
#ifdef GFX_TESTFRAMEWORK
    char eventID[TF_EVENT_ID_SIZE_MAX];
    index = self->mCurrentBufferIndex;
    snprintf(eventID, TF_EVENT_ID_SIZE_MAX, "Queue-%d", index);
    nsecs_t start = systemTime();
    TF_PRINT(TF_EVENT_START, "FBNW", eventID, "BUFFER:FBNW Queue start");
#endif
    Mutex::Autolock _l(self->mutex);
    framebuffer_device_t* fb = self->fbDev;
    buffer_handle_t handle = static_cast<NativeBuffer*>(buffer)->handle;

    index = self->mCurrentBufferIndex;
    GraphicLog& logger(GraphicLog::getInstance());
    logger.log(GraphicLog::SF_FB_POST_BEFORE, index);

    int res = fb->post(fb, handle);

    logger.log(GraphicLog::SF_FB_POST_AFTER, index);

    self->front = static_cast<NativeBuffer*>(buffer);
    self->mNumFreeBuffers++;
    self->mCondition.broadcast();
#ifdef GFX_TESTFRAMEWORK
    nsecs_t end = systemTime();
    int qtime = ns2ms(end - start);
    TF_PRINT(TF_EVENT_STOP, "FBNW", eventID,
             "BUFFER:FBNW Queue end, QueueTime %d on buf %d",
             qtime, index);
    //todo: need add detailed stats like SFClient
#endif
    return res;
}