Merge "sdm: Handle error on gralloc device open and close"
diff --git a/libgralloc1/gr_utils.cpp b/libgralloc1/gr_utils.cpp
index b3056e1..560bb08 100644
--- a/libgralloc1/gr_utils.cpp
+++ b/libgralloc1/gr_utils.cpp
@@ -509,7 +509,9 @@
// Query GPU for UBWC only if buffer is intended to be used by GPU.
if ((cons_usage & GRALLOC1_CONSUMER_USAGE_GPU_TEXTURE) ||
(prod_usage & GRALLOC1_PRODUCER_USAGE_GPU_RENDER_TARGET)) {
- enable = AdrenoMemInfo::GetInstance()->IsUBWCSupportedByGPU(format);
+ if (AdrenoMemInfo::GetInstance()) {
+ enable = AdrenoMemInfo::GetInstance()->IsUBWCSupportedByGPU(format);
+ }
}
// Allow UBWC, only if CPU usage flags are not set
@@ -675,8 +677,10 @@
int tile = ubwc_enabled;
if (IsUncompressedRGBFormat(format)) {
- AdrenoMemInfo::GetInstance()->AlignUnCompressedRGB(width, height, format, tile, alignedw,
- alignedh);
+ if (AdrenoMemInfo::GetInstance()) {
+ AdrenoMemInfo::GetInstance()->AlignUnCompressedRGB(width, height, format, tile, alignedw,
+ alignedh);
+ }
return;
}
@@ -686,7 +690,9 @@
}
if (IsCompressedRGBFormat(format)) {
- AdrenoMemInfo::GetInstance()->AlignCompressedRGB(width, height, format, alignedw, alignedh);
+ if (AdrenoMemInfo::GetInstance()) {
+ AdrenoMemInfo::GetInstance()->AlignCompressedRGB(width, height, format, alignedw, alignedh);
+ }
return;
}
@@ -698,6 +704,9 @@
switch (format) {
case HAL_PIXEL_FORMAT_YCrCb_420_SP:
case HAL_PIXEL_FORMAT_YCbCr_420_SP:
+ if (AdrenoMemInfo::GetInstance() == nullptr) {
+ return;
+ }
alignment = AdrenoMemInfo::GetInstance()->GetGpuPixelAlignment();
aligned_w = ALIGN(width, alignment);
break;
diff --git a/sdm/libs/hwc2/hwc_buffer_allocator.cpp b/sdm/libs/hwc2/hwc_buffer_allocator.cpp
index a1b763c..4865e08 100644
--- a/sdm/libs/hwc2/hwc_buffer_allocator.cpp
+++ b/sdm/libs/hwc2/hwc_buffer_allocator.cpp
@@ -41,25 +41,43 @@
namespace sdm {
-HWCBufferAllocator::HWCBufferAllocator() {
+DisplayError HWCBufferAllocator::Init() {
int err = hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &module_);
if (err != 0) {
- DLOGE("FATAL: can not open GRALLOC module");
- } else {
- gralloc1_open(module_, &gralloc_device_);
+ DLOGE("FATAL: can not get GRALLOC module");
+ return kErrorResources;
}
+
+ err = gralloc1_open(module_, &gralloc_device_);
+ if (err != 0) {
+ DLOGE("FATAL: can not open GRALLOC device");
+ return kErrorResources;
+ }
+
+ if (gralloc_device_ == nullptr) {
+ DLOGE("FATAL: gralloc device is null");
+ return kErrorResources;
+ }
+
ReleaseBuffer_ = reinterpret_cast<GRALLOC1_PFN_RELEASE>(
gralloc_device_->getFunction(gralloc_device_, GRALLOC1_FUNCTION_RELEASE));
Perform_ = reinterpret_cast<GRALLOC1_PFN_PERFORM>(
gralloc_device_->getFunction(gralloc_device_, GRALLOC1_FUNCTION_PERFORM));
Lock_ = reinterpret_cast<GRALLOC1_PFN_LOCK>(
gralloc_device_->getFunction(gralloc_device_, GRALLOC1_FUNCTION_LOCK));
+
+ return kErrorNone;
}
-HWCBufferAllocator::~HWCBufferAllocator() {
+DisplayError HWCBufferAllocator::Deinit() {
if (gralloc_device_ != nullptr) {
- gralloc1_close(gralloc_device_);
+ int err = gralloc1_close(gralloc_device_);
+ if (err != 0) {
+ DLOGE("FATAL: can not close GRALLOC device");
+ return kErrorResources;
+ }
}
+ return kErrorNone;
}
DisplayError HWCBufferAllocator::AllocateBuffer(BufferInfo *buffer_info) {
diff --git a/sdm/libs/hwc2/hwc_buffer_allocator.h b/sdm/libs/hwc2/hwc_buffer_allocator.h
index 925edce..8101d85 100644
--- a/sdm/libs/hwc2/hwc_buffer_allocator.h
+++ b/sdm/libs/hwc2/hwc_buffer_allocator.h
@@ -45,9 +45,8 @@
class HWCBufferAllocator : public BufferAllocator {
public:
- HWCBufferAllocator();
- ~HWCBufferAllocator();
-
+ DisplayError Init();
+ DisplayError Deinit();
DisplayError AllocateBuffer(BufferInfo *buffer_info);
DisplayError FreeBuffer(BufferInfo *buffer_info);
uint32_t GetBufferSize(BufferInfo *buffer_info);
diff --git a/sdm/libs/hwc2/hwc_session.cpp b/sdm/libs/hwc2/hwc_session.cpp
index df15404..293ffce 100644
--- a/sdm/libs/hwc2/hwc_session.cpp
+++ b/sdm/libs/hwc2/hwc_session.cpp
@@ -157,10 +157,16 @@
StartServices();
- DisplayError error = CoreInterface::CreateCore(HWCDebugHandler::Get(), &buffer_allocator_,
- &buffer_sync_handler_, &socket_handler_,
- &core_intf_);
+ DisplayError error = buffer_allocator_.Init();
if (error != kErrorNone) {
+ DLOGE("Buffer allocaor initialization failed. Error = %d", error);
+ return -EINVAL;
+ }
+
+ error = CoreInterface::CreateCore(HWCDebugHandler::Get(), &buffer_allocator_,
+ &buffer_sync_handler_, &socket_handler_, &core_intf_);
+ if (error != kErrorNone) {
+ buffer_allocator_.Deinit();
DLOGE("Display core initialization failed. Error = %d", error);
return -EINVAL;
}
@@ -173,6 +179,7 @@
if (error != kErrorNone) {
g_hwc_uevent_.Register(nullptr);
CoreInterface::DestroyCore();
+ buffer_allocator_.Deinit();
DLOGE("Primary display type not recognized. Error = %d", error);
return -EINVAL;
}
@@ -198,6 +205,7 @@
if (status) {
g_hwc_uevent_.Register(nullptr);
CoreInterface::DestroyCore();
+ buffer_allocator_.Deinit();
return status;
}