vr_hwc.cpp revision bd9f4d2fef3028bec848bdc216681f4b1678e932
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
18bd9f4d2fef3028bec848bdc216681f4b1678e932Kevin Schoedel#include <cutils/properties.h>
194251e92b6dacb5653aa9528d88484085ee333e3bDaniel Nicoara#include <private/dvr/display_client.h>
2051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara#include <ui/Fence.h>
2151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
2251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara#include <mutex>
2351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
24e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include "vr_composer_client.h"
2551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
2651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoarausing namespace android::hardware::graphics::common::V1_0;
2751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoarausing namespace android::hardware::graphics::composer::V2_1;
2851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
2951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoarausing android::hardware::hidl_handle;
3051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoarausing android::hardware::hidl_string;
3151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoarausing android::hardware::hidl_vec;
3251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoarausing android::hardware::Return;
3351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoarausing android::hardware::Void;
3451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
3551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoaranamespace android {
3651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoaranamespace dvr {
3751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoaranamespace {
3851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
3951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoarausing android::hardware::graphics::common::V1_0::PixelFormat;
4051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
4151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoaraconst Display kDefaultDisplayId = 1;
4251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoaraconst Config kDefaultConfigId = 1;
4351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
441f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoarasp<GraphicBuffer> CreateGraphicBuffer(
451f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara    const native_handle_t* handle,
461f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara    const IVrComposerClient::BufferMetadata& metadata) {
471f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara   sp<GraphicBuffer> buffer = new GraphicBuffer(
481f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara      handle, GraphicBuffer::CLONE_HANDLE, metadata.width, metadata.height,
491f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara      static_cast<int32_t>(metadata.format), metadata.layerCount,
5073feb0676635da6c0f738c10e04052a8162a4095Chris Forbes      metadata.usage, metadata.stride);
511f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara   if (buffer->initCheck() != OK) {
521f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara     ALOGE("Failed to create graphic buffer");
531f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara     return nullptr;
541f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara   }
551f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara
561f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara   return buffer;
57e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
58e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
59d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoaravoid GetPrimaryDisplaySize(int32_t* width, int32_t* height) {
60d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara  *width = 1080;
61d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara  *height = 1920;
62d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara
63d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara  int error = 0;
642251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  auto display_client = display::DisplayClient::Create(&error);
652251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  if (!display_client) {
66d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara    ALOGE("Could not connect to display service : %s(%d)", strerror(error),
67d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara          error);
68d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara    return;
69d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara  }
70d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara
712251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  auto status = display_client->GetDisplayMetrics();
722251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  if (!status) {
73d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara    ALOGE("Could not get display metrics from display service : %s(%d)",
742251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka          status.GetErrorMessage().c_str(), status.error());
75d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara    return;
76d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara  }
77d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara
782251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  *width = status.get().display_width;
792251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  *height = status.get().display_height;
80d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara}
81d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara
8251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}  // namespace
8351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
84d330a62612e287b63442db2470d89c55ad326f27Daniel NicoaraHwcDisplay::HwcDisplay(int32_t width, int32_t height)
85d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara    : width_(width), height_(height) {}
8651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
8751a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraHwcDisplay::~HwcDisplay() {}
8851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
8951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoarabool HwcDisplay::SetClientTarget(const native_handle_t* handle,
9051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                                 base::unique_fd fence) {
91e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  if (handle)
921f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara    buffer_ = CreateGraphicBuffer(handle, buffer_metadata_);
9351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
9451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  fence_ = new Fence(fence.release());
9551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return true;
9651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
9751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
981f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoaravoid HwcDisplay::SetClientTargetMetadata(
991f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara    const IVrComposerClient::BufferMetadata& metadata) {
1001f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara  buffer_metadata_ = metadata;
1011f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara}
1021f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara
10351a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraHwcLayer* HwcDisplay::CreateLayer() {
10451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  uint64_t layer_id = layer_ids_++;
10551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  layers_.push_back(HwcLayer(layer_id));
10651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return &layers_.back();
10751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
10851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
10951a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraHwcLayer* HwcDisplay::GetLayer(Layer id) {
11051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  for (size_t i = 0; i < layers_.size(); ++i)
1112b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    if (layers_[i].info.id == id)
1122b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk      return &layers_[i];
11351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
11451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return nullptr;
11551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
11651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
11751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoarabool HwcDisplay::DestroyLayer(Layer id) {
11851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  for (auto it = layers_.begin(); it != layers_.end(); ++it) {
119e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara    if (it->info.id == id) {
12051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara      layers_.erase(it);
12151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara      return true;
12251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    }
12351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  }
12451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
12551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return false;
12651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
12751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
12851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoaravoid HwcDisplay::GetChangedCompositionTypes(
12951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    std::vector<Layer>* layer_ids,
13051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    std::vector<IComposerClient::Composition>* types) {
131e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  std::sort(layers_.begin(), layers_.end(),
132e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko            [](const auto& lhs, const auto& rhs) {
133730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk              return lhs.info.z_order < rhs.info.z_order;
134e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko            });
135e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
136e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  int first_client_layer = -1, last_client_layer = -1;
137e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  for (size_t i = 0; i < layers_.size(); ++i) {
138e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    switch (layers_[i].composition_type) {
139e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      case IComposerClient::Composition::SOLID_COLOR:
140e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      case IComposerClient::Composition::CURSOR:
141e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      case IComposerClient::Composition::SIDEBAND:
142e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko        if (first_client_layer < 0)
143e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko          first_client_layer = i;
144e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
145e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko        last_client_layer = i;
146e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko        break;
147e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      default:
148e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko        break;
149e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    }
150e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  }
151e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
152e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  for (size_t i = 0; i < layers_.size(); ++i) {
153e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    if (i >= first_client_layer && i <= last_client_layer) {
154e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      if (layers_[i].composition_type != IComposerClient::Composition::CLIENT) {
155e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara        layer_ids->push_back(layers_[i].info.id);
156e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko        types->push_back(IComposerClient::Composition::CLIENT);
157e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko        layers_[i].composition_type = IComposerClient::Composition::CLIENT;
158e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      }
159e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
160e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      continue;
161e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    }
162e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
163e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    if (layers_[i].composition_type != IComposerClient::Composition::DEVICE) {
164e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara      layer_ids->push_back(layers_[i].info.id);
165e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      types->push_back(IComposerClient::Composition::DEVICE);
166e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      layers_[i].composition_type = IComposerClient::Composition::DEVICE;
167e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    }
16851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  }
16951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
17051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
171e7916f88ab250e9cbd7faa53458491f19b716782Daniel NicoaraError HwcDisplay::GetFrame(
172e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara    std::vector<ComposerView::ComposerLayer>* out_frames) {
173e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  bool queued_client_target = false;
174e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  std::vector<ComposerView::ComposerLayer> frame;
175e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  for (const auto& layer : layers_) {
176e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    if (layer.composition_type == IComposerClient::Composition::CLIENT) {
177e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara      if (queued_client_target)
178e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara        continue;
179e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara
180e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara      if (!buffer_.get()) {
181e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara        ALOGE("Client composition requested but no client target buffer");
182e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara        return Error::BAD_LAYER;
183e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      }
184e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara
185e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara      ComposerView::ComposerLayer client_target_layer = {
186e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara          .buffer = buffer_,
187e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara          .fence = fence_.get() ? fence_ : new Fence(-1),
188e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara          .display_frame = {0, 0, static_cast<int32_t>(buffer_->getWidth()),
189e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara            static_cast<int32_t>(buffer_->getHeight())},
190e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara          .crop = {0.0f, 0.0f, static_cast<float>(buffer_->getWidth()),
191e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara            static_cast<float>(buffer_->getHeight())},
192e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara          .blend_mode = IComposerClient::BlendMode::NONE,
193e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara      };
194e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara
195e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara      frame.push_back(client_target_layer);
196e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara      queued_client_target = true;
197e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    } else {
198e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara      if (!layer.info.buffer.get() || !layer.info.fence.get()) {
1993e7dad572220e2c4b9bfbd471a6278385e99330dDaniel Nicoara        ALOGV("Layer requested without valid buffer");
2003e7dad572220e2c4b9bfbd471a6278385e99330dDaniel Nicoara        continue;
201e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara      }
202e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara
203e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      frame.push_back(layer.info);
204e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    }
205e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  }
206e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
207e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara  out_frames->swap(frame);
208e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara  return Error::NONE;
20951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
21051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
211e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoarastd::vector<Layer> HwcDisplay::UpdateLastFrameAndGetLastFrameLayers() {
212e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara  std::vector<Layer> last_frame_layers;
213e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara  last_frame_layers.swap(last_frame_layers_ids_);
21451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
215e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara  for (const auto& layer : layers_)
216e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara    last_frame_layers_ids_.push_back(layer.info.id);
217e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara
218e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara  return last_frame_layers;
219e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
220e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
221730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulkvoid HwcDisplay::SetColorTransform(const float* matrix, int32_t hint) {
222730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  color_transform_hint_ = hint;
223730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  if (matrix)
224730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk    memcpy(color_transform_, matrix, sizeof(color_transform_));
225730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk}
226730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk
227e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko////////////////////////////////////////////////////////////////////////////////
228e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// VrHwcClient
22951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
230d330a62612e287b63442db2470d89c55ad326f27Daniel NicoaraVrHwc::VrHwc() {}
23151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
23251a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraVrHwc::~VrHwc() {}
23351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
23451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoarabool VrHwc::hasCapability(Capability capability) const { return false; }
23551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
23651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoaravoid VrHwc::removeClient() {
23751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  std::lock_guard<std::mutex> guard(mutex_);
23851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  client_ = nullptr;
23951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
24051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
24151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoaravoid VrHwc::enableCallback(bool enable) {
24251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (enable && client_ != nullptr) {
243d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara    {
244d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara      int32_t width, height;
245d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara      GetPrimaryDisplaySize(&width, &height);
246d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara      std::lock_guard<std::mutex> guard(mutex_);
247d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara      // Create the primary display late to avoid initialization issues between
248d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara      // VR HWC and SurfaceFlinger.
249d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara      displays_[kDefaultDisplayId].reset(new HwcDisplay(width, height));
250d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara    }
25151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    client_.promote()->onHotplug(kDefaultDisplayId,
25251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                                 IComposerCallback::Connection::CONNECTED);
25351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  }
25451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
25551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
256a6cc42264e021e37ec52c189dc8e1059d45d4f9bDaniel Nicoarauint32_t VrHwc::getMaxVirtualDisplayCount() { return 1; }
25751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
25851a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::createVirtualDisplay(uint32_t width, uint32_t height,
25951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                                  PixelFormat* format, Display* outDisplay) {
26051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  *format = PixelFormat::RGBA_8888;
261a6cc42264e021e37ec52c189dc8e1059d45d4f9bDaniel Nicoara  *outDisplay = display_count_;
262d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara  displays_[display_count_].reset(new HwcDisplay(width, height));
263a6cc42264e021e37ec52c189dc8e1059d45d4f9bDaniel Nicoara  display_count_++;
26451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
26551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
26651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
2672b3b666cfd89681514764201803e48b6ba112a80Albert ChaulkError VrHwc::destroyVirtualDisplay(Display display) {
2682b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  std::lock_guard<std::mutex> guard(mutex_);
2692b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (display == kDefaultDisplayId || displays_.erase(display) == 0)
27051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    return Error::BAD_DISPLAY;
2712b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  ComposerView::Frame frame;
2722b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  frame.display_id = display;
2732b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  frame.removed = true;
2742b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (observer_)
2752b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    observer_->OnNewFrame(frame);
2762b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  return Error::NONE;
2772b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk}
27851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
2792b3b666cfd89681514764201803e48b6ba112a80Albert ChaulkError VrHwc::createLayer(Display display, Layer* outLayer) {
28051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  std::lock_guard<std::mutex> guard(mutex_);
2812b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  auto display_ptr = FindDisplay(display);
2822b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (!display_ptr)
2832b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_DISPLAY;
28451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
2852b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  HwcLayer* layer = display_ptr->CreateLayer();
286e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara  *outLayer = layer->info.id;
28751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
28851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
28951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
29051a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::destroyLayer(Display display, Layer layer) {
29151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  std::lock_guard<std::mutex> guard(mutex_);
2922b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  auto display_ptr = FindDisplay(display);
2932b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (!display_ptr) {
2942b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_DISPLAY;
2952b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  }
29651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
2972b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  return display_ptr->DestroyLayer(layer) ? Error::NONE : Error::BAD_LAYER;
29851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
29951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
30051a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::getActiveConfig(Display display, Config* outConfig) {
3012b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  std::lock_guard<std::mutex> guard(mutex_);
3022b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (!FindDisplay(display))
3032b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_DISPLAY;
30451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  *outConfig = kDefaultConfigId;
30551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
30651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
30751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
30851a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::getClientTargetSupport(Display display, uint32_t width,
30951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                                    uint32_t height, PixelFormat format,
31051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                                    Dataspace dataspace) {
31151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
31251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
31351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
31451a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::getColorModes(Display display, hidl_vec<ColorMode>* outModes) {
31551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  std::vector<ColorMode> color_modes(1, ColorMode::NATIVE);
31651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  *outModes = hidl_vec<ColorMode>(color_modes);
31751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
31851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
31951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
32051a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::getDisplayAttribute(Display display, Config config,
32151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                                 IComposerClient::Attribute attribute,
32251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                                 int32_t* outValue) {
3232b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  std::lock_guard<std::mutex> guard(mutex_);
324d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara  auto display_ptr = FindDisplay(display);
325d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara  if (!display_ptr) {
32651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    return Error::BAD_DISPLAY;
327d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara  }
32851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (config != kDefaultConfigId) {
32951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    return Error::BAD_CONFIG;
33051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  }
33151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
33251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  switch (attribute) {
33351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    case IComposerClient::Attribute::WIDTH:
334d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara      *outValue = display_ptr->width();
33551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara      break;
33651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    case IComposerClient::Attribute::HEIGHT:
337d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara      *outValue = display_ptr->height();
33851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara      break;
33951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    case IComposerClient::Attribute::VSYNC_PERIOD:
34022c1462add2567fffc6910b120c93b6074f2641bStephen Kiazyk      {
34122c1462add2567fffc6910b120c93b6074f2641bStephen Kiazyk        int error = 0;
34222c1462add2567fffc6910b120c93b6074f2641bStephen Kiazyk        auto display_client = display::DisplayClient::Create(&error);
34322c1462add2567fffc6910b120c93b6074f2641bStephen Kiazyk        if (!display_client) {
34422c1462add2567fffc6910b120c93b6074f2641bStephen Kiazyk          ALOGE("Could not connect to display service : %s(%d)",
34522c1462add2567fffc6910b120c93b6074f2641bStephen Kiazyk                strerror(error), error);
34622c1462add2567fffc6910b120c93b6074f2641bStephen Kiazyk          // Return a default value of 30 fps
34722c1462add2567fffc6910b120c93b6074f2641bStephen Kiazyk          *outValue = 1000 * 1000 * 1000 / 30;
34822c1462add2567fffc6910b120c93b6074f2641bStephen Kiazyk        } else {
34922c1462add2567fffc6910b120c93b6074f2641bStephen Kiazyk          auto metrics = display_client->GetDisplayMetrics();
35022c1462add2567fffc6910b120c93b6074f2641bStephen Kiazyk          *outValue = metrics.get().vsync_period_ns;
35122c1462add2567fffc6910b120c93b6074f2641bStephen Kiazyk        }
35222c1462add2567fffc6910b120c93b6074f2641bStephen Kiazyk      }
35351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara      break;
35451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    case IComposerClient::Attribute::DPI_X:
35551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    case IComposerClient::Attribute::DPI_Y:
356bd9f4d2fef3028bec848bdc216681f4b1678e932Kevin Schoedel      {
357bd9f4d2fef3028bec848bdc216681f4b1678e932Kevin Schoedel        constexpr int32_t kDefaultDPI = 300;
358bd9f4d2fef3028bec848bdc216681f4b1678e932Kevin Schoedel        int32_t dpi = property_get_int32("ro.vr.hwc.dpi", kDefaultDPI);
359bd9f4d2fef3028bec848bdc216681f4b1678e932Kevin Schoedel        if (dpi <= 0) {
360bd9f4d2fef3028bec848bdc216681f4b1678e932Kevin Schoedel          dpi = kDefaultDPI;
361bd9f4d2fef3028bec848bdc216681f4b1678e932Kevin Schoedel        }
362bd9f4d2fef3028bec848bdc216681f4b1678e932Kevin Schoedel        *outValue = 1000 * dpi;
363bd9f4d2fef3028bec848bdc216681f4b1678e932Kevin Schoedel      }
36451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara      break;
36551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    default:
36651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara      return Error::BAD_PARAMETER;
36751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  }
36851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
36951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
37051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
37151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
37251a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::getDisplayConfigs(Display display, hidl_vec<Config>* outConfigs) {
3732b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  std::lock_guard<std::mutex> guard(mutex_);
3742b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (!FindDisplay(display))
37551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    return Error::BAD_DISPLAY;
37651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  std::vector<Config> configs(1, kDefaultConfigId);
37751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  *outConfigs = hidl_vec<Config>(configs);
37851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
37951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
38051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
38151a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::getDisplayName(Display display, hidl_string* outName) {
38251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  *outName = hidl_string();
38351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
38451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
38551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
38651a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::getDisplayType(Display display,
38751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                            IComposerClient::DisplayType* outType) {
3882b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  std::lock_guard<std::mutex> guard(mutex_);
3892b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  auto display_ptr = FindDisplay(display);
3902b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (!display_ptr) {
39151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    *outType = IComposerClient::DisplayType::INVALID;
39251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    return Error::BAD_DISPLAY;
39351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  }
39451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
395a6cc42264e021e37ec52c189dc8e1059d45d4f9bDaniel Nicoara  if (display == kDefaultDisplayId)
396a6cc42264e021e37ec52c189dc8e1059d45d4f9bDaniel Nicoara    *outType = IComposerClient::DisplayType::PHYSICAL;
397a6cc42264e021e37ec52c189dc8e1059d45d4f9bDaniel Nicoara  else
398a6cc42264e021e37ec52c189dc8e1059d45d4f9bDaniel Nicoara    *outType = IComposerClient::DisplayType::VIRTUAL;
399a6cc42264e021e37ec52c189dc8e1059d45d4f9bDaniel Nicoara
40051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
40151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
40251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
40351a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::getDozeSupport(Display display, bool* outSupport) {
40451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  *outSupport = false;
4052b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  std::lock_guard<std::mutex> guard(mutex_);
4062b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (!FindDisplay(display))
40751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    return Error::BAD_DISPLAY;
4082b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  return Error::NONE;
40951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
41051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
41151a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::getHdrCapabilities(Display display, hidl_vec<Hdr>* outTypes,
41251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                                float* outMaxLuminance,
41351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                                float* outMaxAverageLuminance,
41451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                                float* outMinLuminance) {
41551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  *outMaxLuminance = 0;
41651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  *outMaxAverageLuminance = 0;
41751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  *outMinLuminance = 0;
41851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
41951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
42051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
42151a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setActiveConfig(Display display, Config config) {
4222b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  std::lock_guard<std::mutex> guard(mutex_);
423730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  auto display_ptr = FindDisplay(display);
424730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  if (!display_ptr)
4252b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_DISPLAY;
4262b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (config != kDefaultConfigId)
4272b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_CONFIG;
42851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
429730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  display_ptr->set_active_config(config);
43051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
43151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
43251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
43351a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setColorMode(Display display, ColorMode mode) {
4342b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  std::lock_guard<std::mutex> guard(mutex_);
435730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  auto display_ptr = FindDisplay(display);
436730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  if (!display_ptr)
4372b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_DISPLAY;
438730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk
439730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  display_ptr->set_color_mode(mode);
44051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
44151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
44251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
44351a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setPowerMode(Display display, IComposerClient::PowerMode mode) {
4442b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  std::lock_guard<std::mutex> guard(mutex_);
445730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  auto display_ptr = FindDisplay(display);
446730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  if (!display_ptr)
4472b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_DISPLAY;
448730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk
449730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  display_ptr->set_power_mode(mode);
45051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
45151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
45251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
45351a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setVsyncEnabled(Display display, IComposerClient::Vsync enabled) {
4542b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  std::lock_guard<std::mutex> guard(mutex_);
455730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  auto display_ptr = FindDisplay(display);
456730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  if (!display_ptr)
4572b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_DISPLAY;
458730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk
459730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  display_ptr->set_vsync_enabled(enabled);
46051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
46151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
46251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
46351a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setColorTransform(Display display, const float* matrix,
46451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                               int32_t hint) {
4652b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  std::lock_guard<std::mutex> guard(mutex_);
466730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  auto display_ptr = FindDisplay(display);
467730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  if (!display_ptr)
4682b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_DISPLAY;
469730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk
470730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  display_ptr->SetColorTransform(matrix, hint);
47151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
47251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
47351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
47451a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setClientTarget(Display display, buffer_handle_t target,
47551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                             int32_t acquireFence, int32_t dataspace,
47651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                             const std::vector<hwc_rect_t>& damage) {
47751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  base::unique_fd fence(acquireFence);
47851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  std::lock_guard<std::mutex> guard(mutex_);
4792b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  auto display_ptr = FindDisplay(display);
4802b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (!display_ptr)
4812b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_DISPLAY;
48251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
4832b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (target == nullptr)
4842b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::NONE;
4852b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk
4862b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (!display_ptr->SetClientTarget(target, std::move(fence)))
48751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    return Error::BAD_PARAMETER;
48851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
48951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
49051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
49151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
49251a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setOutputBuffer(Display display, buffer_handle_t buffer,
49351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                             int32_t releaseFence) {
49451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  base::unique_fd fence(releaseFence);
4952b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  std::lock_guard<std::mutex> guard(mutex_);
4962b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  auto display_ptr = FindDisplay(display);
4972b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (!display_ptr)
4982b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_DISPLAY;
49951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
500a6cc42264e021e37ec52c189dc8e1059d45d4f9bDaniel Nicoara  // TODO(dnicoara): Is it necessary to do anything here?
501a6cc42264e021e37ec52c189dc8e1059d45d4f9bDaniel Nicoara  return Error::NONE;
50251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
50351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
50451a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::validateDisplay(
50551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    Display display, std::vector<Layer>* outChangedLayers,
50651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    std::vector<IComposerClient::Composition>* outCompositionTypes,
50751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    uint32_t* outDisplayRequestMask, std::vector<Layer>* outRequestedLayers,
50851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    std::vector<uint32_t>* outRequestMasks) {
50951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  std::lock_guard<std::mutex> guard(mutex_);
5102b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  auto display_ptr = FindDisplay(display);
5112b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (!display_ptr)
5122b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_DISPLAY;
51351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
5142b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  display_ptr->GetChangedCompositionTypes(outChangedLayers,
5152b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk                                          outCompositionTypes);
51651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
51751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
51851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
51951a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::acceptDisplayChanges(Display display) { return Error::NONE; }
52051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
52151a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::presentDisplay(Display display, int32_t* outPresentFence,
52251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                            std::vector<Layer>* outLayers,
52351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                            std::vector<int32_t>* outReleaseFences) {
52451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  *outPresentFence = -1;
525e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara  outLayers->clear();
526e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara  outReleaseFences->clear();
527e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara
5282b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  std::lock_guard<std::mutex> guard(mutex_);
5292b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  auto display_ptr = FindDisplay(display);
5302b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk
5312b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (!display_ptr)
53251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    return Error::BAD_DISPLAY;
53351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
5342b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  ComposerView::Frame frame;
535e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara  std::vector<Layer> last_frame_layers;
5362b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  Error status = display_ptr->GetFrame(&frame.layers);
5372b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  frame.display_id = display;
538d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara  frame.display_width = display_ptr->width();
539d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara  frame.display_height = display_ptr->height();
540730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  frame.active_config = display_ptr->active_config();
541730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  frame.power_mode = display_ptr->power_mode();
542730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  frame.vsync_enabled = display_ptr->vsync_enabled();
543730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  frame.color_transform_hint = display_ptr->color_transform_hint();
544730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  frame.color_mode = display_ptr->color_mode();
545730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  memcpy(frame.color_transform, display_ptr->color_transform(),
546730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk         sizeof(frame.color_transform));
547e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara  if (status != Error::NONE)
548e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara    return status;
549e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara
5502b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  last_frame_layers = display_ptr->UpdateLastFrameAndGetLastFrameLayers();
55151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
552e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara  base::unique_fd fence;
55351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (observer_)
554e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara    fence = observer_->OnNewFrame(frame);
555e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara
556e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara  if (fence.get() < 0)
557e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara    return Error::NONE;
558e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara
559e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara  *outPresentFence = dup(fence.get());
560e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara  outLayers->swap(last_frame_layers);
561e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara  for (size_t i = 0; i < outLayers->size(); ++i)
562e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara    outReleaseFences->push_back(dup(fence.get()));
56351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
56451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
56551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
56651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
56751a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerCursorPosition(Display display, Layer layer, int32_t x,
56851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                                    int32_t y) {
5692b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  std::lock_guard<std::mutex> guard(mutex_);
570730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  auto display_ptr = FindDisplay(display);
571730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  if (!display_ptr)
5722b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_DISPLAY;
573730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk
574730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  HwcLayer* hwc_layer = display_ptr->GetLayer(layer);
575730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  if (!hwc_layer)
576730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk    return Error::BAD_LAYER;
577730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk
578730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  hwc_layer->info.cursor_x = x;
579730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  hwc_layer->info.cursor_y = y;
58051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
58151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
58251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
58351a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerBuffer(Display display, Layer layer,
58451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                            buffer_handle_t buffer, int32_t acquireFence) {
58551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  base::unique_fd fence(acquireFence);
5862b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  std::lock_guard<std::mutex> guard(mutex_);
5872b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  auto display_ptr = FindDisplay(display);
5882b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (!display_ptr)
5892b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_DISPLAY;
59051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
5912b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  HwcLayer* hwc_layer = display_ptr->GetLayer(layer);
5922b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (!hwc_layer)
5932b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_LAYER;
594e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
5951f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara  hwc_layer->info.buffer = CreateGraphicBuffer(
5961f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara      buffer, hwc_layer->buffer_metadata);
597e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  hwc_layer->info.fence = new Fence(fence.release());
598e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
59951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
60051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
60151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
60251a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerSurfaceDamage(Display display, Layer layer,
60351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                                   const std::vector<hwc_rect_t>& damage) {
6042b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  std::lock_guard<std::mutex> guard(mutex_);
605730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  auto display_ptr = FindDisplay(display);
606730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  if (!display_ptr)
6072b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_DISPLAY;
608730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk
609730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  HwcLayer* hwc_layer = display_ptr->GetLayer(layer);
610730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  if (!hwc_layer)
611730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk    return Error::BAD_LAYER;
612730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk
613730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  hwc_layer->info.damaged_regions = damage;
61451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
61551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
61651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
61751a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerBlendMode(Display display, Layer layer, int32_t mode) {
6182b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  std::lock_guard<std::mutex> guard(mutex_);
6192b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  auto display_ptr = FindDisplay(display);
6202b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (!display_ptr)
6212b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_DISPLAY;
62251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
6232b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  HwcLayer* hwc_layer = display_ptr->GetLayer(layer);
6242b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (!hwc_layer)
6252b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_LAYER;
626e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
627e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  hwc_layer->info.blend_mode =
628e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      static_cast<ComposerView::ComposerLayer::BlendMode>(mode);
629e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
63051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
63151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
63251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
63351a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerColor(Display display, Layer layer,
63451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                           IComposerClient::Color color) {
6352b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  std::lock_guard<std::mutex> guard(mutex_);
636730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  auto display_ptr = FindDisplay(display);
637730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  if (!display_ptr)
6382b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_DISPLAY;
639730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk
640730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  HwcLayer* hwc_layer = display_ptr->GetLayer(layer);
641730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  if (!hwc_layer)
642730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk    return Error::BAD_LAYER;
643730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk
644730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  hwc_layer->info.color = color;
64551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
64651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
64751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
64851a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerCompositionType(Display display, Layer layer,
64951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                                     int32_t type) {
6502b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  std::lock_guard<std::mutex> guard(mutex_);
6512b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  auto display_ptr = FindDisplay(display);
6522b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (!display_ptr)
6532b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_DISPLAY;
65451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
6552b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  HwcLayer* hwc_layer = display_ptr->GetLayer(layer);
6562b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (!hwc_layer)
6572b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_LAYER;
658e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
659e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  hwc_layer->composition_type = static_cast<HwcLayer::Composition>(type);
660e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
66151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
66251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
66351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
66451a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerDataspace(Display display, Layer layer,
66551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                               int32_t dataspace) {
6662b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  std::lock_guard<std::mutex> guard(mutex_);
667730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  auto display_ptr = FindDisplay(display);
668730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  if (!display_ptr)
6692b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_DISPLAY;
670730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk
671730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  HwcLayer* hwc_layer = display_ptr->GetLayer(layer);
672730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  if (!hwc_layer)
673730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk    return Error::BAD_LAYER;
674730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk
675730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  hwc_layer->info.dataspace = dataspace;
67651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
67751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
67851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
67951a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerDisplayFrame(Display display, Layer layer,
68051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                                  const hwc_rect_t& frame) {
6812b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  std::lock_guard<std::mutex> guard(mutex_);
6822b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  auto display_ptr = FindDisplay(display);
6832b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (!display_ptr)
6842b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_DISPLAY;
68551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
6862b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  HwcLayer* hwc_layer = display_ptr->GetLayer(layer);
6872b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (!hwc_layer)
6882b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_LAYER;
689e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
690e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  hwc_layer->info.display_frame =
691e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      {frame.left, frame.top, frame.right, frame.bottom};
692e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
69351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
69451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
69551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
69651a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerPlaneAlpha(Display display, Layer layer, float alpha) {
6972b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  std::lock_guard<std::mutex> guard(mutex_);
6982b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  auto display_ptr = FindDisplay(display);
6992b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (!display_ptr)
7002b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_DISPLAY;
70151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
7022b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  HwcLayer* hwc_layer = display_ptr->GetLayer(layer);
7032b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (!hwc_layer)
7042b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_LAYER;
705e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
706e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  hwc_layer->info.alpha = alpha;
707e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
70851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
70951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
71051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
71151a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerSidebandStream(Display display, Layer layer,
71251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                                    buffer_handle_t stream) {
7132b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  std::lock_guard<std::mutex> guard(mutex_);
7142b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (!FindDisplay(display))
7152b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_DISPLAY;
71651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
71751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
71851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
71951a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerSourceCrop(Display display, Layer layer,
72051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                                const hwc_frect_t& crop) {
7212b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  std::lock_guard<std::mutex> guard(mutex_);
7222b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  auto display_ptr = FindDisplay(display);
7232b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (!display_ptr)
7242b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_DISPLAY;
72551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
7262b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  HwcLayer* hwc_layer = display_ptr->GetLayer(layer);
7272b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (!hwc_layer)
7282b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_LAYER;
729e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
730e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  hwc_layer->info.crop = {crop.left, crop.top, crop.right, crop.bottom};
731e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
73251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
73351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
73451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
73551a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerTransform(Display display, Layer layer,
73651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                               int32_t transform) {
7372b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  std::lock_guard<std::mutex> guard(mutex_);
738730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  auto display_ptr = FindDisplay(display);
739730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  if (!display_ptr)
7402b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_DISPLAY;
741730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk
742730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  HwcLayer* hwc_layer = display_ptr->GetLayer(layer);
743730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  if (!hwc_layer)
744730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk    return Error::BAD_LAYER;
745730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk
746730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  hwc_layer->info.transform = transform;
74751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
74851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
74951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
75051a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerVisibleRegion(Display display, Layer layer,
75151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                                   const std::vector<hwc_rect_t>& visible) {
7522b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  std::lock_guard<std::mutex> guard(mutex_);
753730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  auto display_ptr = FindDisplay(display);
754730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  if (!display_ptr)
7552b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_DISPLAY;
756730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk
757730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  HwcLayer* hwc_layer = display_ptr->GetLayer(layer);
758730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  if (!hwc_layer)
759730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk    return Error::BAD_LAYER;
760730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk
761730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  hwc_layer->info.visible_regions = visible;
76251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
76351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
76451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
76551a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerZOrder(Display display, Layer layer, uint32_t z) {
7662b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  std::lock_guard<std::mutex> guard(mutex_);
7672b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  auto display_ptr = FindDisplay(display);
7682b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (!display_ptr)
7692b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_DISPLAY;
77051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
7712b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  HwcLayer* hwc_layer = display_ptr->GetLayer(layer);
7722b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (!hwc_layer)
7732b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_LAYER;
774e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
775730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk  hwc_layer->info.z_order = z;
776e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
77751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
77851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
77951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
78051a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerInfo(Display display, Layer layer, uint32_t type,
78151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                          uint32_t appId) {
7822b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  std::lock_guard<std::mutex> guard(mutex_);
7832b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  auto display_ptr = FindDisplay(display);
7842b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (!display_ptr)
7852b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_DISPLAY;
78651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
7872b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  HwcLayer* hwc_layer = display_ptr->GetLayer(layer);
7882b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  if (!hwc_layer)
7892b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk    return Error::BAD_LAYER;
790e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
791e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  hwc_layer->info.type = type;
792e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  hwc_layer->info.app_id = appId;
793e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
79451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
79551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
79651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
7971f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel NicoaraError VrHwc::setClientTargetMetadata(
7981f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara    Display display, const IVrComposerClient::BufferMetadata& metadata) {
7991f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara  std::lock_guard<std::mutex> guard(mutex_);
8001f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara  auto display_ptr = FindDisplay(display);
8011f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara  if (!display_ptr)
8021f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara    return Error::BAD_DISPLAY;
8031f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara
8041f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara  display_ptr->SetClientTargetMetadata(metadata);
8051f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara
8061f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara  return Error::NONE;
8071f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara}
8081f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara
8091f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel NicoaraError VrHwc::setLayerBufferMetadata(
8101f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara    Display display, Layer layer,
8111f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara    const IVrComposerClient::BufferMetadata& metadata) {
8121f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara  std::lock_guard<std::mutex> guard(mutex_);
8131f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara  auto display_ptr = FindDisplay(display);
8141f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara  if (!display_ptr)
8151f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara    return Error::BAD_DISPLAY;
8161f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara
8171f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara  HwcLayer* hwc_layer = display_ptr->GetLayer(layer);
8181f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara  if (!hwc_layer)
8191f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara    return Error::BAD_LAYER;
8201f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara
8211f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara  hwc_layer->buffer_metadata = metadata;
8221f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara
8231f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara  return Error::NONE;
8241f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara}
8251f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara
82651a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraReturn<void> VrHwc::getCapabilities(getCapabilities_cb hidl_cb) {
82751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  hidl_cb(hidl_vec<Capability>());
82851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Void();
82951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
83051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
83151a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraReturn<void> VrHwc::dumpDebugInfo(dumpDebugInfo_cb hidl_cb) {
83251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  hidl_cb(hidl_string());
83351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Void();
83451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
83551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
83651a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraReturn<void> VrHwc::createClient(createClient_cb hidl_cb) {
83751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  std::lock_guard<std::mutex> guard(mutex_);
83851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
83951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  Error status = Error::NONE;
84051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  sp<VrComposerClient> client;
84151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (client_ == nullptr) {
84251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    client = new VrComposerClient(*this);
84351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  } else {
84451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    ALOGE("Already have a client");
84551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    status = Error::NO_RESOURCES;
84651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  }
84751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
84851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  client_ = client;
84951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  hidl_cb(status, client);
85051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Void();
85151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
85251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
85351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoaravoid VrHwc::RegisterObserver(Observer* observer) {
85451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  std::lock_guard<std::mutex> guard(mutex_);
85551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (observer_)
85651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    ALOGE("Overwriting observer");
85751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  else
85851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    observer_ = observer;
85951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
86051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
86151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoaravoid VrHwc::UnregisterObserver(Observer* observer) {
86251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  std::lock_guard<std::mutex> guard(mutex_);
86351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (observer != observer_)
86451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    ALOGE("Trying to unregister unknown observer");
86551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  else
86651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    observer_ = nullptr;
86751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
86851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
8692b3b666cfd89681514764201803e48b6ba112a80Albert ChaulkHwcDisplay* VrHwc::FindDisplay(Display display) {
8702b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  auto iter = displays_.find(display);
8712b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk  return iter == displays_.end() ? nullptr : iter->second.get();
8722b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk}
8732b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk
87451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}  // namespace dvr
87551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}  // namespace android
876