OSDN Git Service

Merge changes from topic 'GPU_replace_GL'
[android-x86/frameworks-native.git] / services / vr / vr_window_manager / surface_flinger_view.cpp
1 #include "surface_flinger_view.h"
2
3 #include <impl/vr_composer_view.h>
4 #include <private/dvr/native_buffer.h>
5
6 #include "hwc_callback.h"
7 #include "texture.h"
8
9 namespace android {
10 namespace dvr {
11
12 SurfaceFlingerView::SurfaceFlingerView() {}
13
14 SurfaceFlingerView::~SurfaceFlingerView() {}
15
16 bool SurfaceFlingerView::Initialize(HwcCallback::Client *client) {
17   const char vr_hwcomposer_name[] = "vr_hwcomposer";
18   vr_hwcomposer_ = HIDL_FETCH_IComposer(vr_hwcomposer_name);
19   if (!vr_hwcomposer_.get()) {
20     ALOGE("Failed to get vr_hwcomposer");
21     return false;
22   }
23
24   if (vr_hwcomposer_->isRemote()) {
25     ALOGE("vr_hwcomposer service is remote");
26     return false;
27   }
28
29   const android::status_t vr_hwcomposer_status =
30       vr_hwcomposer_->registerAsService(vr_hwcomposer_name);
31   if (vr_hwcomposer_status != OK) {
32     ALOGE("Failed to register vr_hwcomposer service");
33     return false;
34   }
35
36   vr_composer_view_ =
37       std::make_unique<VrComposerView>(std::make_unique<HwcCallback>(client));
38   vr_composer_view_->Initialize(GetComposerViewFromIComposer(
39       vr_hwcomposer_.get()));
40
41   // TODO(dnicoara): Query this from the composer service.
42   width_ = 1920;
43   height_ = 1080;
44   return true;
45 }
46
47 bool SurfaceFlingerView::GetTextures(const HwcCallback::Frame& frame,
48                                      std::vector<TextureLayer>* texture_layers,
49                                      TextureLayer* ime_layer,
50                                      bool debug, bool skip_first_layer) const {
51   auto& layers = frame.layers();
52   texture_layers->clear();
53
54   size_t start = 0;
55   // Skip the second layer if it is from the VR app.
56   if (!debug && skip_first_layer) {
57     start = 1;
58     if (layers[0].appid && layers[0].appid == layers[1].appid)
59       start = 2;
60   }
61
62   for (size_t i = start; i < layers.size(); ++i) {
63     if (!debug && layers[i].should_skip_layer())
64       continue;
65
66     std::unique_ptr<Texture> texture(new Texture());
67     if (!texture->Initialize(layers[i].buffer->getNativeBuffer())) {
68       ALOGE("Failed to create texture");
69       texture_layers->clear();
70       return false;
71     }
72
73     TextureLayer texture_layer = {
74         std::move(texture), layers[i].crop, layers[i].display_frame,
75         layers[i].blending, layers[i].alpha,
76     };
77     if (debug && layers[i].type == HwcCallback::HwcLayer::kInputMethod) {
78       *ime_layer = std::move(texture_layer);
79     } else {
80       texture_layers->emplace_back(std::move(texture_layer));
81     }
82   }
83
84   return true;
85 }
86
87 void SurfaceFlingerView::ReleaseFrame() {
88   vr_composer_view_->ReleaseFrame();
89 }
90
91 }  // namespace dvr
92 }  // namespace android