Merge "hwc: mdpcomp: Remove the perf lock acquire log message"
diff --git a/displayengine/libs/core/hw_framebuffer.cpp b/displayengine/libs/core/hw_framebuffer.cpp
index 4a361da..a1698df 100644
--- a/displayengine/libs/core/hw_framebuffer.cpp
+++ b/displayengine/libs/core/hw_framebuffer.cpp
@@ -542,49 +542,33 @@
return kErrorNone;
}
-DisplayError HWFrameBuffer::OpenRotatorSession(Handle device, HWLayers *hw_layers) {
+DisplayError HWFrameBuffer::OpenRotatorSession(Handle device, HWRotateInfo *rotate_info) {
HWContext *hw_context = reinterpret_cast<HWContext *>(device);
HWRotator *hw_rotator = &hw_context->hw_rotator;
+ LayerBuffer *input_buffer = rotate_info->input_buffer;
+ HWBufferInfo *rot_buf_info = &rotate_info->hw_buffer_info;
hw_rotator->Reset();
- HWLayersInfo &hw_layer_info = hw_layers->info;
+ STRUCT_VAR(mdp_rotation_config, mdp_rot_config);
+ mdp_rot_config.version = MDP_ROTATION_REQUEST_VERSION_1_0;
+ mdp_rot_config.input.width = input_buffer->width;
+ mdp_rot_config.input.height = input_buffer->height;
+ SetFormat(input_buffer->format, &mdp_rot_config.input.format);
+ mdp_rot_config.output.width = rot_buf_info->output_buffer.width;
+ mdp_rot_config.output.height = rot_buf_info->output_buffer.height;
+ SetFormat(rot_buf_info->output_buffer.format, &mdp_rot_config.output.format);
+ mdp_rot_config.frame_rate = rotate_info->frame_rate;
- for (uint32_t i = 0; i < hw_layer_info.count; i++) {
- Layer& layer = hw_layer_info.stack->layers[hw_layer_info.index[i]];
- LayerBuffer *input_buffer = layer.input_buffer;
- bool rot90 = (layer.transform.rotation == 90.0f);
-
- for (uint32_t count = 0; count < 2; count++) {
- HWRotateInfo *rotate_info = &hw_layers->config[i].rotates[count];
-
- if (rotate_info->valid) {
- HWBufferInfo *rot_buf_info = &rotate_info->hw_buffer_info;
-
- if (rot_buf_info->session_id < 0) {
- STRUCT_VAR(mdp_rotation_config, mdp_rot_config);
- mdp_rot_config.version = MDP_ROTATION_REQUEST_VERSION_1_0;
- mdp_rot_config.input.width = input_buffer->width;
- mdp_rot_config.input.height = input_buffer->height;
- SetFormat(input_buffer->format, &mdp_rot_config.input.format);
- mdp_rot_config.output.width = rot_buf_info->output_buffer.width;
- mdp_rot_config.output.height = rot_buf_info->output_buffer.height;
- SetFormat(rot_buf_info->output_buffer.format, &mdp_rot_config.output.format);
- mdp_rot_config.frame_rate = layer.frame_rate;
-
- if (ioctl_(hw_context->device_fd, MDSS_ROTATION_OPEN, &mdp_rot_config) < 0) {
- IOCTL_LOGE(MDSS_ROTATION_OPEN, hw_context->type);
- return kErrorHardware;
- }
-
- rot_buf_info->session_id = mdp_rot_config.session_id;
-
- DLOGV_IF(kTagDriverConfig, "session_id %d", rot_buf_info->session_id);
- }
- }
- }
+ if (ioctl_(hw_context->device_fd, MDSS_ROTATION_OPEN, &mdp_rot_config) < 0) {
+ IOCTL_LOGE(MDSS_ROTATION_OPEN, hw_context->type);
+ return kErrorHardware;
}
+ rot_buf_info->session_id = mdp_rot_config.session_id;
+
+ DLOGV_IF(kTagDriverConfig, "session_id %d", rot_buf_info->session_id);
+
return kErrorNone;
}
@@ -911,7 +895,7 @@
return kErrorNone;
}
-DisplayError HWFrameBuffer::RotatorValidate(HWContext *hw_context, HWLayers *hw_layers) {
+void HWFrameBuffer::SetRotatorCtrlParams(HWContext *hw_context, HWLayers *hw_layers) {
HWRotator *hw_rotator = &hw_context->hw_rotator;
DLOGV_IF(kTagDriverConfig, "************************* %s Validate Input ************************",
GetDeviceString(hw_context->type));
@@ -978,17 +962,9 @@
}
}
}
-
- mdp_rot_request->flags = MDSS_ROTATION_REQUEST_VALIDATE;
- if (ioctl_(hw_context->device_fd, MDSS_ROTATION_REQUEST, mdp_rot_request) < 0) {
- IOCTL_LOGE(MDSS_ROTATION_REQUEST, hw_context->type);
- return kErrorHardware;
- }
-
- return kErrorNone;
}
-DisplayError HWFrameBuffer::RotatorCommit(HWContext *hw_context, HWLayers *hw_layers) {
+void HWFrameBuffer::SetRotatorBufferParams(HWContext *hw_context, HWLayers *hw_layers) {
HWRotator *hw_rotator = &hw_context->hw_rotator;
mdp_rotation_request *mdp_rot_request = &hw_rotator->mdp_rot_req;
HWLayersInfo &hw_layer_info = hw_layers->info;
@@ -1041,14 +1017,36 @@
}
}
}
+}
- mdp_rot_request->flags &= ~MDSS_ROTATION_REQUEST_VALIDATE;
- if (ioctl_(hw_context->device_fd, MDSS_ROTATION_REQUEST, mdp_rot_request) < 0) {
+DisplayError HWFrameBuffer::RotatorValidate(HWContext *hw_context, HWLayers *hw_layers) {
+ HWRotator *hw_rotator = &hw_context->hw_rotator;
+ SetRotatorCtrlParams(hw_context, hw_layers);
+
+ hw_rotator->mdp_rot_req.flags = MDSS_ROTATION_REQUEST_VALIDATE;
+ if (ioctl_(hw_context->device_fd, MDSS_ROTATION_REQUEST, &hw_rotator->mdp_rot_req) < 0) {
IOCTL_LOGE(MDSS_ROTATION_REQUEST, hw_context->type);
return kErrorHardware;
}
- rot_count = 0;
+ return kErrorNone;
+}
+
+DisplayError HWFrameBuffer::RotatorCommit(HWContext *hw_context, HWLayers *hw_layers) {
+ HWRotator *hw_rotator = &hw_context->hw_rotator;
+ HWLayersInfo &hw_layer_info = hw_layers->info;
+ uint32_t rot_count = 0;
+
+ SetRotatorCtrlParams(hw_context, hw_layers);
+
+ SetRotatorBufferParams(hw_context, hw_layers);
+
+ hw_rotator->mdp_rot_req.flags &= ~MDSS_ROTATION_REQUEST_VALIDATE;
+ if (ioctl_(hw_context->device_fd, MDSS_ROTATION_REQUEST, &hw_rotator->mdp_rot_req) < 0) {
+ IOCTL_LOGE(MDSS_ROTATION_REQUEST, hw_context->type);
+ return kErrorHardware;
+ }
+
for (uint32_t i = 0; i < hw_layer_info.count; i++) {
Layer& layer = hw_layer_info.stack->layers[hw_layer_info.index[i]];
@@ -1059,7 +1057,7 @@
if (rotate_info->valid) {
HWBufferInfo *rot_buf_info = &rotate_info->hw_buffer_info;
- mdp_rotation_item *mdp_rot_item = &mdp_rot_request->list[rot_count];
+ mdp_rotation_item *mdp_rot_item = &hw_rotator->mdp_rot_req.list[rot_count];
SyncMerge(layer.input_buffer->release_fence_fd, dup(mdp_rot_item->output.fence),
&layer.input_buffer->release_fence_fd);
diff --git a/displayengine/libs/core/hw_framebuffer.h b/displayengine/libs/core/hw_framebuffer.h
index 5c01e5f..f57f597 100644
--- a/displayengine/libs/core/hw_framebuffer.h
+++ b/displayengine/libs/core/hw_framebuffer.h
@@ -56,7 +56,7 @@
virtual DisplayError Doze(Handle device);
virtual DisplayError SetVSyncState(Handle device, bool enable);
virtual DisplayError Standby(Handle device);
- virtual DisplayError OpenRotatorSession(Handle device, HWLayers *hw_layers);
+ virtual DisplayError OpenRotatorSession(Handle device, HWRotateInfo *rotate_info);
virtual DisplayError CloseRotatorSession(Handle device, int32_t session_id);
virtual DisplayError Validate(Handle device, HWLayers *hw_layers);
virtual DisplayError Commit(Handle device, HWLayers *hw_layers);
@@ -192,6 +192,9 @@
DisplayError DisplayValidate(HWContext *device_ctx, HWLayers *hw_layers);
DisplayError DisplayCommit(HWContext *device_ctx, HWLayers *hw_layers);
+ void SetRotatorCtrlParams(HWContext *device_ctx, HWLayers *hw_layers);
+ void SetRotatorBufferParams(HWContext *device_ctx, HWLayers *hw_layers);
+
DisplayError RotatorValidate(HWContext *device_ctx, HWLayers *hw_layers);
DisplayError RotatorCommit(HWContext *device_ctx, HWLayers *hw_layers);
diff --git a/displayengine/libs/core/hw_interface.h b/displayengine/libs/core/hw_interface.h
index 084768e..9e003bb 100644
--- a/displayengine/libs/core/hw_interface.h
+++ b/displayengine/libs/core/hw_interface.h
@@ -107,6 +107,7 @@
};
struct HWRotateInfo {
+ LayerBuffer *input_buffer;
uint32_t pipe_id;
LayerRect src_roi;
LayerRect dst_roi;
@@ -116,9 +117,11 @@
float downscale_ratio_y;
HWBufferInfo hw_buffer_info;
bool valid;
+ uint32_t frame_rate;
- HWRotateInfo() : pipe_id(0), dst_format(kFormatInvalid), writeback_id(kHWWriteback0),
- downscale_ratio_x(1.0f), downscale_ratio_y(1.0f), valid(false) { }
+ HWRotateInfo() : input_buffer(NULL), pipe_id(0), dst_format(kFormatInvalid),
+ writeback_id(kHWWriteback0), downscale_ratio_x(1.0f), downscale_ratio_y(1.0f),
+ valid(false), frame_rate(0) { }
void Reset() { *this = HWRotateInfo(); }
};
@@ -195,7 +198,7 @@
virtual DisplayError Doze(Handle device) = 0;
virtual DisplayError SetVSyncState(Handle device, bool enable) = 0;
virtual DisplayError Standby(Handle device) = 0;
- virtual DisplayError OpenRotatorSession(Handle device, HWLayers *hw_layers) = 0;
+ virtual DisplayError OpenRotatorSession(Handle device, HWRotateInfo *rotate_info) = 0;
virtual DisplayError CloseRotatorSession(Handle device, int32_t session_id) = 0;
virtual DisplayError Validate(Handle device, HWLayers *hw_layers) = 0;
virtual DisplayError Commit(Handle device, HWLayers *hw_layers) = 0;
diff --git a/displayengine/libs/core/offline_ctrl.cpp b/displayengine/libs/core/offline_ctrl.cpp
index 5ffaf22..8794074 100644
--- a/displayengine/libs/core/offline_ctrl.cpp
+++ b/displayengine/libs/core/offline_ctrl.cpp
@@ -85,34 +85,30 @@
DisplayOfflineContext *disp_offline_ctx = reinterpret_cast<DisplayOfflineContext *>(display_ctx);
+ disp_offline_ctx->pending_rot_commit = false;
+
if (!hw_rotator_device_ && IsRotationRequired(hw_layers)) {
DLOGV_IF(kTagOfflineCtrl, "No Rotator device found");
return kErrorHardware;
}
- disp_offline_ctx->pending_rot_commit = false;
-
- uint32_t i = 0;
- while (hw_layers->closed_session_ids[i] >= 0) {
- error = hw_intf_->CloseRotatorSession(hw_rotator_device_, hw_layers->closed_session_ids[i]);
- if (LIKELY(error != kErrorNone)) {
- DLOGE("Rotator close session failed");
- return error;
- }
- hw_layers->closed_session_ids[i++] = -1;
+ error = CloseRotatorSession(hw_layers);
+ if (LIKELY(error != kErrorNone)) {
+ DLOGE("Close rotator session failed for display %d", disp_offline_ctx->display_type);
+ return error;
}
if (IsRotationRequired(hw_layers)) {
- error = hw_intf_->OpenRotatorSession(hw_rotator_device_, hw_layers);
+ error = OpenRotatorSession(hw_layers);
if (LIKELY(error != kErrorNone)) {
- DLOGE("Rotator open session failed");
+ DLOGE("Open rotator session failed for display %d", disp_offline_ctx->display_type);
return error;
}
error = hw_intf_->Validate(hw_rotator_device_, hw_layers);
if (LIKELY(error != kErrorNone)) {
- DLOGE("Rotator validation failed");
+ DLOGE("Rotator validation failed for display %d", disp_offline_ctx->display_type);
return error;
}
disp_offline_ctx->pending_rot_commit = true;
@@ -129,7 +125,7 @@
if (disp_offline_ctx->pending_rot_commit) {
error = hw_intf_->Commit(hw_rotator_device_, hw_layers);
if (error != kErrorNone) {
- DLOGE("Rotator commit failed");
+ DLOGE("Rotator commit failed for display %d", disp_offline_ctx->display_type);
return error;
}
disp_offline_ctx->pending_rot_commit = false;
@@ -138,6 +134,50 @@
return kErrorNone;
}
+DisplayError OfflineCtrl::OpenRotatorSession(HWLayers *hw_layers) {
+ HWLayersInfo &hw_layer_info = hw_layers->info;
+ DisplayError error = kErrorNone;
+
+ for (uint32_t i = 0; i < hw_layer_info.count; i++) {
+ Layer& layer = hw_layer_info.stack->layers[hw_layer_info.index[i]];
+ bool rot90 = (layer.transform.rotation == 90.0f);
+
+ for (uint32_t count = 0; count < 2; count++) {
+ HWRotateInfo *rotate_info = &hw_layers->config[i].rotates[count];
+ HWBufferInfo *rot_buf_info = &rotate_info->hw_buffer_info;
+
+ if (!rotate_info->valid || rot_buf_info->session_id >= 0) {
+ continue;
+ }
+
+ rotate_info->input_buffer = layer.input_buffer;
+ rotate_info->frame_rate = layer.frame_rate;
+
+ error = hw_intf_->OpenRotatorSession(hw_rotator_device_, rotate_info);
+ if (LIKELY(error != kErrorNone)) {
+ return error;
+ }
+ }
+ }
+
+ return kErrorNone;
+}
+
+DisplayError OfflineCtrl::CloseRotatorSession(HWLayers *hw_layers) {
+ DisplayError error = kErrorNone;
+ uint32_t i = 0;
+
+ while (hw_layers->closed_session_ids[i] >= 0) {
+ error = hw_intf_->CloseRotatorSession(hw_rotator_device_, hw_layers->closed_session_ids[i]);
+ if (LIKELY(error != kErrorNone)) {
+ return error;
+ }
+ hw_layers->closed_session_ids[i++] = -1;
+ }
+
+ return kErrorNone;
+}
+
bool OfflineCtrl::IsRotationRequired(HWLayers *hw_layers) {
HWLayersInfo &layer_info = hw_layers->info;
diff --git a/displayengine/libs/core/offline_ctrl.h b/displayengine/libs/core/offline_ctrl.h
index fafdf7c..fa8b264 100644
--- a/displayengine/libs/core/offline_ctrl.h
+++ b/displayengine/libs/core/offline_ctrl.h
@@ -50,6 +50,8 @@
DisplayOfflineContext() : display_type(kPrimary), pending_rot_commit(false) { }
};
+ DisplayError OpenRotatorSession(HWLayers *hw_layers);
+ DisplayError CloseRotatorSession(HWLayers *hw_layers);
bool IsRotationRequired(HWLayers *hw_layers);
HWInterface *hw_intf_;
diff --git a/displayengine/libs/core/res_manager.cpp b/displayengine/libs/core/res_manager.cpp
index fb8f2eb..c9f748b 100644
--- a/displayengine/libs/core/res_manager.cpp
+++ b/displayengine/libs/core/res_manager.cpp
@@ -626,15 +626,17 @@
for (uint32_t i = 0; i < layer_info.count; i++) {
Layer& layer = layer_info.stack->layers[layer_info.index[i]];
HWRotateInfo *rotate = &hw_layers->config[i].rotates[0];
+ bool rot90 = (layer.transform.rotation == 90.0f);
if (rotate->valid) {
LayerBufferFormat rot_ouput_format;
- SetRotatorOutputFormat(layer.input_buffer->format, false, true, &rot_ouput_format);
+ SetRotatorOutputFormat(layer.input_buffer->format, false, rot90, &rot_ouput_format);
HWBufferInfo *hw_buffer_info = &rotate->hw_buffer_info;
hw_buffer_info->buffer_config.width = UINT32(rotate->dst_roi.right - rotate->dst_roi.left);
hw_buffer_info->buffer_config.height = UINT32(rotate->dst_roi.bottom - rotate->dst_roi.top);
hw_buffer_info->buffer_config.format = rot_ouput_format;
+ // Allocate two rotator output buffers by default for double buffering.
hw_buffer_info->buffer_config.buffer_count = 2;
hw_buffer_info->buffer_config.secure = layer.input_buffer->flags.secure;
@@ -647,12 +649,13 @@
rotate = &hw_layers->config[i].rotates[1];
if (rotate->valid) {
LayerBufferFormat rot_ouput_format;
- SetRotatorOutputFormat(layer.input_buffer->format, false, true, &rot_ouput_format);
+ SetRotatorOutputFormat(layer.input_buffer->format, false, rot90, &rot_ouput_format);
HWBufferInfo *hw_buffer_info = &rotate->hw_buffer_info;
hw_buffer_info->buffer_config.width = UINT32(rotate->dst_roi.right - rotate->dst_roi.left);
hw_buffer_info->buffer_config.height = UINT32(rotate->dst_roi.bottom - rotate->dst_roi.top);
hw_buffer_info->buffer_config.format = rot_ouput_format;
+ // Allocate two rotator output buffers by default for double buffering.
hw_buffer_info->buffer_config.buffer_count = 2;
hw_buffer_info->buffer_config.secure = layer.input_buffer->flags.secure;
diff --git a/libhwcomposer/hwc_copybit.cpp b/libhwcomposer/hwc_copybit.cpp
index 65482d7..68f168a 100644
--- a/libhwcomposer/hwc_copybit.cpp
+++ b/libhwcomposer/hwc_copybit.cpp
@@ -131,8 +131,10 @@
return renderArea;
}
-bool CopyBit::isLayerChanging(hwc_display_contents_1_t *list, int k) {
+bool CopyBit::isLayerChanging(hwc_context_t *ctx,
+ hwc_display_contents_1_t *list, int k) {
if((mLayerCache.hnd[k] != list->hwLayers[k].handle) ||
+ (mLayerCache.drop[k] != ctx->copybitDrop[k]) ||
(mLayerCache.displayFrame[k].left !=
list->hwLayers[k].displayFrame.left) ||
(mLayerCache.displayFrame[k].top !=
@@ -161,7 +163,7 @@
int updatingLayerCount = 0;
for (int k = ctx->listStats[dpy].numAppLayers-1; k >= 0 ; k--){
//swap rect will kick in only for single updating layer
- if(isLayerChanging(list, k)) {
+ if(isLayerChanging(ctx, list, k)) {
updatingLayerCount ++;
if(updatingLayerCount == 1)
changingLayerIndex = k;
@@ -1233,6 +1235,7 @@
for (int i=0; i<ctx->listStats[dpy].numAppLayers; i++){
hnd[i] = list->hwLayers[i].handle;
displayFrame[i] = list->hwLayers[i].displayFrame;
+ drop[i] = ctx->copybitDrop[i];
}
}
diff --git a/libhwcomposer/hwc_copybit.h b/libhwcomposer/hwc_copybit.h
index 6ead4a7..4442afc 100644
--- a/libhwcomposer/hwc_copybit.h
+++ b/libhwcomposer/hwc_copybit.h
@@ -61,6 +61,7 @@
int layerCount;
buffer_handle_t hnd[MAX_NUM_APP_LAYERS];
hwc_rect_t displayFrame[MAX_NUM_APP_LAYERS];
+ bool drop[MAX_NUM_APP_LAYERS];
/* c'tor */
LayerCache();
/* clear caching info*/
@@ -135,7 +136,8 @@
int dpy);
int checkDirtyRect(hwc_context_t *ctx, hwc_display_contents_1_t *list,
int dpy);
- bool isLayerChanging(hwc_display_contents_1_t *list, int k);
+ bool isLayerChanging(hwc_context_t *ctx,
+ hwc_display_contents_1_t *list, int k);
};
}; //namespace qhwc