vr_hwc.cpp revision e4eec20f6263f4a42ae462456f60ea6c4518bb0a
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 */
16e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include "vr_hwc.h"
1751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
18e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <gralloc_priv.h>
1951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara#include <ui/Fence.h>
2051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara#include <ui/GraphicBuffer.h>
2151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara#include <ui/GraphicBufferMapper.h>
2251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
2351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara#include <mutex>
2451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
25e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include "sync_timeline.h"
26e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include "vr_composer_client.h"
2751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
2851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoarausing namespace android::hardware::graphics::common::V1_0;
2951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoarausing namespace android::hardware::graphics::composer::V2_1;
3051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
3151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoarausing android::hardware::hidl_handle;
3251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoarausing android::hardware::hidl_string;
3351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoarausing android::hardware::hidl_vec;
3451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoarausing android::hardware::Return;
3551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoarausing android::hardware::Void;
3651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
3751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoaranamespace android {
3851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoaranamespace dvr {
3951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoaranamespace {
4051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
4151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoarausing android::hardware::graphics::common::V1_0::PixelFormat;
4251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
4351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoaraconst Display kDefaultDisplayId = 1;
4451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoaraconst Config kDefaultConfigId = 1;
4551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
46e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkosp<GraphicBuffer> GetBufferFromHandle(const native_handle_t* handle) {
47e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // TODO(dnicoara): Fix this once gralloc1 is available.
48e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  private_handle_t* private_handle = private_handle_t::dynamicCast(handle);
49e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  sp<GraphicBuffer> buffer = new GraphicBuffer(
50e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      private_handle->width, private_handle->height, private_handle->format, 1,
51e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      GraphicBuffer::USAGE_HW_COMPOSER | GraphicBuffer::USAGE_HW_TEXTURE,
52e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      private_handle->width, native_handle_clone(handle), true);
53e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  if (GraphicBufferMapper::get().registerBuffer(buffer.get()) != OK) {
54e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    ALOGE("Failed to register buffer");
55e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    return nullptr;
56e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  }
57e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
58e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  return buffer;
59e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
60e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
6151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}  // namespace
6251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
6351a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraHwcDisplay::HwcDisplay() {}
6451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
6551a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraHwcDisplay::~HwcDisplay() {}
6651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
6751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoarabool HwcDisplay::Initialize() { return hwc_timeline_.Initialize(); }
6851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
6951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoarabool HwcDisplay::SetClientTarget(const native_handle_t* handle,
7051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                                 base::unique_fd fence) {
71e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  if (handle)
72e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    buffer_ = GetBufferFromHandle(handle);
7351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
7451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  fence_ = new Fence(fence.release());
7551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return true;
7651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
7751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
7851a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraHwcLayer* HwcDisplay::CreateLayer() {
7951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  uint64_t layer_id = layer_ids_++;
8051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  layers_.push_back(HwcLayer(layer_id));
8151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return &layers_.back();
8251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
8351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
8451a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraHwcLayer* HwcDisplay::GetLayer(Layer id) {
8551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  for (size_t i = 0; i < layers_.size(); ++i)
8651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    if (layers_[i].id == id) return &layers_[i];
8751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
8851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return nullptr;
8951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
9051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
9151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoarabool HwcDisplay::DestroyLayer(Layer id) {
9251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  for (auto it = layers_.begin(); it != layers_.end(); ++it) {
9351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    if (it->id == id) {
9451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara      layers_.erase(it);
9551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara      return true;
9651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    }
9751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  }
9851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
9951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return false;
10051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
10151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
10251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoaravoid HwcDisplay::GetChangedCompositionTypes(
10351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    std::vector<Layer>* layer_ids,
10451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    std::vector<IComposerClient::Composition>* types) {
105e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  std::sort(layers_.begin(), layers_.end(),
106e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko            [](const auto& lhs, const auto& rhs) {
107e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko              return lhs.z_order < rhs.z_order;
108e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko            });
109e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
110e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  int first_client_layer = -1, last_client_layer = -1;
111e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  for (size_t i = 0; i < layers_.size(); ++i) {
112e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    switch (layers_[i].composition_type) {
113e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      case IComposerClient::Composition::SOLID_COLOR:
114e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      case IComposerClient::Composition::CURSOR:
115e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      case IComposerClient::Composition::SIDEBAND:
116e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko        if (first_client_layer < 0)
117e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko          first_client_layer = i;
118e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
119e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko        last_client_layer = i;
120e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko        break;
121e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      default:
122e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko        break;
123e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    }
124e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  }
125e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
126e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  for (size_t i = 0; i < layers_.size(); ++i) {
127e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    if (i >= first_client_layer && i <= last_client_layer) {
128e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      if (layers_[i].composition_type != IComposerClient::Composition::CLIENT) {
129e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko        layer_ids->push_back(layers_[i].id);
130e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko        types->push_back(IComposerClient::Composition::CLIENT);
131e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko        layers_[i].composition_type = IComposerClient::Composition::CLIENT;
132e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      }
133e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
134e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      continue;
135e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    }
136e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
137e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    if (layers_[i].composition_type != IComposerClient::Composition::DEVICE) {
138e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      layer_ids->push_back(layers_[i].id);
139e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      types->push_back(IComposerClient::Composition::DEVICE);
140e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      layers_[i].composition_type = IComposerClient::Composition::DEVICE;
141e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    }
14251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  }
14351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
14451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
14551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoarastd::vector<ComposerView::ComposerLayer> HwcDisplay::GetFrame() {
14651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  // Increment the time the fence is signalled every time we get the
14751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  // presentation frame. This ensures that calling ReleaseFrame() only affects
14851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  // the current frame.
14951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  fence_time_++;
15051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
151e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  bool queued_client_target = false;
152e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  std::vector<ComposerView::ComposerLayer> frame;
153e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  for (const auto& layer : layers_) {
154e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    if (layer.composition_type == IComposerClient::Composition::CLIENT) {
155e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      if (!queued_client_target) {
156e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko        ComposerView::ComposerLayer client_target_layer = {
157e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko            .buffer = buffer_,
158e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko            .fence = fence_.get() ? fence_ : new Fence(-1),
159e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko            .display_frame = {0, 0, static_cast<int32_t>(buffer_->getWidth()),
160e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko              static_cast<int32_t>(buffer_->getHeight())},
161e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko            .crop = {0.0f, 0.0f, static_cast<float>(buffer_->getWidth()),
162e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko              static_cast<float>(buffer_->getHeight())},
163e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko            .blend_mode = IComposerClient::BlendMode::NONE,
164e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko        };
165e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
166e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko        frame.push_back(client_target_layer);
167e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko        queued_client_target = true;
168e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      }
169e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    } else {
170e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      frame.push_back(layer.info);
171e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    }
172e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  }
173e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
174e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  return frame;
17551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
17651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
177e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkovoid HwcDisplay::GetReleaseFences(int* present_fence,
178e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko                                  std::vector<Layer>* layer_ids,
17951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                                  std::vector<int>* fences) {
180e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  *present_fence = hwc_timeline_.CreateFence(fence_time_);
18151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  for (const auto& layer : layers_) {
18251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    layer_ids->push_back(layer.id);
18351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    fences->push_back(hwc_timeline_.CreateFence(fence_time_));
18451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  }
18551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
18651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
187e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkovoid HwcDisplay::ReleaseFrame() {
188e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  hwc_timeline_.IncrementTimeline();
189e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
190e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
191e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko////////////////////////////////////////////////////////////////////////////////
192e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// VrHwcClient
19351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
19451a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraVrHwc::VrHwc() {}
19551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
19651a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraVrHwc::~VrHwc() {}
19751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
19851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoarabool VrHwc::Initialize() { return display_.Initialize(); }
19951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
20051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoarabool VrHwc::hasCapability(Capability capability) const { return false; }
20151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
20251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoaravoid VrHwc::removeClient() {
20351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  std::lock_guard<std::mutex> guard(mutex_);
20451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  client_ = nullptr;
20551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
20651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
20751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoaravoid VrHwc::enableCallback(bool enable) {
20851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  std::lock_guard<std::mutex> guard(mutex_);
20951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (enable && client_ != nullptr) {
21051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    client_.promote()->onHotplug(kDefaultDisplayId,
21151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                                 IComposerCallback::Connection::CONNECTED);
21251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  }
21351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
21451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
21551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoarauint32_t VrHwc::getMaxVirtualDisplayCount() { return 0; }
21651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
21751a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::createVirtualDisplay(uint32_t width, uint32_t height,
21851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                                  PixelFormat* format, Display* outDisplay) {
21951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  *format = PixelFormat::RGBA_8888;
22051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  *outDisplay = 0;
22151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
22251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
22351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
22451a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::destroyVirtualDisplay(Display display) { return Error::NONE; }
22551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
22651a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::createLayer(Display display, Layer* outLayer) {
22751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (display != kDefaultDisplayId) {
22851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    return Error::BAD_DISPLAY;
22951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  }
23051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
23151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  std::lock_guard<std::mutex> guard(mutex_);
23251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
23351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  HwcLayer* layer = display_.CreateLayer();
23451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  *outLayer = layer->id;
23551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
23651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
23751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
23851a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::destroyLayer(Display display, Layer layer) {
23951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (display != kDefaultDisplayId) return Error::BAD_DISPLAY;
24051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
24151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  std::lock_guard<std::mutex> guard(mutex_);
24251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
24351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return display_.DestroyLayer(layer) ? Error::NONE : Error::BAD_LAYER;
24451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
24551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
24651a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::getActiveConfig(Display display, Config* outConfig) {
24751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (display != kDefaultDisplayId) return Error::BAD_DISPLAY;
24851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
24951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  *outConfig = kDefaultConfigId;
25051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
25151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
25251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
25351a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::getClientTargetSupport(Display display, uint32_t width,
25451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                                    uint32_t height, PixelFormat format,
25551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                                    Dataspace dataspace) {
25651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
25751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
25851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
25951a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::getColorModes(Display display, hidl_vec<ColorMode>* outModes) {
26051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  std::vector<ColorMode> color_modes(1, ColorMode::NATIVE);
26151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  *outModes = hidl_vec<ColorMode>(color_modes);
26251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
26351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
26451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
26551a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::getDisplayAttribute(Display display, Config config,
26651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                                 IComposerClient::Attribute attribute,
26751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                                 int32_t* outValue) {
26851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (display != kDefaultDisplayId) {
26951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    return Error::BAD_DISPLAY;
27051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  }
27151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
27251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (config != kDefaultConfigId) {
27351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    return Error::BAD_CONFIG;
27451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  }
27551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
27651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  switch (attribute) {
27751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    case IComposerClient::Attribute::WIDTH:
278e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      *outValue = 1920;
27951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara      break;
28051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    case IComposerClient::Attribute::HEIGHT:
281e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      *outValue = 1080;
28251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara      break;
28351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    case IComposerClient::Attribute::VSYNC_PERIOD:
28451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara      *outValue = 1000 * 1000 * 1000 / 30;  // 30fps
28551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara      break;
28651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    case IComposerClient::Attribute::DPI_X:
28751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    case IComposerClient::Attribute::DPI_Y:
28851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara      *outValue = 300 * 1000;  // 300dpi
28951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara      break;
29051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    default:
29151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara      return Error::BAD_PARAMETER;
29251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  }
29351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
29451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
29551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
29651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
29751a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::getDisplayConfigs(Display display, hidl_vec<Config>* outConfigs) {
29851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (display != kDefaultDisplayId) {
29951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    return Error::BAD_DISPLAY;
30051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  }
30151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
30251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  std::vector<Config> configs(1, kDefaultConfigId);
30351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  *outConfigs = hidl_vec<Config>(configs);
30451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
30551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
30651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
30751a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::getDisplayName(Display display, hidl_string* outName) {
30851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  *outName = hidl_string();
30951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
31051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
31151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
31251a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::getDisplayType(Display display,
31351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                            IComposerClient::DisplayType* outType) {
31451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (display != kDefaultDisplayId) {
31551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    *outType = IComposerClient::DisplayType::INVALID;
31651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    return Error::BAD_DISPLAY;
31751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  }
31851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
31951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  *outType = IComposerClient::DisplayType::PHYSICAL;
32051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
32151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
32251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
32351a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::getDozeSupport(Display display, bool* outSupport) {
32451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  *outSupport = false;
32551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (display == kDefaultDisplayId)
32651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    return Error::NONE;
32751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  else
32851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    return Error::BAD_DISPLAY;
32951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
33051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
33151a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::getHdrCapabilities(Display display, hidl_vec<Hdr>* outTypes,
33251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                                float* outMaxLuminance,
33351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                                float* outMaxAverageLuminance,
33451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                                float* outMinLuminance) {
33551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  *outMaxLuminance = 0;
33651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  *outMaxAverageLuminance = 0;
33751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  *outMinLuminance = 0;
33851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
33951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
34051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
34151a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setActiveConfig(Display display, Config config) {
34251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (display != kDefaultDisplayId) return Error::BAD_DISPLAY;
34351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
34451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (config != kDefaultConfigId) return Error::BAD_CONFIG;
34551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
34651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
34751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
34851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
34951a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setColorMode(Display display, ColorMode mode) {
35051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (display != kDefaultDisplayId) return Error::BAD_DISPLAY;
35151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
35251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
35351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
35451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
35551a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setPowerMode(Display display, IComposerClient::PowerMode mode) {
35651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (display != kDefaultDisplayId) return Error::BAD_DISPLAY;
35751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
35851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
35951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
36051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
36151a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setVsyncEnabled(Display display, IComposerClient::Vsync enabled) {
36251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (display != kDefaultDisplayId) return Error::BAD_DISPLAY;
36351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
36451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
36551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
36651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
36751a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setColorTransform(Display display, const float* matrix,
36851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                               int32_t hint) {
36951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (display != kDefaultDisplayId) return Error::BAD_DISPLAY;
37051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
37151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
37251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
37351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
37451a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setClientTarget(Display display, buffer_handle_t target,
37551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                             int32_t acquireFence, int32_t dataspace,
37651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                             const std::vector<hwc_rect_t>& damage) {
37751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  base::unique_fd fence(acquireFence);
37851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (display != kDefaultDisplayId) return Error::BAD_DISPLAY;
37951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
38051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (target == nullptr) return Error::NONE;
38151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
38251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  std::lock_guard<std::mutex> guard(mutex_);
38351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
38451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (!display_.SetClientTarget(target, std::move(fence)))
38551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    return Error::BAD_PARAMETER;
38651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
38751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
38851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
38951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
39051a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setOutputBuffer(Display display, buffer_handle_t buffer,
39151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                             int32_t releaseFence) {
39251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  base::unique_fd fence(releaseFence);
39351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (display != kDefaultDisplayId) return Error::BAD_DISPLAY;
39451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
39551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
39651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
39751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
39851a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::validateDisplay(
39951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    Display display, std::vector<Layer>* outChangedLayers,
40051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    std::vector<IComposerClient::Composition>* outCompositionTypes,
40151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    uint32_t* outDisplayRequestMask, std::vector<Layer>* outRequestedLayers,
40251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    std::vector<uint32_t>* outRequestMasks) {
40351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (display != kDefaultDisplayId) {
40451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    return Error::BAD_DISPLAY;
40551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  }
40651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
40751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  std::lock_guard<std::mutex> guard(mutex_);
40851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
40951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  display_.GetChangedCompositionTypes(outChangedLayers, outCompositionTypes);
41051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
41151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
41251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
41351a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::acceptDisplayChanges(Display display) { return Error::NONE; }
41451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
41551a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::presentDisplay(Display display, int32_t* outPresentFence,
41651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                            std::vector<Layer>* outLayers,
41751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                            std::vector<int32_t>* outReleaseFences) {
41851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  *outPresentFence = -1;
41951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (display != kDefaultDisplayId) {
42051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    return Error::BAD_DISPLAY;
42151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  }
42251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
423e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  std::vector<ComposerView::ComposerLayer> frame;
424e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  {
425e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    std::lock_guard<std::mutex> guard(mutex_);
426e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    frame = display_.GetFrame();
427e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    display_.GetReleaseFences(outPresentFence, outLayers, outReleaseFences);
428e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  }
42951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
43051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (observer_)
431e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    observer_->OnNewFrame(frame);
43251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  else
433e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    ReleaseFrame();
43451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
43551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
43651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
43751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
43851a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerCursorPosition(Display display, Layer layer, int32_t x,
43951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                                    int32_t y) {
44051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (display != kDefaultDisplayId) return Error::BAD_DISPLAY;
44151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
44251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
44351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
44451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
44551a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerBuffer(Display display, Layer layer,
44651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                            buffer_handle_t buffer, int32_t acquireFence) {
44751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  base::unique_fd fence(acquireFence);
44851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (display != kDefaultDisplayId) return Error::BAD_DISPLAY;
44951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
450e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  HwcLayer* hwc_layer = display_.GetLayer(layer);
451e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  if (!hwc_layer) return Error::BAD_LAYER;
452e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
453e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  hwc_layer->info.buffer = GetBufferFromHandle(buffer);
454e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  hwc_layer->info.fence = new Fence(fence.release());
455e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
45651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
45751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
45851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
45951a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerSurfaceDamage(Display display, Layer layer,
46051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                                   const std::vector<hwc_rect_t>& damage) {
46151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (display != kDefaultDisplayId) return Error::BAD_DISPLAY;
46251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
46351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
46451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
46551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
46651a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerBlendMode(Display display, Layer layer, int32_t mode) {
46751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (display != kDefaultDisplayId) return Error::BAD_DISPLAY;
46851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
469e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  HwcLayer* hwc_layer = display_.GetLayer(layer);
470e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  if (!hwc_layer) return Error::BAD_LAYER;
471e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
472e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  hwc_layer->info.blend_mode =
473e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      static_cast<ComposerView::ComposerLayer::BlendMode>(mode);
474e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
47551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
47651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
47751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
47851a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerColor(Display display, Layer layer,
47951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                           IComposerClient::Color color) {
48051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (display != kDefaultDisplayId) return Error::BAD_DISPLAY;
48151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
48251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
48351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
48451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
48551a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerCompositionType(Display display, Layer layer,
48651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                                     int32_t type) {
48751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (display != kDefaultDisplayId) return Error::BAD_DISPLAY;
48851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
489e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  HwcLayer* hwc_layer = display_.GetLayer(layer);
490e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  if (!hwc_layer) return Error::BAD_LAYER;
491e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
492e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  hwc_layer->composition_type = static_cast<HwcLayer::Composition>(type);
493e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
49451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
49551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
49651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
49751a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerDataspace(Display display, Layer layer,
49851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                               int32_t dataspace) {
49951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (display != kDefaultDisplayId) return Error::BAD_DISPLAY;
50051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
50151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
50251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
50351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
50451a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerDisplayFrame(Display display, Layer layer,
50551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                                  const hwc_rect_t& frame) {
50651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (display != kDefaultDisplayId) return Error::BAD_DISPLAY;
50751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
508e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  HwcLayer* hwc_layer = display_.GetLayer(layer);
509e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  if (!hwc_layer) return Error::BAD_LAYER;
510e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
511e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  hwc_layer->info.display_frame =
512e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      {frame.left, frame.top, frame.right, frame.bottom};
513e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
51451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
51551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
51651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
51751a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerPlaneAlpha(Display display, Layer layer, float alpha) {
51851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (display != kDefaultDisplayId) return Error::BAD_DISPLAY;
51951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
520e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  HwcLayer* hwc_layer = display_.GetLayer(layer);
521e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  if (!hwc_layer) return Error::BAD_LAYER;
522e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
523e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  hwc_layer->info.alpha = alpha;
524e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
52551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
52651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
52751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
52851a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerSidebandStream(Display display, Layer layer,
52951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                                    buffer_handle_t stream) {
53051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (display != kDefaultDisplayId) return Error::BAD_DISPLAY;
53151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
53251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
53351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
53451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
53551a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerSourceCrop(Display display, Layer layer,
53651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                                const hwc_frect_t& crop) {
53751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (display != kDefaultDisplayId) return Error::BAD_DISPLAY;
53851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
539e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  HwcLayer* hwc_layer = display_.GetLayer(layer);
540e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  if (!hwc_layer) return Error::BAD_LAYER;
541e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
542e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  hwc_layer->info.crop = {crop.left, crop.top, crop.right, crop.bottom};
543e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
54451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
54551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
54651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
54751a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerTransform(Display display, Layer layer,
54851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                               int32_t transform) {
54951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (display != kDefaultDisplayId) return Error::BAD_DISPLAY;
55051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
55151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
55251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
55351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
55451a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerVisibleRegion(Display display, Layer layer,
55551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                                   const std::vector<hwc_rect_t>& visible) {
55651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (display != kDefaultDisplayId) return Error::BAD_DISPLAY;
55751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
55851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
55951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
56051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
56151a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerZOrder(Display display, Layer layer, uint32_t z) {
56251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (display != kDefaultDisplayId) return Error::BAD_DISPLAY;
56351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
564e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  HwcLayer* hwc_layer = display_.GetLayer(layer);
565e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  if (!hwc_layer) return Error::BAD_LAYER;
566e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
567e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  hwc_layer->z_order = z;
568e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
56951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
57051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
57151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
57251a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerInfo(Display display, Layer layer, uint32_t type,
57351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                          uint32_t appId) {
57451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (display != kDefaultDisplayId) return Error::BAD_DISPLAY;
57551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
576e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  HwcLayer* hwc_layer = display_.GetLayer(layer);
577e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  if (!hwc_layer) return Error::BAD_LAYER;
578e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
579e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  hwc_layer->info.type = type;
580e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  hwc_layer->info.app_id = appId;
581e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
58251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
58351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
58451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
58551a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraReturn<void> VrHwc::getCapabilities(getCapabilities_cb hidl_cb) {
58651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  hidl_cb(hidl_vec<Capability>());
58751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Void();
58851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
58951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
59051a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraReturn<void> VrHwc::dumpDebugInfo(dumpDebugInfo_cb hidl_cb) {
59151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  hidl_cb(hidl_string());
59251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Void();
59351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
59451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
59551a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraReturn<void> VrHwc::createClient(createClient_cb hidl_cb) {
59651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  std::lock_guard<std::mutex> guard(mutex_);
59751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
59851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  Error status = Error::NONE;
59951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  sp<VrComposerClient> client;
60051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (client_ == nullptr) {
60151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    client = new VrComposerClient(*this);
60251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    client->initialize();
60351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  } else {
60451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    ALOGE("Already have a client");
60551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    status = Error::NO_RESOURCES;
60651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  }
60751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
60851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  client_ = client;
60951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  hidl_cb(status, client);
61051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Void();
61151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
61251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
61351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoaravoid VrHwc::RegisterObserver(Observer* observer) {
61451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  std::lock_guard<std::mutex> guard(mutex_);
61551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (observer_)
61651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    ALOGE("Overwriting observer");
61751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  else
61851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    observer_ = observer;
61951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
62051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
62151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoaravoid VrHwc::UnregisterObserver(Observer* observer) {
62251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  std::lock_guard<std::mutex> guard(mutex_);
62351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (observer != observer_)
62451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    ALOGE("Trying to unregister unknown observer");
62551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  else
62651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    observer_ = nullptr;
62751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
62851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
62951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoaravoid VrHwc::ReleaseFrame() {
63051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  std::lock_guard<std::mutex> guard(mutex_);
63151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  display_.ReleaseFrame();
63251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
63351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
63451a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraComposerView* GetComposerViewFromIComposer(
63551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    hardware::graphics::composer::V2_1::IComposer* composer) {
63651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return static_cast<VrHwc*>(composer);
63751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
63851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
63951a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraIComposer* HIDL_FETCH_IComposer(const char*) { return new VrHwc(); }
64051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
64151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}  // namespace dvr
64251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}  // namespace android
643