diff options
Diffstat (limited to 'drmhwctwo.cpp')
-rw-r--r-- | drmhwctwo.cpp | 89 |
1 files changed, 77 insertions, 12 deletions
diff --git a/drmhwctwo.cpp b/drmhwctwo.cpp index 605406b..5afc96d 100644 --- a/drmhwctwo.cpp +++ b/drmhwctwo.cpp @@ -910,9 +910,14 @@ HWC2::Error DrmHwcTwo::HwcDisplay::ValidateDisplay(uint32_t *num_types, if (avail_planes < layers_.size()) avail_planes--; - std::map<uint32_t, DrmHwcTwo::HwcLayer *> z_map; + std::map<uint32_t, DrmHwcTwo::HwcLayer *> z_map, z_map_tmp; + uint32_t z_index = 0; + // First create a map of layers and z_order values for (std::pair<const hwc2_layer_t, DrmHwcTwo::HwcLayer> &l : layers_) - z_map.emplace(std::make_pair(l.second.z_order(), &l.second)); + z_map_tmp.emplace(std::make_pair(l.second.z_order(), &l.second)); + // normalise the map so that the lowest z_order layer has key 0 + for (std::pair<const uint32_t, DrmHwcTwo::HwcLayer *> &l : z_map_tmp) + z_map.emplace(std::make_pair(z_index++, l.second)); uint32_t total_pixops = CalcPixOps(z_map, 0, z_map.size()), gpu_pixops = 0; @@ -963,7 +968,9 @@ HWC2::Error DrmHwcTwo::HwcDisplay::ValidateDisplay(uint32_t *num_types, MarkValidated(z_map, client_start, client_size); - if (CreateComposition(true) != HWC2::Error::None) { + bool testing_needed = !(client_start == 0 && client_size == z_map.size()); + + if (testing_needed && CreateComposition(true) != HWC2::Error::None) { ++total_stats_.failed_kms_validate_; gpu_pixops = total_pixops; client_size = z_map.size(); @@ -997,10 +1004,13 @@ HWC2::Error DrmHwcTwo::HwcDisplay::GetDisplayIdentificationData( blob = drmModeGetPropertyBlob(drm_->fd(), blob_id); - outData = static_cast<uint8_t *>(blob->data); - + if (outData) { + *outDataSize = std::min(*outDataSize, blob->length); + memcpy(outData, blob->data, *outDataSize); + } else { + *outDataSize = blob->length; + } *outPort = connector_->id(); - *outDataSize = blob->length; return HWC2::Error::None; } @@ -1017,8 +1027,50 @@ HWC2::Error DrmHwcTwo::HwcDisplay::GetDisplayCapabilities( return HWC2::Error::None; } + +HWC2::Error DrmHwcTwo::HwcDisplay::GetDisplayBrightnessSupport( + bool *supported) { + *supported = false; + return HWC2::Error::None; +} + +HWC2::Error DrmHwcTwo::HwcDisplay::SetDisplayBrightness( + float /* brightness */) { + return HWC2::Error::Unsupported; +} + #endif /* PLATFORM_SDK_VERSION > 28 */ +#if PLATFORM_SDK_VERSION > 27 + +HWC2::Error DrmHwcTwo::HwcDisplay::GetRenderIntents( + int32_t mode, uint32_t *outNumIntents, + int32_t * /*android_render_intent_v1_1_t*/ outIntents) { + if (mode != HAL_COLOR_MODE_NATIVE) { + return HWC2::Error::BadParameter; + } + + if (outIntents == nullptr) { + *outNumIntents = 1; + return HWC2::Error::None; + } + *outNumIntents = 1; + outIntents[0] = HAL_RENDER_INTENT_COLORIMETRIC; + return HWC2::Error::None; +} + +HWC2::Error DrmHwcTwo::HwcDisplay::SetColorModeWithIntent(int32_t mode, + int32_t intent) { + if (mode != HAL_COLOR_MODE_NATIVE) + return HWC2::Error::BadParameter; + if (intent != HAL_RENDER_INTENT_COLORIMETRIC) + return HWC2::Error::BadParameter; + color_mode_ = mode; + return HWC2::Error::None; +} + +#endif /* PLATFORM_SDK_VERSION > 27 */ + HWC2::Error DrmHwcTwo::HwcLayer::SetCursorPosition(int32_t x, int32_t y) { supported(__func__); cursor_x_ = x; @@ -1037,12 +1089,6 @@ HWC2::Error DrmHwcTwo::HwcLayer::SetLayerBuffer(buffer_handle_t buffer, supported(__func__); UniqueFd uf(acquire_fence); - // The buffer and acquire_fence are handled elsewhere - if (sf_type_ == HWC2::Composition::Client || - sf_type_ == HWC2::Composition::Sideband || - sf_type_ == HWC2::Composition::SolidColor) - return HWC2::Error::None; - set_buffer(buffer); set_acquire_fence(uf.get()); return HWC2::Error::None; @@ -1341,6 +1387,17 @@ hwc2_function_pointer_t DrmHwcTwo::HookDevGetFunction( return ToHook<HWC2_PFN_VALIDATE_DISPLAY>( DisplayHook<decltype(&HwcDisplay::ValidateDisplay), &HwcDisplay::ValidateDisplay, uint32_t *, uint32_t *>); +#if PLATFORM_SDK_VERSION > 27 + case HWC2::FunctionDescriptor::GetRenderIntents: + return ToHook<HWC2_PFN_GET_RENDER_INTENTS>( + DisplayHook<decltype(&HwcDisplay::GetRenderIntents), + &HwcDisplay::GetRenderIntents, int32_t, uint32_t *, + int32_t *>); + case HWC2::FunctionDescriptor::SetColorModeWithRenderIntent: + return ToHook<HWC2_PFN_SET_COLOR_MODE_WITH_RENDER_INTENT>( + DisplayHook<decltype(&HwcDisplay::SetColorModeWithIntent), + &HwcDisplay::SetColorModeWithIntent, int32_t, int32_t>); +#endif #if PLATFORM_SDK_VERSION > 28 case HWC2::FunctionDescriptor::GetDisplayIdentificationData: return ToHook<HWC2_PFN_GET_DISPLAY_IDENTIFICATION_DATA>( @@ -1352,6 +1409,14 @@ hwc2_function_pointer_t DrmHwcTwo::HookDevGetFunction( DisplayHook<decltype(&HwcDisplay::GetDisplayCapabilities), &HwcDisplay::GetDisplayCapabilities, uint32_t *, uint32_t *>); + case HWC2::FunctionDescriptor::GetDisplayBrightnessSupport: + return ToHook<HWC2_PFN_GET_DISPLAY_BRIGHTNESS_SUPPORT>( + DisplayHook<decltype(&HwcDisplay::GetDisplayBrightnessSupport), + &HwcDisplay::GetDisplayBrightnessSupport, bool *>); + case HWC2::FunctionDescriptor::SetDisplayBrightness: + return ToHook<HWC2_PFN_SET_DISPLAY_BRIGHTNESS>( + DisplayHook<decltype(&HwcDisplay::SetDisplayBrightness), + &HwcDisplay::SetDisplayBrightness, float>); #endif /* PLATFORM_SDK_VERSION > 28 */ // Layer functions case HWC2::FunctionDescriptor::SetCursorPosition: |