hwc2: Fix buffer allocator usage

Make sure the hwc buffer allocator is created at one location.

CRs-Fixed: 2019502
Change-Id: I0ffc2fb886431d8155c3bc2c112178cc413df54b
This commit is contained in:
Naseer Ahmed
2017-03-01 18:38:12 -05:00
parent a2569b466f
commit d183040148
11 changed files with 58 additions and 51 deletions

View File

@@ -88,8 +88,8 @@ void HWCColorManager::MarshallStructIntoParcel(const PPDisplayAPIPayload &data,
out_parcel->write(data.payload, data.size); out_parcel->write(data.payload, data.size);
} }
HWCColorManager *HWCColorManager::CreateColorManager() { HWCColorManager *HWCColorManager::CreateColorManager(HWCBufferAllocator * buffer_allocator) {
HWCColorManager *color_mgr = new HWCColorManager(); HWCColorManager *color_mgr = new HWCColorManager(buffer_allocator);
if (color_mgr) { if (color_mgr) {
// Load display API interface library. And retrieve color API function tables. // Load display API interface library. And retrieve color API function tables.
@@ -135,6 +135,10 @@ HWCColorManager *HWCColorManager::CreateColorManager() {
return color_mgr; return color_mgr;
} }
HWCColorManager::HWCColorManager(HWCBufferAllocator *buffer_allocator) :
buffer_allocator_(buffer_allocator) {
}
HWCColorManager::~HWCColorManager() { HWCColorManager::~HWCColorManager() {
} }
@@ -216,17 +220,9 @@ int HWCColorManager::SetFrameCapture(void *params, bool enable, HWCDisplay *hwc_
buffer_info.alloc_buffer_info.stride = 0; buffer_info.alloc_buffer_info.stride = 0;
buffer_info.alloc_buffer_info.size = 0; buffer_info.alloc_buffer_info.size = 0;
buffer_allocator_ = new HWCBufferAllocator();
if (buffer_allocator_ == NULL) {
DLOGE("Memory allocation for buffer_allocator_ FAILED");
return -ENOMEM;
}
ret = buffer_allocator_->AllocateBuffer(&buffer_info); ret = buffer_allocator_->AllocateBuffer(&buffer_info);
if (ret != 0) { if (ret != 0) {
DLOGE("Buffer allocation failed. ret: %d", ret); DLOGE("Buffer allocation failed. ret: %d", ret);
delete buffer_allocator_;
buffer_allocator_ = NULL;
return -ENOMEM; return -ENOMEM;
} else { } else {
void *buffer = mmap(NULL, buffer_info.alloc_buffer_info.size, PROT_READ | PROT_WRITE, void *buffer = mmap(NULL, buffer_info.alloc_buffer_info.size, PROT_READ | PROT_WRITE,
@@ -236,8 +232,6 @@ int HWCColorManager::SetFrameCapture(void *params, bool enable, HWCDisplay *hwc_
DLOGE("mmap failed. err = %d", errno); DLOGE("mmap failed. err = %d", errno);
frame_capture_data->buffer = NULL; frame_capture_data->buffer = NULL;
ret = buffer_allocator_->FreeBuffer(&buffer_info); ret = buffer_allocator_->FreeBuffer(&buffer_info);
delete buffer_allocator_;
buffer_allocator_ = NULL;
return -EFAULT; return -EFAULT;
} else { } else {
frame_capture_data->buffer = reinterpret_cast<uint8_t *>(buffer); frame_capture_data->buffer = reinterpret_cast<uint8_t *>(buffer);
@@ -263,8 +257,6 @@ int HWCColorManager::SetFrameCapture(void *params, bool enable, HWCDisplay *hwc_
if (ret != 0) { if (ret != 0) {
DLOGE("FreeBuffer failed. ret = %d", ret); DLOGE("FreeBuffer failed. ret = %d", ret);
} }
delete buffer_allocator_;
buffer_allocator_ = NULL;
} }
} else { } else {
DLOGE("GetFrameCaptureStatus failed. ret = %d", ret); DLOGE("GetFrameCaptureStatus failed. ret = %d", ret);

View File

@@ -105,12 +105,13 @@ class HWCQDCMModeManager {
class HWCColorManager { class HWCColorManager {
public: public:
static const int kNumSolidFillLayers = 2; static const int kNumSolidFillLayers = 2;
static HWCColorManager *CreateColorManager(); static HWCColorManager *CreateColorManager(HWCBufferAllocator *buffer_allocator);
static int CreatePayloadFromParcel(const android::Parcel &in, uint32_t *disp_id, static int CreatePayloadFromParcel(const android::Parcel &in, uint32_t *disp_id,
PPDisplayAPIPayload *sink); PPDisplayAPIPayload *sink);
static void MarshallStructIntoParcel(const PPDisplayAPIPayload &data, static void MarshallStructIntoParcel(const PPDisplayAPIPayload &data,
android::Parcel *out_parcel); android::Parcel *out_parcel);
explicit HWCColorManager(HWCBufferAllocator *buffer_allocator);
~HWCColorManager(); ~HWCColorManager();
void DestroyColorManager(); void DestroyColorManager();
int EnableQDCMMode(bool enable, HWCDisplay *hwc_display); int EnableQDCMMode(bool enable, HWCDisplay *hwc_display);

View File

@@ -213,7 +213,7 @@ void HWCColorMode::PopulateTransform(const android_color_mode_t &mode,
HWCDisplay::HWCDisplay(CoreInterface *core_intf, HWCCallbacks *callbacks, DisplayType type, HWCDisplay::HWCDisplay(CoreInterface *core_intf, HWCCallbacks *callbacks, DisplayType type,
hwc2_display_t id, bool needs_blit, qService::QService *qservice, hwc2_display_t id, bool needs_blit, qService::QService *qservice,
DisplayClass display_class) DisplayClass display_class, BufferAllocator *buffer_allocator)
: core_intf_(core_intf), : core_intf_(core_intf),
callbacks_(callbacks), callbacks_(callbacks),
type_(type), type_(type),
@@ -221,6 +221,7 @@ HWCDisplay::HWCDisplay(CoreInterface *core_intf, HWCCallbacks *callbacks, Displa
needs_blit_(needs_blit), needs_blit_(needs_blit),
qservice_(qservice), qservice_(qservice),
display_class_(display_class) { display_class_(display_class) {
buffer_allocator_ = static_cast<HWCBufferAllocator *>(buffer_allocator);
} }
int HWCDisplay::Init() { int HWCDisplay::Init() {
@@ -237,8 +238,6 @@ int HWCDisplay::Init() {
swap_interval_zero_ = true; swap_interval_zero_ = true;
} }
buffer_allocator_ = new HWCBufferAllocator();
client_target_ = new HWCLayer(id_, buffer_allocator_); client_target_ = new HWCLayer(id_, buffer_allocator_);
int blit_enabled = 0; int blit_enabled = 0;
@@ -262,11 +261,6 @@ int HWCDisplay::Deinit() {
delete client_target_; delete client_target_;
if (buffer_allocator_) {
delete buffer_allocator_;
buffer_allocator_ = NULL;
}
if (color_mode_) { if (color_mode_) {
color_mode_->DeInit(); color_mode_->DeInit();
delete color_mode_; delete color_mode_;

View File

@@ -199,7 +199,8 @@ class HWCDisplay : public DisplayEventHandler {
static const uint32_t kMaxLayerCount = 32; static const uint32_t kMaxLayerCount = 32;
HWCDisplay(CoreInterface *core_intf, HWCCallbacks *callbacks, DisplayType type, hwc2_display_t id, HWCDisplay(CoreInterface *core_intf, HWCCallbacks *callbacks, DisplayType type, hwc2_display_t id,
bool needs_blit, qService::QService *qservice, DisplayClass display_class); bool needs_blit, qService::QService *qservice, DisplayClass display_class,
BufferAllocator *buffer_allocator);
// DisplayEventHandler methods // DisplayEventHandler methods
virtual DisplayError VSync(const DisplayEventVSync &vsync); virtual DisplayError VSync(const DisplayEventVSync &vsync);

View File

@@ -39,12 +39,14 @@
namespace sdm { namespace sdm {
int HWCDisplayExternal::Create(CoreInterface *core_intf, HWCCallbacks *callbacks, int HWCDisplayExternal::Create(CoreInterface *core_intf, HWCBufferAllocator *buffer_allocator,
qService::QService *qservice, HWCDisplay **hwc_display) { HWCCallbacks *callbacks, qService::QService *qservice,
return Create(core_intf, callbacks, 0, 0, qservice, false, hwc_display); HWCDisplay **hwc_display) {
return Create(core_intf, buffer_allocator, callbacks, 0, 0, qservice, false, hwc_display);
} }
int HWCDisplayExternal::Create(CoreInterface *core_intf, HWCCallbacks *callbacks, int HWCDisplayExternal::Create(CoreInterface *core_intf, HWCBufferAllocator *buffer_allocator,
HWCCallbacks *callbacks,
uint32_t primary_width, uint32_t primary_height, uint32_t primary_width, uint32_t primary_height,
qService::QService *qservice, bool use_primary_res, qService::QService *qservice, bool use_primary_res,
HWCDisplay **hwc_display) { HWCDisplay **hwc_display) {
@@ -52,7 +54,8 @@ int HWCDisplayExternal::Create(CoreInterface *core_intf, HWCCallbacks *callbacks
uint32_t external_height = 0; uint32_t external_height = 0;
DisplayError error = kErrorNone; DisplayError error = kErrorNone;
HWCDisplay *hwc_display_external = new HWCDisplayExternal(core_intf, callbacks, qservice); HWCDisplay *hwc_display_external = new HWCDisplayExternal(core_intf, buffer_allocator, callbacks,
qservice);
int status = hwc_display_external->Init(); int status = hwc_display_external->Init();
if (status) { if (status) {
delete hwc_display_external; delete hwc_display_external;
@@ -95,10 +98,12 @@ void HWCDisplayExternal::Destroy(HWCDisplay *hwc_display) {
delete hwc_display; delete hwc_display;
} }
HWCDisplayExternal::HWCDisplayExternal(CoreInterface *core_intf, HWCCallbacks *callbacks, HWCDisplayExternal::HWCDisplayExternal(CoreInterface *core_intf,
HWCBufferAllocator *buffer_allocator,
HWCCallbacks *callbacks,
qService::QService *qservice) qService::QService *qservice)
: HWCDisplay(core_intf, callbacks, kHDMI, HWC_DISPLAY_EXTERNAL, false, qservice, : HWCDisplay(core_intf, callbacks, kHDMI, HWC_DISPLAY_EXTERNAL, false, qservice,
DISPLAY_CLASS_EXTERNAL) { DISPLAY_CLASS_EXTERNAL, buffer_allocator) {
} }
HWC2::Error HWCDisplayExternal::Validate(uint32_t *out_num_types, uint32_t *out_num_requests) { HWC2::Error HWCDisplayExternal::Validate(uint32_t *out_num_types, uint32_t *out_num_requests) {

View File

@@ -36,10 +36,12 @@ namespace sdm {
class HWCDisplayExternal : public HWCDisplay { class HWCDisplayExternal : public HWCDisplay {
public: public:
static int Create(CoreInterface *core_intf, HWCCallbacks *callbacks, uint32_t primary_width, static int Create(CoreInterface *core_intf, HWCBufferAllocator *buffer_allocator,
HWCCallbacks *callbacks, uint32_t primary_width,
uint32_t primary_height, qService::QService *qservice, bool use_primary_res, uint32_t primary_height, qService::QService *qservice, bool use_primary_res,
HWCDisplay **hwc_display); HWCDisplay **hwc_display);
static int Create(CoreInterface *core_intf, HWCCallbacks *callbacks, qService::QService *qservice, static int Create(CoreInterface *core_intf, HWCBufferAllocator *buffer_allocator,
HWCCallbacks *callbacks, qService::QService *qservice,
HWCDisplay **hwc_display); HWCDisplay **hwc_display);
static void Destroy(HWCDisplay *hwc_display); static void Destroy(HWCDisplay *hwc_display);
virtual HWC2::Error Validate(uint32_t *out_num_types, uint32_t *out_num_requests); virtual HWC2::Error Validate(uint32_t *out_num_types, uint32_t *out_num_requests);
@@ -47,8 +49,8 @@ class HWCDisplayExternal : public HWCDisplay {
virtual void SetSecureDisplay(bool secure_display_active); virtual void SetSecureDisplay(bool secure_display_active);
private: private:
HWCDisplayExternal(CoreInterface *core_intf, HWCCallbacks *callbacks, HWCDisplayExternal(CoreInterface *core_intf, HWCBufferAllocator *buffer_allocator,
qService::QService *qservice); HWCCallbacks *callbacks, qService::QService *qservice);
void ApplyScanAdjustment(hwc_rect_t *display_frame); void ApplyScanAdjustment(hwc_rect_t *display_frame);
static void GetDownscaleResolution(uint32_t primary_width, uint32_t primary_height, static void GetDownscaleResolution(uint32_t primary_width, uint32_t primary_height,
uint32_t *virtual_width, uint32_t *virtual_height); uint32_t *virtual_width, uint32_t *virtual_height);

View File

@@ -88,7 +88,7 @@ void HWCDisplayPrimary::Destroy(HWCDisplay *hwc_display) {
HWCDisplayPrimary::HWCDisplayPrimary(CoreInterface *core_intf, BufferAllocator *buffer_allocator, HWCDisplayPrimary::HWCDisplayPrimary(CoreInterface *core_intf, BufferAllocator *buffer_allocator,
HWCCallbacks *callbacks, qService::QService *qservice) HWCCallbacks *callbacks, qService::QService *qservice)
: HWCDisplay(core_intf, callbacks, kPrimary, HWC_DISPLAY_PRIMARY, true, qservice, : HWCDisplay(core_intf, callbacks, kPrimary, HWC_DISPLAY_PRIMARY, true, qservice,
DISPLAY_CLASS_PRIMARY), DISPLAY_CLASS_PRIMARY, buffer_allocator),
buffer_allocator_(buffer_allocator), buffer_allocator_(buffer_allocator),
cpu_hint_(NULL) { cpu_hint_(NULL) {
} }

View File

@@ -42,10 +42,12 @@
namespace sdm { namespace sdm {
int HWCDisplayVirtual::Create(CoreInterface *core_intf, HWCCallbacks *callbacks, uint32_t width, int HWCDisplayVirtual::Create(CoreInterface *core_intf, HWCBufferAllocator *buffer_allocator,
HWCCallbacks *callbacks, uint32_t width,
uint32_t height, int32_t *format, HWCDisplay **hwc_display) { uint32_t height, int32_t *format, HWCDisplay **hwc_display) {
int status = 0; int status = 0;
HWCDisplayVirtual *hwc_display_virtual = new HWCDisplayVirtual(core_intf, callbacks); HWCDisplayVirtual *hwc_display_virtual = new HWCDisplayVirtual(core_intf, buffer_allocator,
callbacks);
// TODO(user): Populate format correctly // TODO(user): Populate format correctly
DLOGI("Creating virtual display: w: %d h:%d format:0x%x", width, height, *format); DLOGI("Creating virtual display: w: %d h:%d format:0x%x", width, height, *format);
@@ -89,9 +91,10 @@ void HWCDisplayVirtual::Destroy(HWCDisplay *hwc_display) {
delete hwc_display; delete hwc_display;
} }
HWCDisplayVirtual::HWCDisplayVirtual(CoreInterface *core_intf, HWCCallbacks *callbacks) HWCDisplayVirtual::HWCDisplayVirtual(CoreInterface *core_intf, HWCBufferAllocator *buffer_allocator,
HWCCallbacks *callbacks)
: HWCDisplay(core_intf, callbacks, kVirtual, HWC_DISPLAY_VIRTUAL, false, NULL, : HWCDisplay(core_intf, callbacks, kVirtual, HWC_DISPLAY_VIRTUAL, false, NULL,
DISPLAY_CLASS_VIRTUAL) { DISPLAY_CLASS_VIRTUAL, buffer_allocator) {
} }
int HWCDisplayVirtual::Init() { int HWCDisplayVirtual::Init() {

View File

@@ -38,7 +38,8 @@ namespace sdm {
class HWCDisplayVirtual : public HWCDisplay { class HWCDisplayVirtual : public HWCDisplay {
public: public:
static int Create(CoreInterface *core_intf, HWCCallbacks *callbacks, uint32_t width, static int Create(CoreInterface *core_intf, HWCBufferAllocator *buffer_allocator,
HWCCallbacks *callbacks, uint32_t width,
uint32_t height, int32_t *format, HWCDisplay **hwc_display); uint32_t height, int32_t *format, HWCDisplay **hwc_display);
static void Destroy(HWCDisplay *hwc_display); static void Destroy(HWCDisplay *hwc_display);
virtual int Init(); virtual int Init();
@@ -49,7 +50,8 @@ class HWCDisplayVirtual : public HWCDisplay {
HWC2::Error SetOutputBuffer(buffer_handle_t buf, int32_t release_fence); HWC2::Error SetOutputBuffer(buffer_handle_t buf, int32_t release_fence);
private: private:
HWCDisplayVirtual(CoreInterface *core_intf, HWCCallbacks *callbacks); HWCDisplayVirtual(CoreInterface *core_intf, HWCBufferAllocator *buffer_allocator,
HWCCallbacks *callbacks);
int SetConfig(uint32_t width, uint32_t height); int SetConfig(uint32_t width, uint32_t height);
bool dump_output_layer_ = false; bool dump_output_layer_ = false;

View File

@@ -93,7 +93,9 @@ int HWCSession::Init() {
return -EINVAL; return -EINVAL;
} }
DisplayError error = CoreInterface::CreateCore(HWCDebugHandler::Get(), &buffer_allocator_, buffer_allocator_ = new HWCBufferAllocator();
DisplayError error = CoreInterface::CreateCore(HWCDebugHandler::Get(), buffer_allocator_,
&buffer_sync_handler_, &socket_handler_, &buffer_sync_handler_, &socket_handler_,
&core_intf_); &core_intf_);
if (error != kErrorNone) { if (error != kErrorNone) {
@@ -109,11 +111,11 @@ int HWCSession::Init() {
if (error == kErrorNone && hw_disp_info.type == kHDMI && hw_disp_info.is_connected) { if (error == kErrorNone && hw_disp_info.type == kHDMI && hw_disp_info.is_connected) {
// HDMI is primary display. If already connected, then create it and store in // HDMI is primary display. If already connected, then create it and store in
// primary display slot. If not connected, create a NULL display for now. // primary display slot. If not connected, create a NULL display for now.
status = HWCDisplayExternal::Create(core_intf_, &callbacks_, qservice_, status = HWCDisplayExternal::Create(core_intf_, buffer_allocator_, &callbacks_, qservice_,
&hwc_display_[HWC_DISPLAY_PRIMARY]); &hwc_display_[HWC_DISPLAY_PRIMARY]);
} else { } else {
// Create and power on primary display // Create and power on primary display
status = HWCDisplayPrimary::Create(core_intf_, &buffer_allocator_, &callbacks_, qservice_, status = HWCDisplayPrimary::Create(core_intf_, buffer_allocator_, &callbacks_, qservice_,
&hwc_display_[HWC_DISPLAY_PRIMARY]); &hwc_display_[HWC_DISPLAY_PRIMARY]);
} }
@@ -122,7 +124,7 @@ int HWCSession::Init() {
return status; return status;
} }
color_mgr_ = HWCColorManager::CreateColorManager(); color_mgr_ = HWCColorManager::CreateColorManager(buffer_allocator_);
if (!color_mgr_) { if (!color_mgr_) {
DLOGW("Failed to load HWCColorManager."); DLOGW("Failed to load HWCColorManager.");
} }
@@ -162,6 +164,11 @@ int HWCSession::Deinit() {
DLOGE("Display core de-initialization failed. Error = %d", error); DLOGE("Display core de-initialization failed. Error = %d", error);
} }
if (buffer_allocator_ != nullptr) {
delete buffer_allocator_;
}
buffer_allocator_ = nullptr;
return 0; return 0;
} }
@@ -707,8 +714,8 @@ HWC2::Error HWCSession::CreateVirtualDisplayObject(uint32_t width, uint32_t heig
if (hwc_display_[HWC_DISPLAY_VIRTUAL]) { if (hwc_display_[HWC_DISPLAY_VIRTUAL]) {
return HWC2::Error::NoResources; return HWC2::Error::NoResources;
} }
auto status = HWCDisplayVirtual::Create(core_intf_, &callbacks_, width, height, format, auto status = HWCDisplayVirtual::Create(core_intf_, buffer_allocator_, &callbacks_, width,
&hwc_display_[HWC_DISPLAY_VIRTUAL]); height, format, &hwc_display_[HWC_DISPLAY_VIRTUAL]);
// TODO(user): validate width and height support // TODO(user): validate width and height support
if (status) if (status)
return HWC2::Error::Unsupported; return HWC2::Error::Unsupported;
@@ -726,8 +733,8 @@ int32_t HWCSession::ConnectDisplay(int disp) {
hwc_display_[HWC_DISPLAY_PRIMARY]->GetFrameBufferResolution(&primary_width, &primary_height); hwc_display_[HWC_DISPLAY_PRIMARY]->GetFrameBufferResolution(&primary_width, &primary_height);
if (disp == HWC_DISPLAY_EXTERNAL) { if (disp == HWC_DISPLAY_EXTERNAL) {
status = HWCDisplayExternal::Create(core_intf_, &callbacks_, primary_width, primary_height, status = HWCDisplayExternal::Create(core_intf_, buffer_allocator_, &callbacks_, primary_width,
qservice_, false, &hwc_display_[disp]); primary_height, qservice_, false, &hwc_display_[disp]);
} else { } else {
DLOGE("Invalid display type"); DLOGE("Invalid display type");
return -1; return -1;

View File

@@ -177,7 +177,7 @@ class HWCSession : hwc2_device_t, public qClient::BnQClient {
pthread_t uevent_thread_; pthread_t uevent_thread_;
bool uevent_thread_exit_ = false; bool uevent_thread_exit_ = false;
const char *uevent_thread_name_ = "HWC_UeventThread"; const char *uevent_thread_name_ = "HWC_UeventThread";
HWCBufferAllocator buffer_allocator_; HWCBufferAllocator *buffer_allocator_;
HWCBufferSyncHandler buffer_sync_handler_; HWCBufferSyncHandler buffer_sync_handler_;
HWCColorManager *color_mgr_ = NULL; HWCColorManager *color_mgr_ = NULL;
bool reset_panel_ = false; bool reset_panel_ = false;