panorama_sos_displays.at(0).at(sos_it));
virtualdisp->InitVirtualDisplay(1920, 1080);
i_available_panorama_displays.emplace_back(virtualdisp);
+ virtual_panorama_displays_.emplace_back(virtualdisp);
}
// Add the native displays
// Skip the disconnected display here
i_available_panorama_displays.emplace_back(
temp_displays.at(panorama_displays.at(m).at(l)));
+ physical_panorama_displays_.emplace_back(
+ temp_displays.at(panorama_displays.at(m).at(l)));
// Add tag for panorama-ed displays
available_displays.at(panorama_displays.at(m).at(l)) = false;
}
std::unique_ptr<MosaicDisplay> panorama(
new MosaicDisplay(i_available_panorama_displays));
panorama->SetPanoramaMode(true);
- panorama->SetExtraDispInfo((int)panorama_displays.size(),
- (int)panorama_sos_displays.size());
+ panorama->SetExtraDispInfo(&virtual_panorama_displays_,
+ &physical_panorama_displays_);
+ ptr_mosaicdisplay = (MosaicDisplay *)panorama.get();
panorama_displays_.emplace_back(std::move(panorama));
// Save the panorama to the final displays list
total_displays_.emplace_back(panorama_displays_.back().get());
}
}
+bool GpuDevice::TriggerPanorama(uint32_t hotplug_simulation) {
+ bool ret = false;
+ if (ptr_mosaicdisplay) {
+ ret = ptr_mosaicdisplay->TriggerPanorama(hotplug_simulation);
+ }
+ return ret;
+}
+
+bool GpuDevice::ShutdownPanorama(uint32_t hotplug_simulation) {
+ bool ret = false;
+ if (ptr_mosaicdisplay) {
+ ret = ptr_mosaicdisplay->ShutdownPanorama(hotplug_simulation);
+ }
+ return ret;
+}
+
#endif
void GpuDevice::ParseLogicalDisplaySetting(
#include "hwctrace.h"
+#ifdef ENABLE_PANORAMA
+#include "displaymanager.h"
+#include "virtualpanoramadisplay.h"
+#endif
+
namespace hwcomposer {
class MDVsyncCallback : public hwcomposer::VsyncCallback {
for (uint32_t i = 0; i < size; i++) {
physical_displays_.emplace_back(displays.at(i));
}
+#ifdef ENABLE_PANORAMA
+ event_.Initialize();
+#endif
}
MosaicDisplay::~MosaicDisplay() {
+#ifdef ENABLE_PANORAMA
+ if (panorama_mode_) {
+ while (!virtual_panorama_displays_->empty()) {
+ NativeDisplay *ptr_display = virtual_panorama_displays_->back();
+ delete ptr_display;
+ }
+ while (!physical_panorama_displays_->empty()) {
+ NativeDisplay *ptr_display = physical_panorama_displays_->back();
+ delete ptr_display;
+ }
+ } else {
+ while (!physical_displays_.empty()) {
+ NativeDisplay *ptr_display = physical_displays_.back();
+ physical_displays_.pop_back();
+ delete ptr_display;
+ }
+ }
+#endif
}
bool MosaicDisplay::Initialize(NativeBufferHandler * /*buffer_handler*/) {
int32_t *retire_fence,
PixelUploaderCallback *call_back,
bool /*handle_constraints*/) {
- if (power_mode_ != kOn)
+ if (power_mode_ != kOn) {
+#ifdef ENALBE_PANORAMA
+ if (skip_update_) {
+ event_.Signal();
+ }
+#endif
return true;
+ }
+
+#ifdef ENABLE_PANORAMA
+ if (skip_update_) {
+ return true;
+ }
+ under_present = true;
+#endif
lock_.lock();
+
+#ifdef ENABLE_PANORAMA
+ uint32_t curr_displays_num = connected_displays_.size();
+ uint32_t physical_displays_num = physical_displays_.size();
+
+ if (curr_displays_num != physical_displays_num) {
+ update_connected_displays_ = true;
+ }
+#endif
+
if (update_connected_displays_) {
std::vector<NativeDisplay *>().swap(connected_displays_);
uint32_t size = physical_displays_.size();
lock_.unlock();
uint32_t size = connected_displays_.size();
int32_t left_constraint = 0;
+#ifdef ENABLE_PANORAMA
+ if (panorama_mode_ && !panorama_enabling_state_) {
+ left_constraint += total_width_virtual_ / 2;
+ }
+#endif
size_t total_layers = source_layers.size();
int32_t fence = -1;
*retire_fence = -1;
left_constraint = right_constraint;
}
+#ifdef ENABLE_PANORAMA
+ if (skip_update_) {
+ event_.Signal();
+ }
+ under_present = false;
+#endif
+
return true;
}
vsync_divisor_ = vsync_counter_;
#endif
+#ifdef ENABLE_PANORAMA
+ if (!panorama_mode_) {
+ if (connected_ == connected) {
+ lock_.unlock();
+ return;
+ }
+ }
+#else
if (connected_ == connected) {
lock_.unlock();
return;
}
+#endif
if (hotplug_callback_) {
+#ifdef ENABLE_PANORAMA
+ if (!panorama_mode_) {
+ if (!connected && connected_ && total_connected_displays) {
+ lock_.unlock();
+ return;
+ }
+ }
+#else
if (!connected && connected_ && total_connected_displays) {
lock_.unlock();
return;
}
-
+#endif
connected_ = connected;
hotplug_callback_->Callback(display_id_, connected);
}
bool MosaicDisplay::GetDisplayName(uint32_t *size, char *name) {
std::ostringstream stream;
+#ifdef ENABLE_PANORAMA
+ if (panorama_mode_) {
+ stream << "Panorama";
+ } else {
+ stream << "Mosaic";
+ }
+#else
stream << "Mosaic";
+#endif
std::string string = stream.str();
size_t length = string.length();
if (!name) {
return true;
}
- *size = std::min<uint32_t>(static_cast<uint32_t>(length - 1), *size);
+ *size = std::min<uint32_t>(static_cast<uint32_t>(length), *size);
strncpy(name, string.c_str(), *size);
return true;
}
#ifdef ENABLE_PANORAMA
void MosaicDisplay::SetPanoramaMode(bool mode) {
+ panorama_lock_.lock();
panorama_mode_ = mode;
+ if (panorama_mode_)
+ panorama_enabling_state_ = true;
+ panorama_lock_.unlock();
+}
+
+void MosaicDisplay::SetExtraDispInfo(
+ std::vector<NativeDisplay *> *virtual_panorama_displays,
+ std::vector<NativeDisplay *> *physical_panorama_displays) {
+ virtual_panorama_displays_ = virtual_panorama_displays;
+ physical_panorama_displays_ = physical_panorama_displays;
+
+ num_physical_displays_ = physical_panorama_displays->size();
+
+ num_virtual_displays_ = virtual_panorama_displays->size();
+
+ for (uint32_t i = 0; i < physical_panorama_displays->size(); i++) {
+ real_physical_displays_.emplace_back(physical_panorama_displays->at(i));
+ total_width_physical_ += physical_panorama_displays->at(i)->Width();
+ }
+
+ for (uint32_t i = 0; i < virtual_panorama_displays->size(); i++) {
+ total_width_virtual_ += virtual_panorama_displays->at(i)->Width();
+ }
+}
+
+bool MosaicDisplay::TriggerPanorama(uint32_t hotplug_simulation) {
+ bool ret = true;
+
+ if (!panorama_mode_) {
+ ret = false;
+ } else {
+ panorama_lock_.lock();
+ if (!panorama_enabling_state_) {
+ panorama_enabling_state_ = true;
+ } else {
+ ETRACE("Panorama mode already enabled!");
+ ret = false;
+ }
+ panorama_lock_.unlock();
+ }
+
+ if (!ret) {
+ return ret;
+ }
+
+ skip_update_ = true;
+ if (under_present) {
+ event_.Wait();
+ }
+ lock_.lock();
+ physical_displays_.swap(real_physical_displays_);
+ lock_.unlock();
+
+ SetActiveConfig(0);
+
+ uint32_t size = virtual_panorama_displays_->size();
+ for (uint32_t i = 0; i < size; i++) {
+ VirtualPanoramaDisplay *ppdisplay =
+ (VirtualPanoramaDisplay *)virtual_panorama_displays_->at(i);
+ ppdisplay->SetHyperDmaBufMode(1);
+ }
+
+ update_connected_displays_ = true;
+ if (hotplug_simulation) {
+ HotPlugUpdate(false);
+ HotPlugUpdate(true);
+ }
+ skip_update_ = false;
+ return ret;
}
-void MosaicDisplay::SetExtraDispInfo(int num_physical_displays,
- int num_virtual_displays) {
- num_physical_displays_ = num_physical_displays;
- num_virtual_displays_ = num_virtual_displays;
+bool MosaicDisplay::ShutdownPanorama(uint32_t hotplug_simulation) {
+ bool ret = true;
+
+ if (!panorama_mode_) {
+ ret = false;
+ } else {
+ panorama_lock_.lock();
+ if (panorama_enabling_state_) {
+ panorama_enabling_state_ = false;
+ } else {
+ ETRACE("Panorama mode already disabled!");
+ ret = false;
+ }
+ panorama_lock_.unlock();
+ }
+
+ if (!ret) {
+ return ret;
+ }
+
+ skip_update_ = true;
+ if (under_present) {
+ event_.Wait();
+ }
+ lock_.lock();
+
+ uint32_t size = virtual_panorama_displays_->size();
+ for (uint32_t i = 0; i < size; i++) {
+ VirtualPanoramaDisplay *ppdisplay =
+ (VirtualPanoramaDisplay *)virtual_panorama_displays_->at(i);
+ ppdisplay->SetHyperDmaBufMode(0);
+ }
+
+ physical_displays_.swap(real_physical_displays_);
+ lock_.unlock();
+
+ SetActiveConfig(0);
+
+ update_connected_displays_ = true;
+ if (hotplug_simulation) {
+ HotPlugUpdate(false);
+ HotPlugUpdate(true);
+ }
+ skip_update_ = false;
+ return ret;
}
+
#endif
} // namespace hwcomposer
#include <nativedisplay.h>
#include <spinlock.h>
+#include "hwcevent.h"
namespace hwcomposer {
+#ifdef ENABLE_PANORAMA
+class DisplayManager;
+#endif
class MosaicDisplay : public NativeDisplay {
public:
#ifdef ENABLE_PANORAMA
void SetPanoramaMode(bool mode);
- void SetExtraDispInfo(int num_physical_displays, int num_virtual_displays);
+ void SetExtraDispInfo(
+ std::vector<NativeDisplay *> *virtual_panorama_displays,
+ std::vector<NativeDisplay *> *physical_panorama_displays);
+ bool TriggerPanorama(uint32_t hotplug_simulation);
+ bool ShutdownPanorama(uint32_t hotplug_simulation);
#endif
private:
bool pending_vsync_ = false;
bool update_connected_displays_ = true;
#ifdef ENABLE_PANORAMA
+ std::vector<NativeDisplay *> *virtual_panorama_displays_;
+ std::vector<NativeDisplay *> *physical_panorama_displays_;
+ std::vector<NativeDisplay *> real_physical_displays_;
+ SpinLock panorama_lock_;
bool panorama_mode_ = false;
+ bool panorama_enabling_state_ = false;
+ bool skip_update_ = false;
+ bool under_present = false;
int32_t num_physical_displays_ = 1;
+ int32_t total_width_physical_ = 0;
int32_t num_virtual_displays_ = 1;
+ int32_t total_width_virtual_ = 0;
+ HWCEvent event_;
#endif
SpinLock lock_;
};
} else
ITRACE("Hyper DmaBuf: IOCTL_HYPER_DMABUF_TX_CH_SETUP Done!\n");
}
+ if (mHyperDmaBuf_Fd > 0) {
+ hyper_dmabuf_initialized = true;
+ }
#endif
- hyper_dmabuf_initialized = true;
}
VirtualPanoramaDisplay::~VirtualPanoramaDisplay() {
temp.handle_ = handle_;
resource_manager_->MarkResourceForDeletion(temp, false);
}
+
if (output_handle_) {
delete output_handle_;
}
resource_manager_->PurgeBuffer();
compositor_.Reset();
#ifdef HYPER_DMABUF_SHARING
+ HyperDmaUnExport();
+#endif
+}
+
+#ifdef HYPER_DMABUF_SHARING
+void VirtualPanoramaDisplay::HyperDmaUnExport() {
+ HyperDmaExport(true);
if (mHyperDmaBuf_Fd > 0) {
auto it = mHyperDmaExportedBuffers.begin();
for (; it != mHyperDmaExportedBuffers.end(); ++it) {
} else {
ITRACE("Hyper DmaBuf: IOCTL_HYPER_DMABUF_UNEXPORT ioctl Done [0x%x]!\n",
it->second.hyper_dmabuf_id.id);
- mHyperDmaExportedBuffers.erase(it);
}
}
+ mHyperDmaExportedBuffers.clear();
+
close(mHyperDmaBuf_Fd);
mHyperDmaBuf_Fd = -1;
}
-#endif
+ hyper_dmabuf_initialized = false;
}
+#endif
void VirtualPanoramaDisplay::InitVirtualDisplay(uint32_t width,
uint32_t height) {
return true;
}
-void VirtualPanoramaDisplay::HyperDmaExport() {
+void VirtualPanoramaDisplay::HyperDmaExport(bool notify_stopping) {
#ifdef HYPER_DMABUF_SHARING
int ret = 0;
size_t buffer_number = 0;
mHyperDmaExportedBuffers[imported_fd].rotation = 0;
mHyperDmaExportedBuffers[imported_fd].status = 0;
mHyperDmaExportedBuffers[imported_fd].counter = 0;
- mHyperDmaExportedBuffers[imported_fd].surface_id = display_index_;
+ if (notify_stopping) {
+ // Send an invalid surface_id to let SOS daemon knowns guest is stopping
+ // sharing.
+ mHyperDmaExportedBuffers[imported_fd].surface_id = 0xff;
+ } else {
+ mHyperDmaExportedBuffers[imported_fd].surface_id = display_index_;
+ }
mHyperDmaExportedBuffers[imported_fd].bbox[0] = 0;
mHyperDmaExportedBuffers[imported_fd].bbox[1] = 0;
mHyperDmaExportedBuffers[imported_fd].bbox[2] = buffer->GetWidth();
mHyperDmaExportedBuffers[imported_fd].bbox[3] = buffer->GetHeight();
}
+ } else {
+ if (!notify_stopping) {
+ imported_fd = buffer->GetPrimeFD();
+ mHyperDmaExportedBuffers[imported_fd].surface_id = display_index_;
+ }
}
msg.sz_priv = header_size + info_size;
return;
}
+ mHyperDmaExportedBuffers[buffer->GetPrimeFD()].hyper_dmabuf_id = msg.hid;
+
resource_manager_->PreparePurgedResources();
std::vector<ResourceHandle> purged_gl_resources;
PixelUploaderCallback * /*call_back*/,
bool handle_constraints) {
CTRACE();
+
+ if (!hyper_dmabuf_mode_) {
+ return true;
+ }
+
if (!hyper_dmabuf_initialized) {
InitHyperDmaBuf();
}
}
#ifdef HYPER_DMABUF_SHARING
- HyperDmaExport();
+ HyperDmaExport(false);
#endif
return true;
return -1;
}
+#ifdef HYPER_DMABUF_SHARING
+bool VirtualPanoramaDisplay::SetHyperDmaBufMode(uint32_t mode) {
+ if (hyper_dmabuf_mode_ != mode) {
+ hyper_dmabuf_mode_ = mode;
+ if (hyper_dmabuf_mode_) {
+ // Trigger hyperdmabuf sharing
+ // Disable hyper dmabuf sharing to make sure the Present method has the
+ // chance to re-establish the new hyper dmabuf channel.
+ // The purpose is to workaround SOS vmdisplay-wayland's refresh issue
+ // after resumsing from latest hyper dmabuf sharing stopping.
+ HyperDmaUnExport();
+ resource_manager_->PurgeBuffer();
+ }
+ }
+
+ return true;
+}
+#endif
+
bool VirtualPanoramaDisplay::SetPowerMode(uint32_t /*power_mode*/) {
return true;
}
void CreateOutBuffer();
- void HyperDmaExport();
+ void HyperDmaExport(bool notify_stopping);
DisplayType Type() const override {
return DisplayType::kVirtual;
bool SetPowerMode(uint32_t power_mode) override;
+#ifdef HYPER_DMABUF_SHARING
+ bool SetHyperDmaBufMode(uint32_t mode);
+#endif
+
int RegisterVsyncCallback(std::shared_ptr<VsyncCallback> callback,
uint32_t display_id) override;
bool hyper_dmabuf_initialized = false;
#ifdef HYPER_DMABUF_SHARING
+ void HyperDmaUnExport();
int mHyperDmaBuf_Fd = -1;
std::map<uint32_t, vm_buffer_info>
mHyperDmaExportedBuffers; // Track the hyper dmabuf metadata info mapping
uint32_t frame_count_ = 0;
+ uint32_t hyper_dmabuf_mode_ = 1;
#endif
};
return OK;
}
+#ifdef ENABLE_PANORAMA
+status_t HwcService::Controls::TriggerPanorama(uint32_t hotplug_simulation) {
+ mHwc.TriggerPanorama(hotplug_simulation);
+ return OK;
+}
+
+status_t HwcService::Controls::ShutdownPanorama(uint32_t hotplug_simulation) {
+ mHwc.ShutdownPanorama(hotplug_simulation);
+ return OK;
+}
+#endif
+
bool HwcService::Controls::VideoIsEncryptedSessionEnabled(uint32_t sessionID,
uint32_t instanceID) {
// TO DO
status_t DisableHDCPSessionForAllDisplays();
+#ifdef ENABLE_PANORAMA
+ status_t TriggerPanorama(uint32_t hotplug_simulation);
+ status_t ShutdownPanorama(uint32_t hotplug_simulation);
+#endif
+
status_t SetHDCPSRMForAllDisplays(const int8_t* SRM, uint32_t SRMLength);
status_t SetHDCPSRMForDisplay(uint32_t connector, const int8_t* SRM,
void Callback(uint32_t display, bool connected) {
if (display == 0) {
+#ifdef ENABLE_PANORAMA
+ char dispname[128];
+ uint32_t size = sizeof(dispname);
+ memset(dispname, 0, sizeof(dispname));
+ display_->GetDisplayName(&size, dispname);
+ if (strstr(dispname, "Panorama")) {
+ // Allow the hotplug events to be emitted.
+ } else {
+ if (notified_) {
+ return;
+ }
+
+ if (connected) {
+ notified_ = true;
+ }
+ }
+#else
// SF expects primary display to be always
// connected. Let's notify it first time and ignore
// any followup status changes.
if (connected)
notified_ = true;
+#endif
}
auto hook = reinterpret_cast<HWC2_PFN_HOTPLUG>(hook_);
device_.DisableHDCPSessionForAllDisplays();
}
+#ifdef ENABLE_PANORAMA
+void IAHWC2::TriggerPanorama(uint32_t hotplug_simulation) {
+ device_.TriggerPanorama(hotplug_simulation);
+}
+
+void IAHWC2::ShutdownPanorama(uint32_t hotplug_simulation) {
+ device_.ShutdownPanorama(hotplug_simulation);
+}
+#endif
+
void IAHWC2::SetPAVPSessionStatus(bool enabled, uint32_t papv_session_id,
uint32_t pavp_instance_id) {
device_.SetPAVPSessionStatus(enabled, papv_session_id, pavp_instance_id);
void DisableHDCPSessionForDisplay(uint32_t connector);
void DisableHDCPSessionForAllDisplays();
+#ifdef ENABLE_PANORAMA
+ void TriggerPanorama(uint32_t hotplug_simulation);
+ void ShutdownPanorama(uint32_t hotplug_simulation);
+#endif
void SetPAVPSessionStatus(bool enabled, uint32_t pavp_session_id,
uint32_t pavp_instance_id);
LOCAL_MODULE := libhwcservice
LOCAL_CFLAGS += -fvisibility=default
+ifeq ($(strip $(ENABLE_HYPER_DMABUF_SHARING)), true)
+LOCAL_CFLAGS += -DENABLE_PANORAMA
+endif
LOCAL_SHARED_LIBRARIES := libutils libbinder liblog
LOCAL_MULTILIB := both
LOCAL_EXPORT_C_INCLUDE_DIRS += $(LOCAL_PATH)
return pContext->mControls->DisableHDCPSessionForDisplay(connector);
}
+#ifdef ENABLE_PANORAMA
+status_t HwcService_TriggerPanorama(HWCSHANDLE hwcs,
+ uint32_t hotplug_simulation) {
+ HwcsContext* pContext = static_cast<HwcsContext*>(hwcs);
+ if (!pContext) {
+ return android::BAD_VALUE;
+ }
+ return pContext->mControls->TriggerPanorama(hotplug_simulation);
+}
+
+status_t HwcService_ShutdownPanorama(HWCSHANDLE hwcs,
+ uint32_t hotplug_simulation) {
+ HwcsContext* pContext = static_cast<HwcsContext*>(hwcs);
+ if (!pContext) {
+ return android::BAD_VALUE;
+ }
+ return pContext->mControls->ShutdownPanorama(hotplug_simulation);
+}
+#endif
+
uint32_t HwcService_GetDisplayIDFromConnectorID(HWCSHANDLE hwcs,
uint32_t connector_id) {
HwcsContext* pContext = static_cast<HwcsContext*>(hwcs);
// on all connected displays.
status_t HwcService_Video_DisableHDCPSession_AllDisplays(HWCSHANDLE hwcs);
+#ifdef ENABLE_PANORAMA
+status_t HwcService_TriggerPanorama(HWCSHANDLE hwcs,
+ uint32_t hotplug_simulation);
+status_t HwcService_ShutdownPanorama(HWCSHANDLE hwcs,
+ uint32_t hotplug_simulation);
+#endif
+
status_t HwcService_Video_SetHDCPSRM_ForDisplay(HWCSHANDLE hwcs,
uint32_t connector,
const int8_t *SRM,
TRANSACT_MDS_UPDATE_INPUT_STATE,
TRANSACT_WIDI_GET_SINGLE_DISPLAY,
TRANSACT_WIDI_SET_SINGLE_DISPLAY,
+#ifdef ENABLE_PANORAMA
+ TRANSACT_TRIGGER_PANORAMA,
+ TRANSACT_SHUTDOWN_PANORAMA,
+#endif
};
status_t DisplaySetOverscan(uint32_t display, int32_t xoverscan,
return OK;
}
+#ifdef ENABLE_PANORAMA
+ status_t TriggerPanorama(uint32_t hotplug_simulation) override {
+ Parcel data;
+ Parcel reply;
+ data.writeInterfaceToken(IControls::getInterfaceDescriptor());
+ data.writeInt32(hotplug_simulation);
+ status_t ret = remote()->transact(TRANSACT_TRIGGER_PANORAMA, data, &reply);
+ if (ret != NO_ERROR) {
+ ALOGW("%s() transact failed: %d", __FUNCTION__, ret);
+ }
+ return reply.readInt32();
+ }
+
+ status_t ShutdownPanorama(uint32_t hotplug_simulation) override {
+ Parcel data;
+ Parcel reply;
+ data.writeInterfaceToken(IControls::getInterfaceDescriptor());
+ data.writeInt32(hotplug_simulation);
+ status_t ret = remote()->transact(TRANSACT_SHUTDOWN_PANORAMA, data, &reply);
+ if (ret != NO_ERROR) {
+ ALOGW("%s() transact failed: %d", __FUNCTION__, ret);
+ }
+ return reply.readInt32();
+ }
+#endif
+
status_t DisplaySetScaling(uint32_t display,
EHwcsScalingMode eScalingMode) override {
Parcel data;
reply->writeInt32(ret);
return NO_ERROR;
}
+#ifdef ENABLE_PANORAMA
+ case BpControls::TRANSACT_TRIGGER_PANORAMA: {
+ CHECK_INTERFACE(IControls, data, reply);
+ uint32_t hotplug_simulation = data.readInt32();
+ status_t ret = this->TriggerPanorama(hotplug_simulation);
+ reply->writeInt32(ret);
+ return NO_ERROR;
+ }
+
+ case BpControls::TRANSACT_SHUTDOWN_PANORAMA: {
+ CHECK_INTERFACE(IControls, data, reply);
+ uint32_t hotplug_simulation = data.readInt32();
+ status_t ret = this->ShutdownPanorama(hotplug_simulation);
+ reply->writeInt32(ret);
+ return NO_ERROR;
+ }
+#endif
case BpControls::TRANSACT_VIDEO_IS_ENCRYPTED_SESSION_ENABLED: {
CHECK_INTERFACE(IControls, data, reply);
uint32_t sessionID = data.readInt32();
virtual status_t DisableHDCPSessionForAllDisplays() = 0;
+#ifdef ENABLE_PANORAMA
+ virtual status_t TriggerPanorama(uint32_t hotplug_simulation) = 0;
+
+ virtual status_t ShutdownPanorama(uint32_t hotplug_simulation) = 0;
+#endif
+
virtual status_t SetHDCPSRMForAllDisplays(const int8_t *SRM,
uint32_t SRMLength) = 0;
ifeq ($(shell test $(ANDROID_VERSION) -ge 8; echo $$?), 0)
LOCAL_CFLAGS += -DUSE_PROCESS_STATE
endif
+ifeq ($(strip $(ENABLE_HYPER_DMABUF_SHARING)), true)
+LOCAL_CFLAGS += -DENABLE_PANORAMA
+endif
include $(BUILD_EXECUTABLE)
"\t-c: Set Contrast\n"
"\t-e: Set Sharpness\n"
"\t-d: Set deinterlace\n"
- "\t-r: Restore all default video colors/deinterlace \n";
+ "\t-r: Restore all default video colors/deinterlace \n"
+#ifdef ENABLE_PANORAMA
+ "\t-w: Trigger Panorama with option of hotplug simulation or not\n"
+ "\t-m: Shutdown Panorama with option of hotplug simulation or not\n";
+#else
+ ;
+#endif
exit(-1);
}
bool disable_hdcp_for_display = false;
bool disable_hdcp_for_all_display = false;
bool restore = false;
+#ifdef ENABLE_PANORAMA
+ bool trigger_panorama = false;
+ bool shutdown_panorama = false;
+#endif
int ch;
+#ifdef ENABLE_PANORAMA
+ while ((ch = getopt(argc, argv, "gsphijkurabcdemw")) != -1) {
+#else
while ((ch = getopt(argc, argv, "gsphijkurabcde")) != -1) {
+#endif
switch (ch) {
case 'g':
get_mode = true;
case 'k':
disable_hdcp_for_all_display = true;
break;
+#ifdef ENABLE_PANORAMA
+ case 'w':
+ trigger_panorama = true;
+ break;
+ case 'm':
+ shutdown_panorama = true;
+ break;
+#endif
default:
usage();
}
HwcService_Video_DisableHDCPSession_AllDisplays(hwcs);
}
+#ifdef ENABLE_PANORAMA
+ if (trigger_panorama) {
+ int simulation_hotplug = 0;
+ if (argc >= 1) {
+ simulation_hotplug = atoi(argv[0]);
+ }
+ aout << "Trigger Panorama view mode, simulation hotplug: "
+ << simulation_hotplug << endl;
+
+ HwcService_TriggerPanorama(hwcs, simulation_hotplug);
+ }
+
+ if (shutdown_panorama) {
+ int simulation_hotplug = 0;
+ if (argc >= 1) {
+ simulation_hotplug = atoi(argv[0]);
+ }
+ aout << "Shutdown Panorama view mode, simulation hotplug: "
+ << simulation_hotplug << endl;
+ HwcService_ShutdownPanorama(hwcs, simulation_hotplug);
+ }
+#endif
+
HwcService_Disconnect(hwcs);
return 0;
}
namespace hwcomposer {
+#ifdef ENABLE_PANORAMA
+class MosaicDisplay;
+#endif
class NativeDisplay;
class GpuDevice : public HWCThread {
void SetHDCPSRMForDisplay(uint32_t connector, const int8_t* SRM,
uint32_t SRMLength);
uint32_t GetDisplayIDFromConnectorID(const uint32_t connector_id);
+#ifdef ENABLE_PANORAMA
+ bool TriggerPanorama(uint32_t hotplug_simulation);
+ bool ShutdownPanorama(uint32_t hotplug_simulation);
+#endif
bool IsReservedDrmPlane();
std::vector<std::vector<uint32_t>>& panorama_displays,
std::vector<std::vector<uint32_t>>& panorama_sos_displays,
std::vector<bool>& available_displays);
+
+ std::vector<NativeDisplay*> virtual_panorama_displays_;
+ std::vector<NativeDisplay*> physical_panorama_displays_;
+ MosaicDisplay* ptr_mosaicdisplay = NULL;
#endif
void ParseLogicalDisplaySetting(std::string& value,
std::vector<uint32_t>& logical_displays);
--- /dev/null
+#!/system/bin/sh
+/vendor/bin/hwcservice_test -m 0
+screen_res=`/vendor/bin/hwcservice_test -g | sed -n "/^[0-9]/p" | sed -n "s/\(^[0-9]*\)[ \t]*\([0-9]*\)[ \t]*.*/\1x\2/p"`
+echo "screen_res: $screen_res"
+wm size $screen_res
--- /dev/null
+#!/system/bin/sh
+/vendor/bin/hwcservice_test -w 0
+screen_res=`/vendor/bin/hwcservice_test -g | sed -n "/^[0-9]/p" | sed -n "s/\(^[0-9]*\)[ \t]*\([0-9]*\)[ \t]*.*/\1x\2/p"`
+echo "screen_res: $screen_res"
+wm size $screen_res