151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara/*
251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara * Copyright 2016 The Android Open Source Project
351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara *
451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara * Licensed under the Apache License, Version 2.0 (the "License");
551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara * you may not use this file except in compliance with the License.
651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara * You may obtain a copy of the License at
751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara *
851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara *      http://www.apache.org/licenses/LICENSE-2.0
951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara *
1051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara * Unless required by applicable law or agreed to in writing, software
1151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara * distributed under the License is distributed on an "AS IS" BASIS,
1251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara * See the License for the specific language governing permissions and
1451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara * limitations under the License.
1551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara */
164251e92b6dacb5653aa9528d88484085ee333e3bDaniel Nicoara#include "impl/vr_hwc.h"
1751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
18784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliu#include "android-base/stringprintf.h"
19bd9f4d2fef3028bec848bdc216681f4b1678e932Kevin Schoedel#include <cutils/properties.h>
204251e92b6dacb5653aa9528d88484085ee333e3bDaniel Nicoara#include <private/dvr/display_client.h>
2151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara#include <ui/Fence.h>
2251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
2351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara#include <mutex>
2451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
25e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include "vr_composer_client.h"
2651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
2751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoarausing namespace android::hardware::graphics::common::V1_0;
2851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoarausing namespace android::hardware::graphics::composer::V2_1;
2951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
30784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliuusing android::base::StringPrintf;
3151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoarausing android::hardware::hidl_handle;
3251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoarausing android::hardware::hidl_string;
3351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoarausing android::hardware::hidl_vec;
3451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoarausing android::hardware::Return;
3551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoarausing android::hardware::Void;
3651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
3751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoaranamespace android {
3851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoaranamespace dvr {
3951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoaranamespace {
4051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
4151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoarausing android::hardware::graphics::common::V1_0::PixelFormat;
4251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
4351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoaraconst Display kDefaultDisplayId = 1;
4451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoaraconst Config kDefaultConfigId = 1;
4551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
461f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoarasp<GraphicBuffer> CreateGraphicBuffer(
471f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara    const native_handle_t* handle,
481f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara    const IVrComposerClient::BufferMetadata& metadata) {
491f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara   sp<GraphicBuffer> buffer = new GraphicBuffer(
501f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara      handle, GraphicBuffer::CLONE_HANDLE, metadata.width, metadata.height,
511f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara      static_cast<int32_t>(metadata.format), metadata.layerCount,
5273feb0676635da6c0f738c10e04052a8162a4095Chris Forbes      metadata.usage, metadata.stride);
531f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara   if (buffer->initCheck() != OK) {
541f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara     ALOGE("Failed to create graphic buffer");
551f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara     return nullptr;
561f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara   }
571f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara
581f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara   return buffer;
59e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
60e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
61d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoaravoid GetPrimaryDisplaySize(int32_t* width, int32_t* height) {
62d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara  *width = 1080;
63d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara  *height = 1920;
64d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara
65d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara  int error = 0;
662251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  auto display_client = display::DisplayClient::Create(&error);
672251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  if (!display_client) {
68d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara    ALOGE("Could not connect to display service : %s(%d)", strerror(error),
69d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara          error);
70d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara    return;
71d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara  }
72d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara
732251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  auto status = display_client->GetDisplayMetrics();
742251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  if (!status) {
75d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara    ALOGE("Could not get display metrics from display service : %s(%d)",
762251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka          status.GetErrorMessage().c_str(), status.error());
77d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara    return;
78d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara  }
79d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara
802251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  *width = status.get().display_width;
812251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  *height = status.get().display_height;
82d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara}
83d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara
8451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}  // namespace
8551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
86d330a62612e287b63442db2470d89c55ad326f27Daniel NicoaraHwcDisplay::HwcDisplay(int32_t width, int32_t height)
87d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara    : width_(width), height_(height) {}
8851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
8951a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraHwcDisplay::~HwcDisplay() {}
9051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
9151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoarabool HwcDisplay::SetClientTarget(const native_handle_t* handle,
9251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                                 base::unique_fd fence) {
93e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  if (handle)
941f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara    buffer_ = CreateGraphicBuffer(handle, buffer_metadata_);
9551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
9651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  fence_ = new Fence(fence.release());
9751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return true;
9851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
9951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
1001f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoaravoid HwcDisplay::SetClientTargetMetadata(
1011f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara    const IVrComposerClient::BufferMetadata& metadata) {
1021f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara  buffer_metadata_ = metadata;
1031f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara}
1041f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara
10551a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraHwcLayer* HwcDisplay::CreateLayer() {
10651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  uint64_t layer_id = layer_ids_++;
10751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  layers_.push_back(HwcLayer(layer_id));
10851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return &layers_.back();
10951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
11051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
11151a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraHwcLayer* HwcDisplay::GetLayer(Layer id) {
11251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  for (size_t i = 0; i < layers_.size(); ++i)
1132b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    if (layers_[i].info.id == id)
1142b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk      return &layers_[i];
11551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
11651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return nullptr;
11751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
11851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
11951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoarabool HwcDisplay::DestroyLayer(Layer id) {
12051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  for (auto it = layers_.begin(); it != layers_.end(); ++it) {
121e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara    if (it->info.id == id) {
12251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara      layers_.erase(it);
12351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara      return true;
12451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    }
12551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  }
12651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
12751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return false;
12851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
12951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
13051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoaravoid HwcDisplay::GetChangedCompositionTypes(
13151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    std::vector<Layer>* layer_ids,
13251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    std::vector<IComposerClient::Composition>* types) {
133e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  std::sort(layers_.begin(), layers_.end(),
134e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko            [](const auto& lhs, const auto& rhs) {
135730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk              return lhs.info.z_order < rhs.info.z_order;
136e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko            });
137e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1389494b73677e39a5dc67ee8e64c9cc944624ebffdGeorge Burgess IV  const size_t no_layer = std::numeric_limits<size_t>::max();
1399494b73677e39a5dc67ee8e64c9cc944624ebffdGeorge Burgess IV  size_t first_client_layer = no_layer, last_client_layer = no_layer;
140e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  for (size_t i = 0; i < layers_.size(); ++i) {
141e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    switch (layers_[i].composition_type) {
142e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      case IComposerClient::Composition::SOLID_COLOR:
143e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      case IComposerClient::Composition::CURSOR:
144e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      case IComposerClient::Composition::SIDEBAND:
1459494b73677e39a5dc67ee8e64c9cc944624ebffdGeorge Burgess IV        if (first_client_layer == no_layer)
146e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko          first_client_layer = i;
147e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
148e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko        last_client_layer = i;
149e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko        break;
150e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      default:
151e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko        break;
152e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    }
153e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  }
154e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
155e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  for (size_t i = 0; i < layers_.size(); ++i) {
156e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    if (i >= first_client_layer && i <= last_client_layer) {
157e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      if (layers_[i].composition_type != IComposerClient::Composition::CLIENT) {
158e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara        layer_ids->push_back(layers_[i].info.id);
159e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko        types->push_back(IComposerClient::Composition::CLIENT);
160e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko        layers_[i].composition_type = IComposerClient::Composition::CLIENT;
161e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      }
162e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
163e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      continue;
164e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    }
165e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
166e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    if (layers_[i].composition_type != IComposerClient::Composition::DEVICE) {
167e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara      layer_ids->push_back(layers_[i].info.id);
168e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      types->push_back(IComposerClient::Composition::DEVICE);
169e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      layers_[i].composition_type = IComposerClient::Composition::DEVICE;
170e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    }
17151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  }
17251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
17351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
174e7916f88ab250e9cbd7faa53458491f19b716782Daniel NicoaraError HwcDisplay::GetFrame(
175e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara    std::vector<ComposerView::ComposerLayer>* out_frames) {
176e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  bool queued_client_target = false;
177e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  std::vector<ComposerView::ComposerLayer> frame;
178e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  for (const auto& layer : layers_) {
179e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    if (layer.composition_type == IComposerClient::Composition::CLIENT) {
180e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara      if (queued_client_target)
181e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara        continue;
182e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara
183e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara      if (!buffer_.get()) {
184e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara        ALOGE("Client composition requested but no client target buffer");
185e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara        return Error::BAD_LAYER;
186e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      }
187e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara
188e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara      ComposerView::ComposerLayer client_target_layer = {
189e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara          .buffer = buffer_,
190e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara          .fence = fence_.get() ? fence_ : new Fence(-1),
191e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara          .display_frame = {0, 0, static_cast<int32_t>(buffer_->getWidth()),
192e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara            static_cast<int32_t>(buffer_->getHeight())},
193e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara          .crop = {0.0f, 0.0f, static_cast<float>(buffer_->getWidth()),
194e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara            static_cast<float>(buffer_->getHeight())},
195e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara          .blend_mode = IComposerClient::BlendMode::NONE,
196e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara      };
197e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara
198e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara      frame.push_back(client_target_layer);
199e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara      queued_client_target = true;
200e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    } else {
201e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara      if (!layer.info.buffer.get() || !layer.info.fence.get()) {
2023e7dad572220e2c4b9bfbd471a6278385e99330dDaniel Nicoara        ALOGV("Layer requested without valid buffer");
2033e7dad572220e2c4b9bfbd471a6278385e99330dDaniel Nicoara        continue;
204e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara      }
205e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara
206e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      frame.push_back(layer.info);
207e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    }
208e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  }
209e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
210e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara  out_frames->swap(frame);
211e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara  return Error::NONE;
21251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
21351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
214e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoarastd::vector<Layer> HwcDisplay::UpdateLastFrameAndGetLastFrameLayers() {
215e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara  std::vector<Layer> last_frame_layers;
216e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara  last_frame_layers.swap(last_frame_layers_ids_);
21751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
218e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara  for (const auto& layer : layers_)
219e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara    last_frame_layers_ids_.push_back(layer.info.id);
220e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara
221e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara  return last_frame_layers;
222e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
223e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
224730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulkvoid HwcDisplay::SetColorTransform(const float* matrix, int32_t hint) {
225730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  color_transform_hint_ = hint;
226730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  if (matrix)
227730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk    memcpy(color_transform_, matrix, sizeof(color_transform_));
228730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk}
229730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk
230784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliuvoid HwcDisplay::dumpDebugInfo(std::string* result) const {
231784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliu  if (!result) {
232784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliu    return;
233784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliu  }
234784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliu  *result += StringPrintf("HwcDisplay: width: %d, height: %d, layers size: %zu, colormode: %d\
235784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliu      , config: %d\n", width_, height_, layers_.size(), color_mode_, active_config_);
236784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliu  *result += StringPrintf("HwcDisplay buffer metadata: width: %d, height: %d, stride: %d,\
237784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliu      layerCount: %d, pixelFormat: %d\n", buffer_metadata_.width, buffer_metadata_.height,
238784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliu      buffer_metadata_.stride, buffer_metadata_.layerCount, buffer_metadata_.format);
239784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliu  for (const auto& layer : layers_) {
240784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliu    layer.dumpDebugInfo(result);
241784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliu  }
242784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliu}
243784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliu
244e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko////////////////////////////////////////////////////////////////////////////////
245e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// VrHwcClient
24651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
247d330a62612e287b63442db2470d89c55ad326f27Daniel NicoaraVrHwc::VrHwc() {}
24851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
24951a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraVrHwc::~VrHwc() {}
25051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
25141b98d41f9f4e94a1a9a31960a317649cbec3b09Chia-I Wubool VrHwc::hasCapability(hwc2_capability_t /* capability */) { return false; }
25251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
253513476ab1802bf315d70a854512f4940a035fcf9Chia-I Wuvoid VrHwc::registerEventCallback(EventCallback* callback) {
254c683dfeccb10aeee7abc9b1e496bd88581a1860cSteven Thomas  {
255c683dfeccb10aeee7abc9b1e496bd88581a1860cSteven Thomas    std::lock_guard<std::mutex> guard(mutex_);
256c683dfeccb10aeee7abc9b1e496bd88581a1860cSteven Thomas    event_callback_ = callback;
257c683dfeccb10aeee7abc9b1e496bd88581a1860cSteven Thomas    int32_t width, height;
258c683dfeccb10aeee7abc9b1e496bd88581a1860cSteven Thomas    GetPrimaryDisplaySize(&width, &height);
259c683dfeccb10aeee7abc9b1e496bd88581a1860cSteven Thomas    // Create the primary display late to avoid initialization issues between
260c683dfeccb10aeee7abc9b1e496bd88581a1860cSteven Thomas    // VR HWC and SurfaceFlinger.
261c683dfeccb10aeee7abc9b1e496bd88581a1860cSteven Thomas    displays_[kDefaultDisplayId].reset(new HwcDisplay(width, height));
26251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  }
263c683dfeccb10aeee7abc9b1e496bd88581a1860cSteven Thomas  event_callback_->onHotplug(kDefaultDisplayId,
264c683dfeccb10aeee7abc9b1e496bd88581a1860cSteven Thomas                             IComposerCallback::Connection::CONNECTED);
265c683dfeccb10aeee7abc9b1e496bd88581a1860cSteven Thomas}
266c683dfeccb10aeee7abc9b1e496bd88581a1860cSteven Thomas
267c683dfeccb10aeee7abc9b1e496bd88581a1860cSteven Thomasvoid VrHwc::unregisterEventCallback() {
268c683dfeccb10aeee7abc9b1e496bd88581a1860cSteven Thomas  std::lock_guard<std::mutex> guard(mutex_);
269c683dfeccb10aeee7abc9b1e496bd88581a1860cSteven Thomas  event_callback_ = nullptr;
27051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
27151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
272a6cc42264e021e37ec52c189dc8e1059d45d4f9bDaniel Nicoarauint32_t VrHwc::getMaxVirtualDisplayCount() { return 1; }
27351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
27451a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::createVirtualDisplay(uint32_t width, uint32_t height,
27551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                                  PixelFormat* format, Display* outDisplay) {
27651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  *format = PixelFormat::RGBA_8888;
277a6cc42264e021e37ec52c189dc8e1059d45d4f9bDaniel Nicoara  *outDisplay = display_count_;
278d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara  displays_[display_count_].reset(new HwcDisplay(width, height));
279a6cc42264e021e37ec52c189dc8e1059d45d4f9bDaniel Nicoara  display_count_++;
28051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
28151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
28251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
2832b3b666cfd89681514764201803e48b6ba112a80Albert ChaulkError VrHwc::destroyVirtualDisplay(Display display) {
2842b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  std::lock_guard<std::mutex> guard(mutex_);
2852b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (display == kDefaultDisplayId || displays_.erase(display) == 0)
28651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    return Error::BAD_DISPLAY;
2872b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  ComposerView::Frame frame;
2882b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  frame.display_id = display;
2892b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  frame.removed = true;
2902b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (observer_)
2912b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    observer_->OnNewFrame(frame);
2922b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  return Error::NONE;
2932b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk}
29451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
2952b3b666cfd89681514764201803e48b6ba112a80Albert ChaulkError VrHwc::createLayer(Display display, Layer* outLayer) {
29651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  std::lock_guard<std::mutex> guard(mutex_);
2972b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  auto display_ptr = FindDisplay(display);
2982b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (!display_ptr)
2992b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_DISPLAY;
30051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
3012b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  HwcLayer* layer = display_ptr->CreateLayer();
302e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara  *outLayer = layer->info.id;
30351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
30451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
30551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
30651a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::destroyLayer(Display display, Layer layer) {
30751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  std::lock_guard<std::mutex> guard(mutex_);
3082b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  auto display_ptr = FindDisplay(display);
3092b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (!display_ptr) {
3102b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_DISPLAY;
3112b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  }
31251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
3132b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  return display_ptr->DestroyLayer(layer) ? Error::NONE : Error::BAD_LAYER;
31451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
31551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
31651a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::getActiveConfig(Display display, Config* outConfig) {
3172b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  std::lock_guard<std::mutex> guard(mutex_);
3182b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (!FindDisplay(display))
3192b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_DISPLAY;
32051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  *outConfig = kDefaultConfigId;
32151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
32251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
32351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
324b0d89ff617e4c39d0d0aba650854492077321dbbDaniel NicoaraError VrHwc::getClientTargetSupport(Display /* display */, uint32_t /* width */,
325b0d89ff617e4c39d0d0aba650854492077321dbbDaniel Nicoara                                    uint32_t /* height */,
326b0d89ff617e4c39d0d0aba650854492077321dbbDaniel Nicoara                                    PixelFormat /* format */,
327b0d89ff617e4c39d0d0aba650854492077321dbbDaniel Nicoara                                    Dataspace /* dataspace */) {
32851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
32951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
33051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
331b0d89ff617e4c39d0d0aba650854492077321dbbDaniel NicoaraError VrHwc::getColorModes(Display /* display */,
332b0d89ff617e4c39d0d0aba650854492077321dbbDaniel Nicoara                           hidl_vec<ColorMode>* outModes) {
33351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  std::vector<ColorMode> color_modes(1, ColorMode::NATIVE);
33451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  *outModes = hidl_vec<ColorMode>(color_modes);
33551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
33651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
33751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
33851a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::getDisplayAttribute(Display display, Config config,
33951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                                 IComposerClient::Attribute attribute,
34051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                                 int32_t* outValue) {
3412b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  std::lock_guard<std::mutex> guard(mutex_);
342d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara  auto display_ptr = FindDisplay(display);
343d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara  if (!display_ptr) {
34451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    return Error::BAD_DISPLAY;
345d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara  }
34651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (config != kDefaultConfigId) {
34751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    return Error::BAD_CONFIG;
34851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  }
34951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
35051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  switch (attribute) {
35151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    case IComposerClient::Attribute::WIDTH:
352d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara      *outValue = display_ptr->width();
35351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara      break;
35451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    case IComposerClient::Attribute::HEIGHT:
355d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara      *outValue = display_ptr->height();
35651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara      break;
35751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    case IComposerClient::Attribute::VSYNC_PERIOD:
35822c1462add2567fffc6910b120c93b6074f2641bStephen Kiazyk      {
35922c1462add2567fffc6910b120c93b6074f2641bStephen Kiazyk        int error = 0;
36022c1462add2567fffc6910b120c93b6074f2641bStephen Kiazyk        auto display_client = display::DisplayClient::Create(&error);
36122c1462add2567fffc6910b120c93b6074f2641bStephen Kiazyk        if (!display_client) {
36222c1462add2567fffc6910b120c93b6074f2641bStephen Kiazyk          ALOGE("Could not connect to display service : %s(%d)",
36322c1462add2567fffc6910b120c93b6074f2641bStephen Kiazyk                strerror(error), error);
36422c1462add2567fffc6910b120c93b6074f2641bStephen Kiazyk          // Return a default value of 30 fps
36522c1462add2567fffc6910b120c93b6074f2641bStephen Kiazyk          *outValue = 1000 * 1000 * 1000 / 30;
36622c1462add2567fffc6910b120c93b6074f2641bStephen Kiazyk        } else {
36722c1462add2567fffc6910b120c93b6074f2641bStephen Kiazyk          auto metrics = display_client->GetDisplayMetrics();
36822c1462add2567fffc6910b120c93b6074f2641bStephen Kiazyk          *outValue = metrics.get().vsync_period_ns;
36922c1462add2567fffc6910b120c93b6074f2641bStephen Kiazyk        }
37022c1462add2567fffc6910b120c93b6074f2641bStephen Kiazyk      }
37151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara      break;
37251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    case IComposerClient::Attribute::DPI_X:
37351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    case IComposerClient::Attribute::DPI_Y:
374bd9f4d2fef3028bec848bdc216681f4b1678e932Kevin Schoedel      {
375bd9f4d2fef3028bec848bdc216681f4b1678e932Kevin Schoedel        constexpr int32_t kDefaultDPI = 300;
376bd9f4d2fef3028bec848bdc216681f4b1678e932Kevin Schoedel        int32_t dpi = property_get_int32("ro.vr.hwc.dpi", kDefaultDPI);
377bd9f4d2fef3028bec848bdc216681f4b1678e932Kevin Schoedel        if (dpi <= 0) {
378bd9f4d2fef3028bec848bdc216681f4b1678e932Kevin Schoedel          dpi = kDefaultDPI;
379bd9f4d2fef3028bec848bdc216681f4b1678e932Kevin Schoedel        }
380bd9f4d2fef3028bec848bdc216681f4b1678e932Kevin Schoedel        *outValue = 1000 * dpi;
381bd9f4d2fef3028bec848bdc216681f4b1678e932Kevin Schoedel      }
38251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara      break;
38351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    default:
38451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara      return Error::BAD_PARAMETER;
38551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  }
38651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
38751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
38851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
38951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
39051a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::getDisplayConfigs(Display display, hidl_vec<Config>* outConfigs) {
3912b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  std::lock_guard<std::mutex> guard(mutex_);
3922b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (!FindDisplay(display))
39351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    return Error::BAD_DISPLAY;
39451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  std::vector<Config> configs(1, kDefaultConfigId);
39551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  *outConfigs = hidl_vec<Config>(configs);
39651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
39751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
39851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
399b0d89ff617e4c39d0d0aba650854492077321dbbDaniel NicoaraError VrHwc::getDisplayName(Display /* display */, hidl_string* outName) {
40051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  *outName = hidl_string();
40151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
40251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
40351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
40451a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::getDisplayType(Display display,
40551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                            IComposerClient::DisplayType* outType) {
4062b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  std::lock_guard<std::mutex> guard(mutex_);
4072b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  auto display_ptr = FindDisplay(display);
4082b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (!display_ptr) {
40951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    *outType = IComposerClient::DisplayType::INVALID;
41051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    return Error::BAD_DISPLAY;
41151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  }
41251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
413a6cc42264e021e37ec52c189dc8e1059d45d4f9bDaniel Nicoara  if (display == kDefaultDisplayId)
414a6cc42264e021e37ec52c189dc8e1059d45d4f9bDaniel Nicoara    *outType = IComposerClient::DisplayType::PHYSICAL;
415a6cc42264e021e37ec52c189dc8e1059d45d4f9bDaniel Nicoara  else
416a6cc42264e021e37ec52c189dc8e1059d45d4f9bDaniel Nicoara    *outType = IComposerClient::DisplayType::VIRTUAL;
417a6cc42264e021e37ec52c189dc8e1059d45d4f9bDaniel Nicoara
41851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
41951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
42051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
42151a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::getDozeSupport(Display display, bool* outSupport) {
42251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  *outSupport = false;
4232b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  std::lock_guard<std::mutex> guard(mutex_);
4242b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (!FindDisplay(display))
42551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    return Error::BAD_DISPLAY;
4262b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  return Error::NONE;
42751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
42851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
429b0d89ff617e4c39d0d0aba650854492077321dbbDaniel NicoaraError VrHwc::getHdrCapabilities(Display /* display */,
430b0d89ff617e4c39d0d0aba650854492077321dbbDaniel Nicoara                                hidl_vec<Hdr>* /* outTypes */,
43151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                                float* outMaxLuminance,
43251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                                float* outMaxAverageLuminance,
43351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                                float* outMinLuminance) {
43451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  *outMaxLuminance = 0;
43551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  *outMaxAverageLuminance = 0;
43651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  *outMinLuminance = 0;
43751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
43851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
43951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
44051a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setActiveConfig(Display display, Config config) {
4412b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  std::lock_guard<std::mutex> guard(mutex_);
442730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  auto display_ptr = FindDisplay(display);
443730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  if (!display_ptr)
4442b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_DISPLAY;
4452b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (config != kDefaultConfigId)
4462b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_CONFIG;
44751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
448730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  display_ptr->set_active_config(config);
44951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
45051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
45151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
45251a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setColorMode(Display display, ColorMode mode) {
4532b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  std::lock_guard<std::mutex> guard(mutex_);
454730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  auto display_ptr = FindDisplay(display);
455730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  if (!display_ptr)
4562b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_DISPLAY;
457730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk
458730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  display_ptr->set_color_mode(mode);
45951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
46051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
46151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
46251a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setPowerMode(Display display, IComposerClient::PowerMode mode) {
4632b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  std::lock_guard<std::mutex> guard(mutex_);
464730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  auto display_ptr = FindDisplay(display);
465730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  if (!display_ptr)
4662b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_DISPLAY;
467730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk
468730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  display_ptr->set_power_mode(mode);
46951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
47051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
47151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
47251a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setVsyncEnabled(Display display, IComposerClient::Vsync enabled) {
4732b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  std::lock_guard<std::mutex> guard(mutex_);
474730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  auto display_ptr = FindDisplay(display);
475730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  if (!display_ptr)
4762b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_DISPLAY;
477730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk
478730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  display_ptr->set_vsync_enabled(enabled);
47951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
48051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
48151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
48251a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setColorTransform(Display display, const float* matrix,
48351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                               int32_t hint) {
4842b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  std::lock_guard<std::mutex> guard(mutex_);
485730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  auto display_ptr = FindDisplay(display);
486730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  if (!display_ptr)
4872b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_DISPLAY;
488730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk
489730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  display_ptr->SetColorTransform(matrix, hint);
49051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
49151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
49251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
49351a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setClientTarget(Display display, buffer_handle_t target,
494b0d89ff617e4c39d0d0aba650854492077321dbbDaniel Nicoara                             int32_t acquireFence, int32_t /* dataspace */,
495b0d89ff617e4c39d0d0aba650854492077321dbbDaniel Nicoara                             const std::vector<hwc_rect_t>& /* damage */) {
49651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  base::unique_fd fence(acquireFence);
49751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  std::lock_guard<std::mutex> guard(mutex_);
4982b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  auto display_ptr = FindDisplay(display);
4992b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (!display_ptr)
5002b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_DISPLAY;
50151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
5022b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (target == nullptr)
5032b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::NONE;
5042b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk
5052b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (!display_ptr->SetClientTarget(target, std::move(fence)))
50651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    return Error::BAD_PARAMETER;
50751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
50851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
50951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
51051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
511b0d89ff617e4c39d0d0aba650854492077321dbbDaniel NicoaraError VrHwc::setOutputBuffer(Display display, buffer_handle_t /* buffer */,
51251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                             int32_t releaseFence) {
51351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  base::unique_fd fence(releaseFence);
5142b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  std::lock_guard<std::mutex> guard(mutex_);
5152b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  auto display_ptr = FindDisplay(display);
5162b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (!display_ptr)
5172b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_DISPLAY;
51851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
519a6cc42264e021e37ec52c189dc8e1059d45d4f9bDaniel Nicoara  // TODO(dnicoara): Is it necessary to do anything here?
520a6cc42264e021e37ec52c189dc8e1059d45d4f9bDaniel Nicoara  return Error::NONE;
52151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
52251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
52351a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::validateDisplay(
52451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    Display display, std::vector<Layer>* outChangedLayers,
52551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    std::vector<IComposerClient::Composition>* outCompositionTypes,
526b0d89ff617e4c39d0d0aba650854492077321dbbDaniel Nicoara    uint32_t* /* outDisplayRequestMask */,
527b0d89ff617e4c39d0d0aba650854492077321dbbDaniel Nicoara    std::vector<Layer>* /* outRequestedLayers */,
528b0d89ff617e4c39d0d0aba650854492077321dbbDaniel Nicoara    std::vector<uint32_t>* /* outRequestMasks */) {
52951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  std::lock_guard<std::mutex> guard(mutex_);
5302b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  auto display_ptr = FindDisplay(display);
5312b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (!display_ptr)
5322b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_DISPLAY;
53351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
5342b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  display_ptr->GetChangedCompositionTypes(outChangedLayers,
5352b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk                                          outCompositionTypes);
53651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
53751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
53851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
539b0d89ff617e4c39d0d0aba650854492077321dbbDaniel NicoaraError VrHwc::acceptDisplayChanges(Display /* display */) { return Error::NONE; }
54051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
54151a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::presentDisplay(Display display, int32_t* outPresentFence,
54251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                            std::vector<Layer>* outLayers,
54351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                            std::vector<int32_t>* outReleaseFences) {
54451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  *outPresentFence = -1;
545e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara  outLayers->clear();
546e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara  outReleaseFences->clear();
547e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara
5482b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  std::lock_guard<std::mutex> guard(mutex_);
5492b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  auto display_ptr = FindDisplay(display);
5502b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk
5512b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (!display_ptr)
55251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    return Error::BAD_DISPLAY;
55351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
5542b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  ComposerView::Frame frame;
555e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara  std::vector<Layer> last_frame_layers;
5562b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  Error status = display_ptr->GetFrame(&frame.layers);
5572b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  frame.display_id = display;
558d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara  frame.display_width = display_ptr->width();
559d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara  frame.display_height = display_ptr->height();
560730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  frame.active_config = display_ptr->active_config();
561730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  frame.power_mode = display_ptr->power_mode();
562730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  frame.vsync_enabled = display_ptr->vsync_enabled();
563730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  frame.color_transform_hint = display_ptr->color_transform_hint();
564730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  frame.color_mode = display_ptr->color_mode();
565730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  memcpy(frame.color_transform, display_ptr->color_transform(),
566730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk         sizeof(frame.color_transform));
567e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara  if (status != Error::NONE)
568e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara    return status;
569e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara
5702b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  last_frame_layers = display_ptr->UpdateLastFrameAndGetLastFrameLayers();
57151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
572e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara  base::unique_fd fence;
57351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (observer_)
574e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara    fence = observer_->OnNewFrame(frame);
575e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara
576e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara  if (fence.get() < 0)
577e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara    return Error::NONE;
578e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara
579e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara  *outPresentFence = dup(fence.get());
580e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara  outLayers->swap(last_frame_layers);
581e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara  for (size_t i = 0; i < outLayers->size(); ++i)
582e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara    outReleaseFences->push_back(dup(fence.get()));
58351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
58451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
58551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
58651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
58751a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerCursorPosition(Display display, Layer layer, int32_t x,
58851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                                    int32_t y) {
5892b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  std::lock_guard<std::mutex> guard(mutex_);
590730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  auto display_ptr = FindDisplay(display);
591730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  if (!display_ptr)
5922b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_DISPLAY;
593730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk
594730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  HwcLayer* hwc_layer = display_ptr->GetLayer(layer);
595730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  if (!hwc_layer)
596730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk    return Error::BAD_LAYER;
597730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk
598730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  hwc_layer->info.cursor_x = x;
599730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  hwc_layer->info.cursor_y = y;
60051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
60151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
60251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
60351a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerBuffer(Display display, Layer layer,
60451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                            buffer_handle_t buffer, int32_t acquireFence) {
60551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  base::unique_fd fence(acquireFence);
6062b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  std::lock_guard<std::mutex> guard(mutex_);
6072b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  auto display_ptr = FindDisplay(display);
6082b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (!display_ptr)
6092b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_DISPLAY;
61051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
6112b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  HwcLayer* hwc_layer = display_ptr->GetLayer(layer);
6122b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (!hwc_layer)
6132b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_LAYER;
614e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
6151f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara  hwc_layer->info.buffer = CreateGraphicBuffer(
6161f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara      buffer, hwc_layer->buffer_metadata);
617e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  hwc_layer->info.fence = new Fence(fence.release());
618e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
61951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
62051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
62151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
62251a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerSurfaceDamage(Display display, Layer layer,
62351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                                   const std::vector<hwc_rect_t>& damage) {
6242b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  std::lock_guard<std::mutex> guard(mutex_);
625730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  auto display_ptr = FindDisplay(display);
626730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  if (!display_ptr)
6272b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_DISPLAY;
628730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk
629730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  HwcLayer* hwc_layer = display_ptr->GetLayer(layer);
630730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  if (!hwc_layer)
631730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk    return Error::BAD_LAYER;
632730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk
633730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  hwc_layer->info.damaged_regions = damage;
63451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
63551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
63651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
63751a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerBlendMode(Display display, Layer layer, int32_t mode) {
6382b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  std::lock_guard<std::mutex> guard(mutex_);
6392b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  auto display_ptr = FindDisplay(display);
6402b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (!display_ptr)
6412b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_DISPLAY;
64251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
6432b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  HwcLayer* hwc_layer = display_ptr->GetLayer(layer);
6442b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (!hwc_layer)
6452b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_LAYER;
646e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
647e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  hwc_layer->info.blend_mode =
648e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      static_cast<ComposerView::ComposerLayer::BlendMode>(mode);
649e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
65051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
65151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
65251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
65351a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerColor(Display display, Layer layer,
65451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                           IComposerClient::Color color) {
6552b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  std::lock_guard<std::mutex> guard(mutex_);
656730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  auto display_ptr = FindDisplay(display);
657730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  if (!display_ptr)
6582b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_DISPLAY;
659730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk
660730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  HwcLayer* hwc_layer = display_ptr->GetLayer(layer);
661730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  if (!hwc_layer)
662730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk    return Error::BAD_LAYER;
663730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk
664730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  hwc_layer->info.color = color;
66551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
66651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
66751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
66851a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerCompositionType(Display display, Layer layer,
66951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                                     int32_t type) {
6702b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  std::lock_guard<std::mutex> guard(mutex_);
6712b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  auto display_ptr = FindDisplay(display);
6722b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (!display_ptr)
6732b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_DISPLAY;
67451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
6752b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  HwcLayer* hwc_layer = display_ptr->GetLayer(layer);
6762b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (!hwc_layer)
6772b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_LAYER;
678e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
679e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  hwc_layer->composition_type = static_cast<HwcLayer::Composition>(type);
680e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
68151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
68251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
68351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
68451a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerDataspace(Display display, Layer layer,
68551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                               int32_t dataspace) {
6862b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  std::lock_guard<std::mutex> guard(mutex_);
687730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  auto display_ptr = FindDisplay(display);
688730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  if (!display_ptr)
6892b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_DISPLAY;
690730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk
691730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  HwcLayer* hwc_layer = display_ptr->GetLayer(layer);
692730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  if (!hwc_layer)
693730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk    return Error::BAD_LAYER;
694730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk
695730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  hwc_layer->info.dataspace = dataspace;
69651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
69751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
69851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
69951a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerDisplayFrame(Display display, Layer layer,
70051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                                  const hwc_rect_t& frame) {
7012b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  std::lock_guard<std::mutex> guard(mutex_);
7022b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  auto display_ptr = FindDisplay(display);
7032b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (!display_ptr)
7042b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_DISPLAY;
70551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
7062b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  HwcLayer* hwc_layer = display_ptr->GetLayer(layer);
7072b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (!hwc_layer)
7082b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_LAYER;
709e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
710e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  hwc_layer->info.display_frame =
711e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      {frame.left, frame.top, frame.right, frame.bottom};
712e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
71351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
71451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
71551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
71651a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerPlaneAlpha(Display display, Layer layer, float alpha) {
7172b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  std::lock_guard<std::mutex> guard(mutex_);
7182b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  auto display_ptr = FindDisplay(display);
7192b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (!display_ptr)
7202b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_DISPLAY;
72151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
7222b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  HwcLayer* hwc_layer = display_ptr->GetLayer(layer);
7232b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (!hwc_layer)
7242b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_LAYER;
725e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
726e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  hwc_layer->info.alpha = alpha;
727e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
72851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
72951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
73051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
731b0d89ff617e4c39d0d0aba650854492077321dbbDaniel NicoaraError VrHwc::setLayerSidebandStream(Display display, Layer /* layer */,
732b0d89ff617e4c39d0d0aba650854492077321dbbDaniel Nicoara                                    buffer_handle_t /* stream */) {
7332b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  std::lock_guard<std::mutex> guard(mutex_);
7342b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (!FindDisplay(display))
7352b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_DISPLAY;
73651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
73751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
73851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
73951a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerSourceCrop(Display display, Layer layer,
74051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                                const hwc_frect_t& crop) {
7412b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  std::lock_guard<std::mutex> guard(mutex_);
7422b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  auto display_ptr = FindDisplay(display);
7432b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (!display_ptr)
7442b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_DISPLAY;
74551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
7462b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  HwcLayer* hwc_layer = display_ptr->GetLayer(layer);
7472b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (!hwc_layer)
7482b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_LAYER;
749e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
750e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  hwc_layer->info.crop = {crop.left, crop.top, crop.right, crop.bottom};
751e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
75251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
75351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
75451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
75551a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerTransform(Display display, Layer layer,
75651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                               int32_t transform) {
7572b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  std::lock_guard<std::mutex> guard(mutex_);
758730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  auto display_ptr = FindDisplay(display);
759730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  if (!display_ptr)
7602b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_DISPLAY;
761730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk
762730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  HwcLayer* hwc_layer = display_ptr->GetLayer(layer);
763730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  if (!hwc_layer)
764730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk    return Error::BAD_LAYER;
765730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk
766730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  hwc_layer->info.transform = transform;
76751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
76851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
76951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
77051a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerVisibleRegion(Display display, Layer layer,
77151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                                   const std::vector<hwc_rect_t>& visible) {
7722b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  std::lock_guard<std::mutex> guard(mutex_);
773730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  auto display_ptr = FindDisplay(display);
774730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  if (!display_ptr)
7752b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_DISPLAY;
776730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk
777730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  HwcLayer* hwc_layer = display_ptr->GetLayer(layer);
778730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  if (!hwc_layer)
779730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk    return Error::BAD_LAYER;
780730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk
781730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  hwc_layer->info.visible_regions = visible;
78251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
78351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
78451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
78551a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerZOrder(Display display, Layer layer, uint32_t z) {
7862b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  std::lock_guard<std::mutex> guard(mutex_);
7872b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  auto display_ptr = FindDisplay(display);
7882b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (!display_ptr)
7892b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_DISPLAY;
79051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
7912b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  HwcLayer* hwc_layer = display_ptr->GetLayer(layer);
7922b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (!hwc_layer)
7932b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_LAYER;
794e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
795730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  hwc_layer->info.z_order = z;
796e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
79751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
79851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
79951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
80051a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerInfo(Display display, Layer layer, uint32_t type,
80151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                          uint32_t appId) {
8022b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  std::lock_guard<std::mutex> guard(mutex_);
8032b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  auto display_ptr = FindDisplay(display);
8042b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (!display_ptr)
8052b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_DISPLAY;
80651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
8072b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  HwcLayer* hwc_layer = display_ptr->GetLayer(layer);
8082b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (!hwc_layer)
8092b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_LAYER;
810e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
811e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  hwc_layer->info.type = type;
812e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  hwc_layer->info.app_id = appId;
813e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
81451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
81551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
81651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
8171f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel NicoaraError VrHwc::setClientTargetMetadata(
8181f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara    Display display, const IVrComposerClient::BufferMetadata& metadata) {
8191f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara  std::lock_guard<std::mutex> guard(mutex_);
8201f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara  auto display_ptr = FindDisplay(display);
8211f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara  if (!display_ptr)
8221f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara    return Error::BAD_DISPLAY;
8231f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara
8241f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara  display_ptr->SetClientTargetMetadata(metadata);
8251f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara
8261f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara  return Error::NONE;
8271f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara}
8281f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara
8291f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel NicoaraError VrHwc::setLayerBufferMetadata(
8301f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara    Display display, Layer layer,
8311f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara    const IVrComposerClient::BufferMetadata& metadata) {
8321f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara  std::lock_guard<std::mutex> guard(mutex_);
8331f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara  auto display_ptr = FindDisplay(display);
8341f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara  if (!display_ptr)
8351f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara    return Error::BAD_DISPLAY;
8361f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara
8371f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara  HwcLayer* hwc_layer = display_ptr->GetLayer(layer);
8381f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara  if (!hwc_layer)
8391f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara    return Error::BAD_LAYER;
8401f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara
8411f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara  hwc_layer->buffer_metadata = metadata;
8421f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara
8431f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara  return Error::NONE;
8441f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara}
8451f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara
84651a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraReturn<void> VrHwc::getCapabilities(getCapabilities_cb hidl_cb) {
84751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  hidl_cb(hidl_vec<Capability>());
84851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Void();
84951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
85051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
85151a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraReturn<void> VrHwc::dumpDebugInfo(dumpDebugInfo_cb hidl_cb) {
852784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliu  std::string result;
853784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliu
854784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliu  {
855784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliu    std::lock_guard<std::mutex> guard(mutex_);
856784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliu    result = "\nVrHwc states:\n";
857784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliu    for (const auto& pair : displays_) {
858784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliu      result += StringPrintf("Display id: %lu\n", (unsigned long)pair.first);
859784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliu      pair.second->dumpDebugInfo(&result);
860784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliu    }
861784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliu    result += "\n";
862784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliu  }
863784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliu
864784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliu  hidl_cb(hidl_string(result));
86551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Void();
86651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
86751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
86851a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraReturn<void> VrHwc::createClient(createClient_cb hidl_cb) {
86951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  std::lock_guard<std::mutex> guard(mutex_);
87051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
87151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  Error status = Error::NONE;
87251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  sp<VrComposerClient> client;
87314c461a47806524f7bb51273df7d45fb8648b4b7Steven Thomas  if (!client_.promote().get()) {
87451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    client = new VrComposerClient(*this);
87551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  } else {
87651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    ALOGE("Already have a client");
87751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    status = Error::NO_RESOURCES;
87851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  }
87951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
88051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  client_ = client;
88151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  hidl_cb(status, client);
88251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Void();
88351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
88451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
8858fc9822f3b20f6547c3398c55e8b70c4f3940db9Daniel Nicoaravoid VrHwc::ForceDisplaysRefresh() {
8868fc9822f3b20f6547c3398c55e8b70c4f3940db9Daniel Nicoara  std::lock_guard<std::mutex> guard(mutex_);
887513476ab1802bf315d70a854512f4940a035fcf9Chia-I Wu  if (event_callback_ != nullptr) {
8888fc9822f3b20f6547c3398c55e8b70c4f3940db9Daniel Nicoara    for (const auto& pair : displays_)
889513476ab1802bf315d70a854512f4940a035fcf9Chia-I Wu      event_callback_->onRefresh(pair.first);
8908fc9822f3b20f6547c3398c55e8b70c4f3940db9Daniel Nicoara  }
8918fc9822f3b20f6547c3398c55e8b70c4f3940db9Daniel Nicoara}
8928fc9822f3b20f6547c3398c55e8b70c4f3940db9Daniel Nicoara
89351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoaravoid VrHwc::RegisterObserver(Observer* observer) {
89451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  std::lock_guard<std::mutex> guard(mutex_);
89551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (observer_)
89651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    ALOGE("Overwriting observer");
89751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  else
89851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    observer_ = observer;
89951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
90051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
90151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoaravoid VrHwc::UnregisterObserver(Observer* observer) {
90251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  std::lock_guard<std::mutex> guard(mutex_);
90351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (observer != observer_)
90451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    ALOGE("Trying to unregister unknown observer");
90551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  else
90651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    observer_ = nullptr;
90751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
90851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
9092b3b666cfd89681514764201803e48b6ba112a80Albert ChaulkHwcDisplay* VrHwc::FindDisplay(Display display) {
9102b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  auto iter = displays_.find(display);
9112b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  return iter == displays_.end() ? nullptr : iter->second.get();
9122b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk}
9132b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk
914784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliuvoid HwcLayer::dumpDebugInfo(std::string* result) const {
915784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliu  if (!result) {
916784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliu    return;
917784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliu  }
918784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliu  *result += StringPrintf("Layer: composition_type: %d, type: %d, app_id: %d, z_order: %d,\
919784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliu      cursor_x: %d, cursor_y: %d, color(rgba): (%d,%d,%d,%d), dataspace: %d, transform: %d,\
920784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliu      display_frame(LTRB): (%d,%d,%d,%d), crop(LTRB): (%.1f,%.1f,%.1f,%.1f), blend_mode: %d\n",
921784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliu      composition_type, info.type, info.app_id, info.z_order, info.cursor_x, info.cursor_y,
922784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliu      info.color.r, info.color.g, info.color.b, info.color.a, info.dataspace, info.transform,
923784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliu      info.display_frame.left, info.display_frame.top, info.display_frame.right,
924784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliu      info.display_frame.bottom, info.crop.left, info.crop.top, info.crop.right,
925784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliu      info.crop.bottom, info.blend_mode);
926784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliu  *result += StringPrintf("Layer buffer metadata: width: %d, height: %d, stride: %d, layerCount: %d\
927784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliu      , pixelFormat: %d\n", buffer_metadata.width, buffer_metadata.height, buffer_metadata.stride,
928784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliu      buffer_metadata.layerCount, buffer_metadata.format);
929784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliu}
930784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliu
93151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}  // namespace dvr
93251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}  // namespace android
933