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