vr_hwc.cpp revision 22c1462add2567fffc6910b120c93b6074f2641b
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
184251e92b6dacb5653aa9528d88484085ee333e3bDaniel Nicoara#include <private/dvr/display_client.h>
1951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara#include <ui/Fence.h>
2051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
2151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara#include <mutex>
2251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
23e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include "vr_composer_client.h"
2451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
2551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoarausing namespace android::hardware::graphics::common::V1_0;
2651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoarausing namespace android::hardware::graphics::composer::V2_1;
2751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
2851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoarausing android::hardware::hidl_handle;
2951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoarausing android::hardware::hidl_string;
3051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoarausing android::hardware::hidl_vec;
3151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoarausing android::hardware::Return;
3251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoarausing android::hardware::Void;
3351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
3451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoaranamespace android {
3551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoaranamespace dvr {
3651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoaranamespace {
3751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
3851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoarausing android::hardware::graphics::common::V1_0::PixelFormat;
3951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
4051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoaraconst Display kDefaultDisplayId = 1;
4151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoaraconst Config kDefaultConfigId = 1;
4251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
431f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoarasp<GraphicBuffer> CreateGraphicBuffer(
441f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara    const native_handle_t* handle,
451f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara    const IVrComposerClient::BufferMetadata& metadata) {
461f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara   sp<GraphicBuffer> buffer = new GraphicBuffer(
471f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara      handle, GraphicBuffer::CLONE_HANDLE, metadata.width, metadata.height,
481f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara      static_cast<int32_t>(metadata.format), metadata.layerCount,
4973feb0676635da6c0f738c10e04052a8162a4095Chris Forbes      metadata.usage, metadata.stride);
501f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara   if (buffer->initCheck() != OK) {
511f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara     ALOGE("Failed to create graphic buffer");
521f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara     return nullptr;
531f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara   }
541f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara
551f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara   return buffer;
56e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
57e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
58d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoaravoid GetPrimaryDisplaySize(int32_t* width, int32_t* height) {
59d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara  *width = 1080;
60d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara  *height = 1920;
61d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara
62d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara  int error = 0;
632251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  auto display_client = display::DisplayClient::Create(&error);
642251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  if (!display_client) {
65d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara    ALOGE("Could not connect to display service : %s(%d)", strerror(error),
66d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara          error);
67d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara    return;
68d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara  }
69d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara
702251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  auto status = display_client->GetDisplayMetrics();
712251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  if (!status) {
72d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara    ALOGE("Could not get display metrics from display service : %s(%d)",
732251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka          status.GetErrorMessage().c_str(), status.error());
74d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara    return;
75d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara  }
76d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara
772251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  *width = status.get().display_width;
782251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  *height = status.get().display_height;
79d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara}
80d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara
8151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}  // namespace
8251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
83d330a62612e287b63442db2470d89c55ad326f27Daniel NicoaraHwcDisplay::HwcDisplay(int32_t width, int32_t height)
84d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara    : width_(width), height_(height) {}
8551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
8651a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraHwcDisplay::~HwcDisplay() {}
8751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
8851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoarabool HwcDisplay::SetClientTarget(const native_handle_t* handle,
8951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                                 base::unique_fd fence) {
90e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  if (handle)
911f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara    buffer_ = CreateGraphicBuffer(handle, buffer_metadata_);
9251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
9351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  fence_ = new Fence(fence.release());
9451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return true;
9551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
9651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
971f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoaravoid HwcDisplay::SetClientTargetMetadata(
981f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara    const IVrComposerClient::BufferMetadata& metadata) {
991f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara  buffer_metadata_ = metadata;
1001f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara}
1011f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara
10251a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraHwcLayer* HwcDisplay::CreateLayer() {
10351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  uint64_t layer_id = layer_ids_++;
10451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  layers_.push_back(HwcLayer(layer_id));
10551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return &layers_.back();
10651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
10751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
10851a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraHwcLayer* HwcDisplay::GetLayer(Layer id) {
10951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  for (size_t i = 0; i < layers_.size(); ++i)
1102b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    if (layers_[i].info.id == id)
1112b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk      return &layers_[i];
11251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
11351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return nullptr;
11451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
11551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
11651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoarabool HwcDisplay::DestroyLayer(Layer id) {
11751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  for (auto it = layers_.begin(); it != layers_.end(); ++it) {
118e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara    if (it->info.id == id) {
11951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara      layers_.erase(it);
12051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara      return true;
12151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    }
12251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  }
12351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
12451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return false;
12551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
12651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
12751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoaravoid HwcDisplay::GetChangedCompositionTypes(
12851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    std::vector<Layer>* layer_ids,
12951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    std::vector<IComposerClient::Composition>* types) {
130e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  std::sort(layers_.begin(), layers_.end(),
131e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko            [](const auto& lhs, const auto& rhs) {
132730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk              return lhs.info.z_order < rhs.info.z_order;
133e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko            });
134e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
135e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  int first_client_layer = -1, last_client_layer = -1;
136e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  for (size_t i = 0; i < layers_.size(); ++i) {
137e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    switch (layers_[i].composition_type) {
138e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      case IComposerClient::Composition::SOLID_COLOR:
139e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      case IComposerClient::Composition::CURSOR:
140e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      case IComposerClient::Composition::SIDEBAND:
141e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko        if (first_client_layer < 0)
142e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko          first_client_layer = i;
143e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
144e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko        last_client_layer = i;
145e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko        break;
146e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      default:
147e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko        break;
148e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    }
149e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  }
150e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
151e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  for (size_t i = 0; i < layers_.size(); ++i) {
152e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    if (i >= first_client_layer && i <= last_client_layer) {
153e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      if (layers_[i].composition_type != IComposerClient::Composition::CLIENT) {
154e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara        layer_ids->push_back(layers_[i].info.id);
155e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko        types->push_back(IComposerClient::Composition::CLIENT);
156e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko        layers_[i].composition_type = IComposerClient::Composition::CLIENT;
157e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      }
158e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
159e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      continue;
160e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    }
161e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
162e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    if (layers_[i].composition_type != IComposerClient::Composition::DEVICE) {
163e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara      layer_ids->push_back(layers_[i].info.id);
164e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      types->push_back(IComposerClient::Composition::DEVICE);
165e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      layers_[i].composition_type = IComposerClient::Composition::DEVICE;
166e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    }
16751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  }
16851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
16951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
170e7916f88ab250e9cbd7faa53458491f19b716782Daniel NicoaraError HwcDisplay::GetFrame(
171e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara    std::vector<ComposerView::ComposerLayer>* out_frames) {
172e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  bool queued_client_target = false;
173e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  std::vector<ComposerView::ComposerLayer> frame;
174e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  for (const auto& layer : layers_) {
175e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    if (layer.composition_type == IComposerClient::Composition::CLIENT) {
176e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara      if (queued_client_target)
177e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara        continue;
178e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara
179e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara      if (!buffer_.get()) {
180e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara        ALOGE("Client composition requested but no client target buffer");
181e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara        return Error::BAD_LAYER;
182e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      }
183e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara
184e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara      ComposerView::ComposerLayer client_target_layer = {
185e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara          .buffer = buffer_,
186e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara          .fence = fence_.get() ? fence_ : new Fence(-1),
187e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara          .display_frame = {0, 0, static_cast<int32_t>(buffer_->getWidth()),
188e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara            static_cast<int32_t>(buffer_->getHeight())},
189e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara          .crop = {0.0f, 0.0f, static_cast<float>(buffer_->getWidth()),
190e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara            static_cast<float>(buffer_->getHeight())},
191e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara          .blend_mode = IComposerClient::BlendMode::NONE,
192e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara      };
193e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara
194e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara      frame.push_back(client_target_layer);
195e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara      queued_client_target = true;
196e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    } else {
197e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara      if (!layer.info.buffer.get() || !layer.info.fence.get()) {
1983e7dad572220e2c4b9bfbd471a6278385e99330dDaniel Nicoara        ALOGV("Layer requested without valid buffer");
1993e7dad572220e2c4b9bfbd471a6278385e99330dDaniel Nicoara        continue;
200e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara      }
201e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara
202e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      frame.push_back(layer.info);
203e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    }
204e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  }
205e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
206e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara  out_frames->swap(frame);
207e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara  return Error::NONE;
20851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
20951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
210e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoarastd::vector<Layer> HwcDisplay::UpdateLastFrameAndGetLastFrameLayers() {
211e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara  std::vector<Layer> last_frame_layers;
212e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara  last_frame_layers.swap(last_frame_layers_ids_);
21351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
214e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara  for (const auto& layer : layers_)
215e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara    last_frame_layers_ids_.push_back(layer.info.id);
216e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara
217e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara  return last_frame_layers;
218e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
219e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
220730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulkvoid HwcDisplay::SetColorTransform(const float* matrix, int32_t hint) {
221730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  color_transform_hint_ = hint;
222730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  if (matrix)
223730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk    memcpy(color_transform_, matrix, sizeof(color_transform_));
224730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk}
225730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk
226e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko////////////////////////////////////////////////////////////////////////////////
227e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// VrHwcClient
22851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
229d330a62612e287b63442db2470d89c55ad326f27Daniel NicoaraVrHwc::VrHwc() {}
23051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
23151a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraVrHwc::~VrHwc() {}
23251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
23351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoarabool VrHwc::hasCapability(Capability capability) const { return false; }
23451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
23551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoaravoid VrHwc::removeClient() {
23651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  std::lock_guard<std::mutex> guard(mutex_);
23751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  client_ = nullptr;
23851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
23951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
24051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoaravoid VrHwc::enableCallback(bool enable) {
24151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (enable && client_ != nullptr) {
242d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara    {
243d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara      int32_t width, height;
244d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara      GetPrimaryDisplaySize(&width, &height);
245d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara      std::lock_guard<std::mutex> guard(mutex_);
246d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara      // Create the primary display late to avoid initialization issues between
247d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara      // VR HWC and SurfaceFlinger.
248d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara      displays_[kDefaultDisplayId].reset(new HwcDisplay(width, height));
249d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara    }
25051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    client_.promote()->onHotplug(kDefaultDisplayId,
25151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                                 IComposerCallback::Connection::CONNECTED);
25251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  }
25351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
25451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
255a6cc42264e021e37ec52c189dc8e1059d45d4f9bDaniel Nicoarauint32_t VrHwc::getMaxVirtualDisplayCount() { return 1; }
25651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
25751a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::createVirtualDisplay(uint32_t width, uint32_t height,
25851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                                  PixelFormat* format, Display* outDisplay) {
25951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  *format = PixelFormat::RGBA_8888;
260a6cc42264e021e37ec52c189dc8e1059d45d4f9bDaniel Nicoara  *outDisplay = display_count_;
261d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara  displays_[display_count_].reset(new HwcDisplay(width, height));
262a6cc42264e021e37ec52c189dc8e1059d45d4f9bDaniel Nicoara  display_count_++;
26351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
26451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
26551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
2662b3b666cfd89681514764201803e48b6ba112a80Albert ChaulkError VrHwc::destroyVirtualDisplay(Display display) {
2672b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  std::lock_guard<std::mutex> guard(mutex_);
2682b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (display == kDefaultDisplayId || displays_.erase(display) == 0)
26951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    return Error::BAD_DISPLAY;
2702b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  ComposerView::Frame frame;
2712b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  frame.display_id = display;
2722b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  frame.removed = true;
2732b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (observer_)
2742b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    observer_->OnNewFrame(frame);
2752b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  return Error::NONE;
2762b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk}
27751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
2782b3b666cfd89681514764201803e48b6ba112a80Albert ChaulkError VrHwc::createLayer(Display display, Layer* outLayer) {
27951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  std::lock_guard<std::mutex> guard(mutex_);
2802b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  auto display_ptr = FindDisplay(display);
2812b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (!display_ptr)
2822b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_DISPLAY;
28351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
2842b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  HwcLayer* layer = display_ptr->CreateLayer();
285e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara  *outLayer = layer->info.id;
28651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
28751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
28851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
28951a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::destroyLayer(Display display, Layer layer) {
29051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  std::lock_guard<std::mutex> guard(mutex_);
2912b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  auto display_ptr = FindDisplay(display);
2922b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (!display_ptr) {
2932b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_DISPLAY;
2942b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  }
29551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
2962b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  return display_ptr->DestroyLayer(layer) ? Error::NONE : Error::BAD_LAYER;
29751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
29851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
29951a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::getActiveConfig(Display display, Config* outConfig) {
3002b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  std::lock_guard<std::mutex> guard(mutex_);
3012b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (!FindDisplay(display))
3022b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_DISPLAY;
30351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  *outConfig = kDefaultConfigId;
30451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
30551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
30651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
30751a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::getClientTargetSupport(Display display, uint32_t width,
30851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                                    uint32_t height, PixelFormat format,
30951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                                    Dataspace dataspace) {
31051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
31151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
31251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
31351a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::getColorModes(Display display, hidl_vec<ColorMode>* outModes) {
31451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  std::vector<ColorMode> color_modes(1, ColorMode::NATIVE);
31551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  *outModes = hidl_vec<ColorMode>(color_modes);
31651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
31751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
31851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
31951a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::getDisplayAttribute(Display display, Config config,
32051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                                 IComposerClient::Attribute attribute,
32151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                                 int32_t* outValue) {
3222b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  std::lock_guard<std::mutex> guard(mutex_);
323d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara  auto display_ptr = FindDisplay(display);
324d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara  if (!display_ptr) {
32551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    return Error::BAD_DISPLAY;
326d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara  }
32751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (config != kDefaultConfigId) {
32851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    return Error::BAD_CONFIG;
32951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  }
33051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
33151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  switch (attribute) {
33251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    case IComposerClient::Attribute::WIDTH:
333d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara      *outValue = display_ptr->width();
33451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara      break;
33551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    case IComposerClient::Attribute::HEIGHT:
336d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara      *outValue = display_ptr->height();
33751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara      break;
33851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    case IComposerClient::Attribute::VSYNC_PERIOD:
33922c1462add2567fffc6910b120c93b6074f2641bStephen Kiazyk      {
34022c1462add2567fffc6910b120c93b6074f2641bStephen Kiazyk        int error = 0;
34122c1462add2567fffc6910b120c93b6074f2641bStephen Kiazyk        auto display_client = display::DisplayClient::Create(&error);
34222c1462add2567fffc6910b120c93b6074f2641bStephen Kiazyk        if (!display_client) {
34322c1462add2567fffc6910b120c93b6074f2641bStephen Kiazyk          ALOGE("Could not connect to display service : %s(%d)",
34422c1462add2567fffc6910b120c93b6074f2641bStephen Kiazyk                strerror(error), error);
34522c1462add2567fffc6910b120c93b6074f2641bStephen Kiazyk          // Return a default value of 30 fps
34622c1462add2567fffc6910b120c93b6074f2641bStephen Kiazyk          *outValue = 1000 * 1000 * 1000 / 30;
34722c1462add2567fffc6910b120c93b6074f2641bStephen Kiazyk        } else {
34822c1462add2567fffc6910b120c93b6074f2641bStephen Kiazyk          auto metrics = display_client->GetDisplayMetrics();
34922c1462add2567fffc6910b120c93b6074f2641bStephen Kiazyk          *outValue = metrics.get().vsync_period_ns;
35022c1462add2567fffc6910b120c93b6074f2641bStephen Kiazyk        }
35122c1462add2567fffc6910b120c93b6074f2641bStephen Kiazyk      }
35251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara      break;
35351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    case IComposerClient::Attribute::DPI_X:
35451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    case IComposerClient::Attribute::DPI_Y:
35551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara      *outValue = 300 * 1000;  // 300dpi
35651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara      break;
35751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    default:
35851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara      return Error::BAD_PARAMETER;
35951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  }
36051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
36151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
36251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
36351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
36451a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::getDisplayConfigs(Display display, hidl_vec<Config>* outConfigs) {
3652b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  std::lock_guard<std::mutex> guard(mutex_);
3662b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (!FindDisplay(display))
36751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    return Error::BAD_DISPLAY;
36851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  std::vector<Config> configs(1, kDefaultConfigId);
36951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  *outConfigs = hidl_vec<Config>(configs);
37051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
37151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
37251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
37351a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::getDisplayName(Display display, hidl_string* outName) {
37451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  *outName = hidl_string();
37551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
37651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
37751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
37851a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::getDisplayType(Display display,
37951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                            IComposerClient::DisplayType* outType) {
3802b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  std::lock_guard<std::mutex> guard(mutex_);
3812b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  auto display_ptr = FindDisplay(display);
3822b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (!display_ptr) {
38351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    *outType = IComposerClient::DisplayType::INVALID;
38451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    return Error::BAD_DISPLAY;
38551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  }
38651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
387a6cc42264e021e37ec52c189dc8e1059d45d4f9bDaniel Nicoara  if (display == kDefaultDisplayId)
388a6cc42264e021e37ec52c189dc8e1059d45d4f9bDaniel Nicoara    *outType = IComposerClient::DisplayType::PHYSICAL;
389a6cc42264e021e37ec52c189dc8e1059d45d4f9bDaniel Nicoara  else
390a6cc42264e021e37ec52c189dc8e1059d45d4f9bDaniel Nicoara    *outType = IComposerClient::DisplayType::VIRTUAL;
391a6cc42264e021e37ec52c189dc8e1059d45d4f9bDaniel Nicoara
39251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
39351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
39451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
39551a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::getDozeSupport(Display display, bool* outSupport) {
39651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  *outSupport = false;
3972b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  std::lock_guard<std::mutex> guard(mutex_);
3982b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (!FindDisplay(display))
39951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    return Error::BAD_DISPLAY;
4002b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  return Error::NONE;
40151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
40251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
40351a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::getHdrCapabilities(Display display, hidl_vec<Hdr>* outTypes,
40451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                                float* outMaxLuminance,
40551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                                float* outMaxAverageLuminance,
40651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                                float* outMinLuminance) {
40751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  *outMaxLuminance = 0;
40851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  *outMaxAverageLuminance = 0;
40951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  *outMinLuminance = 0;
41051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
41151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
41251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
41351a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setActiveConfig(Display display, Config config) {
4142b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  std::lock_guard<std::mutex> guard(mutex_);
415730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  auto display_ptr = FindDisplay(display);
416730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  if (!display_ptr)
4172b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_DISPLAY;
4182b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (config != kDefaultConfigId)
4192b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_CONFIG;
42051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
421730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  display_ptr->set_active_config(config);
42251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
42351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
42451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
42551a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setColorMode(Display display, ColorMode mode) {
4262b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  std::lock_guard<std::mutex> guard(mutex_);
427730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  auto display_ptr = FindDisplay(display);
428730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  if (!display_ptr)
4292b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_DISPLAY;
430730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk
431730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  display_ptr->set_color_mode(mode);
43251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
43351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
43451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
43551a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setPowerMode(Display display, IComposerClient::PowerMode mode) {
4362b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  std::lock_guard<std::mutex> guard(mutex_);
437730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  auto display_ptr = FindDisplay(display);
438730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  if (!display_ptr)
4392b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_DISPLAY;
440730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk
441730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  display_ptr->set_power_mode(mode);
44251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
44351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
44451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
44551a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setVsyncEnabled(Display display, IComposerClient::Vsync enabled) {
4462b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  std::lock_guard<std::mutex> guard(mutex_);
447730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  auto display_ptr = FindDisplay(display);
448730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  if (!display_ptr)
4492b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_DISPLAY;
450730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk
451730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  display_ptr->set_vsync_enabled(enabled);
45251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
45351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
45451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
45551a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setColorTransform(Display display, const float* matrix,
45651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                               int32_t hint) {
4572b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  std::lock_guard<std::mutex> guard(mutex_);
458730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  auto display_ptr = FindDisplay(display);
459730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  if (!display_ptr)
4602b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_DISPLAY;
461730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk
462730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  display_ptr->SetColorTransform(matrix, hint);
46351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
46451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
46551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
46651a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setClientTarget(Display display, buffer_handle_t target,
46751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                             int32_t acquireFence, int32_t dataspace,
46851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                             const std::vector<hwc_rect_t>& damage) {
46951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  base::unique_fd fence(acquireFence);
47051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  std::lock_guard<std::mutex> guard(mutex_);
4712b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  auto display_ptr = FindDisplay(display);
4722b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (!display_ptr)
4732b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_DISPLAY;
47451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
4752b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (target == nullptr)
4762b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::NONE;
4772b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk
4782b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (!display_ptr->SetClientTarget(target, std::move(fence)))
47951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    return Error::BAD_PARAMETER;
48051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
48151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
48251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
48351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
48451a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setOutputBuffer(Display display, buffer_handle_t buffer,
48551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                             int32_t releaseFence) {
48651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  base::unique_fd fence(releaseFence);
4872b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  std::lock_guard<std::mutex> guard(mutex_);
4882b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  auto display_ptr = FindDisplay(display);
4892b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (!display_ptr)
4902b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_DISPLAY;
49151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
492a6cc42264e021e37ec52c189dc8e1059d45d4f9bDaniel Nicoara  // TODO(dnicoara): Is it necessary to do anything here?
493a6cc42264e021e37ec52c189dc8e1059d45d4f9bDaniel Nicoara  return Error::NONE;
49451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
49551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
49651a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::validateDisplay(
49751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    Display display, std::vector<Layer>* outChangedLayers,
49851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    std::vector<IComposerClient::Composition>* outCompositionTypes,
49951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    uint32_t* outDisplayRequestMask, std::vector<Layer>* outRequestedLayers,
50051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    std::vector<uint32_t>* outRequestMasks) {
50151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  std::lock_guard<std::mutex> guard(mutex_);
5022b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  auto display_ptr = FindDisplay(display);
5032b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (!display_ptr)
5042b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_DISPLAY;
50551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
5062b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  display_ptr->GetChangedCompositionTypes(outChangedLayers,
5072b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk                                          outCompositionTypes);
50851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
50951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
51051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
51151a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::acceptDisplayChanges(Display display) { return Error::NONE; }
51251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
51351a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::presentDisplay(Display display, int32_t* outPresentFence,
51451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                            std::vector<Layer>* outLayers,
51551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                            std::vector<int32_t>* outReleaseFences) {
51651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  *outPresentFence = -1;
517e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara  outLayers->clear();
518e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara  outReleaseFences->clear();
519e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara
5202b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  std::lock_guard<std::mutex> guard(mutex_);
5212b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  auto display_ptr = FindDisplay(display);
5222b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk
5232b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (!display_ptr)
52451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    return Error::BAD_DISPLAY;
52551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
5262b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  ComposerView::Frame frame;
527e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara  std::vector<Layer> last_frame_layers;
5282b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  Error status = display_ptr->GetFrame(&frame.layers);
5292b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  frame.display_id = display;
530d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara  frame.display_width = display_ptr->width();
531d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara  frame.display_height = display_ptr->height();
532730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  frame.active_config = display_ptr->active_config();
533730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  frame.power_mode = display_ptr->power_mode();
534730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  frame.vsync_enabled = display_ptr->vsync_enabled();
535730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  frame.color_transform_hint = display_ptr->color_transform_hint();
536730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  frame.color_mode = display_ptr->color_mode();
537730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  memcpy(frame.color_transform, display_ptr->color_transform(),
538730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk         sizeof(frame.color_transform));
539e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara  if (status != Error::NONE)
540e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara    return status;
541e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara
5422b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  last_frame_layers = display_ptr->UpdateLastFrameAndGetLastFrameLayers();
54351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
544e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara  base::unique_fd fence;
54551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (observer_)
546e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara    fence = observer_->OnNewFrame(frame);
547e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara
548e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara  if (fence.get() < 0)
549e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara    return Error::NONE;
550e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara
551e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara  *outPresentFence = dup(fence.get());
552e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara  outLayers->swap(last_frame_layers);
553e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara  for (size_t i = 0; i < outLayers->size(); ++i)
554e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara    outReleaseFences->push_back(dup(fence.get()));
55551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
55651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
55751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
55851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
55951a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerCursorPosition(Display display, Layer layer, int32_t x,
56051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                                    int32_t y) {
5612b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  std::lock_guard<std::mutex> guard(mutex_);
562730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  auto display_ptr = FindDisplay(display);
563730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  if (!display_ptr)
5642b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_DISPLAY;
565730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk
566730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  HwcLayer* hwc_layer = display_ptr->GetLayer(layer);
567730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  if (!hwc_layer)
568730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk    return Error::BAD_LAYER;
569730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk
570730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  hwc_layer->info.cursor_x = x;
571730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  hwc_layer->info.cursor_y = y;
57251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
57351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
57451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
57551a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerBuffer(Display display, Layer layer,
57651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                            buffer_handle_t buffer, int32_t acquireFence) {
57751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  base::unique_fd fence(acquireFence);
5782b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  std::lock_guard<std::mutex> guard(mutex_);
5792b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  auto display_ptr = FindDisplay(display);
5802b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (!display_ptr)
5812b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_DISPLAY;
58251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
5832b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  HwcLayer* hwc_layer = display_ptr->GetLayer(layer);
5842b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (!hwc_layer)
5852b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_LAYER;
586e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
5871f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara  hwc_layer->info.buffer = CreateGraphicBuffer(
5881f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara      buffer, hwc_layer->buffer_metadata);
589e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  hwc_layer->info.fence = new Fence(fence.release());
590e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
59151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
59251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
59351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
59451a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerSurfaceDamage(Display display, Layer layer,
59551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                                   const std::vector<hwc_rect_t>& damage) {
5962b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  std::lock_guard<std::mutex> guard(mutex_);
597730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  auto display_ptr = FindDisplay(display);
598730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  if (!display_ptr)
5992b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_DISPLAY;
600730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk
601730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  HwcLayer* hwc_layer = display_ptr->GetLayer(layer);
602730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  if (!hwc_layer)
603730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk    return Error::BAD_LAYER;
604730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk
605730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  hwc_layer->info.damaged_regions = damage;
60651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
60751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
60851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
60951a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerBlendMode(Display display, Layer layer, int32_t mode) {
6102b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  std::lock_guard<std::mutex> guard(mutex_);
6112b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  auto display_ptr = FindDisplay(display);
6122b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (!display_ptr)
6132b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_DISPLAY;
61451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
6152b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  HwcLayer* hwc_layer = display_ptr->GetLayer(layer);
6162b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (!hwc_layer)
6172b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_LAYER;
618e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
619e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  hwc_layer->info.blend_mode =
620e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      static_cast<ComposerView::ComposerLayer::BlendMode>(mode);
621e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
62251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
62351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
62451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
62551a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerColor(Display display, Layer layer,
62651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                           IComposerClient::Color color) {
6272b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  std::lock_guard<std::mutex> guard(mutex_);
628730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  auto display_ptr = FindDisplay(display);
629730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  if (!display_ptr)
6302b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_DISPLAY;
631730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk
632730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  HwcLayer* hwc_layer = display_ptr->GetLayer(layer);
633730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  if (!hwc_layer)
634730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk    return Error::BAD_LAYER;
635730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk
636730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  hwc_layer->info.color = color;
63751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
63851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
63951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
64051a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerCompositionType(Display display, Layer layer,
64151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                                     int32_t type) {
6422b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  std::lock_guard<std::mutex> guard(mutex_);
6432b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  auto display_ptr = FindDisplay(display);
6442b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (!display_ptr)
6452b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_DISPLAY;
64651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
6472b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  HwcLayer* hwc_layer = display_ptr->GetLayer(layer);
6482b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (!hwc_layer)
6492b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_LAYER;
650e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
651e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  hwc_layer->composition_type = static_cast<HwcLayer::Composition>(type);
652e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
65351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
65451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
65551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
65651a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerDataspace(Display display, Layer layer,
65751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                               int32_t dataspace) {
6582b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  std::lock_guard<std::mutex> guard(mutex_);
659730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  auto display_ptr = FindDisplay(display);
660730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  if (!display_ptr)
6612b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_DISPLAY;
662730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk
663730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  HwcLayer* hwc_layer = display_ptr->GetLayer(layer);
664730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  if (!hwc_layer)
665730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk    return Error::BAD_LAYER;
666730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk
667730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  hwc_layer->info.dataspace = dataspace;
66851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
66951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
67051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
67151a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerDisplayFrame(Display display, Layer layer,
67251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                                  const hwc_rect_t& frame) {
6732b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  std::lock_guard<std::mutex> guard(mutex_);
6742b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  auto display_ptr = FindDisplay(display);
6752b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (!display_ptr)
6762b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_DISPLAY;
67751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
6782b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  HwcLayer* hwc_layer = display_ptr->GetLayer(layer);
6792b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (!hwc_layer)
6802b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_LAYER;
681e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
682e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  hwc_layer->info.display_frame =
683e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      {frame.left, frame.top, frame.right, frame.bottom};
684e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
68551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
68651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
68751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
68851a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerPlaneAlpha(Display display, Layer layer, float alpha) {
6892b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  std::lock_guard<std::mutex> guard(mutex_);
6902b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  auto display_ptr = FindDisplay(display);
6912b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (!display_ptr)
6922b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_DISPLAY;
69351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
6942b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  HwcLayer* hwc_layer = display_ptr->GetLayer(layer);
6952b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (!hwc_layer)
6962b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_LAYER;
697e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
698e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  hwc_layer->info.alpha = alpha;
699e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
70051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
70151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
70251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
70351a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerSidebandStream(Display display, Layer layer,
70451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                                    buffer_handle_t stream) {
7052b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  std::lock_guard<std::mutex> guard(mutex_);
7062b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (!FindDisplay(display))
7072b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_DISPLAY;
70851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
70951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
71051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
71151a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerSourceCrop(Display display, Layer layer,
71251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                                const hwc_frect_t& crop) {
7132b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  std::lock_guard<std::mutex> guard(mutex_);
7142b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  auto display_ptr = FindDisplay(display);
7152b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (!display_ptr)
7162b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_DISPLAY;
71751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
7182b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  HwcLayer* hwc_layer = display_ptr->GetLayer(layer);
7192b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (!hwc_layer)
7202b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_LAYER;
721e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
722e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  hwc_layer->info.crop = {crop.left, crop.top, crop.right, crop.bottom};
723e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
72451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
72551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
72651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
72751a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerTransform(Display display, Layer layer,
72851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                               int32_t transform) {
7292b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  std::lock_guard<std::mutex> guard(mutex_);
730730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  auto display_ptr = FindDisplay(display);
731730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  if (!display_ptr)
7322b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_DISPLAY;
733730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk
734730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  HwcLayer* hwc_layer = display_ptr->GetLayer(layer);
735730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  if (!hwc_layer)
736730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk    return Error::BAD_LAYER;
737730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk
738730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  hwc_layer->info.transform = transform;
73951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
74051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
74151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
74251a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerVisibleRegion(Display display, Layer layer,
74351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                                   const std::vector<hwc_rect_t>& visible) {
7442b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  std::lock_guard<std::mutex> guard(mutex_);
745730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  auto display_ptr = FindDisplay(display);
746730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  if (!display_ptr)
7472b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_DISPLAY;
748730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk
749730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  HwcLayer* hwc_layer = display_ptr->GetLayer(layer);
750730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  if (!hwc_layer)
751730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk    return Error::BAD_LAYER;
752730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk
753730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  hwc_layer->info.visible_regions = visible;
75451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
75551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
75651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
75751a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerZOrder(Display display, Layer layer, uint32_t z) {
7582b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  std::lock_guard<std::mutex> guard(mutex_);
7592b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  auto display_ptr = FindDisplay(display);
7602b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (!display_ptr)
7612b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_DISPLAY;
76251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
7632b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  HwcLayer* hwc_layer = display_ptr->GetLayer(layer);
7642b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (!hwc_layer)
7652b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_LAYER;
766e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
767730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  hwc_layer->info.z_order = z;
768e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
76951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
77051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
77151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
77251a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerInfo(Display display, Layer layer, uint32_t type,
77351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                          uint32_t appId) {
7742b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  std::lock_guard<std::mutex> guard(mutex_);
7752b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  auto display_ptr = FindDisplay(display);
7762b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (!display_ptr)
7772b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_DISPLAY;
77851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
7792b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  HwcLayer* hwc_layer = display_ptr->GetLayer(layer);
7802b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (!hwc_layer)
7812b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_LAYER;
782e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
783e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  hwc_layer->info.type = type;
784e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  hwc_layer->info.app_id = appId;
785e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
78651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
78751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
78851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
7891f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel NicoaraError VrHwc::setClientTargetMetadata(
7901f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara    Display display, const IVrComposerClient::BufferMetadata& metadata) {
7911f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara  std::lock_guard<std::mutex> guard(mutex_);
7921f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara  auto display_ptr = FindDisplay(display);
7931f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara  if (!display_ptr)
7941f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara    return Error::BAD_DISPLAY;
7951f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara
7961f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara  display_ptr->SetClientTargetMetadata(metadata);
7971f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara
7981f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara  return Error::NONE;
7991f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara}
8001f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara
8011f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel NicoaraError VrHwc::setLayerBufferMetadata(
8021f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara    Display display, Layer layer,
8031f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara    const IVrComposerClient::BufferMetadata& metadata) {
8041f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara  std::lock_guard<std::mutex> guard(mutex_);
8051f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara  auto display_ptr = FindDisplay(display);
8061f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara  if (!display_ptr)
8071f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara    return Error::BAD_DISPLAY;
8081f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara
8091f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara  HwcLayer* hwc_layer = display_ptr->GetLayer(layer);
8101f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara  if (!hwc_layer)
8111f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara    return Error::BAD_LAYER;
8121f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara
8131f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara  hwc_layer->buffer_metadata = metadata;
8141f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara
8151f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara  return Error::NONE;
8161f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara}
8171f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara
81851a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraReturn<void> VrHwc::getCapabilities(getCapabilities_cb hidl_cb) {
81951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  hidl_cb(hidl_vec<Capability>());
82051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Void();
82151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
82251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
82351a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraReturn<void> VrHwc::dumpDebugInfo(dumpDebugInfo_cb hidl_cb) {
82451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  hidl_cb(hidl_string());
82551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Void();
82651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
82751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
82851a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraReturn<void> VrHwc::createClient(createClient_cb hidl_cb) {
82951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  std::lock_guard<std::mutex> guard(mutex_);
83051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
83151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  Error status = Error::NONE;
83251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  sp<VrComposerClient> client;
83351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (client_ == nullptr) {
83451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    client = new VrComposerClient(*this);
83551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  } else {
83651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    ALOGE("Already have a client");
83751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    status = Error::NO_RESOURCES;
83851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  }
83951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
84051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  client_ = client;
84151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  hidl_cb(status, client);
84251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Void();
84351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
84451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
84551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoaravoid VrHwc::RegisterObserver(Observer* observer) {
84651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  std::lock_guard<std::mutex> guard(mutex_);
84751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (observer_)
84851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    ALOGE("Overwriting observer");
84951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  else
85051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    observer_ = observer;
85151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
85251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
85351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoaravoid VrHwc::UnregisterObserver(Observer* observer) {
85451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  std::lock_guard<std::mutex> guard(mutex_);
85551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (observer != observer_)
85651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    ALOGE("Trying to unregister unknown observer");
85751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  else
85851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    observer_ = nullptr;
85951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
86051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
8612b3b666cfd89681514764201803e48b6ba112a80Albert ChaulkHwcDisplay* VrHwc::FindDisplay(Display display) {
8622b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  auto iter = displays_.find(display);
8632b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  return iter == displays_.end() ? nullptr : iter->second.get();
8642b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk}
8652b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk
86651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}  // namespace dvr
86751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}  // namespace android
868