OSDN Git Service

Allow VRWM to show 2D apps
[android-x86/frameworks-native.git] / services / vr / vr_window_manager / surface_flinger_view.cpp
1 #include "surface_flinger_view.h"
2
3 #include <binder/IServiceManager.h>
4 #include <impl/vr_composer_view.h>
5 #include <private/dvr/native_buffer.h>
6
7 #include "hwc_callback.h"
8 #include "texture.h"
9
10 namespace android {
11 namespace dvr {
12
13 SurfaceFlingerView::SurfaceFlingerView() {}
14
15 SurfaceFlingerView::~SurfaceFlingerView() {}
16
17 bool SurfaceFlingerView::Initialize(HwcCallback::Client *client) {
18   const char instance[] = "DaydreamDisplay";
19   composer_service_ = IVrComposerView::getService(instance);
20   if (composer_service_ == nullptr) {
21     ALOGE("Failed to initialize composer service");
22     return false;
23   }
24
25   if (!composer_service_->isRemote()) {
26     ALOGE("Composer service is not remote");
27     return false;
28   }
29
30   // TODO(dnicoara): Query this from the composer service.
31   width_ = 1920;
32   height_ = 1080;
33
34   composer_observer_.reset(new HwcCallback(composer_service_.get(), client));
35   return true;
36 }
37
38 bool SurfaceFlingerView::GetTextures(const HwcCallback::Frame& frame,
39                                      std::vector<TextureLayer>* texture_layers,
40                                      TextureLayer* ime_layer,
41                                      bool debug, bool skip_first_layer) const {
42   auto& layers = frame.layers();
43   texture_layers->clear();
44
45   size_t start = 0;
46   // Skip the second layer if it is from the VR app.
47   if (!debug && skip_first_layer) {
48     start = 1;
49     if (layers[0].appid && layers[0].appid == layers[1].appid)
50       start = 2;
51   }
52
53   for (size_t i = start; i < layers.size(); ++i) {
54     if (!debug && layers[i].should_skip_layer())
55       continue;
56
57     std::unique_ptr<Texture> texture(new Texture());
58     if (!texture->Initialize(layers[i].buffer->getNativeBuffer())) {
59       ALOGE("Failed to create texture");
60       texture_layers->clear();
61       return false;
62     }
63
64     TextureLayer texture_layer = {
65         std::move(texture), layers[i].crop, layers[i].display_frame,
66         layers[i].blending, layers[i].alpha,
67     };
68     if (debug && layers[i].type == HwcCallback::HwcLayer::kInputMethod) {
69       *ime_layer = std::move(texture_layer);
70     } else {
71       texture_layers->emplace_back(std::move(texture_layer));
72     }
73   }
74
75   return true;
76 }
77
78 }  // namespace dvr
79 }  // namespace android