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