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; }
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; }
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; }