1d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai#include <android/log.h>
2d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai#include <android/native_window.h>
3cb4751c52a5625a22b6a11b4de537ff026d9bfe3Jiwen 'Steve' Cai#include <dvr/dvr_api.h>
42d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai#include <dvr/dvr_buffer_queue.h>
52d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai
62d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai#include <gtest/gtest.h>
72d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai
8d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai#include <array>
9d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai#include <unordered_map>
102251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
119b44532d648d88732c6f17820cf6418c025aecaeTianyuJiang#include "dvr_api_test.h"
129b44532d648d88732c6f17820cf6418c025aecaeTianyuJiang
13869c6d0e652fab846db377632f6f429290faf400TianyuJiang#define LOG_TAG "dvr_buffer_queue-test"
14869c6d0e652fab846db377632f6f429290faf400TianyuJiang
15d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai#ifndef ALOGD
16d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai#define ALOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
17d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai#endif
18d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai
19d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai#ifndef ALOGD_IF
20d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai#define ALOGD_IF(cond, ...) \
21d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai  ((__predict_false(cond)) ? ((void)ALOGD(__VA_ARGS__)) : (void)0)
22d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai#endif
232d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai
242d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cainamespace {
252d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai
26656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Caistatic constexpr uint32_t kBufferWidth = 100;
27656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Caistatic constexpr uint32_t kBufferHeight = 1;
28656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Caistatic constexpr uint32_t kLayerCount = 1;
29d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Caistatic constexpr uint32_t kBufferFormat = AHARDWAREBUFFER_FORMAT_BLOB;
30d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Caistatic constexpr uint64_t kBufferUsage = AHARDWAREBUFFER_USAGE_CPU_READ_OFTEN;
312d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Caistatic constexpr size_t kQueueCapacity = 3;
322d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai
339b44532d648d88732c6f17820cf6418c025aecaeTianyuJiangclass DvrBufferQueueTest : public DvrApiTest {
340b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai public:
350b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai  static void BufferAvailableCallback(void* context) {
360b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai    DvrBufferQueueTest* thiz = static_cast<DvrBufferQueueTest*>(context);
370b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai    thiz->HandleBufferAvailable();
380b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai  }
390b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai
400b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai  static void BufferRemovedCallback(DvrReadBuffer* buffer, void* context) {
410b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai    DvrBufferQueueTest* thiz = static_cast<DvrBufferQueueTest*>(context);
420b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai    thiz->HandleBufferRemoved(buffer);
430b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai  }
440b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai
452d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai protected:
462d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  void TearDown() override {
472d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai    if (write_queue_ != nullptr) {
48274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang      api_.WriteBufferQueueDestroy(write_queue_);
492d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai      write_queue_ = nullptr;
502d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai    }
519b44532d648d88732c6f17820cf6418c025aecaeTianyuJiang    DvrApiTest::TearDown();
522d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  }
532d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai
540b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai  void HandleBufferAvailable() {
550b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai    buffer_available_count_ += 1;
560b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai    ALOGD_IF(TRACE, "Buffer avaiable, count=%d", buffer_available_count_);
570b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai  }
580b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai
590b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai  void HandleBufferRemoved(DvrReadBuffer* buffer) {
600b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai    buffer_removed_count_ += 1;
610b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai    ALOGD_IF(TRACE, "Buffer removed, buffer=%p, count=%d", buffer,
620b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai             buffer_removed_count_);
630b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai  }
640b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai
652d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  DvrWriteBufferQueue* write_queue_{nullptr};
660b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai  int buffer_available_count_{0};
670b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai  int buffer_removed_count_{0};
682d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai};
692d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai
70638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' CaiTEST_F(DvrBufferQueueTest, WriteQueueCreateDestroy) {
71274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang  int ret = api_.WriteBufferQueueCreate(
72d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai      kBufferWidth, kBufferHeight, kBufferFormat, kLayerCount, kBufferUsage,
73638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai      /*capacity=*/0, sizeof(DvrNativeBufferMetadata), &write_queue_);
74d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai  ASSERT_EQ(0, ret);
7542c6f3adbc8473efb0d375e1d564d1522723c6beJiwen 'Steve' Cai
76274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang  api_.WriteBufferQueueDestroy(write_queue_);
772d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  write_queue_ = nullptr;
782d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai}
792d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai
80638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' CaiTEST_F(DvrBufferQueueTest, WriteQueueGetCapacity) {
81274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang  int ret = api_.WriteBufferQueueCreate(
82d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai      kBufferWidth, kBufferHeight, kBufferFormat, kLayerCount, kBufferUsage,
83638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai      kQueueCapacity, sizeof(DvrNativeBufferMetadata), &write_queue_);
84d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai  ASSERT_EQ(0, ret);
8542c6f3adbc8473efb0d375e1d564d1522723c6beJiwen 'Steve' Cai
86274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang  size_t capacity = api_.WriteBufferQueueGetCapacity(write_queue_);
872d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai
882d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  ALOGD_IF(TRACE, "TestWrite_QueueGetCapacity, capacity=%zu", capacity);
892d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  ASSERT_EQ(kQueueCapacity, capacity);
902d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai}
912d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai
92638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' CaiTEST_F(DvrBufferQueueTest, CreateReadQueueFromWriteQueue) {
93274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang  int ret = api_.WriteBufferQueueCreate(
94d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai      kBufferWidth, kBufferHeight, kBufferFormat, kLayerCount, kBufferUsage,
95638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai      /*capacity=*/0, sizeof(DvrNativeBufferMetadata), &write_queue_);
96d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai  ASSERT_EQ(0, ret);
9742c6f3adbc8473efb0d375e1d564d1522723c6beJiwen 'Steve' Cai
982d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  DvrReadBufferQueue* read_queue = nullptr;
99274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang  ret = api_.WriteBufferQueueCreateReadQueue(write_queue_, &read_queue);
1002d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai
1012d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  ASSERT_EQ(0, ret);
1022d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  ASSERT_NE(nullptr, read_queue);
1032d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai
104274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang  api_.ReadBufferQueueDestroy(read_queue);
1052d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai}
1062d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai
107638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' CaiTEST_F(DvrBufferQueueTest, CreateReadQueueFromReadQueue) {
108274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang  int ret = api_.WriteBufferQueueCreate(
109d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai      kBufferWidth, kBufferHeight, kBufferFormat, kLayerCount, kBufferUsage,
110638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai      /*capacity=*/0, sizeof(DvrNativeBufferMetadata), &write_queue_);
111d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai  ASSERT_EQ(0, ret);
11242c6f3adbc8473efb0d375e1d564d1522723c6beJiwen 'Steve' Cai
1132d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  DvrReadBufferQueue* read_queue1 = nullptr;
1142d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  DvrReadBufferQueue* read_queue2 = nullptr;
115274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang  ret = api_.WriteBufferQueueCreateReadQueue(write_queue_, &read_queue1);
1162d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai
1172d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  ASSERT_EQ(0, ret);
1182d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  ASSERT_NE(nullptr, read_queue1);
1192d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai
120274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang  ret = api_.ReadBufferQueueCreateReadQueue(read_queue1, &read_queue2);
1212d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  ASSERT_EQ(0, ret);
1222d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  ASSERT_NE(nullptr, read_queue2);
1232d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  ASSERT_NE(read_queue1, read_queue2);
1242d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai
125274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang  api_.ReadBufferQueueDestroy(read_queue1);
126274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang  api_.ReadBufferQueueDestroy(read_queue2);
1272d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai}
1282d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai
129638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' CaiTEST_F(DvrBufferQueueTest, GainBuffer) {
130274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang  int ret = api_.WriteBufferQueueCreate(
131d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai      kBufferWidth, kBufferHeight, kBufferFormat, kLayerCount, kBufferUsage,
132638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai      kQueueCapacity, sizeof(DvrNativeBufferMetadata), &write_queue_);
133638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai  ASSERT_EQ(ret, 0);
1342251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
135638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai  DvrWriteBuffer* wb = nullptr;
136274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang  EXPECT_FALSE(api_.WriteBufferIsValid(wb));
1372251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
13852ea25cf06cef250ec73052611b48556b3fce4d5Corey Tabaka  DvrNativeBufferMetadata meta;
1392251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  int fence_fd = -1;
140274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang  ret = api_.WriteBufferQueueGainBuffer(write_queue_, /*timeout=*/0, &wb, &meta,
141274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang                                        &fence_fd);
142638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai  ASSERT_EQ(ret, 0);
143638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai  EXPECT_EQ(fence_fd, -1);
144638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai  EXPECT_NE(wb, nullptr);
145274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang  EXPECT_TRUE(api_.WriteBufferIsValid(wb));
1462251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka}
1472251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
148638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' CaiTEST_F(DvrBufferQueueTest, AcquirePostGainRelease) {
149274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang  int ret = api_.WriteBufferQueueCreate(
150d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai      kBufferWidth, kBufferHeight, kBufferFormat, kLayerCount, kBufferUsage,
151638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai      kQueueCapacity, sizeof(DvrNativeBufferMetadata), &write_queue_);
152638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai  ASSERT_EQ(ret, 0);
15342c6f3adbc8473efb0d375e1d564d1522723c6beJiwen 'Steve' Cai
1542d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  DvrReadBufferQueue* read_queue = nullptr;
1552d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  DvrReadBuffer* rb = nullptr;
1562d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  DvrWriteBuffer* wb = nullptr;
15752ea25cf06cef250ec73052611b48556b3fce4d5Corey Tabaka  DvrNativeBufferMetadata meta1;
15852ea25cf06cef250ec73052611b48556b3fce4d5Corey Tabaka  DvrNativeBufferMetadata meta2;
1592d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  int fence_fd = -1;
1602d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai
161274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang  ret = api_.WriteBufferQueueCreateReadQueue(write_queue_, &read_queue);
1622d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai
163638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai  ASSERT_EQ(ret, 0);
164638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai  ASSERT_NE(read_queue, nullptr);
1652d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai
166274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang  api_.ReadBufferQueueSetBufferAvailableCallback(
167274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang      read_queue, &BufferAvailableCallback, this);
1680b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai
1692d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  // Gain buffer for writing.
170274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang  ret = api_.WriteBufferQueueGainBuffer(write_queue_, /*timeout=*/0, &wb,
171274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang                                        &meta1, &fence_fd);
172638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai  ASSERT_EQ(ret, 0);
173638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai  ASSERT_NE(wb, nullptr);
174274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang  ASSERT_TRUE(api_.WriteBufferIsValid(wb));
1752d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  ALOGD_IF(TRACE, "TestDequeuePostDequeueRelease, gain buffer %p, fence_fd=%d",
1762d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai           wb, fence_fd);
177ca93bab82bfcae8f919b8aafc09fe5e4fa616f1eJiwen 'Steve' Cai  close(fence_fd);
1782d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai
1792d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  // Post buffer to the read_queue.
180638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai  meta1.timestamp = 42;
181274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang  ret = api_.WriteBufferQueuePostBuffer(write_queue_, wb, &meta1, /*fence=*/-1);
182638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai  ASSERT_EQ(ret, 0);
183274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang  ASSERT_FALSE(api_.WriteBufferIsValid(wb));
1842d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  wb = nullptr;
1852d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai
1862d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  // Acquire buffer for reading.
187274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang  ret = api_.ReadBufferQueueAcquireBuffer(read_queue, /*timeout=*/10, &rb,
188274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang                                          &meta2, &fence_fd);
189638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai  ASSERT_EQ(ret, 0);
190638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai  ASSERT_NE(rb, nullptr);
1910b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai
1920b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai  // Dequeue is successfully, BufferAvailableCallback should be fired once.
193638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai  ASSERT_EQ(buffer_available_count_, 1);
194274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang  ASSERT_TRUE(api_.ReadBufferIsValid(rb));
195638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai
196638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai  // Metadata should be passed along from producer to consumer properly.
197638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai  ASSERT_EQ(meta1.timestamp, meta2.timestamp);
198638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai
1992d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  ALOGD_IF(TRACE,
2002d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai           "TestDequeuePostDequeueRelease, acquire buffer %p, fence_fd=%d", rb,
2012d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai           fence_fd);
202ca93bab82bfcae8f919b8aafc09fe5e4fa616f1eJiwen 'Steve' Cai  close(fence_fd);
2032d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai
2042d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  // Release buffer to the write_queue.
205274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang  ret = api_.ReadBufferQueueReleaseBuffer(read_queue, rb, &meta2,
206274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang                                          /*release_fence_fd=*/-1);
207638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai  ASSERT_EQ(ret, 0);
208274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang  ASSERT_FALSE(api_.ReadBufferIsValid(rb));
2092d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  rb = nullptr;
2102d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai
2112d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  // TODO(b/34387835) Currently buffer allocation has to happen after all queues
2122d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  // are initialized.
213274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang  size_t capacity = api_.ReadBufferQueueGetCapacity(read_queue);
2142d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai
2152d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  ALOGD_IF(TRACE, "TestDequeuePostDequeueRelease, capacity=%zu", capacity);
2162d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai  ASSERT_EQ(kQueueCapacity, capacity);
2172d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai
218274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang  api_.ReadBufferQueueDestroy(read_queue);
2192d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai}
2202d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai
221638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' CaiTEST_F(DvrBufferQueueTest, GetANativeWindow) {
222274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang  int ret = api_.WriteBufferQueueCreate(
223d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai      kBufferWidth, kBufferHeight, kBufferFormat, kLayerCount, kBufferUsage,
224639d479b8a432771f7fa5ae4b93f677d2c8eb125Jiwen 'Steve' Cai      /*capacity=*/0, /*user_metadata_size=*/0, &write_queue_);
225d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai  ASSERT_EQ(0, ret);
226d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai  ASSERT_NE(nullptr, write_queue_);
227960bcfffefa76d535c5aecd303d755be3fbc59f1Jiwen 'Steve' Cai
228638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai  ANativeWindow* window = nullptr;
229274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang  ret = api_.WriteBufferQueueGetANativeWindow(write_queue_, &window);
230960bcfffefa76d535c5aecd303d755be3fbc59f1Jiwen 'Steve' Cai  ASSERT_EQ(0, ret);
231960bcfffefa76d535c5aecd303d755be3fbc59f1Jiwen 'Steve' Cai  ASSERT_NE(nullptr, window);
232960bcfffefa76d535c5aecd303d755be3fbc59f1Jiwen 'Steve' Cai
233d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai  uint32_t width = ANativeWindow_getWidth(window);
234d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai  uint32_t height = ANativeWindow_getHeight(window);
235d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai  uint32_t format = ANativeWindow_getFormat(window);
236d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai  ASSERT_EQ(kBufferWidth, width);
237d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai  ASSERT_EQ(kBufferHeight, height);
238d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai  ASSERT_EQ(kBufferFormat, format);
239960bcfffefa76d535c5aecd303d755be3fbc59f1Jiwen 'Steve' Cai}
240960bcfffefa76d535c5aecd303d755be3fbc59f1Jiwen 'Steve' Cai
241656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai// Create buffer queue of three buffers and dequeue three buffers out of it.
242656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai// Before each dequeue operation, we resize the buffer queue and expect the
243656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai// queue always return buffer with desired dimension.
244638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' CaiTEST_F(DvrBufferQueueTest, ResizeBuffer) {
245274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang  int ret = api_.WriteBufferQueueCreate(
246d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai      kBufferWidth, kBufferHeight, kBufferFormat, kLayerCount, kBufferUsage,
247638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai      kQueueCapacity, sizeof(DvrNativeBufferMetadata), &write_queue_);
248d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai  ASSERT_EQ(0, ret);
24942c6f3adbc8473efb0d375e1d564d1522723c6beJiwen 'Steve' Cai
250656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai  int fence_fd = -1;
251656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai
25252ea25cf06cef250ec73052611b48556b3fce4d5Corey Tabaka  DvrNativeBufferMetadata meta;
2530b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai  DvrReadBufferQueue* read_queue = nullptr;
254656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai  DvrWriteBuffer* wb1 = nullptr;
255656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai  DvrWriteBuffer* wb2 = nullptr;
256656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai  DvrWriteBuffer* wb3 = nullptr;
257656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai  AHardwareBuffer* ahb1 = nullptr;
258656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai  AHardwareBuffer* ahb2 = nullptr;
259656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai  AHardwareBuffer* ahb3 = nullptr;
260656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai  AHardwareBuffer_Desc buffer_desc;
261656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai
262274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang  ret = api_.WriteBufferQueueCreateReadQueue(write_queue_, &read_queue);
2630b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai
2640b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai  ASSERT_EQ(0, ret);
2650b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai  ASSERT_NE(nullptr, read_queue);
2660b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai
267274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang  api_.ReadBufferQueueSetBufferRemovedCallback(read_queue,
268274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang                                               &BufferRemovedCallback, this);
2690b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai
2700b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai  // Handle all pending events on the read queue.
271274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang  ret = api_.ReadBufferQueueHandleEvents(read_queue);
2720b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai  ASSERT_EQ(0, ret);
2730b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai
274274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang  size_t capacity = api_.ReadBufferQueueGetCapacity(read_queue);
2750b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai  ALOGD_IF(TRACE, "TestResizeBuffer, capacity=%zu", capacity);
2760b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai  ASSERT_EQ(kQueueCapacity, capacity);
2770b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai
278656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai  // Resize before dequeuing.
2790b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai  constexpr uint32_t w1 = 10;
280274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang  ret = api_.WriteBufferQueueResizeBuffer(write_queue_, w1, kBufferHeight);
2810b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai  ASSERT_EQ(0, ret);
282656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai
283656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai  // Gain first buffer for writing. All buffers will be resized.
284274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang  ret = api_.WriteBufferQueueGainBuffer(write_queue_, /*timeout=*/0, &wb1,
285274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang                                        &meta, &fence_fd);
286656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai  ASSERT_EQ(0, ret);
287274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang  ASSERT_TRUE(api_.WriteBufferIsValid(wb1));
2880b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai  ALOGD_IF(TRACE, "TestResizeBuffer, gain buffer %p", wb1);
289ca93bab82bfcae8f919b8aafc09fe5e4fa616f1eJiwen 'Steve' Cai  close(fence_fd);
290656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai
291656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai  // Check the buffer dimension.
292274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang  ret = api_.WriteBufferGetAHardwareBuffer(wb1, &ahb1);
293656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai  ASSERT_EQ(0, ret);
294656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai  AHardwareBuffer_describe(ahb1, &buffer_desc);
295656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai  ASSERT_EQ(w1, buffer_desc.width);
296656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai  ASSERT_EQ(kBufferHeight, buffer_desc.height);
297656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai  AHardwareBuffer_release(ahb1);
298656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai
2990b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai  // For the first resize, all buffers are reallocated.
3000b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai  int expected_buffer_removed_count = kQueueCapacity;
301274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang  ret = api_.ReadBufferQueueHandleEvents(read_queue);
3020b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai  ASSERT_EQ(0, ret);
3030b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai  ASSERT_EQ(expected_buffer_removed_count, buffer_removed_count_);
3040b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai
305656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai  // Resize the queue. We are testing with blob format, keep height to be 1.
3060b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai  constexpr uint32_t w2 = 20;
307274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang  ret = api_.WriteBufferQueueResizeBuffer(write_queue_, w2, kBufferHeight);
308656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai  ASSERT_EQ(0, ret);
309656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai
310656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai  // The next buffer we dequeued should have new width.
311274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang  ret = api_.WriteBufferQueueGainBuffer(write_queue_, /*timeout=*/0, &wb2,
312274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang                                        &meta, &fence_fd);
313656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai  ASSERT_EQ(0, ret);
314274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang  ASSERT_TRUE(api_.WriteBufferIsValid(wb2));
3150b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai  ALOGD_IF(TRACE, "TestResizeBuffer, gain buffer %p, fence_fd=%d", wb2,
316656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai           fence_fd);
317ca93bab82bfcae8f919b8aafc09fe5e4fa616f1eJiwen 'Steve' Cai  close(fence_fd);
318656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai
319656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai  // Check the buffer dimension, should be new width
320274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang  ret = api_.WriteBufferGetAHardwareBuffer(wb2, &ahb2);
321656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai  ASSERT_EQ(0, ret);
322656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai  AHardwareBuffer_describe(ahb2, &buffer_desc);
323656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai  ASSERT_EQ(w2, buffer_desc.width);
324656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai  AHardwareBuffer_release(ahb2);
325656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai
3260b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai  // For the second resize, all but one buffers are reallocated.
3270b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai  expected_buffer_removed_count += (kQueueCapacity - 1);
328274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang  ret = api_.ReadBufferQueueHandleEvents(read_queue);
3290b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai  ASSERT_EQ(0, ret);
3300b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai  ASSERT_EQ(expected_buffer_removed_count, buffer_removed_count_);
3310b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai
332656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai  // Resize the queue for the third time.
3330b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai  constexpr uint32_t w3 = 30;
334274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang  ret = api_.WriteBufferQueueResizeBuffer(write_queue_, w3, kBufferHeight);
335656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai  ASSERT_EQ(0, ret);
336656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai
337656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai  // The next buffer we dequeued should have new width.
338274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang  ret = api_.WriteBufferQueueGainBuffer(write_queue_, /*timeout=*/0, &wb3,
339274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang                                        &meta, &fence_fd);
340656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai  ASSERT_EQ(0, ret);
341274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang  ASSERT_TRUE(api_.WriteBufferIsValid(wb3));
3420b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai  ALOGD_IF(TRACE, "TestResizeBuffer, gain buffer %p, fence_fd=%d", wb3,
343656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai           fence_fd);
344ca93bab82bfcae8f919b8aafc09fe5e4fa616f1eJiwen 'Steve' Cai  close(fence_fd);
345656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai
346656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai  // Check the buffer dimension, should be new width
347274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang  ret = api_.WriteBufferGetAHardwareBuffer(wb3, &ahb3);
348656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai  ASSERT_EQ(0, ret);
349656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai  AHardwareBuffer_describe(ahb3, &buffer_desc);
350656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai  ASSERT_EQ(w3, buffer_desc.width);
351656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai  AHardwareBuffer_release(ahb3);
3520b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai
3530b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai  // For the third resize, all but two buffers are reallocated.
3540b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai  expected_buffer_removed_count += (kQueueCapacity - 2);
355274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang  ret = api_.ReadBufferQueueHandleEvents(read_queue);
3560b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai  ASSERT_EQ(0, ret);
3570b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai  ASSERT_EQ(expected_buffer_removed_count, buffer_removed_count_);
3580b80155bf5c27b47c160d1904ad442842dc8f0c5Jiwen 'Steve' Cai
359274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang  api_.ReadBufferQueueDestroy(read_queue);
360656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai}
361656f406fcb0c45fd3c729a513bdd3f353cc6ec1fJiwen 'Steve' Cai
362638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' CaiTEST_F(DvrBufferQueueTest, ReadQueueEventFd) {
363274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang  int ret = api_.WriteBufferQueueCreate(
364d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai      kBufferWidth, kBufferHeight, kBufferFormat, kLayerCount, kBufferUsage,
365638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai      kQueueCapacity, sizeof(DvrNativeBufferMetadata), &write_queue_);
366d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai  ASSERT_EQ(0, ret);
36797274870fc8229b507fc71566c0502eb322655cfJiwen 'Steve' Cai
36897274870fc8229b507fc71566c0502eb322655cfJiwen 'Steve' Cai  DvrReadBufferQueue* read_queue = nullptr;
369274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang  ret = api_.WriteBufferQueueCreateReadQueue(write_queue_, &read_queue);
37097274870fc8229b507fc71566c0502eb322655cfJiwen 'Steve' Cai
37197274870fc8229b507fc71566c0502eb322655cfJiwen 'Steve' Cai  ASSERT_EQ(0, ret);
37297274870fc8229b507fc71566c0502eb322655cfJiwen 'Steve' Cai  ASSERT_NE(nullptr, read_queue);
37397274870fc8229b507fc71566c0502eb322655cfJiwen 'Steve' Cai
374274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang  int event_fd = api_.ReadBufferQueueGetEventFd(read_queue);
37597274870fc8229b507fc71566c0502eb322655cfJiwen 'Steve' Cai  ASSERT_GT(event_fd, 0);
37697274870fc8229b507fc71566c0502eb322655cfJiwen 'Steve' Cai}
37797274870fc8229b507fc71566c0502eb322655cfJiwen 'Steve' Cai
37808fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai// Verifies a Dvr{Read,Write}BufferQueue contains the same set of
37908fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai// Dvr{Read,Write}Buffer(s) during their lifecycles. And for the same buffer_id,
38008fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai// the corresponding AHardwareBuffer handle stays the same.
381638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' CaiTEST_F(DvrBufferQueueTest, StableBufferIdAndHardwareBuffer) {
382274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang  int ret = api_.WriteBufferQueueCreate(
383d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai      kBufferWidth, kBufferHeight, kBufferFormat, kLayerCount, kBufferUsage,
384638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai      kQueueCapacity, sizeof(DvrNativeBufferMetadata), &write_queue_);
385d741b3dfbb60eadaa2c1835e347825e18c19a802Jiwen 'Steve' Cai  ASSERT_EQ(0, ret);
38608fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai
38708fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai  int fence_fd = -1;
38808fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai  DvrReadBufferQueue* read_queue = nullptr;
389274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang  EXPECT_EQ(0, api_.WriteBufferQueueCreateReadQueue(write_queue_, &read_queue));
39008fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai
39108fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai  // Read buffers.
39208fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai  std::array<DvrReadBuffer*, kQueueCapacity> rbs;
39308fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai  // Write buffers.
39408fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai  std::array<DvrWriteBuffer*, kQueueCapacity> wbs;
395638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai  // Buffer metadata.
396638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai  std::array<DvrNativeBufferMetadata, kQueueCapacity> metas;
39708fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai  // Hardware buffers for Read buffers.
39808fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai  std::unordered_map<int, AHardwareBuffer*> rhbs;
39908fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai  // Hardware buffers for Write buffers.
40008fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai  std::unordered_map<int, AHardwareBuffer*> whbs;
40108fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai
40208fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai  constexpr int kNumTests = 100;
40308fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai
40408fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai  // This test runs the following operations many many times. Thus we prefer to
40508fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai  // use ASSERT_XXX rather than EXPECT_XXX to avoid spamming the output.
40608fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai  std::function<void(size_t i)> Gain = [&](size_t i) {
407274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang    int ret = api_.WriteBufferQueueGainBuffer(write_queue_, /*timeout=*/10,
408274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang                                              &wbs[i], &metas[i], &fence_fd);
409638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai    ASSERT_EQ(ret, 0);
41008fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai    ASSERT_LT(fence_fd, 0);  // expect invalid fence.
411274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang    ASSERT_TRUE(api_.WriteBufferIsValid(wbs[i]));
412274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang    int buffer_id = api_.WriteBufferGetId(wbs[i]);
41308fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai    ASSERT_GT(buffer_id, 0);
41408fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai
41508fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai    AHardwareBuffer* hb = nullptr;
416274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang    ASSERT_EQ(0, api_.WriteBufferGetAHardwareBuffer(wbs[i], &hb));
41708fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai
41808fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai    auto whb_it = whbs.find(buffer_id);
41908fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai    if (whb_it == whbs.end()) {
42008fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai      // If this is a new buffer id, check that total number of unique
42108fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai      // hardware buffers won't exceed queue capacity.
42208fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai      ASSERT_LT(whbs.size(), kQueueCapacity);
42308fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai      whbs.emplace(buffer_id, hb);
42408fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai    } else {
42508fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai      // If this is a buffer id we have seen before, check that the
42608fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai      // buffer_id maps to the same AHardwareBuffer handle.
42708fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai      ASSERT_EQ(hb, whb_it->second);
42808fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai    }
42908fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai  };
43008fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai
43108fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai  std::function<void(size_t i)> Post = [&](size_t i) {
432274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang    ASSERT_TRUE(api_.WriteBufferIsValid(wbs[i]));
43308fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai
434638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai    metas[i].timestamp++;
435274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang    int ret = api_.WriteBufferQueuePostBuffer(write_queue_, wbs[i], &metas[i],
436274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang                                              /*fence=*/-1);
437638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai    ASSERT_EQ(ret, 0);
43808fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai  };
43908fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai
44008fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai  std::function<void(size_t i)> Acquire = [&](size_t i) {
441274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang    int ret = api_.ReadBufferQueueAcquireBuffer(read_queue, /*timeout=*/10,
442274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang                                                &rbs[i], &metas[i], &fence_fd);
443638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai    ASSERT_EQ(ret, 0);
44408fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai    ASSERT_LT(fence_fd, 0);  // expect invalid fence.
445274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang    ASSERT_TRUE(api_.ReadBufferIsValid(rbs[i]));
44608fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai
447274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang    int buffer_id = api_.ReadBufferGetId(rbs[i]);
44808fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai    ASSERT_GT(buffer_id, 0);
44908fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai
45008fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai    AHardwareBuffer* hb = nullptr;
451274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang    ASSERT_EQ(0, api_.ReadBufferGetAHardwareBuffer(rbs[i], &hb));
45208fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai
45308fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai    auto rhb_it = rhbs.find(buffer_id);
45408fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai    if (rhb_it == rhbs.end()) {
45508fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai      // If this is a new buffer id, check that total number of unique hardware
45608fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai      // buffers won't exceed queue capacity.
45708fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai      ASSERT_LT(rhbs.size(), kQueueCapacity);
45808fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai      rhbs.emplace(buffer_id, hb);
45908fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai    } else {
46008fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai      // If this is a buffer id we have seen before, check that the buffer_id
46108fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai      // maps to the same AHardwareBuffer handle.
46208fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai      ASSERT_EQ(hb, rhb_it->second);
46308fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai    }
46408fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai  };
46508fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai
46608fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai  std::function<void(size_t i)> Release = [&](size_t i) {
467274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang    ASSERT_TRUE(api_.ReadBufferIsValid(rbs[i]));
46808fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai
469274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang    int ret = api_.ReadBufferQueueReleaseBuffer(read_queue, rbs[i], &metas[i],
470274d6182b0220e10a1e48e51159f4e20b24f8770TianyuJiang                                                /*release_fence_fd=*/-1);
471638b7f747df50374d1e91c2496da41f293394e19Jiwen 'Steve' Cai    ASSERT_EQ(ret, 0);
47208fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai  };
47308fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai
47408fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai  // Scenario one:
47508fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai  for (int i = 0; i < kNumTests; i++) {
47608fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai    // Gain all write buffers.
47708fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai    for (size_t i = 0; i < kQueueCapacity; i++) {
47808fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai      ASSERT_NO_FATAL_FAILURE(Gain(i));
47908fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai    }
48008fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai    // Post all write buffers.
48108fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai    for (size_t i = 0; i < kQueueCapacity; i++) {
48208fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai      ASSERT_NO_FATAL_FAILURE(Post(i));
48308fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai    }
48408fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai    // Acquire all read buffers.
48508fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai    for (size_t i = 0; i < kQueueCapacity; i++) {
48608fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai      ASSERT_NO_FATAL_FAILURE(Acquire(i));
48708fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai    }
48808fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai    // Release all read buffers.
48908fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai    for (size_t i = 0; i < kQueueCapacity; i++) {
49008fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai      ASSERT_NO_FATAL_FAILURE(Release(i));
49108fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai    }
49208fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai  }
49308fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai
49408fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai  // Scenario two:
49508fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai  for (int i = 0; i < kNumTests; i++) {
49608fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai    // Gain and post all write buffers.
49708fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai    for (size_t i = 0; i < kQueueCapacity; i++) {
49808fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai      ASSERT_NO_FATAL_FAILURE(Gain(i));
49908fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai      ASSERT_NO_FATAL_FAILURE(Post(i));
50008fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai    }
50108fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai    // Acquire and release all read buffers.
50208fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai    for (size_t i = 0; i < kQueueCapacity; i++) {
50308fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai      ASSERT_NO_FATAL_FAILURE(Acquire(i));
50408fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai      ASSERT_NO_FATAL_FAILURE(Release(i));
50508fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai    }
50608fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai  }
50708fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai
50808fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai  // Scenario three:
50908fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai  for (int i = 0; i < kNumTests; i++) {
51008fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai    // Gain all write buffers then post them in reversed order.
51108fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai    for (size_t i = 0; i < kQueueCapacity; i++) {
51208fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai      ASSERT_NO_FATAL_FAILURE(Gain(i));
51308fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai    }
51408fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai    for (size_t i = 0; i < kQueueCapacity; i++) {
51508fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai      ASSERT_NO_FATAL_FAILURE(Post(kQueueCapacity - 1 - i));
51608fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai    }
51708fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai
51808fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai    // Acquire all write buffers then release them in reversed order.
51908fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai    for (size_t i = 0; i < kQueueCapacity; i++) {
52008fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai      ASSERT_NO_FATAL_FAILURE(Acquire(i));
52108fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai    }
52208fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai    for (size_t i = 0; i < kQueueCapacity; i++) {
52308fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai      ASSERT_NO_FATAL_FAILURE(Release(kQueueCapacity - 1 - i));
52408fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai    }
52508fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai  }
52608fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai}
52708fca7329e85dbfdcea927865bc768325c9da2baJiwen 'Steve' Cai
528b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' CaiTEST_F(DvrBufferQueueTest, ConsumerReleaseAfterProducerDestroy) {
529b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai  int ret = api_.WriteBufferQueueCreate(
530b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai      kBufferWidth, kBufferHeight, kBufferFormat, kLayerCount, kBufferUsage,
531b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai      kQueueCapacity, sizeof(DvrNativeBufferMetadata), &write_queue_);
532b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai  ASSERT_EQ(ret, 0);
533b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai
534b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai  DvrReadBufferQueue* read_queue = nullptr;
535b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai  DvrReadBuffer* rb = nullptr;
536b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai  DvrWriteBuffer* wb = nullptr;
537b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai  DvrNativeBufferMetadata meta1;
538b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai  DvrNativeBufferMetadata meta2;
539b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai  int fence_fd = -1;
540b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai
541b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai  ret = api_.WriteBufferQueueCreateReadQueue(write_queue_, &read_queue);
542b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai  ASSERT_EQ(ret, 0);
543b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai
544b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai  api_.ReadBufferQueueSetBufferAvailableCallback(
545b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai      read_queue, &BufferAvailableCallback, this);
546b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai
547b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai  // Gain buffer for writing.
548b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai  ret = api_.WriteBufferQueueGainBuffer(write_queue_, /*timeout=*/0, &wb,
549b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai                                        &meta1, &fence_fd);
550b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai  ASSERT_EQ(ret, 0);
551b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai  close(fence_fd);
552b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai
553b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai  // Post buffer to the read_queue.
554b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai  ret = api_.WriteBufferQueuePostBuffer(write_queue_, wb, &meta1, /*fence=*/-1);
555b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai  ASSERT_EQ(ret, 0);
556b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai  wb = nullptr;
557b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai
558b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai  // Acquire buffer for reading.
559b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai  ret = api_.ReadBufferQueueAcquireBuffer(read_queue, /*timeout=*/10, &rb,
560b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai                                          &meta2, &fence_fd);
561b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai  ASSERT_EQ(ret, 0);
562b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai  close(fence_fd);
563b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai
564b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai  // Destroy the write buffer queue and make sure the reader queue is picking
565b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai  // these events up.
566b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai  api_.WriteBufferQueueDestroy(write_queue_);
567b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai  ret = api_.ReadBufferQueueHandleEvents(read_queue);
568b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai  ASSERT_EQ(0, ret);
569b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai
570b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai  // Release buffer to the write_queue.
571b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai  ret = api_.ReadBufferQueueReleaseBuffer(read_queue, rb, &meta2,
572b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai                                          /*release_fence_fd=*/-1);
573b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai  ASSERT_EQ(ret, 0);
574b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai  rb = nullptr;
575b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai
576b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai  api_.ReadBufferQueueDestroy(read_queue);
577b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai}
578b53da4fdf32337382175800ce89ca9ad0962a6e4Jiwen 'Steve' Cai
5792d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai}  // namespace
580