diff options
| -rw-r--r-- | libs/vr/libbufferhub/buffer_hub_client.cpp | 2 | ||||
| -rw-r--r-- | libs/vr/libbufferhub/include/private/dvr/ion_buffer.h | 55 | ||||
| -rw-r--r-- | libs/vr/libbufferhub/ion_buffer.cpp | 201 | ||||
| -rw-r--r-- | libs/vr/libbufferhub/tests/Android.mk | 1 | ||||
| -rw-r--r-- | libs/vr/libbufferhub/tests/ion_buffer/Android.mk | 74 | ||||
| -rw-r--r-- | libs/vr/libbufferhub/tests/ion_buffer/ion_buffer-test.cpp | 375 | ||||
| -rw-r--r-- | libs/vr/libeds/Android.bp | 2 | ||||
| -rw-r--r-- | libs/vr/libvrsensor/Android.bp | 1 | ||||
| -rw-r--r-- | services/vr/bufferhubd/Android.mk | 3 | ||||
| -rw-r--r-- | services/vr/bufferhubd/buffer_hub.cpp | 2 | ||||
| -rw-r--r-- | services/vr/sensord/Android.mk | 1 |
11 files changed, 76 insertions, 641 deletions
diff --git a/libs/vr/libbufferhub/buffer_hub_client.cpp b/libs/vr/libbufferhub/buffer_hub_client.cpp index e2413bd890..7268b76805 100644 --- a/libs/vr/libbufferhub/buffer_hub_client.cpp +++ b/libs/vr/libbufferhub/buffer_hub_client.cpp @@ -51,8 +51,6 @@ Status<LocalChannelHandle> BufferHubBuffer::CreateConsumer() { int BufferHubBuffer::ImportBuffer() { ATRACE_NAME("BufferHubBuffer::ImportBuffer"); - if (!IonBuffer::GetGrallocModule()) - return -EIO; Status<std::vector<NativeBufferHandle<LocalHandle>>> status = InvokeRemoteMethod<BufferHubRPC::GetBuffers>(); diff --git a/libs/vr/libbufferhub/include/private/dvr/ion_buffer.h b/libs/vr/libbufferhub/include/private/dvr/ion_buffer.h index 8125c54816..e449cbdb02 100644 --- a/libs/vr/libbufferhub/include/private/dvr/ion_buffer.h +++ b/libs/vr/libbufferhub/include/private/dvr/ion_buffer.h @@ -2,6 +2,8 @@ #define ANDROID_DVR_ION_BUFFER_H_ #include <hardware/gralloc.h> +#include <log/log.h> +#include <ui/GraphicBuffer.h> namespace android { namespace dvr { @@ -58,45 +60,24 @@ class IonBuffer { int LockYUV(int usage, int x, int y, int width, int height, struct android_ycbcr* yuv); int Unlock(); - - buffer_handle_t handle() const { return handle_; } - int width() const { return width_; } - int height() const { return height_; } - int layer_count() const { return layer_count_; } - int stride() const { return stride_; } - int layer_stride() const { return layer_stride_; } - int format() const { return format_; } - int usage() const { return usage_; } - - static gralloc_module_t const* GetGrallocModule() { - GrallocInit(); - return gralloc_module_; - } - - static alloc_device_t* GetGrallocDevice() { - GrallocInit(); - return gralloc_device_; - } + buffer_handle_t handle() const { if (buffer_.get()) return buffer_->handle; + else return nullptr; } + int width() const { if (buffer_.get()) return buffer_->getWidth(); + else return 0; } + int height() const { if (buffer_.get()) return buffer_->getHeight(); + else return 0; } + int layer_count() const { if (buffer_.get()) return buffer_->getLayerCount(); + else return 0; } + int stride() const { if (buffer_.get()) return buffer_->getStride(); + else return 0; } + int layer_stride() const { return 0; } + int format() const { if (buffer_.get()) return buffer_->getPixelFormat(); + else return 0; } + int usage() const { if (buffer_.get()) return buffer_->getUsage(); + else return 0; } private: - buffer_handle_t handle_; - int width_; - int height_; - int layer_count_; - int stride_; - int layer_stride_; - int format_; - int usage_; - bool locked_; - bool needs_unregister_; - - void Replace(buffer_handle_t handle, int width, int height, int layer_count, - int stride, int layer_stride, int format, int usage, - bool needs_unregister); - - static void GrallocInit(); - static gralloc_module_t const* gralloc_module_; - static alloc_device_t* gralloc_device_; + sp<GraphicBuffer> buffer_; IonBuffer(const IonBuffer&) = delete; void operator=(const IonBuffer&) = delete; diff --git a/libs/vr/libbufferhub/ion_buffer.cpp b/libs/vr/libbufferhub/ion_buffer.cpp index 4db21647fd..3fb3f3c6ff 100644 --- a/libs/vr/libbufferhub/ion_buffer.cpp +++ b/libs/vr/libbufferhub/ion_buffer.cpp @@ -1,4 +1,5 @@ #include <private/dvr/ion_buffer.h> +#include <ui/GraphicBufferMapper.h> #include <log/log.h> #define ATRACE_TAG ATRACE_TAG_GRAPHICS @@ -9,9 +10,6 @@ namespace android { namespace dvr { -gralloc_module_t const* IonBuffer::gralloc_module_ = nullptr; -alloc_device_t* IonBuffer::gralloc_device_ = nullptr; - IonBuffer::IonBuffer() : IonBuffer(nullptr, 0, 0, 0, 0, 0, 0, 0) {} IonBuffer::IonBuffer(int width, int height, int format, int usage) @@ -23,33 +21,26 @@ IonBuffer::IonBuffer(buffer_handle_t handle, int width, int height, int stride, int format, int usage) : IonBuffer(handle, width, height, 1, stride, 0, format, usage) {} + IonBuffer::IonBuffer(buffer_handle_t handle, int width, int height, int layer_count, int stride, int layer_stride, int format, int usage) - : handle_(handle), - width_(width), - height_(height), - layer_count_(layer_count), - stride_(stride), - layer_stride_(layer_stride), - format_(format), - usage_(usage), - locked_(false), - needs_unregister_(false) { + : buffer_(nullptr) { ALOGD_IF(TRACE, - "IonBuffer::IonBuffer: handle=%p width=%d height=%d layer_count=%d " - "stride=%d layer stride=%d format=%d usage=%d", - handle_, width_, height_, layer_count_, stride_, layer_stride_, - format_, usage_); - GrallocInit(); + "IonBuffer::IonBuffer: handle=%p width=%d height=%d layer_count=%d " + "stride=%d layer stride=%d format=%d usage=%d", + handle, width, height, layer_count, stride, layer_stride, + format, usage); + if (handle != 0) { + Import(handle, width, height, stride, format, usage); + } } IonBuffer::~IonBuffer() { ALOGD_IF(TRACE, "IonBuffer::~IonBuffer: handle=%p width=%d height=%d stride=%d " "format=%d usage=%d", - handle_, width_, height_, stride_, format_, usage_); - + handle() , width(), height(), stride(), format(), usage()); FreeHandle(); } @@ -58,111 +49,42 @@ IonBuffer::IonBuffer(IonBuffer&& other) : IonBuffer() { } IonBuffer& IonBuffer::operator=(IonBuffer&& other) { - ALOGD_IF(TRACE, "IonBuffer::operator=: handle_=%p other.handle_=%p", handle_, - other.handle_); + ALOGD_IF(TRACE, "IonBuffer::operator=: handle_=%p other.handle_=%p", handle(), + other.handle()); if (this != &other) { - Replace(other.handle_, other.width_, other.height_, other.layer_count_, - other.stride_, other.layer_stride_, other.format_, other.usage_, - other.needs_unregister_); - locked_ = other.locked_; - other.handle_ = nullptr; + buffer_ = other.buffer_; other.FreeHandle(); } - return *this; } void IonBuffer::FreeHandle() { - if (handle_) { - // Lock/Unlock don't need to be balanced, but one Unlock is needed to - // clean/unmap the buffer. Warn if this didn't happen before freeing the - // native handle. - ALOGW_IF(locked_, - "IonBuffer::FreeHandle: freeing a locked handle!!! handle=%p", - handle_); - - if (needs_unregister_) { - int ret = gralloc_module_->unregisterBuffer(gralloc_module_, handle_); - ALOGE_IF(ret < 0, - "IonBuffer::FreeHandle: Failed to unregister handle: %s", - strerror(-ret)); - - native_handle_close(const_cast<native_handle_t*>(handle_)); - native_handle_delete(const_cast<native_handle_t*>(handle_)); - } else { - int ret = gralloc_device_->free(gralloc_device_, handle_); - if (ret < 0) { - ALOGE("IonBuffer::FreeHandle: failed to free buffer: %s", - strerror(-ret)); - - // Not sure if this is the right thing to do. Attempting to prevent a - // memory leak of the native handle. - native_handle_close(const_cast<native_handle_t*>(handle_)); - native_handle_delete(const_cast<native_handle_t*>(handle_)); - } - } + if (buffer_.get()) { + // GraphicBuffer unregisters and cleans up the handle if needed + buffer_ = nullptr; } - - // Always re-initialize these members, even if handle_ was nullptr, in case - // someone was dumb enough to pass a nullptr handle to the constructor or - // Reset. - handle_ = nullptr; - width_ = 0; - height_ = 0; - layer_count_ = 0; - stride_ = 0; - layer_stride_ = 0; - format_ = 0; - usage_ = 0; - locked_ = false; - needs_unregister_ = false; } int IonBuffer::Alloc(int width, int height, int format, int usage) { - ATRACE_NAME("IonBuffer::Alloc"); ALOGD_IF(TRACE, "IonBuffer::Alloc: width=%d height=%d format=%d usage=%d", width, height, format, usage); - int stride; - buffer_handle_t handle; - - int ret = gralloc_device_->alloc(gralloc_device_, width, height, format, - usage, &handle, &stride); - if (ret < 0) { - ALOGE("IonBuffer::Alloc: failed to allocate gralloc buffer: %s", - strerror(-ret)); - return ret; + GraphicBufferMapper& mapper = GraphicBufferMapper::get(); + buffer_ = new GraphicBuffer(width, height, format, usage); + if (mapper.registerBuffer(buffer_.get()) != OK) { + ALOGE("IonBuffer::Aloc: Failed to register buffer"); } - - Replace(handle, width, height, 1, stride, 0, format, usage, false); return 0; } -void IonBuffer::Replace(buffer_handle_t handle, int width, int height, - int layer_count, int stride, int layer_stride, - int format, int usage, bool needs_unregister) { - FreeHandle(); - - handle_ = handle; - width_ = width; - height_ = height; - layer_count_ = layer_count; - stride_ = stride; - layer_stride_ = layer_stride; - format_ = format; - usage_ = usage; - needs_unregister_ = needs_unregister; -} - void IonBuffer::Reset(buffer_handle_t handle, int width, int height, int stride, int format, int usage) { ALOGD_IF(TRACE, "IonBuffer::Reset: handle=%p width=%d height=%d stride=%d format=%d " "usage=%d", handle, width, height, stride, format, usage); - - Replace(handle, width, height, 1, stride, 0, format, usage, false); + Import(handle, width, height, stride, format, usage); } int IonBuffer::Import(buffer_handle_t handle, int width, int height, int stride, @@ -173,14 +95,14 @@ int IonBuffer::Import(buffer_handle_t handle, int width, int height, int stride, "IonBuffer::Import: handle=%p width=%d height=%d stride=%d format=%d " "usage=%d", handle, width, height, stride, format, usage); - - int ret = gralloc_module_->registerBuffer(gralloc_module_, handle); - if (ret < 0) { - ALOGE("IonBuffer::Import: failed to import handle: %s", strerror(-ret)); - return ret; + FreeHandle(); + GraphicBufferMapper& mapper = GraphicBufferMapper::get(); + buffer_ = new GraphicBuffer(width, height, format, 1, usage, + stride, (native_handle_t*)handle, true); + if (mapper.registerBuffer(buffer_.get()) != OK) { + ALOGE("IonBuffer::Import: Failed to register cloned buffer"); + return -EINVAL; } - - Replace(handle, width, height, 1, stride, 0, format, usage, true); return 0; } @@ -262,15 +184,14 @@ int IonBuffer::Lock(int usage, int x, int y, int width, int height, ALOGD_IF(TRACE, "IonBuffer::Lock: handle=%p usage=%d x=%d y=%d width=%d height=%d " "address=%p", - handle_, usage, x, y, width, height, address); + handle(), usage, x, y, width, height, address); - // Lock may be called multiple times; but only one Unlock is required. - const int err = gralloc_module_->lock(gralloc_module_, handle_, usage, x, y, - width, height, address); - if (!err) - locked_ = true; - - return err; + status_t err = buffer_->lock(usage, Rect(x, y, x + width, y + height), + address); + if (err != NO_ERROR) + return -EINVAL; + else + return 0; } int IonBuffer::LockYUV(int usage, int x, int y, int width, int height, @@ -278,45 +199,25 @@ int IonBuffer::LockYUV(int usage, int x, int y, int width, int height, ATRACE_NAME("IonBuffer::LockYUV"); ALOGD_IF(TRACE, "IonBuffer::Lock: handle=%p usage=%d x=%d y=%d width=%d height=%d", - handle_, usage, x, y, width, height); - const int err = gralloc_module_->lock_ycbcr(gralloc_module_, handle_, usage, - x, y, width, height, yuv); - if (!err) - locked_ = true; + handle(), usage, x, y, width, height); - return err; + status_t err = buffer_->lockYCbCr(usage, Rect(x, y, x + width, y + height), + yuv); + if (err != NO_ERROR) + return -EINVAL; + else + return 0; } int IonBuffer::Unlock() { ATRACE_NAME("IonBuffer::Unlock"); - ALOGD_IF(TRACE, "IonBuffer::Unlock: handle=%p", handle_); - - // Lock may be called multiple times; but only one Unlock is required. - const int err = gralloc_module_->unlock(gralloc_module_, handle_); - if (!err) - locked_ = false; + ALOGD_IF(TRACE, "IonBuffer::Unlock: handle=%p", handle()); - return err; -} - -void IonBuffer::GrallocInit() { - static std::once_flag gralloc_flag; - std::call_once(gralloc_flag, []() { - hw_module_t const* module = nullptr; - alloc_device_t* device = nullptr; - - int err = hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &module); - ALOGE_IF(err, "IonBuffer::GrallocInit: failed to find the %s module: %s", - GRALLOC_HARDWARE_MODULE_ID, strerror(-err)); - - err = gralloc_open(module, &device); - ALOGE_IF(err, "IonBuffer::GrallocInit: failed to open gralloc device: %s", - strerror(-err)); - - gralloc_module_ = reinterpret_cast<gralloc_module_t const*>(module); - gralloc_device_ = device; - }); + status_t err = buffer_->unlock(); + if (err != NO_ERROR) + return -EINVAL; + else + return 0; } - -} // namespace dvr -} // namespace android +} // namespace dvr +} // namespace android diff --git a/libs/vr/libbufferhub/tests/Android.mk b/libs/vr/libbufferhub/tests/Android.mk deleted file mode 100644 index 5053e7d643..0000000000 --- a/libs/vr/libbufferhub/tests/Android.mk +++ /dev/null @@ -1 +0,0 @@ -include $(call all-subdir-makefiles) diff --git a/libs/vr/libbufferhub/tests/ion_buffer/Android.mk b/libs/vr/libbufferhub/tests/ion_buffer/Android.mk deleted file mode 100644 index 3bfdb7b553..0000000000 --- a/libs/vr/libbufferhub/tests/ion_buffer/Android.mk +++ /dev/null @@ -1,74 +0,0 @@ -LOCAL_PATH := $(call my-dir) - -include $(CLEAR_VARS) - -COMPONENT_TOP := ${LOCAL_PATH}/../.. - -LOCAL_SRC_FILES := \ - ion_buffer-test.cpp \ - ../../ion_buffer.cpp \ - ../../mocks/gralloc/gralloc.cpp - -LOCAL_SHARED_LIBRARIES := \ - libc \ - libcutils \ - libutils \ - liblog - -LOCAL_STATIC_LIBRARIES := \ - libgmock - -LOCAL_C_INCLUDES := \ - ${COMPONENT_TOP}/mocks/gralloc \ - ${COMPONENT_TOP}/include \ - $(TOP)/system/core/base/include - -LOCAL_EXPORT_C_INCLUDE_DIRS := ${LOCAL_C_INCLUDES} - -LOCAL_NATIVE_COVERAGE := true - -LOCAL_CFLAGS := -DTRACE=0 -g - -LOCAL_MODULE := ion_buffer-test -LOCAL_MODULE_TAGS := tests - -include $(BUILD_NATIVE_TEST) - -include $(CLEAR_VARS) - -LOCAL_SRC_FILES := \ - ion_buffer-test.cpp \ - ../../ion_buffer.cpp \ - ../../mocks/gralloc/gralloc.cpp - -LOCAL_SHARED_LIBRARIES := \ - liblog - -LOCAL_STATIC_LIBRARIES := \ - libgmock_host - -LOCAL_C_INCLUDES := \ - ${COMPONENT_TOP}/mocks/gralloc \ - ${COMPONENT_TOP}/include \ - $(TOP)/system/core/base/include - -LOCAL_EXPORT_C_INCLUDE_DIRS := ${LOCAL_C_INCLUDES} - -LOCAL_NATIVE_COVERAGE := true - -LOCAL_CFLAGS := -DTRACE=0 - -LOCAL_MODULE := ion_buffer-host_test -LOCAL_MODULE_TAGS := tests -include $(BUILD_HOST_NATIVE_TEST) - -.PHONY: dvr_host_native_unit_tests -dvr_host_native_unit_tests: ion_buffer-host_test -ifeq (true,$(NATIVE_COVERAGE)) - ion_buffer-host_test: llvm-cov - ion_buffer-test: llvm-cov - # This shouldn't be necessary, but the default build with - # NATIVE_COVERAGE=true manages to ion_buffer-test without - # building llvm-cov (droid is the default target). - droid: llvm-cov -endif diff --git a/libs/vr/libbufferhub/tests/ion_buffer/ion_buffer-test.cpp b/libs/vr/libbufferhub/tests/ion_buffer/ion_buffer-test.cpp deleted file mode 100644 index 68f82d70bc..0000000000 --- a/libs/vr/libbufferhub/tests/ion_buffer/ion_buffer-test.cpp +++ /dev/null @@ -1,375 +0,0 @@ -#include <gmock/gmock.h> -#include <gralloc_mock.h> -#include <gtest/gtest.h> -#include <private/dvr/ion_buffer.h> - -using ::testing::_; -using ::testing::Invoke; -using ::testing::Return; -using ::testing::SetArgPointee; -using android::dvr::IonBuffer; - -GrallocMock* GrallocMock::staticObject = nullptr; - -namespace { - -const int w1 = 100; -const int h1 = 200; -const int d1 = 2; -const int f1 = 1; -const int u1 = 3; -const int stride1 = 8; -const int layer_stride1 = 8; -native_handle_t handle1; -const int w2 = 150; -const int h2 = 300; -const int d2 = 4; -const int f2 = 2; -const int u2 = 5; -const int stride2 = 4; -const int layer_stride2 = 4; -native_handle_t handle2; -const int kMaxFd = 10; -const int kMaxInt = 10; -char handleData[sizeof(native_handle_t) + (kMaxFd + kMaxInt) * sizeof(int)]; -native_handle_t* const dataHandle = - reinterpret_cast<native_handle_t*>(handleData); -char refData[sizeof(native_handle_t) + (kMaxFd + kMaxInt) * sizeof(int)]; -native_handle_t* const refHandle = reinterpret_cast<native_handle_t*>(refData); - -class IonBufferUnitTest : public ::testing::Test { - protected: - // You can remove any or all of the following functions if its body - // is empty. - - IonBufferUnitTest() { - GrallocMock::staticObject = new GrallocMock; - // You can do set-up work for each test here. - // most ServicefsClients will use this initializer. Use as the - // default. - } - - virtual ~IonBufferUnitTest() { - delete GrallocMock::staticObject; - GrallocMock::staticObject = nullptr; - // You can do clean-up work that doesn't throw exceptions here. - } - - // If the constructor and destructor are not enough for setting up - // and cleaning up each test, you can define the following methods: - - void SetUp() override { - // Code here will be called immediately after the constructor (right - // before each test). - } - - void TearDown() override { - // Code here will be called immediately after each test (right - // before the destructor). - } -}; - -void TestIonBufferState(const IonBuffer& buffer, int w, int h, int d, int f, - int u, native_handle_t* handle, int stride, - int layer_stride) { - EXPECT_EQ(buffer.width(), w); - EXPECT_EQ(buffer.height(), h); - EXPECT_EQ(buffer.layer_count(), d); - EXPECT_EQ(buffer.format(), f); - EXPECT_EQ(buffer.usage(), u); - EXPECT_EQ(buffer.handle(), handle); - EXPECT_EQ(buffer.stride(), stride); - EXPECT_EQ(buffer.layer_stride(), layer_stride); -} - -TEST_F(IonBufferUnitTest, TestFreeOnDestruction) { - // Set up |alloc|(|w1...|) to succeed once and fail on others calls. - EXPECT_CALL(*GrallocMock::staticObject, alloc(w1, h1, f1, u1, _, _)) - .Times(1) - .WillOnce(DoAll(SetArgPointee<4>(&handle1), SetArgPointee<5>(stride1), - Return(0))); - // Set up |free| to be called once. - EXPECT_CALL(*GrallocMock::staticObject, free(&handle1)) - .Times(1) - .WillRepeatedly(Return(0)); - - IonBuffer buffer; - // First call to |alloc| with |w1...| set up to succeed. - int ret = buffer.Alloc(w1, h1, f1, u1); - EXPECT_EQ(ret, 0); - TestIonBufferState(buffer, w1, h1, 1, f1, u1, &handle1, stride1, 0); - - // Scoped destructor will be called, calling |free| on |handle1|. -} - -TEST_F(IonBufferUnitTest, TestAlloc) { - IonBuffer buffer; - // Set up |alloc|(|w1...|) to succeed once and fail on others calls. - EXPECT_CALL(*GrallocMock::staticObject, alloc(w1, h1, f1, u1, _, _)) - .Times(2) - .WillOnce(DoAll(SetArgPointee<4>(&handle1), SetArgPointee<5>(stride1), - Return(0))) - .WillRepeatedly(Return(-1)); - - // Set up |alloc|(|w2...|) to succeed once and fail on others calls. - EXPECT_CALL(*GrallocMock::staticObject, alloc(w2, h2, f2, u2, _, _)) - .Times(2) - .WillOnce(DoAll(SetArgPointee<4>(&handle2), SetArgPointee<5>(stride2), - Return(0))) - .WillRepeatedly(Return(-1)); - EXPECT_CALL(*GrallocMock::staticObject, free(&handle1)) - .Times(1) - .WillRepeatedly(Return(0)); - EXPECT_CALL(*GrallocMock::staticObject, free(&handle2)) - .Times(1) - .WillRepeatedly(Return(0)); - - // First call to |alloc| with |w1...| set up to succeed. - int ret = buffer.Alloc(w1, h1, f1, u1); - EXPECT_EQ(ret, 0); - TestIonBufferState(buffer, w1, h1, 1, f1, u1, &handle1, stride1, 0); - - // First call to |alloc| with |w2...| set up to succeed, |free| should be - // called once on |handle1|. - ret = buffer.Alloc(w2, h2, f2, u2); - EXPECT_EQ(ret, 0); - TestIonBufferState(buffer, w2, h2, 1, f2, u2, &handle2, stride2, 0); - - // Second call to |alloc| with |w1| is set up to fail. - ret = buffer.Alloc(w1, h1, f1, u1); - EXPECT_LT(ret, 0); - TestIonBufferState(buffer, w2, h2, 1, f2, u2, &handle2, stride2, 0); - - // |free| on |handle2| should be called here. - buffer.FreeHandle(); - TestIonBufferState(buffer, 0, 0, 0, 0, 0, nullptr, 0, 0); - - // |alloc| is set up to fail. - ret = buffer.Alloc(w2, h2, f2, u2); - EXPECT_LT(ret, 0); - TestIonBufferState(buffer, 0, 0, 0, 0, 0, nullptr, 0, 0); -} - -TEST_F(IonBufferUnitTest, TestReset) { - IonBuffer buffer; - EXPECT_CALL(*GrallocMock::staticObject, free(&handle1)) - .Times(1) - .WillRepeatedly(Return(0)); - EXPECT_CALL(*GrallocMock::staticObject, free(&handle2)) - .Times(1) - .WillRepeatedly(Return(0)); - buffer.Reset(&handle1, w1, h1, stride1, f1, u1); - TestIonBufferState(buffer, w1, h1, 1, f1, u1, &handle1, stride1, 0); - buffer.Reset(&handle2, w2, h2, stride2, f2, u2); - TestIonBufferState(buffer, w2, h2, 1, f2, u2, &handle2, stride2, 0); - buffer.FreeHandle(); -} - -TEST_F(IonBufferUnitTest, TestImport1) { - IonBuffer buffer; - EXPECT_CALL(*GrallocMock::staticObject, registerBuffer(&handle1)) - .Times(3) - .WillOnce(Return(0)) - .WillRepeatedly(Return(-1)); - EXPECT_CALL(*GrallocMock::staticObject, registerBuffer(&handle2)) - .Times(3) - .WillOnce(Return(0)) - .WillOnce(Return(-1)) - .WillOnce(Return(0)); - EXPECT_CALL(*GrallocMock::staticObject, unregisterBuffer(&handle1)) - .Times(1) - .WillOnce(Return(0)); - EXPECT_CALL(*GrallocMock::staticObject, native_handle_close(&handle1)) - .Times(1); - EXPECT_CALL(*GrallocMock::staticObject, native_handle_delete(&handle1)) - .Times(1); - EXPECT_CALL(*GrallocMock::staticObject, alloc(w1, h1, f1, u1, _, _)) - .Times(1) - .WillRepeatedly(DoAll(SetArgPointee<4>(&handle1), - SetArgPointee<5>(stride1), Return(0))); - EXPECT_CALL(*GrallocMock::staticObject, unregisterBuffer(&handle2)) - .Times(2) - .WillRepeatedly(Return(0)); - EXPECT_CALL(*GrallocMock::staticObject, native_handle_close(&handle2)) - .Times(2); - EXPECT_CALL(*GrallocMock::staticObject, native_handle_delete(&handle2)) - .Times(2); - EXPECT_CALL(*GrallocMock::staticObject, free(&handle1)) - .Times(1) - .WillRepeatedly(Return(0)); - - int ret = buffer.Import(&handle1, w1, h1, stride1, f1, u1); - EXPECT_EQ(ret, 0); - TestIonBufferState(buffer, w1, h1, 1, f1, u1, &handle1, stride1, 0); - ret = buffer.Import(&handle2, w2, h2, stride2, f2, u2); - EXPECT_EQ(ret, 0); - TestIonBufferState(buffer, w2, h2, 1, f2, u2, &handle2, stride2, 0); - ret = buffer.Alloc(w1, h1, f1, u1); - EXPECT_EQ(ret, 0); - ret = buffer.Import(&handle2, w2, h2, stride2, f2, u2); - EXPECT_LT(ret, 0); - TestIonBufferState(buffer, w1, h1, 1, f1, u1, &handle1, stride1, 0); - ret = buffer.Import(&handle2, w2, h2, stride2, f2, u2); - EXPECT_EQ(ret, 0); - TestIonBufferState(buffer, w2, h2, 1, f2, u2, &handle2, stride2, 0); - ret = buffer.Import(&handle1, w1, h1, stride1, f1, u1); - EXPECT_LT(ret, 0); - TestIonBufferState(buffer, w2, h2, 1, f2, u2, &handle2, stride2, 0); - buffer.FreeHandle(); - ret = buffer.Import(&handle1, w1, h1, stride1, f1, u1); - EXPECT_LT(ret, 0); - TestIonBufferState(buffer, 0, 0, 0, 0, 0, nullptr, 0, 0); -} - -native_handle_t* native_handle_create_impl(int nFds, int nInts) { - if ((nFds + nInts) > (kMaxFd + kMaxInt)) - return nullptr; - dataHandle->version = sizeof(native_handle_t); - dataHandle->numFds = nFds; - dataHandle->numInts = nInts; - for (int i = 0; i < nFds + nInts; i++) - dataHandle->data[i] = 0; - return dataHandle; -} - -TEST_F(IonBufferUnitTest, TestImport2) { - IonBuffer buffer; - int ints[] = {211, 313, 444}; - int fds[] = {-1, -1}; - int ni = sizeof(ints) / sizeof(ints[0]); - int nfd = sizeof(fds) / sizeof(fds[0]); - EXPECT_CALL(*GrallocMock::staticObject, native_handle_create(nfd, ni)) - .Times(3) - .WillOnce(Return(nullptr)) - .WillRepeatedly(Invoke(native_handle_create_impl)); - EXPECT_CALL(*GrallocMock::staticObject, registerBuffer(dataHandle)) - .Times(2) - .WillOnce(Return(-1)) - .WillRepeatedly(Return(0)); - EXPECT_CALL(*GrallocMock::staticObject, native_handle_close(dataHandle)) - .Times(2); - EXPECT_CALL(*GrallocMock::staticObject, native_handle_delete(dataHandle)) - .Times(2); - EXPECT_CALL(*GrallocMock::staticObject, unregisterBuffer(dataHandle)) - .Times(1) - .WillRepeatedly(Return(0)); - - int ret = buffer.Import(fds, -1, ints, ni, w1, h1, stride1, f1, u1); - EXPECT_LT(ret, 0); - ret = buffer.Import(fds, nfd, ints, -1, w1, h1, stride1, f1, u1); - EXPECT_LT(ret, 0); - ret = buffer.Import(fds, nfd, ints, ni, w1, h1, stride1, f1, u1); - EXPECT_LT(ret, 0); - ret = buffer.Import(fds, nfd, ints, ni, w1, h1, stride1, f1, u1); - EXPECT_LT(ret, 0); - ret = buffer.Import(fds, nfd, ints, ni, w1, h1, stride1, f1, u1); - EXPECT_EQ(ret, 0); - TestIonBufferState(buffer, w1, h1, 1, f1, u1, dataHandle, stride1, 0); - EXPECT_EQ(dataHandle->numFds, nfd); - EXPECT_EQ(dataHandle->numInts, ni); - for (int i = 0; i < nfd; i++) - EXPECT_EQ(dataHandle->data[i], fds[i]); - for (int i = 0; i < ni; i++) - EXPECT_EQ(dataHandle->data[nfd + i], ints[i]); - buffer.FreeHandle(); -} - -TEST_F(IonBufferUnitTest, TestDuplicate) { - IonBuffer buffer; - IonBuffer ref; - int ints[] = {211, 313, 444}; - int fds[] = {-1, -1}; - int ni = sizeof(ints) / sizeof(ints[0]); - int nfd = sizeof(fds) / sizeof(fds[0]); - - for (int i = 0; i < nfd; i++) { - refHandle->data[i] = fds[i]; - } - for (int i = 0; i < ni; i++) { - refHandle->data[i + nfd] = ints[i]; - } - - EXPECT_CALL(*GrallocMock::staticObject, alloc(w1, h1, f1, u1, _, _)) - .Times(1) - .WillRepeatedly(DoAll(SetArgPointee<4>(refHandle), - SetArgPointee<5>(stride1), Return(0))); - EXPECT_CALL(*GrallocMock::staticObject, native_handle_create(nfd, ni)) - .Times(3) - .WillOnce(Return(nullptr)) - .WillRepeatedly(Invoke(native_handle_create_impl)); - EXPECT_CALL(*GrallocMock::staticObject, registerBuffer(dataHandle)) - .Times(2) - .WillOnce(Return(-1)) - .WillRepeatedly(Return(0)); - EXPECT_CALL(*GrallocMock::staticObject, native_handle_close(dataHandle)) - .Times(2); - EXPECT_CALL(*GrallocMock::staticObject, native_handle_delete(dataHandle)) - .Times(2); - EXPECT_CALL(*GrallocMock::staticObject, unregisterBuffer(dataHandle)) - .Times(1) - .WillRepeatedly(Return(0)); - EXPECT_CALL(*GrallocMock::staticObject, free(refHandle)) - .Times(1) - .WillRepeatedly(Return(0)); - - int ret = buffer.Duplicate(&ref); - EXPECT_LT(ret, 0); - ret = ref.Alloc(w1, h1, f1, u1); - EXPECT_EQ(ret, 0); - refHandle->numFds = -1; - refHandle->numInts = 0; - ret = buffer.Duplicate(&ref); - EXPECT_LT(ret, 0); - refHandle->numFds = nfd; - refHandle->numInts = ni; - ret = buffer.Duplicate(&ref); - EXPECT_LT(ret, 0); - ret = buffer.Duplicate(&ref); - EXPECT_LT(ret, 0); - ret = buffer.Duplicate(&ref); - EXPECT_EQ(ret, 0); - TestIonBufferState(buffer, w1, h1, 1, f1, u1, dataHandle, stride1, 0); - EXPECT_EQ(dataHandle->numFds, nfd); - EXPECT_EQ(dataHandle->numInts, ni); - for (int i = 0; i < nfd; i++) - EXPECT_LT(dataHandle->data[i], 0); - for (int i = 0; i < ni; i++) - EXPECT_EQ(dataHandle->data[nfd + i], ints[i]); - buffer.FreeHandle(); - ref.FreeHandle(); -} - -TEST_F(IonBufferUnitTest, TestLockUnlock) { - IonBuffer buffer; - const int x = 12; - const int y = 24; - const int value1 = 17; - const int value2 = 25; - void* addr1; - void** addr = &addr1; - - EXPECT_CALL(*GrallocMock::staticObject, alloc(w1, h1, f1, u1, _, _)) - .Times(1) - .WillRepeatedly(DoAll(SetArgPointee<4>(&handle1), - SetArgPointee<5>(stride1), Return(0))); - EXPECT_CALL(*GrallocMock::staticObject, - lock(&handle1, u2, x, y, w2, h2, addr)) - .Times(1) - .WillRepeatedly(Return(value1)); - EXPECT_CALL(*GrallocMock::staticObject, unlock(&handle1)) - .Times(1) - .WillRepeatedly(Return(value2)); - EXPECT_CALL(*GrallocMock::staticObject, free(&handle1)) - .Times(1) - .WillRepeatedly(Return(0)); - - int ret = buffer.Alloc(w1, h1, f1, u1); - EXPECT_EQ(ret, 0); - ret = buffer.Lock(u2, x, y, w2, h2, addr); - EXPECT_EQ(ret, value1); - ret = buffer.Unlock(); - EXPECT_EQ(ret, value2); - buffer.FreeHandle(); -} - -} // namespace diff --git a/libs/vr/libeds/Android.bp b/libs/vr/libeds/Android.bp index 7838c4d1a2..187cbbf986 100644 --- a/libs/vr/libeds/Android.bp +++ b/libs/vr/libeds/Android.bp @@ -36,6 +36,8 @@ sharedLibraries = [ "libEGL", "libGLESv1_CM", "libGLESv2", + "libui", + "libutils", "libvulkan", ] diff --git a/libs/vr/libvrsensor/Android.bp b/libs/vr/libvrsensor/Android.bp index f201ea646b..6d48f18385 100644 --- a/libs/vr/libvrsensor/Android.bp +++ b/libs/vr/libvrsensor/Android.bp @@ -34,6 +34,7 @@ sharedLibraries = [ "libhardware", "liblog", "libutils", + "libui", ] cc_library { diff --git a/services/vr/bufferhubd/Android.mk b/services/vr/bufferhubd/Android.mk index 0db909ccec..c1a0b6f1f4 100644 --- a/services/vr/bufferhubd/Android.mk +++ b/services/vr/bufferhubd/Android.mk @@ -34,7 +34,8 @@ sharedLibraries := \ liblog \ libsync \ libutils \ - libgui + libgui \ + libui include $(CLEAR_VARS) # Don't strip symbols so we see stack traces in logcat. diff --git a/services/vr/bufferhubd/buffer_hub.cpp b/services/vr/bufferhubd/buffer_hub.cpp index 09064767d2..80efcf8452 100644 --- a/services/vr/bufferhubd/buffer_hub.cpp +++ b/services/vr/bufferhubd/buffer_hub.cpp @@ -29,7 +29,7 @@ BufferHubService::BufferHubService() BufferHubService::~BufferHubService() {} bool BufferHubService::IsInitialized() const { - return BASE::IsInitialized() && IonBuffer::GetGrallocModule(); + return BASE::IsInitialized(); } std::string BufferHubService::DumpState(size_t /*max_length*/) { diff --git a/services/vr/sensord/Android.mk b/services/vr/sensord/Android.mk index f9a1ceca4e..ba0821b321 100644 --- a/services/vr/sensord/Android.mk +++ b/services/vr/sensord/Android.mk @@ -44,6 +44,7 @@ sharedLibraries := \ liblog \ libhardware \ libutils \ + libui \ $(SENSORD_EXTEND) \ cFlags := -DLOG_TAG=\"sensord\" \ |