From ee1fc7e0b0ea72b15afabf3da89e73de97a3a1b3 Mon Sep 17 00:00:00 2001 From: Sushil Chauhan Date: Thu, 9 Jul 2015 17:43:21 -0700 Subject: [PATCH] sdm: Do not allow decimation on UBWC framebuffer MDP hardware cannot apply decimation on UBWC tiled framebuffer. CRs-Fixed: 867832 Change-Id: I6f2f37955ac9e2b4a6d7888c146930dd3863f385 --- sdm/include/private/resource_interface.h | 2 +- sdm/include/utils/debug.h | 1 + sdm/libs/core/comp_manager.cpp | 2 +- sdm/libs/core/resource_default.cpp | 34 +++++++++++++++++------- sdm/libs/core/resource_default.h | 7 ++--- sdm/libs/utils/debug.cpp | 13 +++++++++ 6 files changed, 45 insertions(+), 14 deletions(-) diff --git a/sdm/include/private/resource_interface.h b/sdm/include/private/resource_interface.h index b084f679..bc1a37d3 100644 --- a/sdm/include/private/resource_interface.h +++ b/sdm/include/private/resource_interface.h @@ -45,7 +45,7 @@ class ResourceInterface { virtual void Purge(Handle display_ctx) = 0; virtual DisplayError SetMaxMixerStages(Handle display_ctx, uint32_t max_mixer_stages) = 0; virtual DisplayError ValidateScaling(const LayerRect &crop, const LayerRect &dst, - bool rotate90) = 0; + bool rotate90, bool ubwc_tiled) = 0; virtual DisplayError ValidateCursorConfig(Handle display_ctx, const Layer &layer, bool is_top) = 0; virtual DisplayError ValidateCursorPosition(Handle display_ctx, HWLayers *hw_layers, diff --git a/sdm/include/utils/debug.h b/sdm/include/utils/debug.h index 943747b8..95efef66 100644 --- a/sdm/include/utils/debug.h +++ b/sdm/include/utils/debug.h @@ -70,6 +70,7 @@ class Debug { static bool IsRotatorUbwcDisabled(); static bool IsRotatorSplitDisabled(); static bool IsScalarDisabled(); + static bool IsUbwcTiledFrameBuffer(); private: Debug(); diff --git a/sdm/libs/core/comp_manager.cpp b/sdm/libs/core/comp_manager.cpp index 6e9a14dc..784597d7 100644 --- a/sdm/libs/core/comp_manager.cpp +++ b/sdm/libs/core/comp_manager.cpp @@ -386,7 +386,7 @@ void CompManager::AppendDump(char *buffer, uint32_t length) { DisplayError CompManager::ValidateScaling(const LayerRect &crop, const LayerRect &dst, bool rotate90) { - return resource_intf_->ValidateScaling(crop, dst, rotate90); + return resource_intf_->ValidateScaling(crop, dst, rotate90, Debug::IsUbwcTiledFrameBuffer()); } DisplayError CompManager::ValidateCursorPosition(Handle display_ctx, HWLayers *hw_layers, diff --git a/sdm/libs/core/resource_default.cpp b/sdm/libs/core/resource_default.cpp index f664c06c..ab66ac83 100644 --- a/sdm/libs/core/resource_default.cpp +++ b/sdm/libs/core/resource_default.cpp @@ -554,7 +554,8 @@ DisplayError ResourceDefault::Config(DisplayResourceContext *display_resource_ct return error; } - error = ValidateScaling(src_rect, dst_rect, false); + bool ubwc_tiled = IsUBWCFormat(layer.input_buffer->format); + error = ValidateScaling(src_rect, dst_rect, false, ubwc_tiled); if (error != kErrorNone) { return error; } @@ -702,7 +703,7 @@ DisplayError ResourceDefault::ValidateDimensions(const LayerRect &crop, const La return kErrorNone; } -DisplayError ResourceDefault::ValidatePipeParams(HWPipeInfo *pipe_info) { +DisplayError ResourceDefault::ValidatePipeParams(HWPipeInfo *pipe_info, bool ubwc_tiled) { DisplayError error = kErrorNone; const LayerRect &src_rect = pipe_info->src_roi; @@ -713,7 +714,7 @@ DisplayError ResourceDefault::ValidatePipeParams(HWPipeInfo *pipe_info) { return error; } - error = ValidateScaling(src_rect, dst_rect, false); + error = ValidateScaling(src_rect, dst_rect, false, ubwc_tiled); if (error != kErrorNone) { return error; } @@ -722,7 +723,7 @@ DisplayError ResourceDefault::ValidatePipeParams(HWPipeInfo *pipe_info) { } DisplayError ResourceDefault::ValidateScaling(const LayerRect &crop, const LayerRect &dst, - bool rotate90) { + bool rotate90, bool ubwc_tiled) { DisplayError error = kErrorNone; float scale_x = 1.0f; @@ -733,7 +734,7 @@ DisplayError ResourceDefault::ValidateScaling(const LayerRect &crop, const Layer return error; } - error = ValidateDownScaling(scale_x, scale_y); + error = ValidateDownScaling(scale_x, scale_y, ubwc_tiled); if (error != kErrorNone) { return error; } @@ -746,11 +747,12 @@ DisplayError ResourceDefault::ValidateScaling(const LayerRect &crop, const Layer return kErrorNone; } -DisplayError ResourceDefault::ValidateDownScaling(float scale_x, float scale_y) { +DisplayError ResourceDefault::ValidateDownScaling(float scale_x, float scale_y, bool ubwc_tiled) { if ((UINT32(scale_x) > 1) || (UINT32(scale_y) > 1)) { float max_scale_down = FLOAT(hw_res_info_.max_scale_down); - if (hw_res_info_.has_decimation) { + // MDP H/W cannot apply decimation on UBWC tiled framebuffer + if (!ubwc_tiled && hw_res_info_.has_decimation) { max_scale_down *= FLOAT(kMaxDecimationDownScaleRatio); } @@ -867,7 +869,8 @@ DisplayError ResourceDefault::AlignPipeConfig(const Layer &layer, HWPipeInfo *le return kErrorNotSupported; } - error = ValidatePipeParams(left_pipe); + bool ubwc_tiled = IsUBWCFormat(layer.input_buffer->format); + error = ValidatePipeParams(left_pipe, ubwc_tiled); if (error != kErrorNone) { goto PipeConfigExit; } @@ -876,7 +879,7 @@ DisplayError ResourceDefault::AlignPipeConfig(const Layer &layer, HWPipeInfo *le // Make sure the left and right ROI are conjunct right_pipe->src_roi.left = left_pipe->src_roi.right; right_pipe->dst_roi.left = left_pipe->dst_roi.right; - error = ValidatePipeParams(right_pipe); + error = ValidatePipeParams(right_pipe, ubwc_tiled); } PipeConfigExit: @@ -915,4 +918,17 @@ DisplayError ResourceDefault::ValidateCursorPosition(Handle display_ctx, HWLayer return kErrorNotSupported; } +bool ResourceDefault::IsUBWCFormat(LayerBufferFormat format) { + switch (format) { + case kFormatRGBA8888Ubwc: + case kFormatRGBX8888Ubwc: + case kFormatRGB565Ubwc: + case kFormatYCbCr420SPVenusUbwc: + return true; + default: + break; + } + return false; +} + } // namespace sdm diff --git a/sdm/libs/core/resource_default.h b/sdm/libs/core/resource_default.h index a19022db..990e1024 100644 --- a/sdm/libs/core/resource_default.h +++ b/sdm/libs/core/resource_default.h @@ -51,7 +51,7 @@ class ResourceDefault : public ResourceInterface { virtual void Purge(Handle display_ctx); virtual DisplayError SetMaxMixerStages(Handle display_ctx, uint32_t max_mixer_stages); virtual DisplayError ValidateScaling(const LayerRect &crop, const LayerRect &dst, - bool rotate90); + bool rotate90, bool ubwc_tiled); DisplayError ValidateCursorConfig(Handle display_ctx, const Layer& layer, bool is_top); DisplayError ValidateCursorPosition(Handle display_ctx, HWLayers *hw_layers, int x, int y); @@ -130,8 +130,8 @@ class ResourceDefault : public ResourceInterface { bool CalculateCropRects(const LayerRect &scissor, LayerRect *crop, LayerRect *dst); DisplayError ValidateLayerDimensions(const Layer &layer); DisplayError ValidateDimensions(const LayerRect &crop, const LayerRect &dst); - DisplayError ValidatePipeParams(HWPipeInfo *pipe_info); - DisplayError ValidateDownScaling(float scale_x, float scale_y); + DisplayError ValidatePipeParams(HWPipeInfo *pipe_info, bool ubwc_tiled); + DisplayError ValidateDownScaling(float scale_x, float scale_y, bool ubwc_tiled); DisplayError ValidateUpScaling(float scale_x, float scale_y); DisplayError GetScaleFactor(const LayerRect &crop, const LayerRect &dst, float *scale_x, float *scale_y); @@ -141,6 +141,7 @@ class ResourceDefault : public ResourceInterface { DisplayError AlignPipeConfig(const Layer &layer, HWPipeInfo *left_pipe, HWPipeInfo *right_pipe); void ResourceStateLog(void); DisplayError CalculateDecimation(float downscale, uint8_t *decimation); + bool IsUBWCFormat(LayerBufferFormat format); Locker locker_; HWResourceInfo hw_res_info_; diff --git a/sdm/libs/utils/debug.cpp b/sdm/libs/utils/debug.cpp index 4df63d93..33f94b92 100644 --- a/sdm/libs/utils/debug.cpp +++ b/sdm/libs/utils/debug.cpp @@ -120,5 +120,18 @@ bool Debug::IsScalarDisabled() { return (value == 1); } +bool Debug::IsUbwcTiledFrameBuffer() { + int ubwc_disabled = 0; + int ubwc_framebuffer = 0; + + debug_.debug_handler_->GetProperty("debug.gralloc.gfx_ubwc_disable", &ubwc_disabled); + + if (!ubwc_disabled) { + debug_.debug_handler_->GetProperty("debug.gralloc.enable_fb_ubwc", &ubwc_framebuffer); + } + + return (ubwc_framebuffer == 1); +} + } // namespace sdm