vr_hwc.cpp revision 22c1462add2567fffc6910b120c93b6074f2641b
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 184251e92b6dacb5653aa9528d88484085ee333e3bDaniel Nicoara#include <private/dvr/display_client.h> 1951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara#include <ui/Fence.h> 2051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 2151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara#include <mutex> 2251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 23e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include "vr_composer_client.h" 2451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 2551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoarausing namespace android::hardware::graphics::common::V1_0; 2651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoarausing namespace android::hardware::graphics::composer::V2_1; 2751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 2851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoarausing android::hardware::hidl_handle; 2951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoarausing android::hardware::hidl_string; 3051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoarausing android::hardware::hidl_vec; 3151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoarausing android::hardware::Return; 3251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoarausing android::hardware::Void; 3351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 3451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoaranamespace android { 3551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoaranamespace dvr { 3651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoaranamespace { 3751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 3851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoarausing android::hardware::graphics::common::V1_0::PixelFormat; 3951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 4051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoaraconst Display kDefaultDisplayId = 1; 4151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoaraconst Config kDefaultConfigId = 1; 4251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 431f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoarasp<GraphicBuffer> CreateGraphicBuffer( 441f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara const native_handle_t* handle, 451f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara const IVrComposerClient::BufferMetadata& metadata) { 461f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara sp<GraphicBuffer> buffer = new GraphicBuffer( 471f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara handle, GraphicBuffer::CLONE_HANDLE, metadata.width, metadata.height, 481f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara static_cast<int32_t>(metadata.format), metadata.layerCount, 4973feb0676635da6c0f738c10e04052a8162a4095Chris Forbes metadata.usage, metadata.stride); 501f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara if (buffer->initCheck() != OK) { 511f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara ALOGE("Failed to create graphic buffer"); 521f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara return nullptr; 531f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara } 541f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara 551f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara return buffer; 56e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} 57e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 58d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoaravoid GetPrimaryDisplaySize(int32_t* width, int32_t* height) { 59d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara *width = 1080; 60d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara *height = 1920; 61d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara 62d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara int error = 0; 632251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka auto display_client = display::DisplayClient::Create(&error); 642251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka if (!display_client) { 65d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara ALOGE("Could not connect to display service : %s(%d)", strerror(error), 66d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara error); 67d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara return; 68d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara } 69d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara 702251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka auto status = display_client->GetDisplayMetrics(); 712251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka if (!status) { 72d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara ALOGE("Could not get display metrics from display service : %s(%d)", 732251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka status.GetErrorMessage().c_str(), status.error()); 74d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara return; 75d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara } 76d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara 772251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka *width = status.get().display_width; 782251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka *height = status.get().display_height; 79d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara} 80d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara 8151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} // namespace 8251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 83d330a62612e287b63442db2470d89c55ad326f27Daniel NicoaraHwcDisplay::HwcDisplay(int32_t width, int32_t height) 84d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara : width_(width), height_(height) {} 8551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 8651a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraHwcDisplay::~HwcDisplay() {} 8751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 8851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoarabool HwcDisplay::SetClientTarget(const native_handle_t* handle, 8951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara base::unique_fd fence) { 90e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko if (handle) 911f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara buffer_ = CreateGraphicBuffer(handle, buffer_metadata_); 9251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 9351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara fence_ = new Fence(fence.release()); 9451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return true; 9551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 9651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 971f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoaravoid HwcDisplay::SetClientTargetMetadata( 981f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara const IVrComposerClient::BufferMetadata& metadata) { 991f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara buffer_metadata_ = metadata; 1001f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara} 1011f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara 10251a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraHwcLayer* HwcDisplay::CreateLayer() { 10351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara uint64_t layer_id = layer_ids_++; 10451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara layers_.push_back(HwcLayer(layer_id)); 10551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return &layers_.back(); 10651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 10751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 10851a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraHwcLayer* HwcDisplay::GetLayer(Layer id) { 10951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara for (size_t i = 0; i < layers_.size(); ++i) 1102b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (layers_[i].info.id == id) 1112b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return &layers_[i]; 11251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 11351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return nullptr; 11451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 11551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 11651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoarabool HwcDisplay::DestroyLayer(Layer id) { 11751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara for (auto it = layers_.begin(); it != layers_.end(); ++it) { 118e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara if (it->info.id == id) { 11951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara layers_.erase(it); 12051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return true; 12151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara } 12251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara } 12351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 12451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return false; 12551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 12651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 12751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoaravoid HwcDisplay::GetChangedCompositionTypes( 12851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara std::vector<Layer>* layer_ids, 12951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara std::vector<IComposerClient::Composition>* types) { 130e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko std::sort(layers_.begin(), layers_.end(), 131e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko [](const auto& lhs, const auto& rhs) { 132730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk return lhs.info.z_order < rhs.info.z_order; 133e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko }); 134e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 135e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko int first_client_layer = -1, last_client_layer = -1; 136e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko for (size_t i = 0; i < layers_.size(); ++i) { 137e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko switch (layers_[i].composition_type) { 138e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko case IComposerClient::Composition::SOLID_COLOR: 139e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko case IComposerClient::Composition::CURSOR: 140e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko case IComposerClient::Composition::SIDEBAND: 141e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko if (first_client_layer < 0) 142e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko first_client_layer = i; 143e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 144e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko last_client_layer = i; 145e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko break; 146e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko default: 147e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko break; 148e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko } 149e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko } 150e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 151e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko for (size_t i = 0; i < layers_.size(); ++i) { 152e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko if (i >= first_client_layer && i <= last_client_layer) { 153e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko if (layers_[i].composition_type != IComposerClient::Composition::CLIENT) { 154e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara layer_ids->push_back(layers_[i].info.id); 155e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko types->push_back(IComposerClient::Composition::CLIENT); 156e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko layers_[i].composition_type = IComposerClient::Composition::CLIENT; 157e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko } 158e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 159e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko continue; 160e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko } 161e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 162e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko if (layers_[i].composition_type != IComposerClient::Composition::DEVICE) { 163e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara layer_ids->push_back(layers_[i].info.id); 164e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko types->push_back(IComposerClient::Composition::DEVICE); 165e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko layers_[i].composition_type = IComposerClient::Composition::DEVICE; 166e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko } 16751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara } 16851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 16951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 170e7916f88ab250e9cbd7faa53458491f19b716782Daniel NicoaraError HwcDisplay::GetFrame( 171e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara std::vector<ComposerView::ComposerLayer>* out_frames) { 172e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko bool queued_client_target = false; 173e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko std::vector<ComposerView::ComposerLayer> frame; 174e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko for (const auto& layer : layers_) { 175e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko if (layer.composition_type == IComposerClient::Composition::CLIENT) { 176e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara if (queued_client_target) 177e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara continue; 178e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara 179e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara if (!buffer_.get()) { 180e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara ALOGE("Client composition requested but no client target buffer"); 181e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara return Error::BAD_LAYER; 182e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko } 183e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara 184e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara ComposerView::ComposerLayer client_target_layer = { 185e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara .buffer = buffer_, 186e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara .fence = fence_.get() ? fence_ : new Fence(-1), 187e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara .display_frame = {0, 0, static_cast<int32_t>(buffer_->getWidth()), 188e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara static_cast<int32_t>(buffer_->getHeight())}, 189e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara .crop = {0.0f, 0.0f, static_cast<float>(buffer_->getWidth()), 190e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara static_cast<float>(buffer_->getHeight())}, 191e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara .blend_mode = IComposerClient::BlendMode::NONE, 192e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara }; 193e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara 194e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara frame.push_back(client_target_layer); 195e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara queued_client_target = true; 196e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko } else { 197e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara if (!layer.info.buffer.get() || !layer.info.fence.get()) { 1983e7dad572220e2c4b9bfbd471a6278385e99330dDaniel Nicoara ALOGV("Layer requested without valid buffer"); 1993e7dad572220e2c4b9bfbd471a6278385e99330dDaniel Nicoara continue; 200e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara } 201e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara 202e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko frame.push_back(layer.info); 203e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko } 204e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko } 205e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 206e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara out_frames->swap(frame); 207e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara return Error::NONE; 20851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 20951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 210e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoarastd::vector<Layer> HwcDisplay::UpdateLastFrameAndGetLastFrameLayers() { 211e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara std::vector<Layer> last_frame_layers; 212e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara last_frame_layers.swap(last_frame_layers_ids_); 21351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 214e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara for (const auto& layer : layers_) 215e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara last_frame_layers_ids_.push_back(layer.info.id); 216e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara 217e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara return last_frame_layers; 218e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} 219e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 220730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulkvoid HwcDisplay::SetColorTransform(const float* matrix, int32_t hint) { 221730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk color_transform_hint_ = hint; 222730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk if (matrix) 223730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk memcpy(color_transform_, matrix, sizeof(color_transform_)); 224730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk} 225730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk 226e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko//////////////////////////////////////////////////////////////////////////////// 227e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// VrHwcClient 22851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 229d330a62612e287b63442db2470d89c55ad326f27Daniel NicoaraVrHwc::VrHwc() {} 23051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 23151a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraVrHwc::~VrHwc() {} 23251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 23351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoarabool VrHwc::hasCapability(Capability capability) const { return false; } 23451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 23551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoaravoid VrHwc::removeClient() { 23651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara std::lock_guard<std::mutex> guard(mutex_); 23751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara client_ = nullptr; 23851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 23951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 24051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoaravoid VrHwc::enableCallback(bool enable) { 24151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara if (enable && client_ != nullptr) { 242d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara { 243d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara int32_t width, height; 244d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara GetPrimaryDisplaySize(&width, &height); 245d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara std::lock_guard<std::mutex> guard(mutex_); 246d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara // Create the primary display late to avoid initialization issues between 247d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara // VR HWC and SurfaceFlinger. 248d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara displays_[kDefaultDisplayId].reset(new HwcDisplay(width, height)); 249d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara } 25051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara client_.promote()->onHotplug(kDefaultDisplayId, 25151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara IComposerCallback::Connection::CONNECTED); 25251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara } 25351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 25451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 255a6cc42264e021e37ec52c189dc8e1059d45d4f9bDaniel Nicoarauint32_t VrHwc::getMaxVirtualDisplayCount() { return 1; } 25651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 25751a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::createVirtualDisplay(uint32_t width, uint32_t height, 25851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara PixelFormat* format, Display* outDisplay) { 25951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara *format = PixelFormat::RGBA_8888; 260a6cc42264e021e37ec52c189dc8e1059d45d4f9bDaniel Nicoara *outDisplay = display_count_; 261d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara displays_[display_count_].reset(new HwcDisplay(width, height)); 262a6cc42264e021e37ec52c189dc8e1059d45d4f9bDaniel Nicoara display_count_++; 26351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 26451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 26551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 2662b3b666cfd89681514764201803e48b6ba112a80Albert ChaulkError VrHwc::destroyVirtualDisplay(Display display) { 2672b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk std::lock_guard<std::mutex> guard(mutex_); 2682b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (display == kDefaultDisplayId || displays_.erase(display) == 0) 26951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::BAD_DISPLAY; 2702b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk ComposerView::Frame frame; 2712b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk frame.display_id = display; 2722b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk frame.removed = true; 2732b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (observer_) 2742b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk observer_->OnNewFrame(frame); 2752b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::NONE; 2762b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk} 27751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 2782b3b666cfd89681514764201803e48b6ba112a80Albert ChaulkError VrHwc::createLayer(Display display, Layer* outLayer) { 27951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara std::lock_guard<std::mutex> guard(mutex_); 2802b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk auto display_ptr = FindDisplay(display); 2812b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (!display_ptr) 2822b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_DISPLAY; 28351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 2842b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk HwcLayer* layer = display_ptr->CreateLayer(); 285e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara *outLayer = layer->info.id; 28651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 28751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 28851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 28951a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::destroyLayer(Display display, Layer layer) { 29051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara std::lock_guard<std::mutex> guard(mutex_); 2912b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk auto display_ptr = FindDisplay(display); 2922b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (!display_ptr) { 2932b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_DISPLAY; 2942b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk } 29551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 2962b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return display_ptr->DestroyLayer(layer) ? Error::NONE : Error::BAD_LAYER; 29751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 29851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 29951a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::getActiveConfig(Display display, Config* outConfig) { 3002b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk std::lock_guard<std::mutex> guard(mutex_); 3012b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (!FindDisplay(display)) 3022b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_DISPLAY; 30351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara *outConfig = kDefaultConfigId; 30451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 30551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 30651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 30751a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::getClientTargetSupport(Display display, uint32_t width, 30851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara uint32_t height, PixelFormat format, 30951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara Dataspace dataspace) { 31051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 31151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 31251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 31351a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::getColorModes(Display display, hidl_vec<ColorMode>* outModes) { 31451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara std::vector<ColorMode> color_modes(1, ColorMode::NATIVE); 31551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara *outModes = hidl_vec<ColorMode>(color_modes); 31651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 31751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 31851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 31951a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::getDisplayAttribute(Display display, Config config, 32051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara IComposerClient::Attribute attribute, 32151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara int32_t* outValue) { 3222b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk std::lock_guard<std::mutex> guard(mutex_); 323d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara auto display_ptr = FindDisplay(display); 324d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara if (!display_ptr) { 32551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::BAD_DISPLAY; 326d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara } 32751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara if (config != kDefaultConfigId) { 32851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::BAD_CONFIG; 32951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara } 33051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 33151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara switch (attribute) { 33251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara case IComposerClient::Attribute::WIDTH: 333d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara *outValue = display_ptr->width(); 33451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara break; 33551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara case IComposerClient::Attribute::HEIGHT: 336d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara *outValue = display_ptr->height(); 33751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara break; 33851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara case IComposerClient::Attribute::VSYNC_PERIOD: 33922c1462add2567fffc6910b120c93b6074f2641bStephen Kiazyk { 34022c1462add2567fffc6910b120c93b6074f2641bStephen Kiazyk int error = 0; 34122c1462add2567fffc6910b120c93b6074f2641bStephen Kiazyk auto display_client = display::DisplayClient::Create(&error); 34222c1462add2567fffc6910b120c93b6074f2641bStephen Kiazyk if (!display_client) { 34322c1462add2567fffc6910b120c93b6074f2641bStephen Kiazyk ALOGE("Could not connect to display service : %s(%d)", 34422c1462add2567fffc6910b120c93b6074f2641bStephen Kiazyk strerror(error), error); 34522c1462add2567fffc6910b120c93b6074f2641bStephen Kiazyk // Return a default value of 30 fps 34622c1462add2567fffc6910b120c93b6074f2641bStephen Kiazyk *outValue = 1000 * 1000 * 1000 / 30; 34722c1462add2567fffc6910b120c93b6074f2641bStephen Kiazyk } else { 34822c1462add2567fffc6910b120c93b6074f2641bStephen Kiazyk auto metrics = display_client->GetDisplayMetrics(); 34922c1462add2567fffc6910b120c93b6074f2641bStephen Kiazyk *outValue = metrics.get().vsync_period_ns; 35022c1462add2567fffc6910b120c93b6074f2641bStephen Kiazyk } 35122c1462add2567fffc6910b120c93b6074f2641bStephen Kiazyk } 35251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara break; 35351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara case IComposerClient::Attribute::DPI_X: 35451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara case IComposerClient::Attribute::DPI_Y: 35551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara *outValue = 300 * 1000; // 300dpi 35651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara break; 35751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara default: 35851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::BAD_PARAMETER; 35951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara } 36051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 36151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 36251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 36351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 36451a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::getDisplayConfigs(Display display, hidl_vec<Config>* outConfigs) { 3652b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk std::lock_guard<std::mutex> guard(mutex_); 3662b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (!FindDisplay(display)) 36751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::BAD_DISPLAY; 36851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara std::vector<Config> configs(1, kDefaultConfigId); 36951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara *outConfigs = hidl_vec<Config>(configs); 37051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 37151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 37251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 37351a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::getDisplayName(Display display, hidl_string* outName) { 37451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara *outName = hidl_string(); 37551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 37651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 37751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 37851a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::getDisplayType(Display display, 37951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara IComposerClient::DisplayType* outType) { 3802b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk std::lock_guard<std::mutex> guard(mutex_); 3812b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk auto display_ptr = FindDisplay(display); 3822b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (!display_ptr) { 38351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara *outType = IComposerClient::DisplayType::INVALID; 38451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::BAD_DISPLAY; 38551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara } 38651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 387a6cc42264e021e37ec52c189dc8e1059d45d4f9bDaniel Nicoara if (display == kDefaultDisplayId) 388a6cc42264e021e37ec52c189dc8e1059d45d4f9bDaniel Nicoara *outType = IComposerClient::DisplayType::PHYSICAL; 389a6cc42264e021e37ec52c189dc8e1059d45d4f9bDaniel Nicoara else 390a6cc42264e021e37ec52c189dc8e1059d45d4f9bDaniel Nicoara *outType = IComposerClient::DisplayType::VIRTUAL; 391a6cc42264e021e37ec52c189dc8e1059d45d4f9bDaniel Nicoara 39251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 39351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 39451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 39551a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::getDozeSupport(Display display, bool* outSupport) { 39651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara *outSupport = false; 3972b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk std::lock_guard<std::mutex> guard(mutex_); 3982b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (!FindDisplay(display)) 39951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::BAD_DISPLAY; 4002b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::NONE; 40151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 40251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 40351a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::getHdrCapabilities(Display display, hidl_vec<Hdr>* outTypes, 40451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara float* outMaxLuminance, 40551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara float* outMaxAverageLuminance, 40651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara float* outMinLuminance) { 40751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara *outMaxLuminance = 0; 40851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara *outMaxAverageLuminance = 0; 40951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara *outMinLuminance = 0; 41051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 41151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 41251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 41351a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setActiveConfig(Display display, Config config) { 4142b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk std::lock_guard<std::mutex> guard(mutex_); 415730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk auto display_ptr = FindDisplay(display); 416730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk if (!display_ptr) 4172b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_DISPLAY; 4182b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (config != kDefaultConfigId) 4192b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_CONFIG; 42051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 421730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk display_ptr->set_active_config(config); 42251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 42351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 42451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 42551a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setColorMode(Display display, ColorMode mode) { 4262b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk std::lock_guard<std::mutex> guard(mutex_); 427730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk auto display_ptr = FindDisplay(display); 428730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk if (!display_ptr) 4292b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_DISPLAY; 430730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk 431730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk display_ptr->set_color_mode(mode); 43251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 43351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 43451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 43551a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setPowerMode(Display display, IComposerClient::PowerMode mode) { 4362b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk std::lock_guard<std::mutex> guard(mutex_); 437730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk auto display_ptr = FindDisplay(display); 438730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk if (!display_ptr) 4392b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_DISPLAY; 440730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk 441730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk display_ptr->set_power_mode(mode); 44251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 44351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 44451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 44551a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setVsyncEnabled(Display display, IComposerClient::Vsync enabled) { 4462b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk std::lock_guard<std::mutex> guard(mutex_); 447730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk auto display_ptr = FindDisplay(display); 448730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk if (!display_ptr) 4492b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_DISPLAY; 450730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk 451730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk display_ptr->set_vsync_enabled(enabled); 45251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 45351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 45451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 45551a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setColorTransform(Display display, const float* matrix, 45651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara int32_t hint) { 4572b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk std::lock_guard<std::mutex> guard(mutex_); 458730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk auto display_ptr = FindDisplay(display); 459730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk if (!display_ptr) 4602b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_DISPLAY; 461730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk 462730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk display_ptr->SetColorTransform(matrix, hint); 46351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 46451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 46551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 46651a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setClientTarget(Display display, buffer_handle_t target, 46751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara int32_t acquireFence, int32_t dataspace, 46851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara const std::vector<hwc_rect_t>& damage) { 46951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara base::unique_fd fence(acquireFence); 47051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara std::lock_guard<std::mutex> guard(mutex_); 4712b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk auto display_ptr = FindDisplay(display); 4722b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (!display_ptr) 4732b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_DISPLAY; 47451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 4752b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (target == nullptr) 4762b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::NONE; 4772b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk 4782b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (!display_ptr->SetClientTarget(target, std::move(fence))) 47951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::BAD_PARAMETER; 48051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 48151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 48251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 48351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 48451a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setOutputBuffer(Display display, buffer_handle_t buffer, 48551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara int32_t releaseFence) { 48651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara base::unique_fd fence(releaseFence); 4872b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk std::lock_guard<std::mutex> guard(mutex_); 4882b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk auto display_ptr = FindDisplay(display); 4892b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (!display_ptr) 4902b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_DISPLAY; 49151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 492a6cc42264e021e37ec52c189dc8e1059d45d4f9bDaniel Nicoara // TODO(dnicoara): Is it necessary to do anything here? 493a6cc42264e021e37ec52c189dc8e1059d45d4f9bDaniel Nicoara return Error::NONE; 49451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 49551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 49651a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::validateDisplay( 49751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara Display display, std::vector<Layer>* outChangedLayers, 49851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara std::vector<IComposerClient::Composition>* outCompositionTypes, 49951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara uint32_t* outDisplayRequestMask, std::vector<Layer>* outRequestedLayers, 50051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara std::vector<uint32_t>* outRequestMasks) { 50151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara std::lock_guard<std::mutex> guard(mutex_); 5022b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk auto display_ptr = FindDisplay(display); 5032b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (!display_ptr) 5042b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_DISPLAY; 50551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 5062b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk display_ptr->GetChangedCompositionTypes(outChangedLayers, 5072b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk outCompositionTypes); 50851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 50951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 51051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 51151a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::acceptDisplayChanges(Display display) { return Error::NONE; } 51251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 51351a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::presentDisplay(Display display, int32_t* outPresentFence, 51451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara std::vector<Layer>* outLayers, 51551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara std::vector<int32_t>* outReleaseFences) { 51651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara *outPresentFence = -1; 517e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara outLayers->clear(); 518e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara outReleaseFences->clear(); 519e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara 5202b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk std::lock_guard<std::mutex> guard(mutex_); 5212b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk auto display_ptr = FindDisplay(display); 5222b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk 5232b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (!display_ptr) 52451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::BAD_DISPLAY; 52551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 5262b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk ComposerView::Frame frame; 527e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara std::vector<Layer> last_frame_layers; 5282b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk Error status = display_ptr->GetFrame(&frame.layers); 5292b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk frame.display_id = display; 530d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara frame.display_width = display_ptr->width(); 531d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara frame.display_height = display_ptr->height(); 532730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk frame.active_config = display_ptr->active_config(); 533730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk frame.power_mode = display_ptr->power_mode(); 534730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk frame.vsync_enabled = display_ptr->vsync_enabled(); 535730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk frame.color_transform_hint = display_ptr->color_transform_hint(); 536730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk frame.color_mode = display_ptr->color_mode(); 537730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk memcpy(frame.color_transform, display_ptr->color_transform(), 538730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk sizeof(frame.color_transform)); 539e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara if (status != Error::NONE) 540e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara return status; 541e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara 5422b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk last_frame_layers = display_ptr->UpdateLastFrameAndGetLastFrameLayers(); 54351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 544e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara base::unique_fd fence; 54551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara if (observer_) 546e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara fence = observer_->OnNewFrame(frame); 547e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara 548e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara if (fence.get() < 0) 549e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara return Error::NONE; 550e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara 551e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara *outPresentFence = dup(fence.get()); 552e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara outLayers->swap(last_frame_layers); 553e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara for (size_t i = 0; i < outLayers->size(); ++i) 554e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara outReleaseFences->push_back(dup(fence.get())); 55551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 55651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 55751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 55851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 55951a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerCursorPosition(Display display, Layer layer, int32_t x, 56051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara int32_t y) { 5612b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk std::lock_guard<std::mutex> guard(mutex_); 562730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk auto display_ptr = FindDisplay(display); 563730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk if (!display_ptr) 5642b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_DISPLAY; 565730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk 566730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk HwcLayer* hwc_layer = display_ptr->GetLayer(layer); 567730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk if (!hwc_layer) 568730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk return Error::BAD_LAYER; 569730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk 570730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk hwc_layer->info.cursor_x = x; 571730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk hwc_layer->info.cursor_y = y; 57251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 57351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 57451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 57551a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerBuffer(Display display, Layer layer, 57651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara buffer_handle_t buffer, int32_t acquireFence) { 57751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara base::unique_fd fence(acquireFence); 5782b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk std::lock_guard<std::mutex> guard(mutex_); 5792b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk auto display_ptr = FindDisplay(display); 5802b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (!display_ptr) 5812b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_DISPLAY; 58251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 5832b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk HwcLayer* hwc_layer = display_ptr->GetLayer(layer); 5842b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (!hwc_layer) 5852b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_LAYER; 586e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 5871f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara hwc_layer->info.buffer = CreateGraphicBuffer( 5881f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara buffer, hwc_layer->buffer_metadata); 589e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko hwc_layer->info.fence = new Fence(fence.release()); 590e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 59151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 59251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 59351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 59451a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerSurfaceDamage(Display display, Layer layer, 59551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara const std::vector<hwc_rect_t>& damage) { 5962b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk std::lock_guard<std::mutex> guard(mutex_); 597730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk auto display_ptr = FindDisplay(display); 598730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk if (!display_ptr) 5992b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_DISPLAY; 600730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk 601730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk HwcLayer* hwc_layer = display_ptr->GetLayer(layer); 602730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk if (!hwc_layer) 603730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk return Error::BAD_LAYER; 604730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk 605730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk hwc_layer->info.damaged_regions = damage; 60651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 60751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 60851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 60951a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerBlendMode(Display display, Layer layer, int32_t mode) { 6102b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk std::lock_guard<std::mutex> guard(mutex_); 6112b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk auto display_ptr = FindDisplay(display); 6122b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (!display_ptr) 6132b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_DISPLAY; 61451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 6152b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk HwcLayer* hwc_layer = display_ptr->GetLayer(layer); 6162b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (!hwc_layer) 6172b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_LAYER; 618e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 619e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko hwc_layer->info.blend_mode = 620e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko static_cast<ComposerView::ComposerLayer::BlendMode>(mode); 621e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 62251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 62351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 62451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 62551a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerColor(Display display, Layer layer, 62651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara IComposerClient::Color color) { 6272b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk std::lock_guard<std::mutex> guard(mutex_); 628730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk auto display_ptr = FindDisplay(display); 629730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk if (!display_ptr) 6302b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_DISPLAY; 631730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk 632730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk HwcLayer* hwc_layer = display_ptr->GetLayer(layer); 633730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk if (!hwc_layer) 634730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk return Error::BAD_LAYER; 635730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk 636730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk hwc_layer->info.color = color; 63751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 63851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 63951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 64051a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerCompositionType(Display display, Layer layer, 64151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara int32_t type) { 6422b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk std::lock_guard<std::mutex> guard(mutex_); 6432b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk auto display_ptr = FindDisplay(display); 6442b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (!display_ptr) 6452b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_DISPLAY; 64651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 6472b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk HwcLayer* hwc_layer = display_ptr->GetLayer(layer); 6482b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (!hwc_layer) 6492b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_LAYER; 650e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 651e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko hwc_layer->composition_type = static_cast<HwcLayer::Composition>(type); 652e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 65351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 65451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 65551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 65651a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerDataspace(Display display, Layer layer, 65751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara int32_t dataspace) { 6582b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk std::lock_guard<std::mutex> guard(mutex_); 659730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk auto display_ptr = FindDisplay(display); 660730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk if (!display_ptr) 6612b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_DISPLAY; 662730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk 663730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk HwcLayer* hwc_layer = display_ptr->GetLayer(layer); 664730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk if (!hwc_layer) 665730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk return Error::BAD_LAYER; 666730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk 667730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk hwc_layer->info.dataspace = dataspace; 66851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 66951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 67051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 67151a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerDisplayFrame(Display display, Layer layer, 67251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara const hwc_rect_t& frame) { 6732b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk std::lock_guard<std::mutex> guard(mutex_); 6742b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk auto display_ptr = FindDisplay(display); 6752b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (!display_ptr) 6762b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_DISPLAY; 67751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 6782b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk HwcLayer* hwc_layer = display_ptr->GetLayer(layer); 6792b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (!hwc_layer) 6802b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_LAYER; 681e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 682e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko hwc_layer->info.display_frame = 683e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko {frame.left, frame.top, frame.right, frame.bottom}; 684e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 68551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 68651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 68751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 68851a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerPlaneAlpha(Display display, Layer layer, float alpha) { 6892b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk std::lock_guard<std::mutex> guard(mutex_); 6902b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk auto display_ptr = FindDisplay(display); 6912b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (!display_ptr) 6922b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_DISPLAY; 69351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 6942b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk HwcLayer* hwc_layer = display_ptr->GetLayer(layer); 6952b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (!hwc_layer) 6962b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_LAYER; 697e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 698e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko hwc_layer->info.alpha = alpha; 699e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 70051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 70151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 70251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 70351a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerSidebandStream(Display display, Layer layer, 70451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara buffer_handle_t stream) { 7052b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk std::lock_guard<std::mutex> guard(mutex_); 7062b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (!FindDisplay(display)) 7072b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_DISPLAY; 70851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 70951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 71051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 71151a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerSourceCrop(Display display, Layer layer, 71251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara const hwc_frect_t& crop) { 7132b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk std::lock_guard<std::mutex> guard(mutex_); 7142b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk auto display_ptr = FindDisplay(display); 7152b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (!display_ptr) 7162b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_DISPLAY; 71751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 7182b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk HwcLayer* hwc_layer = display_ptr->GetLayer(layer); 7192b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (!hwc_layer) 7202b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_LAYER; 721e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 722e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko hwc_layer->info.crop = {crop.left, crop.top, crop.right, crop.bottom}; 723e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 72451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 72551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 72651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 72751a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerTransform(Display display, Layer layer, 72851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara int32_t transform) { 7292b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk std::lock_guard<std::mutex> guard(mutex_); 730730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk auto display_ptr = FindDisplay(display); 731730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk if (!display_ptr) 7322b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_DISPLAY; 733730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk 734730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk HwcLayer* hwc_layer = display_ptr->GetLayer(layer); 735730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk if (!hwc_layer) 736730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk return Error::BAD_LAYER; 737730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk 738730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk hwc_layer->info.transform = transform; 73951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 74051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 74151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 74251a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerVisibleRegion(Display display, Layer layer, 74351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara const std::vector<hwc_rect_t>& visible) { 7442b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk std::lock_guard<std::mutex> guard(mutex_); 745730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk auto display_ptr = FindDisplay(display); 746730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk if (!display_ptr) 7472b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_DISPLAY; 748730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk 749730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk HwcLayer* hwc_layer = display_ptr->GetLayer(layer); 750730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk if (!hwc_layer) 751730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk return Error::BAD_LAYER; 752730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk 753730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk hwc_layer->info.visible_regions = visible; 75451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 75551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 75651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 75751a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerZOrder(Display display, Layer layer, uint32_t z) { 7582b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk std::lock_guard<std::mutex> guard(mutex_); 7592b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk auto display_ptr = FindDisplay(display); 7602b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (!display_ptr) 7612b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_DISPLAY; 76251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 7632b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk HwcLayer* hwc_layer = display_ptr->GetLayer(layer); 7642b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (!hwc_layer) 7652b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_LAYER; 766e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 767730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk hwc_layer->info.z_order = z; 768e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 76951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 77051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 77151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 77251a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerInfo(Display display, Layer layer, uint32_t type, 77351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara uint32_t appId) { 7742b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk std::lock_guard<std::mutex> guard(mutex_); 7752b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk auto display_ptr = FindDisplay(display); 7762b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (!display_ptr) 7772b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_DISPLAY; 77851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 7792b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk HwcLayer* hwc_layer = display_ptr->GetLayer(layer); 7802b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (!hwc_layer) 7812b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_LAYER; 782e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 783e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko hwc_layer->info.type = type; 784e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko hwc_layer->info.app_id = appId; 785e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 78651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 78751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 78851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 7891f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel NicoaraError VrHwc::setClientTargetMetadata( 7901f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara Display display, const IVrComposerClient::BufferMetadata& metadata) { 7911f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara std::lock_guard<std::mutex> guard(mutex_); 7921f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara auto display_ptr = FindDisplay(display); 7931f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara if (!display_ptr) 7941f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara return Error::BAD_DISPLAY; 7951f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara 7961f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara display_ptr->SetClientTargetMetadata(metadata); 7971f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara 7981f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara return Error::NONE; 7991f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara} 8001f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara 8011f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel NicoaraError VrHwc::setLayerBufferMetadata( 8021f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara Display display, Layer layer, 8031f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara const IVrComposerClient::BufferMetadata& metadata) { 8041f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara std::lock_guard<std::mutex> guard(mutex_); 8051f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara auto display_ptr = FindDisplay(display); 8061f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara if (!display_ptr) 8071f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara return Error::BAD_DISPLAY; 8081f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara 8091f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara HwcLayer* hwc_layer = display_ptr->GetLayer(layer); 8101f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara if (!hwc_layer) 8111f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara return Error::BAD_LAYER; 8121f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara 8131f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara hwc_layer->buffer_metadata = metadata; 8141f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara 8151f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara return Error::NONE; 8161f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara} 8171f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara 81851a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraReturn<void> VrHwc::getCapabilities(getCapabilities_cb hidl_cb) { 81951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara hidl_cb(hidl_vec<Capability>()); 82051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Void(); 82151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 82251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 82351a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraReturn<void> VrHwc::dumpDebugInfo(dumpDebugInfo_cb hidl_cb) { 82451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara hidl_cb(hidl_string()); 82551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Void(); 82651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 82751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 82851a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraReturn<void> VrHwc::createClient(createClient_cb hidl_cb) { 82951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara std::lock_guard<std::mutex> guard(mutex_); 83051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 83151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara Error status = Error::NONE; 83251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara sp<VrComposerClient> client; 83351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara if (client_ == nullptr) { 83451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara client = new VrComposerClient(*this); 83551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara } else { 83651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara ALOGE("Already have a client"); 83751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara status = Error::NO_RESOURCES; 83851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara } 83951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 84051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara client_ = client; 84151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara hidl_cb(status, client); 84251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Void(); 84351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 84451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 84551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoaravoid VrHwc::RegisterObserver(Observer* observer) { 84651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara std::lock_guard<std::mutex> guard(mutex_); 84751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara if (observer_) 84851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara ALOGE("Overwriting observer"); 84951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara else 85051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara observer_ = observer; 85151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 85251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 85351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoaravoid VrHwc::UnregisterObserver(Observer* observer) { 85451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara std::lock_guard<std::mutex> guard(mutex_); 85551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara if (observer != observer_) 85651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara ALOGE("Trying to unregister unknown observer"); 85751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara else 85851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara observer_ = nullptr; 85951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 86051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 8612b3b666cfd89681514764201803e48b6ba112a80Albert ChaulkHwcDisplay* VrHwc::FindDisplay(Display display) { 8622b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk auto iter = displays_.find(display); 8632b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return iter == displays_.end() ? nullptr : iter->second.get(); 8642b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk} 8652b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk 86651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} // namespace dvr 86751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} // namespace android 868