vr_hwc.cpp revision e13ec18867aee74a82435ef112dca01416eee4c0
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
1851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara#include <ui/Fence.h>
1951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara#include <ui/GraphicBuffer.h>
2051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara#include <ui/GraphicBufferMapper.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
44e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkosp<GraphicBuffer> GetBufferFromHandle(const native_handle_t* handle) {
451c457103ccd9a520b723c1a90189d4e88a0bdd63Daniel Nicoara  uint32_t width = 0, height = 0, stride = 0, layer_count = 1;
461c457103ccd9a520b723c1a90189d4e88a0bdd63Daniel Nicoara  uint64_t producer_usage = 0, consumer_usage = 0;
471c457103ccd9a520b723c1a90189d4e88a0bdd63Daniel Nicoara  int32_t format = 0;
481c457103ccd9a520b723c1a90189d4e88a0bdd63Daniel Nicoara
491c457103ccd9a520b723c1a90189d4e88a0bdd63Daniel Nicoara  GraphicBufferMapper& mapper = GraphicBufferMapper::get();
50dd5ce7735b73367ac488638704d6bff9aab76f6dDaniel Nicoara  // Need to register |handle| otherwise we can't read its properties.
51c9e2f79c40534d1f20e6da8f88f8c4f964b1202bAlbert Chaulk  if (mapper.registerBuffer(handle) != OK) {
52c9e2f79c40534d1f20e6da8f88f8c4f964b1202bAlbert Chaulk    ALOGE("Failed to register buffer");
53c9e2f79c40534d1f20e6da8f88f8c4f964b1202bAlbert Chaulk    return nullptr;
54c9e2f79c40534d1f20e6da8f88f8c4f964b1202bAlbert Chaulk  }
55c9e2f79c40534d1f20e6da8f88f8c4f964b1202bAlbert Chaulk
561c457103ccd9a520b723c1a90189d4e88a0bdd63Daniel Nicoara  if (mapper.getDimensions(handle, &width, &height) ||
571c457103ccd9a520b723c1a90189d4e88a0bdd63Daniel Nicoara      mapper.getStride(handle, &stride) ||
581c457103ccd9a520b723c1a90189d4e88a0bdd63Daniel Nicoara      mapper.getFormat(handle, &format) ||
591c457103ccd9a520b723c1a90189d4e88a0bdd63Daniel Nicoara      mapper.getProducerUsage(handle, &producer_usage) ||
601c457103ccd9a520b723c1a90189d4e88a0bdd63Daniel Nicoara      mapper.getConsumerUsage(handle, &consumer_usage)) {
611c457103ccd9a520b723c1a90189d4e88a0bdd63Daniel Nicoara    ALOGE("Failed to read handle properties");
621c457103ccd9a520b723c1a90189d4e88a0bdd63Daniel Nicoara    return nullptr;
631c457103ccd9a520b723c1a90189d4e88a0bdd63Daniel Nicoara  }
641c457103ccd9a520b723c1a90189d4e88a0bdd63Daniel Nicoara
651c457103ccd9a520b723c1a90189d4e88a0bdd63Daniel Nicoara  // This will only succeed if gralloc has GRALLOC1_CAPABILITY_LAYERED_BUFFERS
661c457103ccd9a520b723c1a90189d4e88a0bdd63Daniel Nicoara  // capability. Otherwise assume a count of 1.
671c457103ccd9a520b723c1a90189d4e88a0bdd63Daniel Nicoara  mapper.getLayerCount(handle, &layer_count);
681c457103ccd9a520b723c1a90189d4e88a0bdd63Daniel Nicoara
69dd5ce7735b73367ac488638704d6bff9aab76f6dDaniel Nicoara  // NOTE: Can't re-use |handle| since we don't own it.
70e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  sp<GraphicBuffer> buffer = new GraphicBuffer(
711c457103ccd9a520b723c1a90189d4e88a0bdd63Daniel Nicoara      width, height, format, layer_count, producer_usage, consumer_usage,
721c457103ccd9a520b723c1a90189d4e88a0bdd63Daniel Nicoara      stride, native_handle_clone(handle), true);
73dd5ce7735b73367ac488638704d6bff9aab76f6dDaniel Nicoara  // Need to register the cloned buffer otherwise it can't be used later on.
74dd5ce7735b73367ac488638704d6bff9aab76f6dDaniel Nicoara  if (mapper.registerBuffer(buffer.get()) != OK) {
75dd5ce7735b73367ac488638704d6bff9aab76f6dDaniel Nicoara    ALOGE("Failed to register cloned buffer");
76dd5ce7735b73367ac488638704d6bff9aab76f6dDaniel Nicoara    return nullptr;
77dd5ce7735b73367ac488638704d6bff9aab76f6dDaniel Nicoara  }
78e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
79e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  return buffer;
80e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
81e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
8251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}  // namespace
8351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
8451a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraHwcDisplay::HwcDisplay() {}
8551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
8651a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraHwcDisplay::~HwcDisplay() {}
8751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
8851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoarabool HwcDisplay::SetClientTarget(const native_handle_t* handle,
8951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                                 base::unique_fd fence) {
90e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  if (handle)
91e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    buffer_ = GetBufferFromHandle(handle);
9251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
9351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  fence_ = new Fence(fence.release());
9451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return true;
9551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
9651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
9751a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraHwcLayer* HwcDisplay::CreateLayer() {
9851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  uint64_t layer_id = layer_ids_++;
9951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  layers_.push_back(HwcLayer(layer_id));
10051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return &layers_.back();
10151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
10251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
10351a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraHwcLayer* HwcDisplay::GetLayer(Layer id) {
10451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  for (size_t i = 0; i < layers_.size(); ++i)
105e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara    if (layers_[i].info.id == id) return &layers_[i];
10651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
10751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return nullptr;
10851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
10951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
11051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoarabool HwcDisplay::DestroyLayer(Layer id) {
11151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  for (auto it = layers_.begin(); it != layers_.end(); ++it) {
112e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara    if (it->info.id == id) {
11351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara      layers_.erase(it);
11451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara      return true;
11551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    }
11651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  }
11751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
11851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return false;
11951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
12051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
12151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoaravoid HwcDisplay::GetChangedCompositionTypes(
12251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    std::vector<Layer>* layer_ids,
12351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    std::vector<IComposerClient::Composition>* types) {
124e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  std::sort(layers_.begin(), layers_.end(),
125e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko            [](const auto& lhs, const auto& rhs) {
126e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko              return lhs.z_order < rhs.z_order;
127e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko            });
128e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
129e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  int first_client_layer = -1, last_client_layer = -1;
130e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  for (size_t i = 0; i < layers_.size(); ++i) {
131e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    switch (layers_[i].composition_type) {
132e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      case IComposerClient::Composition::SOLID_COLOR:
133e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      case IComposerClient::Composition::CURSOR:
134e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      case IComposerClient::Composition::SIDEBAND:
135e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko        if (first_client_layer < 0)
136e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko          first_client_layer = i;
137e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
138e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko        last_client_layer = i;
139e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko        break;
140e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      default:
141e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko        break;
142e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    }
143e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  }
144e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
145e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  for (size_t i = 0; i < layers_.size(); ++i) {
146e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    if (i >= first_client_layer && i <= last_client_layer) {
147e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      if (layers_[i].composition_type != IComposerClient::Composition::CLIENT) {
148e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara        layer_ids->push_back(layers_[i].info.id);
149e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko        types->push_back(IComposerClient::Composition::CLIENT);
150e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko        layers_[i].composition_type = IComposerClient::Composition::CLIENT;
151e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      }
152e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
153e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      continue;
154e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    }
155e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
156e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    if (layers_[i].composition_type != IComposerClient::Composition::DEVICE) {
157e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara      layer_ids->push_back(layers_[i].info.id);
158e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      types->push_back(IComposerClient::Composition::DEVICE);
159e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      layers_[i].composition_type = IComposerClient::Composition::DEVICE;
160e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    }
16151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  }
16251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
16351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
164e7916f88ab250e9cbd7faa53458491f19b716782Daniel NicoaraError HwcDisplay::GetFrame(
165e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara    std::vector<ComposerView::ComposerLayer>* out_frames) {
166e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  bool queued_client_target = false;
167e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  std::vector<ComposerView::ComposerLayer> frame;
168e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  for (const auto& layer : layers_) {
169e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    if (layer.composition_type == IComposerClient::Composition::CLIENT) {
170e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara      if (queued_client_target)
171e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara        continue;
172e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara
173e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara      if (!buffer_.get()) {
174e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara        ALOGE("Client composition requested but no client target buffer");
175e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara        return Error::BAD_LAYER;
176e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      }
177e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara
178e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara      ComposerView::ComposerLayer client_target_layer = {
179e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara          .buffer = buffer_,
180e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara          .fence = fence_.get() ? fence_ : new Fence(-1),
181e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara          .display_frame = {0, 0, static_cast<int32_t>(buffer_->getWidth()),
182e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara            static_cast<int32_t>(buffer_->getHeight())},
183e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara          .crop = {0.0f, 0.0f, static_cast<float>(buffer_->getWidth()),
184e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara            static_cast<float>(buffer_->getHeight())},
185e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara          .blend_mode = IComposerClient::BlendMode::NONE,
186e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara      };
187e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara
188e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara      frame.push_back(client_target_layer);
189e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara      queued_client_target = true;
190e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    } else {
191e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara      if (!layer.info.buffer.get() || !layer.info.fence.get()) {
192e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara        ALOGE("Layer requested without valid buffer");
193e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara        return Error::BAD_LAYER;
194e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara      }
195e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara
196e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      frame.push_back(layer.info);
197e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    }
198e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  }
199e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
200ffbf8e3d25dfd5e0fb87c19c88d8796daac2eb81Daniel Nicoara  if (frame.empty()) {
201ffbf8e3d25dfd5e0fb87c19c88d8796daac2eb81Daniel Nicoara    ALOGE("Requested frame with no layers");
202ffbf8e3d25dfd5e0fb87c19c88d8796daac2eb81Daniel Nicoara    return Error::BAD_LAYER;
203ffbf8e3d25dfd5e0fb87c19c88d8796daac2eb81Daniel Nicoara  }
204ffbf8e3d25dfd5e0fb87c19c88d8796daac2eb81Daniel Nicoara
205e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara  out_frames->swap(frame);
206e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara  return Error::NONE;
20751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
20851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
209e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoarastd::vector<Layer> HwcDisplay::UpdateLastFrameAndGetLastFrameLayers() {
210e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara  std::vector<Layer> last_frame_layers;
211e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara  last_frame_layers.swap(last_frame_layers_ids_);
21251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
213e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara  for (const auto& layer : layers_)
214e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara    last_frame_layers_ids_.push_back(layer.info.id);
215e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara
216e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara  return last_frame_layers;
217e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
218e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
219e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko////////////////////////////////////////////////////////////////////////////////
220e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// VrHwcClient
22151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
22251a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraVrHwc::VrHwc() {}
22351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
22451a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraVrHwc::~VrHwc() {}
22551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
22651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoarabool VrHwc::hasCapability(Capability capability) const { return false; }
22751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
22851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoaravoid VrHwc::removeClient() {
22951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  std::lock_guard<std::mutex> guard(mutex_);
23051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  client_ = nullptr;
23151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
23251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
23351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoaravoid VrHwc::enableCallback(bool enable) {
23451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  std::lock_guard<std::mutex> guard(mutex_);
23551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (enable && client_ != nullptr) {
23651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    client_.promote()->onHotplug(kDefaultDisplayId,
23751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                                 IComposerCallback::Connection::CONNECTED);
23851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  }
23951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
24051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
24151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoarauint32_t VrHwc::getMaxVirtualDisplayCount() { return 0; }
24251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
24351a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::createVirtualDisplay(uint32_t width, uint32_t height,
24451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                                  PixelFormat* format, Display* outDisplay) {
24551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  *format = PixelFormat::RGBA_8888;
24651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  *outDisplay = 0;
24751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
24851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
24951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
25051a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::destroyVirtualDisplay(Display display) { return Error::NONE; }
25151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
25251a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::createLayer(Display display, Layer* outLayer) {
25351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (display != kDefaultDisplayId) {
25451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    return Error::BAD_DISPLAY;
25551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  }
25651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
25751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  std::lock_guard<std::mutex> guard(mutex_);
25851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
25951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  HwcLayer* layer = display_.CreateLayer();
260e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara  *outLayer = layer->info.id;
26151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
26251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
26351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
26451a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::destroyLayer(Display display, Layer layer) {
26551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (display != kDefaultDisplayId) return Error::BAD_DISPLAY;
26651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
26751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  std::lock_guard<std::mutex> guard(mutex_);
26851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
26951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return display_.DestroyLayer(layer) ? Error::NONE : Error::BAD_LAYER;
27051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
27151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
27251a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::getActiveConfig(Display display, Config* outConfig) {
27351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (display != kDefaultDisplayId) return Error::BAD_DISPLAY;
27451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
27551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  *outConfig = kDefaultConfigId;
27651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
27751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
27851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
27951a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::getClientTargetSupport(Display display, uint32_t width,
28051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                                    uint32_t height, PixelFormat format,
28151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                                    Dataspace dataspace) {
28251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
28351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
28451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
28551a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::getColorModes(Display display, hidl_vec<ColorMode>* outModes) {
28651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  std::vector<ColorMode> color_modes(1, ColorMode::NATIVE);
28751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  *outModes = hidl_vec<ColorMode>(color_modes);
28851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
28951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
29051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
29151a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::getDisplayAttribute(Display display, Config config,
29251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                                 IComposerClient::Attribute attribute,
29351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                                 int32_t* outValue) {
29451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (display != kDefaultDisplayId) {
29551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    return Error::BAD_DISPLAY;
29651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  }
29751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
29851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (config != kDefaultConfigId) {
29951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    return Error::BAD_CONFIG;
30051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  }
30151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
30251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  switch (attribute) {
30351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    case IComposerClient::Attribute::WIDTH:
304e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      *outValue = 1920;
30551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara      break;
30651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    case IComposerClient::Attribute::HEIGHT:
307e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      *outValue = 1080;
30851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara      break;
30951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    case IComposerClient::Attribute::VSYNC_PERIOD:
31051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara      *outValue = 1000 * 1000 * 1000 / 30;  // 30fps
31151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara      break;
31251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    case IComposerClient::Attribute::DPI_X:
31351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    case IComposerClient::Attribute::DPI_Y:
31451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara      *outValue = 300 * 1000;  // 300dpi
31551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara      break;
31651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    default:
31751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara      return Error::BAD_PARAMETER;
31851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  }
31951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
32051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
32151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
32251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
32351a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::getDisplayConfigs(Display display, hidl_vec<Config>* outConfigs) {
32451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (display != kDefaultDisplayId) {
32551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    return Error::BAD_DISPLAY;
32651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  }
32751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
32851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  std::vector<Config> configs(1, kDefaultConfigId);
32951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  *outConfigs = hidl_vec<Config>(configs);
33051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
33151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
33251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
33351a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::getDisplayName(Display display, hidl_string* outName) {
33451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  *outName = hidl_string();
33551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
33651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
33751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
33851a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::getDisplayType(Display display,
33951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                            IComposerClient::DisplayType* outType) {
34051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (display != kDefaultDisplayId) {
34151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    *outType = IComposerClient::DisplayType::INVALID;
34251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    return Error::BAD_DISPLAY;
34351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  }
34451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
34551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  *outType = IComposerClient::DisplayType::PHYSICAL;
34651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
34751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
34851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
34951a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::getDozeSupport(Display display, bool* outSupport) {
35051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  *outSupport = false;
35151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (display == kDefaultDisplayId)
35251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    return Error::NONE;
35351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  else
35451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    return Error::BAD_DISPLAY;
35551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
35651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
35751a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::getHdrCapabilities(Display display, hidl_vec<Hdr>* outTypes,
35851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                                float* outMaxLuminance,
35951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                                float* outMaxAverageLuminance,
36051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                                float* outMinLuminance) {
36151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  *outMaxLuminance = 0;
36251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  *outMaxAverageLuminance = 0;
36351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  *outMinLuminance = 0;
36451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
36551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
36651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
36751a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setActiveConfig(Display display, Config config) {
36851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (display != kDefaultDisplayId) return Error::BAD_DISPLAY;
36951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
37051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (config != kDefaultConfigId) return Error::BAD_CONFIG;
37151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
37251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
37351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
37451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
37551a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setColorMode(Display display, ColorMode mode) {
37651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (display != kDefaultDisplayId) return Error::BAD_DISPLAY;
37751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
37851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
37951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
38051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
38151a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setPowerMode(Display display, IComposerClient::PowerMode mode) {
38251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (display != kDefaultDisplayId) return Error::BAD_DISPLAY;
38351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
38451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
38551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
38651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
38751a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setVsyncEnabled(Display display, IComposerClient::Vsync enabled) {
38851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (display != kDefaultDisplayId) return Error::BAD_DISPLAY;
38951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
39051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
39151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
39251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
39351a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setColorTransform(Display display, const float* matrix,
39451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                               int32_t hint) {
39551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (display != kDefaultDisplayId) return Error::BAD_DISPLAY;
39651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
39751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
39851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
39951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
40051a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setClientTarget(Display display, buffer_handle_t target,
40151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                             int32_t acquireFence, int32_t dataspace,
40251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                             const std::vector<hwc_rect_t>& damage) {
40351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  base::unique_fd fence(acquireFence);
40451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (display != kDefaultDisplayId) return Error::BAD_DISPLAY;
40551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
40651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (target == nullptr) return Error::NONE;
40751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
40851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  std::lock_guard<std::mutex> guard(mutex_);
40951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
41051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (!display_.SetClientTarget(target, std::move(fence)))
41151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    return Error::BAD_PARAMETER;
41251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
41351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
41451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
41551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
41651a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setOutputBuffer(Display display, buffer_handle_t buffer,
41751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                             int32_t releaseFence) {
41851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  base::unique_fd fence(releaseFence);
41951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (display != kDefaultDisplayId) return Error::BAD_DISPLAY;
42051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
421e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara  ALOGE("Virtual display support not implemented");
422e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara  return Error::UNSUPPORTED;
42351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
42451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
42551a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::validateDisplay(
42651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    Display display, std::vector<Layer>* outChangedLayers,
42751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    std::vector<IComposerClient::Composition>* outCompositionTypes,
42851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    uint32_t* outDisplayRequestMask, std::vector<Layer>* outRequestedLayers,
42951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    std::vector<uint32_t>* outRequestMasks) {
43051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (display != kDefaultDisplayId) {
43151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    return Error::BAD_DISPLAY;
43251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  }
43351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
43451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  std::lock_guard<std::mutex> guard(mutex_);
43551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
43651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  display_.GetChangedCompositionTypes(outChangedLayers, outCompositionTypes);
43751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
43851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
43951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
44051a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::acceptDisplayChanges(Display display) { return Error::NONE; }
44151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
44251a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::presentDisplay(Display display, int32_t* outPresentFence,
44351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                            std::vector<Layer>* outLayers,
44451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                            std::vector<int32_t>* outReleaseFences) {
44551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  *outPresentFence = -1;
446e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara  outLayers->clear();
447e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara  outReleaseFences->clear();
448e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara
44951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (display != kDefaultDisplayId) {
45051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    return Error::BAD_DISPLAY;
45151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  }
45251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
453e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  std::vector<ComposerView::ComposerLayer> frame;
454e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara  std::vector<Layer> last_frame_layers;
455e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara  std::lock_guard<std::mutex> guard(mutex_);
456e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara  Error status = display_.GetFrame(&frame);
457e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara  if (status != Error::NONE)
458e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara    return status;
459e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara
460e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara  last_frame_layers = display_.UpdateLastFrameAndGetLastFrameLayers();
46151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
462e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara  base::unique_fd fence;
46351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (observer_)
464e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara    fence = observer_->OnNewFrame(frame);
465e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara
466e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara  if (fence.get() < 0)
467e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara    return Error::NONE;
468e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara
469e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara  *outPresentFence = dup(fence.get());
470e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara  outLayers->swap(last_frame_layers);
471e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara  for (size_t i = 0; i < outLayers->size(); ++i)
472e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara    outReleaseFences->push_back(dup(fence.get()));
47351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
47451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
47551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
47651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
47751a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerCursorPosition(Display display, Layer layer, int32_t x,
47851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                                    int32_t y) {
47951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (display != kDefaultDisplayId) return Error::BAD_DISPLAY;
48051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
48151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
48251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
48351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
48451a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerBuffer(Display display, Layer layer,
48551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                            buffer_handle_t buffer, int32_t acquireFence) {
48651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  base::unique_fd fence(acquireFence);
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->info.buffer = GetBufferFromHandle(buffer);
493e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  hwc_layer->info.fence = new Fence(fence.release());
494e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
49551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
49651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
49751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
49851a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerSurfaceDamage(Display display, Layer layer,
49951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                                   const std::vector<hwc_rect_t>& damage) {
50051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (display != kDefaultDisplayId) return Error::BAD_DISPLAY;
50151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
50251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
50351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
50451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
50551a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerBlendMode(Display display, Layer layer, int32_t mode) {
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.blend_mode =
512e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      static_cast<ComposerView::ComposerLayer::BlendMode>(mode);
513e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
51451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
51551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
51651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
51751a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerColor(Display display, Layer layer,
51851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                           IComposerClient::Color color) {
51951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (display != kDefaultDisplayId) return Error::BAD_DISPLAY;
52051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
52151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
52251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
52351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
52451a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerCompositionType(Display display, Layer layer,
52551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                                     int32_t type) {
52651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (display != kDefaultDisplayId) return Error::BAD_DISPLAY;
52751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
528e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  HwcLayer* hwc_layer = display_.GetLayer(layer);
529e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  if (!hwc_layer) return Error::BAD_LAYER;
530e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
531e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  hwc_layer->composition_type = static_cast<HwcLayer::Composition>(type);
532e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
53351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
53451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
53551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
53651a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerDataspace(Display display, Layer layer,
53751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                               int32_t dataspace) {
53851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (display != kDefaultDisplayId) return Error::BAD_DISPLAY;
53951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
54051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
54151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
54251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
54351a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerDisplayFrame(Display display, Layer layer,
54451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                                  const hwc_rect_t& frame) {
54551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (display != kDefaultDisplayId) return Error::BAD_DISPLAY;
54651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
547e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  HwcLayer* hwc_layer = display_.GetLayer(layer);
548e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  if (!hwc_layer) return Error::BAD_LAYER;
549e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
550e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  hwc_layer->info.display_frame =
551e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      {frame.left, frame.top, frame.right, frame.bottom};
552e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
55351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
55451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
55551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
55651a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerPlaneAlpha(Display display, Layer layer, float alpha) {
55751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (display != kDefaultDisplayId) return Error::BAD_DISPLAY;
55851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
559e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  HwcLayer* hwc_layer = display_.GetLayer(layer);
560e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  if (!hwc_layer) return Error::BAD_LAYER;
561e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
562e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  hwc_layer->info.alpha = alpha;
563e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
56451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
56551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
56651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
56751a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerSidebandStream(Display display, Layer layer,
56851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                                    buffer_handle_t stream) {
56951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (display != kDefaultDisplayId) return Error::BAD_DISPLAY;
57051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
57151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
57251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
57351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
57451a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerSourceCrop(Display display, Layer layer,
57551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                                const hwc_frect_t& crop) {
57651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (display != kDefaultDisplayId) return Error::BAD_DISPLAY;
57751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
578e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  HwcLayer* hwc_layer = display_.GetLayer(layer);
579e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  if (!hwc_layer) return Error::BAD_LAYER;
580e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
581e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  hwc_layer->info.crop = {crop.left, crop.top, crop.right, crop.bottom};
582e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
58351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
58451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
58551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
58651a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerTransform(Display display, Layer layer,
58751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                               int32_t transform) {
58851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (display != kDefaultDisplayId) return Error::BAD_DISPLAY;
58951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
59051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
59151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
59251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
59351a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerVisibleRegion(Display display, Layer layer,
59451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                                   const std::vector<hwc_rect_t>& visible) {
59551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (display != kDefaultDisplayId) return Error::BAD_DISPLAY;
59651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
59751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
59851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
59951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
60051a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerZOrder(Display display, Layer layer, uint32_t z) {
60151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (display != kDefaultDisplayId) return Error::BAD_DISPLAY;
60251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
603e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  HwcLayer* hwc_layer = display_.GetLayer(layer);
604e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  if (!hwc_layer) return Error::BAD_LAYER;
605e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
606e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  hwc_layer->z_order = z;
607e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
60851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
60951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
61051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
61151a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerInfo(Display display, Layer layer, uint32_t type,
61251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara                          uint32_t appId) {
61351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (display != kDefaultDisplayId) return Error::BAD_DISPLAY;
61451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
615e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  HwcLayer* hwc_layer = display_.GetLayer(layer);
616e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  if (!hwc_layer) return Error::BAD_LAYER;
617e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
618e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  hwc_layer->info.type = type;
619e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  hwc_layer->info.app_id = appId;
620e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
62151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Error::NONE;
62251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
62351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
62451a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraReturn<void> VrHwc::getCapabilities(getCapabilities_cb hidl_cb) {
62551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  hidl_cb(hidl_vec<Capability>());
62651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Void();
62751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
62851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
62951a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraReturn<void> VrHwc::dumpDebugInfo(dumpDebugInfo_cb hidl_cb) {
63051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  hidl_cb(hidl_string());
63151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Void();
63251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
63351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
63451a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraReturn<void> VrHwc::createClient(createClient_cb hidl_cb) {
63551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  std::lock_guard<std::mutex> guard(mutex_);
63651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
63751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  Error status = Error::NONE;
63851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  sp<VrComposerClient> client;
63951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (client_ == nullptr) {
64051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    client = new VrComposerClient(*this);
64151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    client->initialize();
64251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  } else {
64351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    ALOGE("Already have a client");
64451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    status = Error::NO_RESOURCES;
64551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  }
64651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
64751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  client_ = client;
64851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  hidl_cb(status, client);
64951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return Void();
65051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
65151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
65251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoaravoid VrHwc::RegisterObserver(Observer* observer) {
65351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  std::lock_guard<std::mutex> guard(mutex_);
65451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (observer_)
65551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    ALOGE("Overwriting observer");
65651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  else
65751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    observer_ = observer;
65851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
65951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
66051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoaravoid VrHwc::UnregisterObserver(Observer* observer) {
66151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  std::lock_guard<std::mutex> guard(mutex_);
66251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  if (observer != observer_)
66351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    ALOGE("Trying to unregister unknown observer");
66451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  else
66551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    observer_ = nullptr;
66651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
66751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
66851a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraComposerView* GetComposerViewFromIComposer(
66951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara    hardware::graphics::composer::V2_1::IComposer* composer) {
67051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara  return static_cast<VrHwc*>(composer);
67151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}
67251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
67351a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraIComposer* HIDL_FETCH_IComposer(const char*) { return new VrHwc(); }
67451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara
67551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}  // namespace dvr
67651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara}  // namespace android
677