}
}
+bool GpuDevice::EnableDRMCommit(bool enable, uint32_t display_id) {
+ // TODO clean all display for commit status
+ size_t size = total_displays_.size();
+ bool ret = false;
+ if (size > display_id)
+ ret = total_displays_.at(display_id)->EnableDRMCommit(enable);
+ return ret;
+}
+
const std::vector<NativeDisplay *> &GpuDevice::GetAllDisplays() {
return total_displays_;
}
power_mode_lock_.unlock();
idle_tracker_.idle_lock_.unlock();
}
+
void DisplayQueue::ForceRefresh() {
+ if (idle_tracker_.state_ & FrameStateTracker::kForceIgnoreUpdates)
+ return;
idle_tracker_.idle_lock_.lock();
idle_tracker_.state_ &= ~FrameStateTracker::kIgnoreUpdates;
idle_tracker_.state_ |= FrameStateTracker::kRevalidateLayers;
power_mode_lock_.unlock();
}
+void DisplayQueue::ForceIgnoreUpdates(bool force) {
+ if (force) {
+ idle_tracker_.state_ |= FrameStateTracker::kForceIgnoreUpdates;
+ IgnoreUpdates();
+ } else {
+ idle_tracker_.state_ &= ~FrameStateTracker::kForceIgnoreUpdates;
+ ForceRefresh();
+ }
+}
+
void DisplayQueue::DisplayConfigurationChanged() {
// Mark it as needs modeset, so that in next queue update we do a modeset
state_ |= kConfigurationChanged;
void ForceRefresh();
+ void ForceIgnoreUpdates(bool force);
+
void UpdateScalingRatio(uint32_t primary_width, uint32_t primary_height,
uint32_t display_width, uint32_t display_height);
// if we are continously updating
// frames, revalidate layers to use planes.
kTrackingFrames =
- 1 << 4, // Tracking frames to see when layers need to be
- // revalidated after
- // disabling overlays for idle case scenario.
- kIgnoreUpdates = 1 << 5 // Ignore present display calls.
+ 1 << 4, // Tracking frames to see when layers need to be
+ // revalidated after
+ // disabling overlays for idle case scenario.
+ kIgnoreUpdates = 1 << 5, // Ignore present display calls.
+ kForceIgnoreUpdates = 1 << 6 // Ignore all commits/updates.
};
uint32_t idle_frames_ = 0;
void ResetTrackerState() {
if (tracker_.state_ & FrameStateTracker::kIgnoreUpdates) {
- tracker_.state_ = FrameStateTracker::kIgnoreUpdates;
+ if (tracker_.state_ & FrameStateTracker::kForceIgnoreUpdates) {
+ tracker_.state_ = FrameStateTracker::kIgnoreUpdates;
+ tracker_.state_ |= FrameStateTracker::kForceIgnoreUpdates;
+ } else
+ tracker_.state_ = FrameStateTracker::kIgnoreUpdates;
} else {
tracker_.state_ = 0;
}
return mHwc.GetDisplayIDFromConnectorID(connector_id);
}
+bool HwcService::Controls::EnableDRMCommit(bool enable, uint32_t display_id) {
+ return mHwc.EnableDRMCommit(enable, display_id);
+}
+
status_t HwcService::Controls::VideoEnableEncryptedSession(
uint32_t sessionID, uint32_t instanceID) {
mHwc.SetPAVPSessionStatus(true, sessionID, instanceID);
status_t SetHDCPSRMForDisplay(uint32_t connector, const int8_t* SRM,
uint32_t SRMLength);
uint32_t GetDisplayIDFromConnectorID(uint32_t connector_id);
+ bool EnableDRMCommit(bool enable, uint32_t display_id);
status_t VideoEnableEncryptedSession(uint32_t sessionID,
uint32_t instanceID);
status_t VideoDisableAllEncryptedSessions(uint32_t sessionID);
return device_.GetDisplayIDFromConnectorID(connector_id);
}
+bool IAHWC2::EnableDRMCommit(bool enable, uint32_t display_id) {
+ return device_.EnableDRMCommit(enable, display_id);
+}
+
void IAHWC2::SetHDCPSRMForDisplay(uint32_t connector, const int8_t *SRM,
uint32_t SRMLength) {
if (SRM == NULL) {
uint32_t SRMLength);
uint32_t GetDisplayIDFromConnectorID(const uint32_t connector_id);
+ bool EnableDRMCommit(bool enable, uint32_t display_id);
+
public:
class Hwc2Layer {
public:
return pContext->mControls->GetDisplayIDFromConnectorID(connector_id);
}
+status_t HwcService_EnableDRMCommit(HWCSHANDLE hwcs, uint32_t enable,
+ uint32_t display_id) {
+ HwcsContext* pContext = static_cast<HwcsContext*>(hwcs);
+ if (!pContext) {
+ return android::BAD_VALUE;
+ }
+
+ return pContext->mControls->EnableDRMCommit(enable, display_id);
+}
+
status_t HwcService_Video_DisableHDCPSession_AllDisplays(HWCSHANDLE hwcs) {
HwcsContext* pContext = static_cast<HwcsContext*>(hwcs);
if (!pContext) {
#define OS_ANDROID_HWC_HWCSERVICEAPI_H_
#include <stdint.h>
-#include <vector>
#ifdef __cplusplus
+#include <vector>
extern "C" {
#endif
uint32_t ydpi;
} HwcsDisplayModeInfo;
+#ifdef __cplusplus
/// query all available modes
// If non-NULL: fills pModeList with up to modeCount modes.
// Returns the number of modes available.
status_t HwcService_DisplayMode_GetAvailableModes(
HWCSHANDLE hwcs, uint32_t display,
std::vector<HwcsDisplayModeInfo> &pModeList);
+#endif
/// get current mode
status_t HwcService_DisplayMode_GetMode(HWCSHANDLE hwcs, uint32_t display,
uint32_t HwcService_GetDisplayIDFromConnectorID(HWCSHANDLE hwcs,
uint32_t connector_id);
+status_t HwcService_EnableDRMCommit(HWCSHANDLE hwcs, uint32_t enable,
+ uint32_t display_id);
+
// The control enables a the protected video subsystem to control when to
// replace any
// encrypted content with a default bitmap (usually black).
TRANSACT_VIDEO_SET_HDCP_SRM_FOR_ALL_DISPLAYS,
TRANSACT_VIDEO_SET_HDCP_SRM_FOR_DISPLAY,
TRANSACT_GET_DISPLAYID_FROM_CONNECTORID,
+ TRANSACT_ENABLE_DRM_COMMIT,
TRANSACT_VIDEO_ENABLE_ENCRYPTED_SESSION,
TRANSACT_VIDEO_DISABLE_ENCRYPTED_SESSION,
TRANSACT_VIDEO_DISABLE_ALL_ENCRYPTED_SESSIONS,
return (uint32_t)(reply.readInt32());
}
+ bool EnableDRMCommit(bool enable, uint32_t display_id) override {
+ Parcel data;
+ Parcel reply;
+ data.writeInterfaceToken(IControls::getInterfaceDescriptor());
+ data.writeInt32(enable);
+ data.writeInt32(display_id);
+
+ status_t ret = remote()->transact(TRANSACT_ENABLE_DRM_COMMIT, data, &reply);
+ if (ret != NO_ERROR) {
+ ALOGW("%s() transact failed: %d", __FUNCTION__, ret);
+ }
+ return (uint32_t)(reply.readInt32());
+ }
+
status_t VideoEnableEncryptedSession(uint32_t sessionID,
uint32_t instanceID) override {
Parcel data;
reply->writeInt32(display_id);
return NO_ERROR;
}
+ case BpControls::TRANSACT_ENABLE_DRM_COMMIT: {
+ CHECK_INTERFACE(IControls, data, reply);
+ bool enable = data.readInt32();
+ uint32_t display_id = data.readInt32();
+ bool ret = this->EnableDRMCommit(enable, display_id);
+ reply->writeInt32(ret);
+ return NO_ERROR;
+ }
case BpControls::TRANSACT_VIDEO_ENABLE_ENCRYPTED_SESSION: {
CHECK_INTERFACE(IControls, data, reply);
uint32_t sessionID = data.readInt32();
uint32_t SRMLength) = 0;
virtual uint32_t GetDisplayIDFromConnectorID(uint32_t connector_id) = 0;
+
+ virtual bool EnableDRMCommit(bool enable, uint32_t display_id) = 0;
+
virtual status_t VideoEnableEncryptedSession(uint32_t sessionID,
uint32_t instanceID) = 0;
virtual status_t VideoDisableAllEncryptedSessions(uint32_t sessionID) = 0;
bool IsReservedDrmPlane();
+ bool EnableDRMCommit(bool enable, uint32_t display_id);
+
std::vector<uint32_t> GetDisplayReservedPlanes(uint32_t display_id);
private:
return false;
}
+ virtual bool EnableDRMCommit(bool enable) {
+ return false;
+ }
+
protected:
friend class PhysicalDisplay;
friend class GpuDevice;
return pipe_;
}
+bool PhysicalDisplay::EnableDRMCommit(bool enable) {
+ display_queue_->ForceIgnoreUpdates(!enable);
+ if (enable)
+ return !display_queue_->IsIgnoreUpdates();
+ else
+ return display_queue_->IsIgnoreUpdates();
+}
+
bool PhysicalDisplay::SetActiveConfig(uint32_t config) {
// update the activeConfig
IHOTPLUGEVENTTRACE(
bool GetDisplayConfigs(uint32_t *num_configs, uint32_t *configs) override;
bool GetDisplayName(uint32_t *size, char *name) override;
+ bool EnableDRMCommit(bool enable) override;
+
/**
* API for composition to non-zero X coordinate.
* This is applicable when float mode is enabled.