Home | History | Annotate | Download | only in tests
      1 #include <android/hardware_buffer.h>
      2 #include <dvr/dvr_buffer.h>
      3 #include <dvr/dvr_config.h>
      4 #include <dvr/dvr_shared_buffers.h>
      5 #include <dvr/dvr_surface.h>
      6 #include <system/graphics.h>
      7 
      8 #include <gtest/gtest.h>
      9 
     10 namespace android {
     11 namespace dvr {
     12 
     13 namespace {
     14 
     15 TEST(DvrGlobalBufferTest, TestGlobalBuffersSameName) {
     16   const DvrGlobalBufferKey buffer_key = 101;
     17   DvrBuffer* buffer1 = nullptr;
     18   int ret1 = dvrSetupGlobalBuffer(buffer_key, 10, 0, &buffer1);
     19   ASSERT_EQ(0, ret1);
     20   ASSERT_NE(nullptr, buffer1);
     21 
     22   DvrBuffer* buffer2 = nullptr;
     23   int ret2 = dvrSetupGlobalBuffer(buffer_key, 10, 0, &buffer2);
     24   ASSERT_EQ(0, ret2);
     25   ASSERT_NE(nullptr, buffer2);
     26 
     27   AHardwareBuffer* hardware_buffer1 = nullptr;
     28   int e1 = dvrBufferGetAHardwareBuffer(buffer1, &hardware_buffer1);
     29   ASSERT_EQ(0, e1);
     30   ASSERT_NE(nullptr, hardware_buffer1);
     31 
     32   AHardwareBuffer* hardware_buffer2 = nullptr;
     33   int e2 = dvrBufferGetAHardwareBuffer(buffer2, &hardware_buffer2);
     34   ASSERT_EQ(0, e2);
     35   ASSERT_NE(nullptr, hardware_buffer2);
     36 
     37   AHardwareBuffer_Desc desc1 = {};
     38   AHardwareBuffer_describe(hardware_buffer1, &desc1);
     39   AHardwareBuffer_Desc desc2 = {};
     40   AHardwareBuffer_describe(hardware_buffer2, &desc2);
     41   ASSERT_EQ(desc1.width, 10u);
     42   ASSERT_EQ(desc1.height, 1u);
     43   ASSERT_EQ(desc1.layers, 1u);
     44   ASSERT_EQ(desc1.format, HAL_PIXEL_FORMAT_BLOB);
     45   ASSERT_EQ(desc1.usage, 0u);
     46   ASSERT_EQ(desc2.width, 10u);
     47   ASSERT_EQ(desc2.height, 1u);
     48   ASSERT_EQ(desc2.layers, 1u);
     49   ASSERT_EQ(desc2.format, HAL_PIXEL_FORMAT_BLOB);
     50   ASSERT_EQ(desc2.usage, 0u);
     51 
     52   dvrBufferDestroy(buffer1);
     53   dvrBufferDestroy(buffer2);
     54 
     55   DvrBuffer* buffer3 = nullptr;
     56   int e3 = dvrGetGlobalBuffer(buffer_key, &buffer3);
     57   ASSERT_NE(nullptr, buffer3);
     58   ASSERT_EQ(0, e3);
     59 
     60   AHardwareBuffer* hardware_buffer3 = nullptr;
     61   int e4 = dvrBufferGetAHardwareBuffer(buffer3, &hardware_buffer3);
     62   ASSERT_EQ(0, e4);
     63   ASSERT_NE(nullptr, hardware_buffer3);
     64 
     65   AHardwareBuffer_Desc desc3 = {};
     66   AHardwareBuffer_describe(hardware_buffer3, &desc3);
     67   ASSERT_EQ(desc3.width, 10u);
     68   ASSERT_EQ(desc3.height, 1u);
     69   ASSERT_EQ(desc3.layers, 1u);
     70   ASSERT_EQ(desc3.format, HAL_PIXEL_FORMAT_BLOB);
     71   ASSERT_EQ(desc3.usage, 0u);
     72 
     73   dvrBufferDestroy(buffer3);
     74 
     75   AHardwareBuffer_release(hardware_buffer1);
     76   AHardwareBuffer_release(hardware_buffer2);
     77   AHardwareBuffer_release(hardware_buffer3);
     78 }
     79 
     80 TEST(DvrGlobalBufferTest, TestMultipleGlobalBuffers) {
     81   const DvrGlobalBufferKey buffer_key1 = 102;
     82   const DvrGlobalBufferKey buffer_key2 = 103;
     83   DvrBuffer* setup_buffer1 = nullptr;
     84   int ret1 = dvrSetupGlobalBuffer(buffer_key1, 10, 0, &setup_buffer1);
     85   ASSERT_EQ(0, ret1);
     86   ASSERT_NE(nullptr, setup_buffer1);
     87   dvrBufferDestroy(setup_buffer1);
     88 
     89   DvrBuffer* setup_buffer2 = nullptr;
     90   int ret2 = dvrSetupGlobalBuffer(buffer_key2, 10, 0, &setup_buffer2);
     91   ASSERT_EQ(0, ret2);
     92   ASSERT_NE(nullptr, setup_buffer2);
     93   dvrBufferDestroy(setup_buffer2);
     94 
     95   DvrBuffer* buffer1 = nullptr;
     96   int e1 = dvrGetGlobalBuffer(buffer_key1, &buffer1);
     97   ASSERT_NE(nullptr, buffer1);
     98   ASSERT_EQ(0, e1);
     99   dvrBufferDestroy(buffer1);
    100 
    101   DvrBuffer* buffer2 = nullptr;
    102   int e2 = dvrGetGlobalBuffer(buffer_key2, &buffer2);
    103   ASSERT_NE(nullptr, buffer2);
    104   ASSERT_EQ(0, e2);
    105   dvrBufferDestroy(buffer2);
    106 }
    107 
    108 TEST(DvrGlobalBufferTest, TestGlobalBufferUsage) {
    109   const DvrGlobalBufferKey buffer_key = 100;
    110 
    111   // Set usage to AHARDWAREBUFFER_USAGE_VIDEO_ENCODE. We use this because
    112   // internally AHARDWAREBUFFER_USAGE_VIDEO_ENCODE is converted to
    113   // GRALLOC1_CONSUMER_USAGE_VIDEO_ENCODER, and these two values are different.
    114   // If all is good, when we get the AHardwareBuffer, it should be converted
    115   // back to AHARDWAREBUFFER_USAGE_VIDEO_ENCODE.
    116   const uint64_t usage = AHARDWAREBUFFER_USAGE_VIDEO_ENCODE;
    117 
    118   DvrBuffer* setup_buffer = nullptr;
    119   int e1 = dvrSetupGlobalBuffer(buffer_key, 10, usage, &setup_buffer);
    120   ASSERT_NE(nullptr, setup_buffer);
    121   ASSERT_EQ(0, e1);
    122 
    123   AHardwareBuffer* hardware_buffer = nullptr;
    124   int e2 = dvrBufferGetAHardwareBuffer(setup_buffer, &hardware_buffer);
    125   ASSERT_EQ(0, e2);
    126   ASSERT_NE(nullptr, hardware_buffer);
    127 
    128   AHardwareBuffer_Desc desc = {};
    129   AHardwareBuffer_describe(hardware_buffer, &desc);
    130   ASSERT_EQ(usage, desc.usage);
    131 
    132   dvrBufferDestroy(setup_buffer);
    133   AHardwareBuffer_release(hardware_buffer);
    134 }
    135 
    136 TEST(DvrGlobalBufferTest, TestGlobalBufferCarriesData) {
    137   const DvrGlobalBufferKey buffer_name = 110;
    138 
    139   uint64_t usage = AHARDWAREBUFFER_USAGE_CPU_READ_OFTEN |
    140                    AHARDWAREBUFFER_USAGE_CPU_WRITE_OFTEN;
    141   constexpr size_t size = 1024 * sizeof(uint64_t);
    142   constexpr uint64_t value = 0x123456787654321;
    143 
    144   {
    145     // Allocate some data and set it to something.
    146     DvrBuffer* setup_buffer = nullptr;
    147     int e1 = dvrSetupGlobalBuffer(buffer_name, size, usage, &setup_buffer);
    148     ASSERT_NE(nullptr, setup_buffer);
    149     ASSERT_EQ(0, e1);
    150 
    151     AHardwareBuffer* hardware_buffer = nullptr;
    152     int e2 = dvrBufferGetAHardwareBuffer(setup_buffer, &hardware_buffer);
    153     ASSERT_EQ(0, e2);
    154     ASSERT_NE(nullptr, hardware_buffer);
    155 
    156     void* buffer;
    157     int e3 = AHardwareBuffer_lock(hardware_buffer, usage, -1, nullptr, &buffer);
    158     ASSERT_EQ(0, e3);
    159     ASSERT_NE(nullptr, buffer);
    160     // Verify that the buffer pointer is at least 16 byte aligned.
    161     ASSERT_EQ(0U, reinterpret_cast<uintptr_t>(buffer) & (16 - 1));
    162 
    163     uint64_t* data = static_cast<uint64_t*>(buffer);
    164     constexpr size_t num_values = size / sizeof(uint64_t);
    165     for (size_t i = 0; i < num_values; ++i) {
    166       data[i] = value;
    167     }
    168 
    169     int32_t fence = -1;
    170     int e4 = AHardwareBuffer_unlock(hardware_buffer, &fence);
    171     ASSERT_EQ(0, e4);
    172 
    173     dvrBufferDestroy(setup_buffer);
    174     AHardwareBuffer_release(hardware_buffer);
    175   }
    176 
    177   {
    178     // Get the buffer and check that all the data is still present.
    179     DvrBuffer* setup_buffer = nullptr;
    180     int e1 = dvrGetGlobalBuffer(buffer_name, &setup_buffer);
    181     ASSERT_NE(nullptr, setup_buffer);
    182     ASSERT_EQ(0, e1);
    183 
    184     AHardwareBuffer* hardware_buffer = nullptr;
    185     int e2 = dvrBufferGetAHardwareBuffer(setup_buffer, &hardware_buffer);
    186     ASSERT_EQ(0, e2);
    187     ASSERT_NE(nullptr, hardware_buffer);
    188 
    189     void* buffer;
    190     int e3 = AHardwareBuffer_lock(hardware_buffer, usage, -1, nullptr, &buffer);
    191     ASSERT_EQ(0, e3);
    192     ASSERT_NE(nullptr, buffer);
    193     // Verify that the buffer pointer is at least 16 byte aligned.
    194     ASSERT_EQ(0U, reinterpret_cast<uintptr_t>(buffer) & (16 - 1));
    195 
    196     uint64_t* data = static_cast<uint64_t*>(buffer);
    197     constexpr size_t num_values = size / sizeof(uint64_t);
    198     bool is_equal = true;
    199     for (size_t i = 0; i < num_values; ++i) {
    200       is_equal &= (data[i] == value);
    201     }
    202     ASSERT_TRUE(is_equal);
    203 
    204     int32_t fence = -1;
    205     int e4 = AHardwareBuffer_unlock(hardware_buffer, &fence);
    206     ASSERT_EQ(0, e4);
    207 
    208     dvrBufferDestroy(setup_buffer);
    209     AHardwareBuffer_release(hardware_buffer);
    210   }
    211 }
    212 
    213 TEST(DvrGlobalBufferTest, TestGlobalBufferZeroed) {
    214   const DvrGlobalBufferKey buffer_name = 120;
    215 
    216   // Allocate 1MB and check that it is all zeros.
    217   uint64_t usage = AHARDWAREBUFFER_USAGE_CPU_READ_OFTEN |
    218                    AHARDWAREBUFFER_USAGE_CPU_WRITE_OFTEN;
    219   constexpr size_t size = 1024 * 1024;
    220   DvrBuffer* setup_buffer = nullptr;
    221   int e1 = dvrSetupGlobalBuffer(buffer_name, size, usage, &setup_buffer);
    222   ASSERT_NE(nullptr, setup_buffer);
    223   ASSERT_EQ(0, e1);
    224 
    225   AHardwareBuffer* hardware_buffer = nullptr;
    226   int e2 = dvrBufferGetAHardwareBuffer(setup_buffer, &hardware_buffer);
    227   ASSERT_EQ(0, e2);
    228   ASSERT_NE(nullptr, hardware_buffer);
    229 
    230   void* buffer;
    231   int e3 = AHardwareBuffer_lock(hardware_buffer, usage, -1, nullptr, &buffer);
    232   ASSERT_EQ(0, e3);
    233   ASSERT_NE(nullptr, buffer);
    234   // Verify that the buffer pointer is at least 16 byte aligned.
    235   ASSERT_EQ(0U, reinterpret_cast<uintptr_t>(buffer) & (16 - 1));
    236 
    237   uint64_t* data = static_cast<uint64_t*>(buffer);
    238   constexpr size_t num_values = size / sizeof(uint64_t);
    239   uint64_t zero = 0;
    240   for (size_t i = 0; i < num_values; ++i) {
    241     zero |= data[i];
    242   }
    243   ASSERT_EQ(0U, zero);
    244 
    245   int32_t fence = -1;
    246   int e4 = AHardwareBuffer_unlock(hardware_buffer, &fence);
    247   ASSERT_EQ(0, e4);
    248 
    249   dvrBufferDestroy(setup_buffer);
    250   AHardwareBuffer_release(hardware_buffer);
    251 }
    252 
    253 TEST(DvrGlobalBufferTest, TestVrflingerConfigBuffer) {
    254   const DvrGlobalBufferKey buffer_name =
    255       DvrGlobalBuffers::kVrFlingerConfigBufferKey;
    256 
    257   // First delete any existing buffer so we can test the failure case.
    258   dvrDeleteGlobalBuffer(buffer_name);
    259 
    260   const uint64_t usage = AHARDWAREBUFFER_USAGE_CPU_READ_OFTEN |
    261                          AHARDWAREBUFFER_USAGE_CPU_WRITE_RARELY;
    262 
    263   size_t correct_size = DvrConfigRing::MemorySize();
    264   size_t wrong_size = DvrConfigRing::MemorySize(0);
    265 
    266   // Setup an invalid config buffer (too small) and assert that it fails.
    267   DvrBuffer* setup_buffer = nullptr;
    268   int e1 = dvrSetupGlobalBuffer(buffer_name, wrong_size, usage, &setup_buffer);
    269   ASSERT_EQ(nullptr, setup_buffer);
    270   ASSERT_GT(0, e1);
    271 
    272   // Setup a correct config buffer.
    273   int e2 =
    274       dvrSetupGlobalBuffer(buffer_name, correct_size, usage, &setup_buffer);
    275   ASSERT_NE(nullptr, setup_buffer);
    276   ASSERT_EQ(0, e2);
    277 
    278   dvrBufferDestroy(setup_buffer);
    279 }
    280 
    281 }  // namespace
    282 
    283 }  // namespace dvr
    284 }  // namespace android
    285