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: 33951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara *outValue = 1000 * 1000 * 1000 / 30; // 30fps 34051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara break; 34151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara case IComposerClient::Attribute::DPI_X: 34251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara case IComposerClient::Attribute::DPI_Y: 34351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara *outValue = 300 * 1000; // 300dpi 34451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara break; 34551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara default: 34651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::BAD_PARAMETER; 34751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara } 34851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 34951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 35051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 35151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 35251a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::getDisplayConfigs(Display display, hidl_vec<Config>* outConfigs) { 3532b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk std::lock_guard<std::mutex> guard(mutex_); 3542b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (!FindDisplay(display)) 35551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::BAD_DISPLAY; 35651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara std::vector<Config> configs(1, kDefaultConfigId); 35751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara *outConfigs = hidl_vec<Config>(configs); 35851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 35951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 36051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 36151a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::getDisplayName(Display display, hidl_string* outName) { 36251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara *outName = hidl_string(); 36351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 36451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 36551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 36651a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::getDisplayType(Display display, 36751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara IComposerClient::DisplayType* outType) { 3682b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk std::lock_guard<std::mutex> guard(mutex_); 3692b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk auto display_ptr = FindDisplay(display); 3702b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (!display_ptr) { 37151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara *outType = IComposerClient::DisplayType::INVALID; 37251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::BAD_DISPLAY; 37351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara } 37451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 375a6cc42264e021e37ec52c189dc8e1059d45d4f9bDaniel Nicoara if (display == kDefaultDisplayId) 376a6cc42264e021e37ec52c189dc8e1059d45d4f9bDaniel Nicoara *outType = IComposerClient::DisplayType::PHYSICAL; 377a6cc42264e021e37ec52c189dc8e1059d45d4f9bDaniel Nicoara else 378a6cc42264e021e37ec52c189dc8e1059d45d4f9bDaniel Nicoara *outType = IComposerClient::DisplayType::VIRTUAL; 379a6cc42264e021e37ec52c189dc8e1059d45d4f9bDaniel Nicoara 38051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 38151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 38251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 38351a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::getDozeSupport(Display display, bool* outSupport) { 38451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara *outSupport = false; 3852b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk std::lock_guard<std::mutex> guard(mutex_); 3862b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (!FindDisplay(display)) 38751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::BAD_DISPLAY; 3882b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::NONE; 38951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 39051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 39151a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::getHdrCapabilities(Display display, hidl_vec<Hdr>* outTypes, 39251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara float* outMaxLuminance, 39351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara float* outMaxAverageLuminance, 39451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara float* outMinLuminance) { 39551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara *outMaxLuminance = 0; 39651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara *outMaxAverageLuminance = 0; 39751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara *outMinLuminance = 0; 39851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 39951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 40051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 40151a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setActiveConfig(Display display, Config config) { 4022b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk std::lock_guard<std::mutex> guard(mutex_); 403730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk auto display_ptr = FindDisplay(display); 404730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk if (!display_ptr) 4052b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_DISPLAY; 4062b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (config != kDefaultConfigId) 4072b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_CONFIG; 40851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 409730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk display_ptr->set_active_config(config); 41051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 41151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 41251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 41351a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setColorMode(Display display, ColorMode mode) { 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; 418730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk 419730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk display_ptr->set_color_mode(mode); 42051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 42151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 42251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 42351a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setPowerMode(Display display, IComposerClient::PowerMode mode) { 4242b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk std::lock_guard<std::mutex> guard(mutex_); 425730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk auto display_ptr = FindDisplay(display); 426730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk if (!display_ptr) 4272b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_DISPLAY; 428730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk 429730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk display_ptr->set_power_mode(mode); 43051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 43151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 43251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 43351a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setVsyncEnabled(Display display, IComposerClient::Vsync enabled) { 4342b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk std::lock_guard<std::mutex> guard(mutex_); 435730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk auto display_ptr = FindDisplay(display); 436730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk if (!display_ptr) 4372b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_DISPLAY; 438730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk 439730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk display_ptr->set_vsync_enabled(enabled); 44051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 44151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 44251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 44351a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setColorTransform(Display display, const float* matrix, 44451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara int32_t hint) { 4452b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk std::lock_guard<std::mutex> guard(mutex_); 446730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk auto display_ptr = FindDisplay(display); 447730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk if (!display_ptr) 4482b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_DISPLAY; 449730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk 450730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk display_ptr->SetColorTransform(matrix, hint); 45151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 45251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 45351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 45451a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setClientTarget(Display display, buffer_handle_t target, 45551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara int32_t acquireFence, int32_t dataspace, 45651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara const std::vector<hwc_rect_t>& damage) { 45751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara base::unique_fd fence(acquireFence); 45851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara std::lock_guard<std::mutex> guard(mutex_); 4592b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk auto display_ptr = FindDisplay(display); 4602b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (!display_ptr) 4612b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_DISPLAY; 46251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 4632b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (target == nullptr) 4642b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::NONE; 4652b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk 4662b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (!display_ptr->SetClientTarget(target, std::move(fence))) 46751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::BAD_PARAMETER; 46851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 46951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 47051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 47151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 47251a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setOutputBuffer(Display display, buffer_handle_t buffer, 47351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara int32_t releaseFence) { 47451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara base::unique_fd fence(releaseFence); 4752b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk std::lock_guard<std::mutex> guard(mutex_); 4762b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk auto display_ptr = FindDisplay(display); 4772b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (!display_ptr) 4782b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_DISPLAY; 47951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 480a6cc42264e021e37ec52c189dc8e1059d45d4f9bDaniel Nicoara // TODO(dnicoara): Is it necessary to do anything here? 481a6cc42264e021e37ec52c189dc8e1059d45d4f9bDaniel Nicoara return Error::NONE; 48251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 48351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 48451a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::validateDisplay( 48551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara Display display, std::vector<Layer>* outChangedLayers, 48651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara std::vector<IComposerClient::Composition>* outCompositionTypes, 48751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara uint32_t* outDisplayRequestMask, std::vector<Layer>* outRequestedLayers, 48851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara std::vector<uint32_t>* outRequestMasks) { 48951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara std::lock_guard<std::mutex> guard(mutex_); 4902b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk auto display_ptr = FindDisplay(display); 4912b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (!display_ptr) 4922b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_DISPLAY; 49351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 4942b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk display_ptr->GetChangedCompositionTypes(outChangedLayers, 4952b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk outCompositionTypes); 49651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 49751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 49851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 49951a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::acceptDisplayChanges(Display display) { return Error::NONE; } 50051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 50151a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::presentDisplay(Display display, int32_t* outPresentFence, 50251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara std::vector<Layer>* outLayers, 50351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara std::vector<int32_t>* outReleaseFences) { 50451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara *outPresentFence = -1; 505e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara outLayers->clear(); 506e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara outReleaseFences->clear(); 507e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara 5082b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk std::lock_guard<std::mutex> guard(mutex_); 5092b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk auto display_ptr = FindDisplay(display); 5102b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk 5112b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (!display_ptr) 51251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::BAD_DISPLAY; 51351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 5142b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk ComposerView::Frame frame; 515e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara std::vector<Layer> last_frame_layers; 5162b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk Error status = display_ptr->GetFrame(&frame.layers); 5172b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk frame.display_id = display; 518d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara frame.display_width = display_ptr->width(); 519d330a62612e287b63442db2470d89c55ad326f27Daniel Nicoara frame.display_height = display_ptr->height(); 520730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk frame.active_config = display_ptr->active_config(); 521730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk frame.power_mode = display_ptr->power_mode(); 522730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk frame.vsync_enabled = display_ptr->vsync_enabled(); 523730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk frame.color_transform_hint = display_ptr->color_transform_hint(); 524730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk frame.color_mode = display_ptr->color_mode(); 525730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk memcpy(frame.color_transform, display_ptr->color_transform(), 526730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk sizeof(frame.color_transform)); 527e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara if (status != Error::NONE) 528e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara return status; 529e7916f88ab250e9cbd7faa53458491f19b716782Daniel Nicoara 5302b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk last_frame_layers = display_ptr->UpdateLastFrameAndGetLastFrameLayers(); 53151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 532e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara base::unique_fd fence; 53351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara if (observer_) 534e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara fence = observer_->OnNewFrame(frame); 535e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara 536e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara if (fence.get() < 0) 537e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara return Error::NONE; 538e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara 539e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara *outPresentFence = dup(fence.get()); 540e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara outLayers->swap(last_frame_layers); 541e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara for (size_t i = 0; i < outLayers->size(); ++i) 542e13ec18867aee74a82435ef112dca01416eee4c0Daniel Nicoara outReleaseFences->push_back(dup(fence.get())); 54351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 54451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 54551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 54651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 54751a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerCursorPosition(Display display, Layer layer, int32_t x, 54851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara int32_t y) { 5492b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk std::lock_guard<std::mutex> guard(mutex_); 550730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk auto display_ptr = FindDisplay(display); 551730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk if (!display_ptr) 5522b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_DISPLAY; 553730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk 554730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk HwcLayer* hwc_layer = display_ptr->GetLayer(layer); 555730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk if (!hwc_layer) 556730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk return Error::BAD_LAYER; 557730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk 558730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk hwc_layer->info.cursor_x = x; 559730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk hwc_layer->info.cursor_y = y; 56051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 56151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 56251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 56351a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerBuffer(Display display, Layer layer, 56451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara buffer_handle_t buffer, int32_t acquireFence) { 56551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara base::unique_fd fence(acquireFence); 5662b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk std::lock_guard<std::mutex> guard(mutex_); 5672b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk auto display_ptr = FindDisplay(display); 5682b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (!display_ptr) 5692b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_DISPLAY; 57051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 5712b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk HwcLayer* hwc_layer = display_ptr->GetLayer(layer); 5722b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (!hwc_layer) 5732b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_LAYER; 574e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 5751f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara hwc_layer->info.buffer = CreateGraphicBuffer( 5761f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara buffer, hwc_layer->buffer_metadata); 577e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko hwc_layer->info.fence = new Fence(fence.release()); 578e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 57951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 58051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 58151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 58251a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerSurfaceDamage(Display display, Layer layer, 58351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara const std::vector<hwc_rect_t>& damage) { 5842b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk std::lock_guard<std::mutex> guard(mutex_); 585730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk auto display_ptr = FindDisplay(display); 586730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk if (!display_ptr) 5872b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_DISPLAY; 588730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk 589730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk HwcLayer* hwc_layer = display_ptr->GetLayer(layer); 590730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk if (!hwc_layer) 591730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk return Error::BAD_LAYER; 592730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk 593730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk hwc_layer->info.damaged_regions = damage; 59451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 59551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 59651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 59751a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerBlendMode(Display display, Layer layer, int32_t mode) { 5982b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk std::lock_guard<std::mutex> guard(mutex_); 5992b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk auto display_ptr = FindDisplay(display); 6002b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (!display_ptr) 6012b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_DISPLAY; 60251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 6032b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk HwcLayer* hwc_layer = display_ptr->GetLayer(layer); 6042b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (!hwc_layer) 6052b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_LAYER; 606e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 607e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko hwc_layer->info.blend_mode = 608e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko static_cast<ComposerView::ComposerLayer::BlendMode>(mode); 609e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 61051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 61151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 61251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 61351a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerColor(Display display, Layer layer, 61451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara IComposerClient::Color color) { 6152b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk std::lock_guard<std::mutex> guard(mutex_); 616730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk auto display_ptr = FindDisplay(display); 617730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk if (!display_ptr) 6182b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_DISPLAY; 619730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk 620730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk HwcLayer* hwc_layer = display_ptr->GetLayer(layer); 621730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk if (!hwc_layer) 622730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk return Error::BAD_LAYER; 623730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk 624730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk hwc_layer->info.color = color; 62551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 62651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 62751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 62851a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerCompositionType(Display display, Layer layer, 62951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara int32_t type) { 6302b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk std::lock_guard<std::mutex> guard(mutex_); 6312b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk auto display_ptr = FindDisplay(display); 6322b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (!display_ptr) 6332b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_DISPLAY; 63451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 6352b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk HwcLayer* hwc_layer = display_ptr->GetLayer(layer); 6362b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (!hwc_layer) 6372b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_LAYER; 638e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 639e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko hwc_layer->composition_type = static_cast<HwcLayer::Composition>(type); 640e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 64151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 64251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 64351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 64451a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerDataspace(Display display, Layer layer, 64551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara int32_t dataspace) { 6462b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk std::lock_guard<std::mutex> guard(mutex_); 647730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk auto display_ptr = FindDisplay(display); 648730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk if (!display_ptr) 6492b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_DISPLAY; 650730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk 651730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk HwcLayer* hwc_layer = display_ptr->GetLayer(layer); 652730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk if (!hwc_layer) 653730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk return Error::BAD_LAYER; 654730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk 655730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk hwc_layer->info.dataspace = dataspace; 65651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 65751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 65851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 65951a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerDisplayFrame(Display display, Layer layer, 66051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara const hwc_rect_t& frame) { 6612b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk std::lock_guard<std::mutex> guard(mutex_); 6622b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk auto display_ptr = FindDisplay(display); 6632b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (!display_ptr) 6642b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_DISPLAY; 66551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 6662b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk HwcLayer* hwc_layer = display_ptr->GetLayer(layer); 6672b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (!hwc_layer) 6682b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_LAYER; 669e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 670e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko hwc_layer->info.display_frame = 671e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko {frame.left, frame.top, frame.right, frame.bottom}; 672e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 67351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 67451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 67551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 67651a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerPlaneAlpha(Display display, Layer layer, float alpha) { 6772b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk std::lock_guard<std::mutex> guard(mutex_); 6782b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk auto display_ptr = FindDisplay(display); 6792b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (!display_ptr) 6802b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_DISPLAY; 68151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 6822b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk HwcLayer* hwc_layer = display_ptr->GetLayer(layer); 6832b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (!hwc_layer) 6842b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_LAYER; 685e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 686e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko hwc_layer->info.alpha = alpha; 687e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 68851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 68951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 69051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 69151a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerSidebandStream(Display display, Layer layer, 69251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara buffer_handle_t stream) { 6932b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk std::lock_guard<std::mutex> guard(mutex_); 6942b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (!FindDisplay(display)) 6952b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_DISPLAY; 69651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 69751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 69851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 69951a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerSourceCrop(Display display, Layer layer, 70051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara const hwc_frect_t& crop) { 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.crop = {crop.left, crop.top, crop.right, crop.bottom}; 711e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 71251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 71351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 71451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 71551a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerTransform(Display display, Layer layer, 71651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara int32_t transform) { 7172b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk std::lock_guard<std::mutex> guard(mutex_); 718730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk auto display_ptr = FindDisplay(display); 719730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk if (!display_ptr) 7202b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_DISPLAY; 721730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk 722730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk HwcLayer* hwc_layer = display_ptr->GetLayer(layer); 723730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk if (!hwc_layer) 724730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk return Error::BAD_LAYER; 725730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk 726730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk hwc_layer->info.transform = transform; 72751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 72851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 72951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 73051a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerVisibleRegion(Display display, Layer layer, 73151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara const std::vector<hwc_rect_t>& visible) { 7322b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk std::lock_guard<std::mutex> guard(mutex_); 733730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk auto display_ptr = FindDisplay(display); 734730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk if (!display_ptr) 7352b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_DISPLAY; 736730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk 737730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk HwcLayer* hwc_layer = display_ptr->GetLayer(layer); 738730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk if (!hwc_layer) 739730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk return Error::BAD_LAYER; 740730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk 741730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk hwc_layer->info.visible_regions = visible; 74251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 74351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 74451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 74551a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerZOrder(Display display, Layer layer, uint32_t z) { 7462b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk std::lock_guard<std::mutex> guard(mutex_); 7472b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk auto display_ptr = FindDisplay(display); 7482b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (!display_ptr) 7492b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_DISPLAY; 75051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 7512b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk HwcLayer* hwc_layer = display_ptr->GetLayer(layer); 7522b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (!hwc_layer) 7532b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_LAYER; 754e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 755730c89a8042e277304a90bff180348fcda75d5a7Albert Chaulk hwc_layer->info.z_order = z; 756e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 75751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 75851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 75951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 76051a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerInfo(Display display, Layer layer, uint32_t type, 76151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara uint32_t appId) { 7622b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk std::lock_guard<std::mutex> guard(mutex_); 7632b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk auto display_ptr = FindDisplay(display); 7642b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (!display_ptr) 7652b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_DISPLAY; 76651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 7672b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk HwcLayer* hwc_layer = display_ptr->GetLayer(layer); 7682b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk if (!hwc_layer) 7692b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return Error::BAD_LAYER; 770e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 771e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko hwc_layer->info.type = type; 772e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko hwc_layer->info.app_id = appId; 773e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 77451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 77551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 77651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 7771f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel NicoaraError VrHwc::setClientTargetMetadata( 7781f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara Display display, const IVrComposerClient::BufferMetadata& metadata) { 7791f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara std::lock_guard<std::mutex> guard(mutex_); 7801f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara auto display_ptr = FindDisplay(display); 7811f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara if (!display_ptr) 7821f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara return Error::BAD_DISPLAY; 7831f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara 7841f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara display_ptr->SetClientTargetMetadata(metadata); 7851f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara 7861f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara return Error::NONE; 7871f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara} 7881f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara 7891f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel NicoaraError VrHwc::setLayerBufferMetadata( 7901f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara Display display, Layer layer, 7911f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara const IVrComposerClient::BufferMetadata& metadata) { 7921f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara std::lock_guard<std::mutex> guard(mutex_); 7931f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara auto display_ptr = FindDisplay(display); 7941f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara if (!display_ptr) 7951f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara return Error::BAD_DISPLAY; 7961f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara 7971f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara HwcLayer* hwc_layer = display_ptr->GetLayer(layer); 7981f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara if (!hwc_layer) 7991f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara return Error::BAD_LAYER; 8001f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara 8011f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara hwc_layer->buffer_metadata = metadata; 8021f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara 8031f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara return Error::NONE; 8041f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara} 8051f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara 80651a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraReturn<void> VrHwc::getCapabilities(getCapabilities_cb hidl_cb) { 80751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara hidl_cb(hidl_vec<Capability>()); 80851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Void(); 80951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 81051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 81151a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraReturn<void> VrHwc::dumpDebugInfo(dumpDebugInfo_cb hidl_cb) { 81251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara hidl_cb(hidl_string()); 81351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Void(); 81451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 81551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 81651a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraReturn<void> VrHwc::createClient(createClient_cb hidl_cb) { 81751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara std::lock_guard<std::mutex> guard(mutex_); 81851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 81951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara Error status = Error::NONE; 82051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara sp<VrComposerClient> client; 82151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara if (client_ == nullptr) { 82251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara client = new VrComposerClient(*this); 82351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara client->initialize(); 82451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara } else { 82551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara ALOGE("Already have a client"); 82651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara status = Error::NO_RESOURCES; 82751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara } 82851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 82951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara client_ = client; 83051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara hidl_cb(status, client); 83151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Void(); 83251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 83351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 83451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoaravoid VrHwc::RegisterObserver(Observer* observer) { 83551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara std::lock_guard<std::mutex> guard(mutex_); 83651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara if (observer_) 83751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara ALOGE("Overwriting observer"); 83851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara else 83951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara observer_ = observer; 84051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 84151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 84251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoaravoid VrHwc::UnregisterObserver(Observer* observer) { 84351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara std::lock_guard<std::mutex> guard(mutex_); 84451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara if (observer != observer_) 84551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara ALOGE("Trying to unregister unknown observer"); 84651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara else 84751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara observer_ = nullptr; 84851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 84951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 8502b3b666cfd89681514764201803e48b6ba112a80Albert ChaulkHwcDisplay* VrHwc::FindDisplay(Display display) { 8512b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk auto iter = displays_.find(display); 8522b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk return iter == displays_.end() ? nullptr : iter->second.get(); 8532b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk} 8542b3b666cfd89681514764201803e48b6ba112a80Albert Chaulk 85551a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraComposerView* GetComposerViewFromIComposer( 85651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara hardware::graphics::composer::V2_1::IComposer* composer) { 85751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return static_cast<VrHwc*>(composer); 85851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 85951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 86051a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraIComposer* HIDL_FETCH_IComposer(const char*) { return new VrHwc(); } 86151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 86251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} // namespace dvr 86351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} // namespace android 864