diff options
| -rw-r--r-- | include/gui/SurfaceTextureClient.h | 1 | ||||
| -rw-r--r-- | include/utils/BlobCache.h | 3 | ||||
| -rw-r--r-- | libs/gui/SurfaceTextureClient.cpp | 45 | ||||
| -rw-r--r-- | libs/gui/tests/SurfaceTextureClient_test.cpp | 2 | ||||
| -rw-r--r-- | libs/gui/tests/SurfaceTexture_test.cpp | 24 | ||||
| -rw-r--r-- | libs/utils/BlobCache.cpp | 14 |
6 files changed, 64 insertions, 25 deletions
diff --git a/include/gui/SurfaceTextureClient.h b/include/gui/SurfaceTextureClient.h index e7c6e247b2..6ce44fcac7 100644 --- a/include/gui/SurfaceTextureClient.h +++ b/include/gui/SurfaceTextureClient.h @@ -80,6 +80,7 @@ private: int setUsage(uint32_t reqUsage); void freeAllBuffers(); + int getSlotFromBufferLocked(android_native_buffer_t* buffer) const; int getConnectedApi() const; diff --git a/include/utils/BlobCache.h b/include/utils/BlobCache.h index 8f76d72c18..dc45ff0f35 100644 --- a/include/utils/BlobCache.h +++ b/include/utils/BlobCache.h @@ -82,6 +82,9 @@ private: BlobCache(const BlobCache&); void operator=(const BlobCache&); + // A random function helper to get around MinGW not having nrand48() + long int blob_random(); + // clean evicts a randomly chosen set of entries from the cache such that // the total size of all remaining entries is less than mMaxTotalSize/2. void clean(); diff --git a/libs/gui/SurfaceTextureClient.cpp b/libs/gui/SurfaceTextureClient.cpp index 22b0852270..b9b2310c7f 100644 --- a/libs/gui/SurfaceTextureClient.cpp +++ b/libs/gui/SurfaceTextureClient.cpp @@ -143,12 +143,40 @@ int SurfaceTextureClient::dequeueBuffer(android_native_buffer_t** buffer) { int SurfaceTextureClient::cancelBuffer(android_native_buffer_t* buffer) { LOGV("SurfaceTextureClient::cancelBuffer"); Mutex::Autolock lock(mMutex); + int i = getSlotFromBufferLocked(buffer); + if (i < 0) { + return i; + } + mSurfaceTexture->cancelBuffer(i); + return OK; +} + +int SurfaceTextureClient::getSlotFromBufferLocked( + android_native_buffer_t* buffer) const { + bool dumpedState = false; for (int i = 0; i < NUM_BUFFER_SLOTS; i++) { - if (mSlots[i]->handle == buffer->handle) { - mSurfaceTexture->cancelBuffer(i); - return OK; + // XXX: Dump the slots whenever we hit a NULL entry while searching for + // a buffer. + if (mSlots[i] == NULL) { + if (!dumpedState) { + LOGD("getSlotFromBufferLocked: encountered NULL buffer in slot %d " + "looking for buffer %p", i, buffer->handle); + for (int j = 0; j < NUM_BUFFER_SLOTS; j++) { + if (mSlots[j] == NULL) { + LOGD("getSlotFromBufferLocked: %02d: NULL", j); + } else { + LOGD("getSlotFromBufferLocked: %02d: %p", j, mSlots[j]->handle); + } + } + dumpedState = true; + } + } + + if (mSlots[i] != NULL && mSlots[i]->handle == buffer->handle) { + return i; } } + LOGE("getSlotFromBufferLocked: unknown buffer: %p", buffer->handle); return BAD_VALUE; } @@ -169,13 +197,12 @@ int SurfaceTextureClient::queueBuffer(android_native_buffer_t* buffer) { } else { timestamp = mTimestamp; } - for (int i = 0; i < NUM_BUFFER_SLOTS; i++) { - if (mSlots[i]->handle == buffer->handle) { - return mSurfaceTexture->queueBuffer(i, timestamp); - } + int i = getSlotFromBufferLocked(buffer); + if (i < 0) { + return i; } - LOGE("queueBuffer: unknown buffer queued"); - return BAD_VALUE; + mSurfaceTexture->queueBuffer(i, timestamp); + return OK; } int SurfaceTextureClient::query(int what, int* value) const { diff --git a/libs/gui/tests/SurfaceTextureClient_test.cpp b/libs/gui/tests/SurfaceTextureClient_test.cpp index a4c5b36288..519b40e44a 100644 --- a/libs/gui/tests/SurfaceTextureClient_test.cpp +++ b/libs/gui/tests/SurfaceTextureClient_test.cpp @@ -590,7 +590,7 @@ TEST_F(SurfaceTextureClientTest, GetTransformMatrixSucceedsAfterFreeingBuffersWi // This test verifies that the buffer format can be queried immediately after // it is set. -TEST_F(SurfaceTextureClientTest, DISABLED_QueryFormatAfterSettingWorks) { +TEST_F(SurfaceTextureClientTest, QueryFormatAfterSettingWorks) { sp<ANativeWindow> anw(mSTC); int fmts[] = { // RGBA_8888 should not come first, as it's the default diff --git a/libs/gui/tests/SurfaceTexture_test.cpp b/libs/gui/tests/SurfaceTexture_test.cpp index 50af3bbbac..f6cefa66c3 100644 --- a/libs/gui/tests/SurfaceTexture_test.cpp +++ b/libs/gui/tests/SurfaceTexture_test.cpp @@ -542,11 +542,7 @@ TEST_F(SurfaceTextureGLTest, TexturingFromCpuFilledYV12BufferNpot) { EXPECT_TRUE(checkPixel(36, 22, 155, 29, 0, 255)); } -// XXX: This test is disabled because it it currently broken on all devices to -// which I have access. Some of the checkPixel calls are not correct because -// I just copied them from the npot test above and haven't bothered to figure -// out the correct values. -TEST_F(SurfaceTextureGLTest, DISABLED_TexturingFromCpuFilledYV12BufferPow2) { +TEST_F(SurfaceTextureGLTest, TexturingFromCpuFilledYV12BufferPow2) { const int texWidth = 64; const int texHeight = 64; @@ -576,18 +572,18 @@ TEST_F(SurfaceTextureGLTest, DISABLED_TexturingFromCpuFilledYV12BufferPow2) { drawTexture(); - EXPECT_TRUE(checkPixel( 0, 0, 255, 127, 255, 255)); - EXPECT_TRUE(checkPixel(63, 0, 0, 133, 0, 255)); + EXPECT_TRUE(checkPixel( 0, 0, 0, 133, 0, 255)); + EXPECT_TRUE(checkPixel(63, 0, 255, 127, 255, 255)); EXPECT_TRUE(checkPixel(63, 63, 0, 133, 0, 255)); EXPECT_TRUE(checkPixel( 0, 63, 255, 127, 255, 255)); - EXPECT_TRUE(checkPixel(22, 19, 247, 70, 255, 255)); - EXPECT_TRUE(checkPixel(45, 11, 209, 32, 235, 255)); - EXPECT_TRUE(checkPixel(52, 12, 100, 255, 73, 255)); - EXPECT_TRUE(checkPixel( 7, 32, 155, 0, 118, 255)); - EXPECT_TRUE(checkPixel(31, 54, 148, 71, 110, 255)); - EXPECT_TRUE(checkPixel(29, 28, 255, 127, 255, 255)); - EXPECT_TRUE(checkPixel(36, 41, 155, 29, 0, 255)); + EXPECT_TRUE(checkPixel(22, 19, 100, 255, 74, 255)); + EXPECT_TRUE(checkPixel(45, 11, 100, 255, 74, 255)); + EXPECT_TRUE(checkPixel(52, 12, 155, 0, 181, 255)); + EXPECT_TRUE(checkPixel( 7, 32, 150, 237, 170, 255)); + EXPECT_TRUE(checkPixel(31, 54, 0, 71, 117, 255)); + EXPECT_TRUE(checkPixel(29, 28, 0, 133, 0, 255)); + EXPECT_TRUE(checkPixel(36, 41, 100, 232, 255, 255)); } TEST_F(SurfaceTextureGLTest, TexturingFromCpuFilledYV12BufferWithCrop) { diff --git a/libs/utils/BlobCache.cpp b/libs/utils/BlobCache.cpp index 1298fa733c..590576a8d4 100644 --- a/libs/utils/BlobCache.cpp +++ b/libs/utils/BlobCache.cpp @@ -31,9 +31,13 @@ BlobCache::BlobCache(size_t maxKeySize, size_t maxValueSize, size_t maxTotalSize mMaxTotalSize(maxTotalSize), mTotalSize(0) { nsecs_t now = systemTime(SYSTEM_TIME_MONOTONIC); +#ifdef _WIN32 + srand(now); +#else mRandState[0] = (now >> 0) & 0xFFFF; mRandState[1] = (now >> 16) & 0xFFFF; mRandState[2] = (now >> 32) & 0xFFFF; +#endif LOGV("initializing random seed using %lld", now); } @@ -148,11 +152,19 @@ size_t BlobCache::get(const void* key, size_t keySize, void* value, return valueBlobSize; } +long int BlobCache::blob_random() { +#ifdef _WIN32 + return rand(); +#else + return nrand48(mRandState); +#endif +} + void BlobCache::clean() { // Remove a random cache entry until the total cache size gets below half // the maximum total cache size. while (mTotalSize > mMaxTotalSize / 2) { - size_t i = size_t(nrand48(mRandState) % (mCacheEntries.size())); + size_t i = size_t(blob_random() % (mCacheEntries.size())); const CacheEntry& entry(mCacheEntries[i]); mTotalSize -= entry.getKey()->getSize() + entry.getValue()->getSize(); mCacheEntries.removeAt(i); |