#include "surface_flinger_view.h"
-#include <binder/IServiceManager.h>
#include <impl/vr_composer_view.h>
+#include <private/dvr/display_client.h>
#include <private/dvr/native_buffer.h>
#include "hwc_callback.h"
SurfaceFlingerView::~SurfaceFlingerView() {}
bool SurfaceFlingerView::Initialize(HwcCallback::Client *client) {
- const char instance[] = "DaydreamDisplay";
- composer_service_ = IVrComposerView::getService(instance);
- if (composer_service_ == nullptr) {
- ALOGE("Failed to initialize composer service");
+ const char vr_hwcomposer_name[] = "vr_hwcomposer";
+ vr_hwcomposer_ = HIDL_FETCH_IComposer(vr_hwcomposer_name);
+ if (!vr_hwcomposer_.get()) {
+ ALOGE("Failed to get vr_hwcomposer");
return false;
}
- if (!composer_service_->isRemote()) {
- ALOGE("Composer service is not remote");
+ if (vr_hwcomposer_->isRemote()) {
+ ALOGE("vr_hwcomposer service is remote");
return false;
}
- // TODO(dnicoara): Query this from the composer service.
- width_ = 1920;
- height_ = 1080;
+ const android::status_t vr_hwcomposer_status =
+ vr_hwcomposer_->registerAsService(vr_hwcomposer_name);
+ if (vr_hwcomposer_status != OK) {
+ ALOGE("Failed to register vr_hwcomposer service");
+ return false;
+ }
+
+ vr_composer_view_ =
+ std::make_unique<VrComposerView>(std::make_unique<HwcCallback>(client));
+ vr_composer_view_->Initialize(GetComposerViewFromIComposer(
+ vr_hwcomposer_.get()));
+
+ int error = 0;
+ auto display_client = DisplayClient::Create(&error);
+ SystemDisplayMetrics metrics;
+
+ if (error) {
+ ALOGE("Could not connect to display service : %s(%d)", strerror(error), error);
+ } else {
+ error = display_client->GetDisplayMetrics(&metrics);
+
+ if (error) {
+ ALOGE("Could not get display metrics from display service : %s(%d)", strerror(error), error);
+ }
+ }
+
+ if (error) {
+ metrics.display_native_height = 1920;
+ metrics.display_native_width = 1080;
+ ALOGI("Setting display metrics to default : width=%d height=%d", metrics.display_native_height, metrics.display_native_width);
+ }
- composer_observer_.reset(new HwcCallback(composer_service_.get(), client));
+ // TODO(alexst): Refactor ShellView to account for orientation and change this back.
+ width_ = metrics.display_native_height;
+ height_ = metrics.display_native_width;
return true;
}
size_t start = 0;
// Skip the second layer if it is from the VR app.
if (!debug && skip_first_layer) {
- start = 1;
- if (layers[0].appid && layers[0].appid == layers[1].appid)
- start = 2;
+ start = 2;
}
for (size_t i = start; i < layers.size(); ++i) {
return true;
}
-void SurfaceFlingerView::ReleaseFrame() {
- composer_service_->releaseFrame();
-}
-
} // namespace dvr
} // namespace android