OSDN Git Service

Merge "surfaceflinger: disable VR mode while SELinux issues are resolved."
[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   sp<IComposer> vr_hwcomposer = IComposer::getService("vr_hwcomposer");
18   if (!vr_hwcomposer.get()) {
19     ALOGE("vr_hwcomposer not registered as service");
20     return false;
21   }
22
23   vr_composer_view_ =
24       std::make_unique<VrComposerView>(std::make_unique<HwcCallback>(client));
25   vr_composer_view_->Initialize(GetComposerViewFromIComposer(
26       vr_hwcomposer.get()));
27
28   // TODO(dnicoara): Query this from the composer service.
29   width_ = 1920;
30   height_ = 1080;
31   return true;
32 }
33
34 bool SurfaceFlingerView::GetTextures(const HwcCallback::Frame& frame,
35                                      std::vector<TextureLayer>* texture_layers,
36                                      TextureLayer* ime_layer,
37                                      bool debug, bool skip_first_layer) const {
38   auto& layers = frame.layers();
39   texture_layers->clear();
40
41   size_t start = 0;
42   // Skip the second layer if it is from the VR app.
43   if (!debug && skip_first_layer) {
44     start = 1;
45     if (layers[0].appid && layers[0].appid == layers[1].appid)
46       start = 2;
47   }
48
49   for (size_t i = start; i < layers.size(); ++i) {
50     if (!debug && layers[i].should_skip_layer())
51       continue;
52
53     std::unique_ptr<Texture> texture(new Texture());
54     if (!texture->Initialize(layers[i].buffer->getNativeBuffer())) {
55       ALOGE("Failed to create texture");
56       texture_layers->clear();
57       return false;
58     }
59
60     TextureLayer texture_layer = {
61         std::move(texture), layers[i].crop, layers[i].display_frame,
62         layers[i].blending, layers[i].alpha,
63     };
64     if (debug && layers[i].type == HwcCallback::HwcLayer::kInputMethod) {
65       *ime_layer = std::move(texture_layer);
66     } else {
67       texture_layers->emplace_back(std::move(texture_layer));
68     }
69   }
70
71   return true;
72 }
73
74 void SurfaceFlingerView::ReleaseFrame() {
75   vr_composer_view_->ReleaseFrame();
76 }
77
78 }  // namespace dvr
79 }  // namespace android