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 18784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliu#include "android-base/stringprintf.h" 19bd9f4d2fef3028bec848bdc216681f4b1678e932Kevin Schoedel#include <cutils/properties.h> 204251e92b6dacb5653aa9528d88484085ee333e3bDaniel Nicoara#include <private/dvr/display_client.h> 2151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara#include <ui/Fence.h> 2251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 2351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara#include <mutex> 2451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 25e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include "vr_composer_client.h" 2651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 2751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoarausing namespace android::hardware::graphics::common::V1_0; 2851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoarausing namespace android::hardware::graphics::composer::V2_1; 2951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 30784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliuusing android::base::StringPrintf; 3151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoarausing android::hardware::hidl_handle; 3251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoarausing android::hardware::hidl_string; 3351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoarausing android::hardware::hidl_vec; 3451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoarausing android::hardware::Return; 3551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoarausing android::hardware::Void; 3651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 3751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoaranamespace android { 3851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoaranamespace dvr { 3951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoaranamespace { 4051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 4151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoarausing android::hardware::graphics::common::V1_0::PixelFormat; 4251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 4351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoaraconst Display kDefaultDisplayId = 1; 4451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoaraconst Config kDefaultConfigId = 1; 4551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 461f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoarasp<GraphicBuffer> CreateGraphicBuffer( 471f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara const native_handle_t* handle, 481f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara const IVrComposerClient::BufferMetadata& metadata) { 491f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara sp<GraphicBuffer> buffer = new GraphicBuffer( 501f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara handle, GraphicBuffer::CLONE_HANDLE, metadata.width, metadata.height, 511f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara static_cast<int32_t>(metadata.format), metadata.layerCount, 5273feb0676635da6c0f738c10e04052a8162a4095Chris Forbes metadata.usage, metadata.stride); 531f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara if (buffer->initCheck() != OK) { 541f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara ALOGE("Failed to create graphic buffer"); 551f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara return nullptr; 561f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara } 571f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara 581f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara return buffer; 59e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} 60e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 61d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoaravoid GetPrimaryDisplaySize(int32_t* width, int32_t* height) { 62d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara *width = 1080; 63d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara *height = 1920; 64d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara 65d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara int error = 0; 662251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka auto display_client = display::DisplayClient::Create(&error); 672251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka if (!display_client) { 68d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara ALOGE("Could not connect to display service : %s(%d)", strerror(error), 69d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara error); 70d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara return; 71d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara } 72d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara 732251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka auto status = display_client->GetDisplayMetrics(); 742251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka if (!status) { 75d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara ALOGE("Could not get display metrics from display service : %s(%d)", 762251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka status.GetErrorMessage().c_str(), status.error()); 77d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara return; 78d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara } 79d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara 802251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka *width = status.get().display_width; 812251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka *height = status.get().display_height; 82d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara} 83d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara 8451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} // namespace 8551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 86d330a62612e287b63442db2470d89c55ad326f27Daniel NicoaraHwcDisplay::HwcDisplay(int32_t width, int32_t height) 87d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara : width_(width), height_(height) {} 8851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 8951a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraHwcDisplay::~HwcDisplay() {} 9051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 9151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoarabool HwcDisplay::SetClientTarget(const native_handle_t* handle, 9251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara base::unique_fd fence) { 93e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko if (handle) 941f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara buffer_ = CreateGraphicBuffer(handle, buffer_metadata_); 9551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 9651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara fence_ = new Fence(fence.release()); 9751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return true; 9851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 9951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 1001f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoaravoid HwcDisplay::SetClientTargetMetadata( 1011f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara const IVrComposerClient::BufferMetadata& metadata) { 1021f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara buffer_metadata_ = metadata; 1031f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara} 1041f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara 10551a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraHwcLayer* HwcDisplay::CreateLayer() { 10651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara uint64_t layer_id = layer_ids_++; 10751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara layers_.push_back(HwcLayer(layer_id)); 10851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return &layers_.back(); 10951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 11051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 11151a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraHwcLayer* HwcDisplay::GetLayer(Layer id) { 11251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara for (size_t i = 0; i < layers_.size(); ++i) 1132b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (layers_[i].info.id == id) 1142b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return &layers_[i]; 11551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 11651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return nullptr; 11751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 11851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 11951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoarabool HwcDisplay::DestroyLayer(Layer id) { 12051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara for (auto it = layers_.begin(); it != layers_.end(); ++it) { 121e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara if (it->info.id == id) { 12251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara layers_.erase(it); 12351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return true; 12451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara } 12551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara } 12651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 12751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return false; 12851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 12951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 13051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoaravoid HwcDisplay::GetChangedCompositionTypes( 13151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara std::vector<Layer>* layer_ids, 13251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara std::vector<IComposerClient::Composition>* types) { 133e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko std::sort(layers_.begin(), layers_.end(), 134e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko [](const auto& lhs, const auto& rhs) { 135730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk return lhs.info.z_order < rhs.info.z_order; 136e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko }); 137e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 1389494b73677e39a5dc67ee8e64c9cc944624ebffdGeorge Burgess IV const size_t no_layer = std::numeric_limits<size_t>::max(); 1399494b73677e39a5dc67ee8e64c9cc944624ebffdGeorge Burgess IV size_t first_client_layer = no_layer, last_client_layer = no_layer; 140e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko for (size_t i = 0; i < layers_.size(); ++i) { 141e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko switch (layers_[i].composition_type) { 142e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko case IComposerClient::Composition::SOLID_COLOR: 143e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko case IComposerClient::Composition::CURSOR: 144e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko case IComposerClient::Composition::SIDEBAND: 1459494b73677e39a5dc67ee8e64c9cc944624ebffdGeorge Burgess IV if (first_client_layer == no_layer) 146e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko first_client_layer = i; 147e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 148e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko last_client_layer = i; 149e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko break; 150e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko default: 151e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko break; 152e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko } 153e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko } 154e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 155e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko for (size_t i = 0; i < layers_.size(); ++i) { 156e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko if (i >= first_client_layer && i <= last_client_layer) { 157e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko if (layers_[i].composition_type != IComposerClient::Composition::CLIENT) { 158e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara layer_ids->push_back(layers_[i].info.id); 159e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko types->push_back(IComposerClient::Composition::CLIENT); 160e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko layers_[i].composition_type = IComposerClient::Composition::CLIENT; 161e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko } 162e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 163e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko continue; 164e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko } 165e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 166e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko if (layers_[i].composition_type != IComposerClient::Composition::DEVICE) { 167e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara layer_ids->push_back(layers_[i].info.id); 168e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko types->push_back(IComposerClient::Composition::DEVICE); 169e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko layers_[i].composition_type = IComposerClient::Composition::DEVICE; 170e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko } 17151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara } 17251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 17351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 174e7916f88ab250e9cbd7faa53458491f19b716782Daniel NicoaraError HwcDisplay::GetFrame( 175e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara std::vector<ComposerView::ComposerLayer>* out_frames) { 176e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko bool queued_client_target = false; 177e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko std::vector<ComposerView::ComposerLayer> frame; 178e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko for (const auto& layer : layers_) { 179e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko if (layer.composition_type == IComposerClient::Composition::CLIENT) { 180e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara if (queued_client_target) 181e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara continue; 182e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara 183e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara if (!buffer_.get()) { 184e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara ALOGE("Client composition requested but no client target buffer"); 185e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara return Error::BAD_LAYER; 186e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko } 187e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara 188e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara ComposerView::ComposerLayer client_target_layer = { 189e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara .buffer = buffer_, 190e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara .fence = fence_.get() ? fence_ : new Fence(-1), 191e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara .display_frame = {0, 0, static_cast<int32_t>(buffer_->getWidth()), 192e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara static_cast<int32_t>(buffer_->getHeight())}, 193e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara .crop = {0.0f, 0.0f, static_cast<float>(buffer_->getWidth()), 194e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara static_cast<float>(buffer_->getHeight())}, 195e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara .blend_mode = IComposerClient::BlendMode::NONE, 196e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara }; 197e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara 198e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara frame.push_back(client_target_layer); 199e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara queued_client_target = true; 200e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko } else { 201e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara if (!layer.info.buffer.get() || !layer.info.fence.get()) { 2023e7dad572220e2c4b9bfbd471a6278385e99330dDaniel Nicoara ALOGV("Layer requested without valid buffer"); 2033e7dad572220e2c4b9bfbd471a6278385e99330dDaniel Nicoara continue; 204e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara } 205e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara 206e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko frame.push_back(layer.info); 207e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko } 208e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko } 209e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 210e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara out_frames->swap(frame); 211e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara return Error::NONE; 21251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 21351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 214e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoarastd::vector<Layer> HwcDisplay::UpdateLastFrameAndGetLastFrameLayers() { 215e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara std::vector<Layer> last_frame_layers; 216e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara last_frame_layers.swap(last_frame_layers_ids_); 21751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 218e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara for (const auto& layer : layers_) 219e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara last_frame_layers_ids_.push_back(layer.info.id); 220e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara 221e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara return last_frame_layers; 222e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} 223e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 224730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulkvoid HwcDisplay::SetColorTransform(const float* matrix, int32_t hint) { 225730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk color_transform_hint_ = hint; 226730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk if (matrix) 227730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk memcpy(color_transform_, matrix, sizeof(color_transform_)); 228730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk} 229730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk 230784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliuvoid HwcDisplay::dumpDebugInfo(std::string* result) const { 231784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliu if (!result) { 232784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliu return; 233784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliu } 234784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliu *result += StringPrintf("HwcDisplay: width: %d, height: %d, layers size: %zu, colormode: %d\ 235784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliu , config: %d\n", width_, height_, layers_.size(), color_mode_, active_config_); 236784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliu *result += StringPrintf("HwcDisplay buffer metadata: width: %d, height: %d, stride: %d,\ 237784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliu layerCount: %d, pixelFormat: %d\n", buffer_metadata_.width, buffer_metadata_.height, 238784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliu buffer_metadata_.stride, buffer_metadata_.layerCount, buffer_metadata_.format); 239784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliu for (const auto& layer : layers_) { 240784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliu layer.dumpDebugInfo(result); 241784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliu } 242784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliu} 243784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliu 244e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko//////////////////////////////////////////////////////////////////////////////// 245e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// VrHwcClient 24651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 247d330a62612e287b63442db2470d89c55ad326f27Daniel NicoaraVrHwc::VrHwc() {} 24851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 24951a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraVrHwc::~VrHwc() {} 25051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 25141b98d41f9f4e94a1a9a31960a317649cbec3b09Chia-I Wubool VrHwc::hasCapability(hwc2_capability_t /* capability */) { return false; } 25251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 253513476ab1802bf315d70a854512f4940a035fcf9Chia-I Wuvoid VrHwc::registerEventCallback(EventCallback* callback) { 254c683dfeccb10aeee7abc9b1e496bd88581a1860cSteven Thomas { 255c683dfeccb10aeee7abc9b1e496bd88581a1860cSteven Thomas std::lock_guard<std::mutex> guard(mutex_); 256c683dfeccb10aeee7abc9b1e496bd88581a1860cSteven Thomas event_callback_ = callback; 257c683dfeccb10aeee7abc9b1e496bd88581a1860cSteven Thomas int32_t width, height; 258c683dfeccb10aeee7abc9b1e496bd88581a1860cSteven Thomas GetPrimaryDisplaySize(&width, &height); 259c683dfeccb10aeee7abc9b1e496bd88581a1860cSteven Thomas // Create the primary display late to avoid initialization issues between 260c683dfeccb10aeee7abc9b1e496bd88581a1860cSteven Thomas // VR HWC and SurfaceFlinger. 261c683dfeccb10aeee7abc9b1e496bd88581a1860cSteven Thomas displays_[kDefaultDisplayId].reset(new HwcDisplay(width, height)); 26251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara } 263c683dfeccb10aeee7abc9b1e496bd88581a1860cSteven Thomas event_callback_->onHotplug(kDefaultDisplayId, 264c683dfeccb10aeee7abc9b1e496bd88581a1860cSteven Thomas IComposerCallback::Connection::CONNECTED); 265c683dfeccb10aeee7abc9b1e496bd88581a1860cSteven Thomas} 266c683dfeccb10aeee7abc9b1e496bd88581a1860cSteven Thomas 267c683dfeccb10aeee7abc9b1e496bd88581a1860cSteven Thomasvoid VrHwc::unregisterEventCallback() { 268c683dfeccb10aeee7abc9b1e496bd88581a1860cSteven Thomas std::lock_guard<std::mutex> guard(mutex_); 269c683dfeccb10aeee7abc9b1e496bd88581a1860cSteven Thomas event_callback_ = nullptr; 27051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 27151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 272a6cc42264e021e37ec52c189dc8e1059d45d4f9bDaniel Nicoarauint32_t VrHwc::getMaxVirtualDisplayCount() { return 1; } 27351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 27451a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::createVirtualDisplay(uint32_t width, uint32_t height, 27551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara PixelFormat* format, Display* outDisplay) { 27651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara *format = PixelFormat::RGBA_8888; 277a6cc42264e021e37ec52c189dc8e1059d45d4f9bDaniel Nicoara *outDisplay = display_count_; 278d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara displays_[display_count_].reset(new HwcDisplay(width, height)); 279a6cc42264e021e37ec52c189dc8e1059d45d4f9bDaniel Nicoara display_count_++; 28051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 28151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 28251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 2832b3b666cfd89681514764201803e48b6ba112a80Albert ChaulkError VrHwc::destroyVirtualDisplay(Display display) { 2842b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk std::lock_guard<std::mutex> guard(mutex_); 2852b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (display == kDefaultDisplayId || displays_.erase(display) == 0) 28651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::BAD_DISPLAY; 2872b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk ComposerView::Frame frame; 2882b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk frame.display_id = display; 2892b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk frame.removed = true; 2902b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (observer_) 2912b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk observer_->OnNewFrame(frame); 2922b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::NONE; 2932b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk} 29451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 2952b3b666cfd89681514764201803e48b6ba112a80Albert ChaulkError VrHwc::createLayer(Display display, Layer* outLayer) { 29651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara std::lock_guard<std::mutex> guard(mutex_); 2972b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk auto display_ptr = FindDisplay(display); 2982b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (!display_ptr) 2992b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_DISPLAY; 30051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 3012b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk HwcLayer* layer = display_ptr->CreateLayer(); 302e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara *outLayer = layer->info.id; 30351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 30451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 30551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 30651a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::destroyLayer(Display display, Layer layer) { 30751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara std::lock_guard<std::mutex> guard(mutex_); 3082b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk auto display_ptr = FindDisplay(display); 3092b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (!display_ptr) { 3102b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_DISPLAY; 3112b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk } 31251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 3132b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return display_ptr->DestroyLayer(layer) ? Error::NONE : Error::BAD_LAYER; 31451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 31551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 31651a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::getActiveConfig(Display display, Config* outConfig) { 3172b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk std::lock_guard<std::mutex> guard(mutex_); 3182b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (!FindDisplay(display)) 3192b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_DISPLAY; 32051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara *outConfig = kDefaultConfigId; 32151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 32251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 32351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 324b0d89ff617e4c39d0d0aba650854492077321dbbDaniel NicoaraError VrHwc::getClientTargetSupport(Display /* display */, uint32_t /* width */, 325b0d89ff617e4c39d0d0aba650854492077321dbbDaniel Nicoara uint32_t /* height */, 326b0d89ff617e4c39d0d0aba650854492077321dbbDaniel Nicoara PixelFormat /* format */, 327b0d89ff617e4c39d0d0aba650854492077321dbbDaniel Nicoara Dataspace /* dataspace */) { 32851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 32951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 33051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 331b0d89ff617e4c39d0d0aba650854492077321dbbDaniel NicoaraError VrHwc::getColorModes(Display /* display */, 332b0d89ff617e4c39d0d0aba650854492077321dbbDaniel Nicoara hidl_vec<ColorMode>* outModes) { 33351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara std::vector<ColorMode> color_modes(1, ColorMode::NATIVE); 33451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara *outModes = hidl_vec<ColorMode>(color_modes); 33551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 33651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 33751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 33851a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::getDisplayAttribute(Display display, Config config, 33951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara IComposerClient::Attribute attribute, 34051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara int32_t* outValue) { 3412b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk std::lock_guard<std::mutex> guard(mutex_); 342d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara auto display_ptr = FindDisplay(display); 343d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara if (!display_ptr) { 34451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::BAD_DISPLAY; 345d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara } 34651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara if (config != kDefaultConfigId) { 34751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::BAD_CONFIG; 34851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara } 34951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 35051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara switch (attribute) { 35151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara case IComposerClient::Attribute::WIDTH: 352d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara *outValue = display_ptr->width(); 35351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara break; 35451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara case IComposerClient::Attribute::HEIGHT: 355d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara *outValue = display_ptr->height(); 35651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara break; 35751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara case IComposerClient::Attribute::VSYNC_PERIOD: 35822c1462add2567fffc6910b120c93b6074f2641bStephen Kiazyk { 35922c1462add2567fffc6910b120c93b6074f2641bStephen Kiazyk int error = 0; 36022c1462add2567fffc6910b120c93b6074f2641bStephen Kiazyk auto display_client = display::DisplayClient::Create(&error); 36122c1462add2567fffc6910b120c93b6074f2641bStephen Kiazyk if (!display_client) { 36222c1462add2567fffc6910b120c93b6074f2641bStephen Kiazyk ALOGE("Could not connect to display service : %s(%d)", 36322c1462add2567fffc6910b120c93b6074f2641bStephen Kiazyk strerror(error), error); 36422c1462add2567fffc6910b120c93b6074f2641bStephen Kiazyk // Return a default value of 30 fps 36522c1462add2567fffc6910b120c93b6074f2641bStephen Kiazyk *outValue = 1000 * 1000 * 1000 / 30; 36622c1462add2567fffc6910b120c93b6074f2641bStephen Kiazyk } else { 36722c1462add2567fffc6910b120c93b6074f2641bStephen Kiazyk auto metrics = display_client->GetDisplayMetrics(); 36822c1462add2567fffc6910b120c93b6074f2641bStephen Kiazyk *outValue = metrics.get().vsync_period_ns; 36922c1462add2567fffc6910b120c93b6074f2641bStephen Kiazyk } 37022c1462add2567fffc6910b120c93b6074f2641bStephen Kiazyk } 37151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara break; 37251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara case IComposerClient::Attribute::DPI_X: 37351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara case IComposerClient::Attribute::DPI_Y: 374bd9f4d2fef3028bec848bdc216681f4b1678e932Kevin Schoedel { 375bd9f4d2fef3028bec848bdc216681f4b1678e932Kevin Schoedel constexpr int32_t kDefaultDPI = 300; 376bd9f4d2fef3028bec848bdc216681f4b1678e932Kevin Schoedel int32_t dpi = property_get_int32("ro.vr.hwc.dpi", kDefaultDPI); 377bd9f4d2fef3028bec848bdc216681f4b1678e932Kevin Schoedel if (dpi <= 0) { 378bd9f4d2fef3028bec848bdc216681f4b1678e932Kevin Schoedel dpi = kDefaultDPI; 379bd9f4d2fef3028bec848bdc216681f4b1678e932Kevin Schoedel } 380bd9f4d2fef3028bec848bdc216681f4b1678e932Kevin Schoedel *outValue = 1000 * dpi; 381bd9f4d2fef3028bec848bdc216681f4b1678e932Kevin Schoedel } 38251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara break; 38351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara default: 38451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::BAD_PARAMETER; 38551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara } 38651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 38751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 38851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 38951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 39051a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::getDisplayConfigs(Display display, hidl_vec<Config>* outConfigs) { 3912b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk std::lock_guard<std::mutex> guard(mutex_); 3922b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (!FindDisplay(display)) 39351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::BAD_DISPLAY; 39451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara std::vector<Config> configs(1, kDefaultConfigId); 39551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara *outConfigs = hidl_vec<Config>(configs); 39651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 39751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 39851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 399b0d89ff617e4c39d0d0aba650854492077321dbbDaniel NicoaraError VrHwc::getDisplayName(Display /* display */, hidl_string* outName) { 40051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara *outName = hidl_string(); 40151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 40251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 40351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 40451a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::getDisplayType(Display display, 40551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara IComposerClient::DisplayType* outType) { 4062b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk std::lock_guard<std::mutex> guard(mutex_); 4072b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk auto display_ptr = FindDisplay(display); 4082b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (!display_ptr) { 40951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara *outType = IComposerClient::DisplayType::INVALID; 41051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::BAD_DISPLAY; 41151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara } 41251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 413a6cc42264e021e37ec52c189dc8e1059d45d4f9bDaniel Nicoara if (display == kDefaultDisplayId) 414a6cc42264e021e37ec52c189dc8e1059d45d4f9bDaniel Nicoara *outType = IComposerClient::DisplayType::PHYSICAL; 415a6cc42264e021e37ec52c189dc8e1059d45d4f9bDaniel Nicoara else 416a6cc42264e021e37ec52c189dc8e1059d45d4f9bDaniel Nicoara *outType = IComposerClient::DisplayType::VIRTUAL; 417a6cc42264e021e37ec52c189dc8e1059d45d4f9bDaniel Nicoara 41851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 41951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 42051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 42151a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::getDozeSupport(Display display, bool* outSupport) { 42251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara *outSupport = false; 4232b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk std::lock_guard<std::mutex> guard(mutex_); 4242b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (!FindDisplay(display)) 42551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::BAD_DISPLAY; 4262b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::NONE; 42751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 42851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 429b0d89ff617e4c39d0d0aba650854492077321dbbDaniel NicoaraError VrHwc::getHdrCapabilities(Display /* display */, 430b0d89ff617e4c39d0d0aba650854492077321dbbDaniel Nicoara hidl_vec<Hdr>* /* outTypes */, 43151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara float* outMaxLuminance, 43251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara float* outMaxAverageLuminance, 43351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara float* outMinLuminance) { 43451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara *outMaxLuminance = 0; 43551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara *outMaxAverageLuminance = 0; 43651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara *outMinLuminance = 0; 43751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 43851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 43951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 44051a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setActiveConfig(Display display, Config config) { 4412b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk std::lock_guard<std::mutex> guard(mutex_); 442730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk auto display_ptr = FindDisplay(display); 443730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk if (!display_ptr) 4442b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_DISPLAY; 4452b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (config != kDefaultConfigId) 4462b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_CONFIG; 44751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 448730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk display_ptr->set_active_config(config); 44951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 45051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 45151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 45251a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setColorMode(Display display, ColorMode mode) { 4532b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk std::lock_guard<std::mutex> guard(mutex_); 454730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk auto display_ptr = FindDisplay(display); 455730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk if (!display_ptr) 4562b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_DISPLAY; 457730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk 458730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk display_ptr->set_color_mode(mode); 45951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 46051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 46151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 46251a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setPowerMode(Display display, IComposerClient::PowerMode mode) { 4632b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk std::lock_guard<std::mutex> guard(mutex_); 464730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk auto display_ptr = FindDisplay(display); 465730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk if (!display_ptr) 4662b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_DISPLAY; 467730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk 468730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk display_ptr->set_power_mode(mode); 46951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 47051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 47151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 47251a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setVsyncEnabled(Display display, IComposerClient::Vsync enabled) { 4732b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk std::lock_guard<std::mutex> guard(mutex_); 474730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk auto display_ptr = FindDisplay(display); 475730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk if (!display_ptr) 4762b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_DISPLAY; 477730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk 478730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk display_ptr->set_vsync_enabled(enabled); 47951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 48051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 48151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 48251a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setColorTransform(Display display, const float* matrix, 48351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara int32_t hint) { 4842b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk std::lock_guard<std::mutex> guard(mutex_); 485730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk auto display_ptr = FindDisplay(display); 486730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk if (!display_ptr) 4872b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_DISPLAY; 488730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk 489730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk display_ptr->SetColorTransform(matrix, hint); 49051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 49151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 49251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 49351a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setClientTarget(Display display, buffer_handle_t target, 494b0d89ff617e4c39d0d0aba650854492077321dbbDaniel Nicoara int32_t acquireFence, int32_t /* dataspace */, 495b0d89ff617e4c39d0d0aba650854492077321dbbDaniel Nicoara const std::vector<hwc_rect_t>& /* damage */) { 49651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara base::unique_fd fence(acquireFence); 49751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara std::lock_guard<std::mutex> guard(mutex_); 4982b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk auto display_ptr = FindDisplay(display); 4992b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (!display_ptr) 5002b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_DISPLAY; 50151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 5022b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (target == nullptr) 5032b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::NONE; 5042b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk 5052b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (!display_ptr->SetClientTarget(target, std::move(fence))) 50651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::BAD_PARAMETER; 50751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 50851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 50951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 51051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 511b0d89ff617e4c39d0d0aba650854492077321dbbDaniel NicoaraError VrHwc::setOutputBuffer(Display display, buffer_handle_t /* buffer */, 51251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara int32_t releaseFence) { 51351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara base::unique_fd fence(releaseFence); 5142b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk std::lock_guard<std::mutex> guard(mutex_); 5152b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk auto display_ptr = FindDisplay(display); 5162b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (!display_ptr) 5172b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_DISPLAY; 51851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 519a6cc42264e021e37ec52c189dc8e1059d45d4f9bDaniel Nicoara // TODO(dnicoara): Is it necessary to do anything here? 520a6cc42264e021e37ec52c189dc8e1059d45d4f9bDaniel Nicoara return Error::NONE; 52151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 52251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 52351a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::validateDisplay( 52451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara Display display, std::vector<Layer>* outChangedLayers, 52551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara std::vector<IComposerClient::Composition>* outCompositionTypes, 526b0d89ff617e4c39d0d0aba650854492077321dbbDaniel Nicoara uint32_t* /* outDisplayRequestMask */, 527b0d89ff617e4c39d0d0aba650854492077321dbbDaniel Nicoara std::vector<Layer>* /* outRequestedLayers */, 528b0d89ff617e4c39d0d0aba650854492077321dbbDaniel Nicoara std::vector<uint32_t>* /* outRequestMasks */) { 52951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara std::lock_guard<std::mutex> guard(mutex_); 5302b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk auto display_ptr = FindDisplay(display); 5312b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (!display_ptr) 5322b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_DISPLAY; 53351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 5342b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk display_ptr->GetChangedCompositionTypes(outChangedLayers, 5352b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk outCompositionTypes); 53651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 53751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 53851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 539b0d89ff617e4c39d0d0aba650854492077321dbbDaniel NicoaraError VrHwc::acceptDisplayChanges(Display /* display */) { return Error::NONE; } 54051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 54151a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::presentDisplay(Display display, int32_t* outPresentFence, 54251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara std::vector<Layer>* outLayers, 54351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara std::vector<int32_t>* outReleaseFences) { 54451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara *outPresentFence = -1; 545e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara outLayers->clear(); 546e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara outReleaseFences->clear(); 547e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara 5482b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk std::lock_guard<std::mutex> guard(mutex_); 5492b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk auto display_ptr = FindDisplay(display); 5502b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk 5512b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (!display_ptr) 55251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::BAD_DISPLAY; 55351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 5542b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk ComposerView::Frame frame; 555e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara std::vector<Layer> last_frame_layers; 5562b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk Error status = display_ptr->GetFrame(&frame.layers); 5572b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk frame.display_id = display; 558d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara frame.display_width = display_ptr->width(); 559d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara frame.display_height = display_ptr->height(); 560730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk frame.active_config = display_ptr->active_config(); 561730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk frame.power_mode = display_ptr->power_mode(); 562730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk frame.vsync_enabled = display_ptr->vsync_enabled(); 563730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk frame.color_transform_hint = display_ptr->color_transform_hint(); 564730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk frame.color_mode = display_ptr->color_mode(); 565730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk memcpy(frame.color_transform, display_ptr->color_transform(), 566730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk sizeof(frame.color_transform)); 567e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara if (status != Error::NONE) 568e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara return status; 569e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara 5702b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk last_frame_layers = display_ptr->UpdateLastFrameAndGetLastFrameLayers(); 57151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 572e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara base::unique_fd fence; 57351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara if (observer_) 574e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara fence = observer_->OnNewFrame(frame); 575e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara 576e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara if (fence.get() < 0) 577e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara return Error::NONE; 578e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara 579e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara *outPresentFence = dup(fence.get()); 580e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara outLayers->swap(last_frame_layers); 581e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara for (size_t i = 0; i < outLayers->size(); ++i) 582e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara outReleaseFences->push_back(dup(fence.get())); 58351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 58451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 58551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 58651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 58751a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerCursorPosition(Display display, Layer layer, int32_t x, 58851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara int32_t y) { 5892b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk std::lock_guard<std::mutex> guard(mutex_); 590730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk auto display_ptr = FindDisplay(display); 591730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk if (!display_ptr) 5922b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_DISPLAY; 593730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk 594730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk HwcLayer* hwc_layer = display_ptr->GetLayer(layer); 595730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk if (!hwc_layer) 596730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk return Error::BAD_LAYER; 597730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk 598730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk hwc_layer->info.cursor_x = x; 599730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk hwc_layer->info.cursor_y = y; 60051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 60151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 60251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 60351a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerBuffer(Display display, Layer layer, 60451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara buffer_handle_t buffer, int32_t acquireFence) { 60551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara base::unique_fd fence(acquireFence); 6062b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk std::lock_guard<std::mutex> guard(mutex_); 6072b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk auto display_ptr = FindDisplay(display); 6082b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (!display_ptr) 6092b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_DISPLAY; 61051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 6112b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk HwcLayer* hwc_layer = display_ptr->GetLayer(layer); 6122b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (!hwc_layer) 6132b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_LAYER; 614e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 6151f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara hwc_layer->info.buffer = CreateGraphicBuffer( 6161f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara buffer, hwc_layer->buffer_metadata); 617e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko hwc_layer->info.fence = new Fence(fence.release()); 618e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 61951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 62051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 62151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 62251a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerSurfaceDamage(Display display, Layer layer, 62351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara const std::vector<hwc_rect_t>& damage) { 6242b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk std::lock_guard<std::mutex> guard(mutex_); 625730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk auto display_ptr = FindDisplay(display); 626730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk if (!display_ptr) 6272b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_DISPLAY; 628730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk 629730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk HwcLayer* hwc_layer = display_ptr->GetLayer(layer); 630730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk if (!hwc_layer) 631730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk return Error::BAD_LAYER; 632730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk 633730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk hwc_layer->info.damaged_regions = damage; 63451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 63551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 63651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 63751a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerBlendMode(Display display, Layer layer, int32_t mode) { 6382b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk std::lock_guard<std::mutex> guard(mutex_); 6392b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk auto display_ptr = FindDisplay(display); 6402b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (!display_ptr) 6412b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_DISPLAY; 64251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 6432b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk HwcLayer* hwc_layer = display_ptr->GetLayer(layer); 6442b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (!hwc_layer) 6452b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_LAYER; 646e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 647e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko hwc_layer->info.blend_mode = 648e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko static_cast<ComposerView::ComposerLayer::BlendMode>(mode); 649e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 65051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 65151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 65251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 65351a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerColor(Display display, Layer layer, 65451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara IComposerClient::Color color) { 6552b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk std::lock_guard<std::mutex> guard(mutex_); 656730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk auto display_ptr = FindDisplay(display); 657730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk if (!display_ptr) 6582b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_DISPLAY; 659730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk 660730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk HwcLayer* hwc_layer = display_ptr->GetLayer(layer); 661730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk if (!hwc_layer) 662730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk return Error::BAD_LAYER; 663730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk 664730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk hwc_layer->info.color = color; 66551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 66651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 66751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 66851a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerCompositionType(Display display, Layer layer, 66951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara int32_t type) { 6702b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk std::lock_guard<std::mutex> guard(mutex_); 6712b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk auto display_ptr = FindDisplay(display); 6722b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (!display_ptr) 6732b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_DISPLAY; 67451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 6752b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk HwcLayer* hwc_layer = display_ptr->GetLayer(layer); 6762b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (!hwc_layer) 6772b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_LAYER; 678e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 679e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko hwc_layer->composition_type = static_cast<HwcLayer::Composition>(type); 680e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 68151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 68251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 68351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 68451a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerDataspace(Display display, Layer layer, 68551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara int32_t dataspace) { 6862b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk std::lock_guard<std::mutex> guard(mutex_); 687730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk auto display_ptr = FindDisplay(display); 688730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk if (!display_ptr) 6892b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_DISPLAY; 690730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk 691730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk HwcLayer* hwc_layer = display_ptr->GetLayer(layer); 692730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk if (!hwc_layer) 693730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk return Error::BAD_LAYER; 694730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk 695730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk hwc_layer->info.dataspace = dataspace; 69651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 69751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 69851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 69951a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerDisplayFrame(Display display, Layer layer, 70051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara const hwc_rect_t& frame) { 7012b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk std::lock_guard<std::mutex> guard(mutex_); 7022b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk auto display_ptr = FindDisplay(display); 7032b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (!display_ptr) 7042b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_DISPLAY; 70551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 7062b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk HwcLayer* hwc_layer = display_ptr->GetLayer(layer); 7072b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (!hwc_layer) 7082b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_LAYER; 709e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 710e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko hwc_layer->info.display_frame = 711e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko {frame.left, frame.top, frame.right, frame.bottom}; 712e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 71351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 71451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 71551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 71651a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerPlaneAlpha(Display display, Layer layer, float alpha) { 7172b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk std::lock_guard<std::mutex> guard(mutex_); 7182b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk auto display_ptr = FindDisplay(display); 7192b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (!display_ptr) 7202b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_DISPLAY; 72151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 7222b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk HwcLayer* hwc_layer = display_ptr->GetLayer(layer); 7232b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (!hwc_layer) 7242b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_LAYER; 725e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 726e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko hwc_layer->info.alpha = alpha; 727e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 72851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 72951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 73051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 731b0d89ff617e4c39d0d0aba650854492077321dbbDaniel NicoaraError VrHwc::setLayerSidebandStream(Display display, Layer /* layer */, 732b0d89ff617e4c39d0d0aba650854492077321dbbDaniel Nicoara buffer_handle_t /* stream */) { 7332b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk std::lock_guard<std::mutex> guard(mutex_); 7342b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (!FindDisplay(display)) 7352b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_DISPLAY; 73651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 73751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 73851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 73951a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerSourceCrop(Display display, Layer layer, 74051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara const hwc_frect_t& crop) { 7412b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk std::lock_guard<std::mutex> guard(mutex_); 7422b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk auto display_ptr = FindDisplay(display); 7432b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (!display_ptr) 7442b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_DISPLAY; 74551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 7462b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk HwcLayer* hwc_layer = display_ptr->GetLayer(layer); 7472b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (!hwc_layer) 7482b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_LAYER; 749e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 750e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko hwc_layer->info.crop = {crop.left, crop.top, crop.right, crop.bottom}; 751e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 75251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 75351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 75451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 75551a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerTransform(Display display, Layer layer, 75651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara int32_t transform) { 7572b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk std::lock_guard<std::mutex> guard(mutex_); 758730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk auto display_ptr = FindDisplay(display); 759730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk if (!display_ptr) 7602b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_DISPLAY; 761730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk 762730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk HwcLayer* hwc_layer = display_ptr->GetLayer(layer); 763730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk if (!hwc_layer) 764730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk return Error::BAD_LAYER; 765730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk 766730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk hwc_layer->info.transform = transform; 76751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 76851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 76951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 77051a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerVisibleRegion(Display display, Layer layer, 77151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara const std::vector<hwc_rect_t>& visible) { 7722b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk std::lock_guard<std::mutex> guard(mutex_); 773730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk auto display_ptr = FindDisplay(display); 774730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk if (!display_ptr) 7752b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_DISPLAY; 776730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk 777730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk HwcLayer* hwc_layer = display_ptr->GetLayer(layer); 778730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk if (!hwc_layer) 779730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk return Error::BAD_LAYER; 780730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk 781730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk hwc_layer->info.visible_regions = visible; 78251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 78351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 78451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 78551a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerZOrder(Display display, Layer layer, uint32_t z) { 7862b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk std::lock_guard<std::mutex> guard(mutex_); 7872b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk auto display_ptr = FindDisplay(display); 7882b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (!display_ptr) 7892b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_DISPLAY; 79051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 7912b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk HwcLayer* hwc_layer = display_ptr->GetLayer(layer); 7922b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (!hwc_layer) 7932b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_LAYER; 794e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 795730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk hwc_layer->info.z_order = z; 796e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 79751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 79851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 79951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 80051a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerInfo(Display display, Layer layer, uint32_t type, 80151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara uint32_t appId) { 8022b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk std::lock_guard<std::mutex> guard(mutex_); 8032b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk auto display_ptr = FindDisplay(display); 8042b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (!display_ptr) 8052b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_DISPLAY; 80651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 8072b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk HwcLayer* hwc_layer = display_ptr->GetLayer(layer); 8082b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (!hwc_layer) 8092b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_LAYER; 810e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 811e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko hwc_layer->info.type = type; 812e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko hwc_layer->info.app_id = appId; 813e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 81451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 81551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 81651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 8171f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel NicoaraError VrHwc::setClientTargetMetadata( 8181f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara Display display, const IVrComposerClient::BufferMetadata& metadata) { 8191f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara std::lock_guard<std::mutex> guard(mutex_); 8201f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara auto display_ptr = FindDisplay(display); 8211f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara if (!display_ptr) 8221f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara return Error::BAD_DISPLAY; 8231f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara 8241f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara display_ptr->SetClientTargetMetadata(metadata); 8251f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara 8261f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara return Error::NONE; 8271f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara} 8281f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara 8291f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel NicoaraError VrHwc::setLayerBufferMetadata( 8301f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara Display display, Layer layer, 8311f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara const IVrComposerClient::BufferMetadata& metadata) { 8321f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara std::lock_guard<std::mutex> guard(mutex_); 8331f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara auto display_ptr = FindDisplay(display); 8341f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara if (!display_ptr) 8351f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara return Error::BAD_DISPLAY; 8361f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara 8371f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara HwcLayer* hwc_layer = display_ptr->GetLayer(layer); 8381f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara if (!hwc_layer) 8391f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara return Error::BAD_LAYER; 8401f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara 8411f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara hwc_layer->buffer_metadata = metadata; 8421f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara 8431f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara return Error::NONE; 8441f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara} 8451f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara 84651a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraReturn<void> VrHwc::getCapabilities(getCapabilities_cb hidl_cb) { 84751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara hidl_cb(hidl_vec<Capability>()); 84851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Void(); 84951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 85051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 85151a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraReturn<void> VrHwc::dumpDebugInfo(dumpDebugInfo_cb hidl_cb) { 852784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliu std::string result; 853784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliu 854784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliu { 855784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliu std::lock_guard<std::mutex> guard(mutex_); 856784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliu result = "\nVrHwc states:\n"; 857784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliu for (const auto& pair : displays_) { 858784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliu result += StringPrintf("Display id: %lu\n", (unsigned long)pair.first); 859784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliu pair.second->dumpDebugInfo(&result); 860784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliu } 861784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliu result += "\n"; 862784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliu } 863784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliu 864784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliu hidl_cb(hidl_string(result)); 86551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Void(); 86651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 86751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 86851a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraReturn<void> VrHwc::createClient(createClient_cb hidl_cb) { 86951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara std::lock_guard<std::mutex> guard(mutex_); 87051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 87151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara Error status = Error::NONE; 87251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara sp<VrComposerClient> client; 87314c461a47806524f7bb51273df7d45fb8648b4b7Steven Thomas if (!client_.promote().get()) { 87451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara client = new VrComposerClient(*this); 87551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara } else { 87651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara ALOGE("Already have a client"); 87751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara status = Error::NO_RESOURCES; 87851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara } 87951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 88051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara client_ = client; 88151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara hidl_cb(status, client); 88251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Void(); 88351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 88451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 8858fc9822f3b20f6547c3398c55e8b70c4f3940db9Daniel Nicoaravoid VrHwc::ForceDisplaysRefresh() { 8868fc9822f3b20f6547c3398c55e8b70c4f3940db9Daniel Nicoara std::lock_guard<std::mutex> guard(mutex_); 887513476ab1802bf315d70a854512f4940a035fcf9Chia-I Wu if (event_callback_ != nullptr) { 8888fc9822f3b20f6547c3398c55e8b70c4f3940db9Daniel Nicoara for (const auto& pair : displays_) 889513476ab1802bf315d70a854512f4940a035fcf9Chia-I Wu event_callback_->onRefresh(pair.first); 8908fc9822f3b20f6547c3398c55e8b70c4f3940db9Daniel Nicoara } 8918fc9822f3b20f6547c3398c55e8b70c4f3940db9Daniel Nicoara} 8928fc9822f3b20f6547c3398c55e8b70c4f3940db9Daniel Nicoara 89351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoaravoid VrHwc::RegisterObserver(Observer* observer) { 89451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara std::lock_guard<std::mutex> guard(mutex_); 89551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara if (observer_) 89651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara ALOGE("Overwriting observer"); 89751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara else 89851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara observer_ = observer; 89951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 90051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 90151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoaravoid VrHwc::UnregisterObserver(Observer* observer) { 90251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara std::lock_guard<std::mutex> guard(mutex_); 90351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara if (observer != observer_) 90451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara ALOGE("Trying to unregister unknown observer"); 90551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara else 90651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara observer_ = nullptr; 90751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 90851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 9092b3b666cfd89681514764201803e48b6ba112a80Albert ChaulkHwcDisplay* VrHwc::FindDisplay(Display display) { 9102b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk auto iter = displays_.find(display); 9112b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return iter == displays_.end() ? nullptr : iter->second.get(); 9122b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk} 9132b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk 914784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliuvoid HwcLayer::dumpDebugInfo(std::string* result) const { 915784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliu if (!result) { 916784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliu return; 917784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliu } 918784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliu *result += StringPrintf("Layer: composition_type: %d, type: %d, app_id: %d, z_order: %d,\ 919784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliu cursor_x: %d, cursor_y: %d, color(rgba): (%d,%d,%d,%d), dataspace: %d, transform: %d,\ 920784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliu display_frame(LTRB): (%d,%d,%d,%d), crop(LTRB): (%.1f,%.1f,%.1f,%.1f), blend_mode: %d\n", 921784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliu composition_type, info.type, info.app_id, info.z_order, info.cursor_x, info.cursor_y, 922784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliu info.color.r, info.color.g, info.color.b, info.color.a, info.dataspace, info.transform, 923784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliu info.display_frame.left, info.display_frame.top, info.display_frame.right, 924784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliu info.display_frame.bottom, info.crop.left, info.crop.top, info.crop.right, 925784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliu info.crop.bottom, info.blend_mode); 926784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliu *result += StringPrintf("Layer buffer metadata: width: %d, height: %d, stride: %d, layerCount: %d\ 927784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliu , pixelFormat: %d\n", buffer_metadata.width, buffer_metadata.height, buffer_metadata.stride, 928784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliu buffer_metadata.layerCount, buffer_metadata.format); 929784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliu} 930784ad685bce10d7443bbb7df24e086ad3a9cbff2rongliu 93151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} // namespace dvr 93251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} // namespace android 933