vr_hwc.cpp revision e4eec20f6263f4a42ae462456f60ea6c4518bb0a
151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara/* 251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara * Copyright 2016 The Android Open Source Project 351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara * 451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara * Licensed under the Apache License, Version 2.0 (the "License"); 551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara * you may not use this file except in compliance with the License. 651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara * You may obtain a copy of the License at 751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara * 851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara * http://www.apache.org/licenses/LICENSE-2.0 951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara * 1051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara * Unless required by applicable law or agreed to in writing, software 1151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara * distributed under the License is distributed on an "AS IS" BASIS, 1251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara * See the License for the specific language governing permissions and 1451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara * limitations under the License. 1551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara */ 16e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include "vr_hwc.h" 1751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 18e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <gralloc_priv.h> 1951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara#include <ui/Fence.h> 2051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara#include <ui/GraphicBuffer.h> 2151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara#include <ui/GraphicBufferMapper.h> 2251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 2351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara#include <mutex> 2451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 25e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include "sync_timeline.h" 26e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include "vr_composer_client.h" 2751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 2851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoarausing namespace android::hardware::graphics::common::V1_0; 2951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoarausing namespace android::hardware::graphics::composer::V2_1; 3051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 3151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoarausing android::hardware::hidl_handle; 3251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoarausing android::hardware::hidl_string; 3351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoarausing android::hardware::hidl_vec; 3451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoarausing android::hardware::Return; 3551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoarausing android::hardware::Void; 3651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 3751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoaranamespace android { 3851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoaranamespace dvr { 3951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoaranamespace { 4051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 4151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoarausing android::hardware::graphics::common::V1_0::PixelFormat; 4251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 4351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoaraconst Display kDefaultDisplayId = 1; 4451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoaraconst Config kDefaultConfigId = 1; 4551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 46e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkosp<GraphicBuffer> GetBufferFromHandle(const native_handle_t* handle) { 47e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko // TODO(dnicoara): Fix this once gralloc1 is available. 48e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko private_handle_t* private_handle = private_handle_t::dynamicCast(handle); 49e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko sp<GraphicBuffer> buffer = new GraphicBuffer( 50e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko private_handle->width, private_handle->height, private_handle->format, 1, 51e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko GraphicBuffer::USAGE_HW_COMPOSER | GraphicBuffer::USAGE_HW_TEXTURE, 52e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko private_handle->width, native_handle_clone(handle), true); 53e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko if (GraphicBufferMapper::get().registerBuffer(buffer.get()) != OK) { 54e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ALOGE("Failed to register buffer"); 55e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko return nullptr; 56e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko } 57e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 58e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko return buffer; 59e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} 60e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 6151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} // namespace 6251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 6351a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraHwcDisplay::HwcDisplay() {} 6451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 6551a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraHwcDisplay::~HwcDisplay() {} 6651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 6751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoarabool HwcDisplay::Initialize() { return hwc_timeline_.Initialize(); } 6851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 6951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoarabool HwcDisplay::SetClientTarget(const native_handle_t* handle, 7051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara base::unique_fd fence) { 71e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko if (handle) 72e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko buffer_ = GetBufferFromHandle(handle); 7351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 7451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara fence_ = new Fence(fence.release()); 7551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return true; 7651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 7751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 7851a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraHwcLayer* HwcDisplay::CreateLayer() { 7951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara uint64_t layer_id = layer_ids_++; 8051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara layers_.push_back(HwcLayer(layer_id)); 8151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return &layers_.back(); 8251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 8351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 8451a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraHwcLayer* HwcDisplay::GetLayer(Layer id) { 8551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara for (size_t i = 0; i < layers_.size(); ++i) 8651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara if (layers_[i].id == id) return &layers_[i]; 8751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 8851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return nullptr; 8951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 9051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 9151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoarabool HwcDisplay::DestroyLayer(Layer id) { 9251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara for (auto it = layers_.begin(); it != layers_.end(); ++it) { 9351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara if (it->id == id) { 9451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara layers_.erase(it); 9551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return true; 9651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara } 9751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara } 9851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 9951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return false; 10051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 10151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 10251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoaravoid HwcDisplay::GetChangedCompositionTypes( 10351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara std::vector<Layer>* layer_ids, 10451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara std::vector<IComposerClient::Composition>* types) { 105e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko std::sort(layers_.begin(), layers_.end(), 106e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko [](const auto& lhs, const auto& rhs) { 107e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko return lhs.z_order < rhs.z_order; 108e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko }); 109e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 110e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko int first_client_layer = -1, last_client_layer = -1; 111e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko for (size_t i = 0; i < layers_.size(); ++i) { 112e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko switch (layers_[i].composition_type) { 113e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko case IComposerClient::Composition::SOLID_COLOR: 114e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko case IComposerClient::Composition::CURSOR: 115e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko case IComposerClient::Composition::SIDEBAND: 116e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko if (first_client_layer < 0) 117e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko first_client_layer = i; 118e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 119e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko last_client_layer = i; 120e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko break; 121e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko default: 122e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko break; 123e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko } 124e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko } 125e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 126e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko for (size_t i = 0; i < layers_.size(); ++i) { 127e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko if (i >= first_client_layer && i <= last_client_layer) { 128e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko if (layers_[i].composition_type != IComposerClient::Composition::CLIENT) { 129e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko layer_ids->push_back(layers_[i].id); 130e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko types->push_back(IComposerClient::Composition::CLIENT); 131e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko layers_[i].composition_type = IComposerClient::Composition::CLIENT; 132e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko } 133e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 134e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko continue; 135e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko } 136e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 137e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko if (layers_[i].composition_type != IComposerClient::Composition::DEVICE) { 138e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko layer_ids->push_back(layers_[i].id); 139e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko types->push_back(IComposerClient::Composition::DEVICE); 140e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko layers_[i].composition_type = IComposerClient::Composition::DEVICE; 141e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko } 14251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara } 14351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 14451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 14551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoarastd::vector<ComposerView::ComposerLayer> HwcDisplay::GetFrame() { 14651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara // Increment the time the fence is signalled every time we get the 14751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara // presentation frame. This ensures that calling ReleaseFrame() only affects 14851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara // the current frame. 14951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara fence_time_++; 15051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 151e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko bool queued_client_target = false; 152e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko std::vector<ComposerView::ComposerLayer> frame; 153e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko for (const auto& layer : layers_) { 154e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko if (layer.composition_type == IComposerClient::Composition::CLIENT) { 155e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko if (!queued_client_target) { 156e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ComposerView::ComposerLayer client_target_layer = { 157e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko .buffer = buffer_, 158e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko .fence = fence_.get() ? fence_ : new Fence(-1), 159e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko .display_frame = {0, 0, static_cast<int32_t>(buffer_->getWidth()), 160e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko static_cast<int32_t>(buffer_->getHeight())}, 161e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko .crop = {0.0f, 0.0f, static_cast<float>(buffer_->getWidth()), 162e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko static_cast<float>(buffer_->getHeight())}, 163e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko .blend_mode = IComposerClient::BlendMode::NONE, 164e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko }; 165e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 166e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko frame.push_back(client_target_layer); 167e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko queued_client_target = true; 168e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko } 169e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko } else { 170e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko frame.push_back(layer.info); 171e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko } 172e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko } 173e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 174e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko return frame; 17551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 17651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 177e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkovoid HwcDisplay::GetReleaseFences(int* present_fence, 178e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko std::vector<Layer>* layer_ids, 17951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara std::vector<int>* fences) { 180e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko *present_fence = hwc_timeline_.CreateFence(fence_time_); 18151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara for (const auto& layer : layers_) { 18251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara layer_ids->push_back(layer.id); 18351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara fences->push_back(hwc_timeline_.CreateFence(fence_time_)); 18451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara } 18551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 18651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 187e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkovoid HwcDisplay::ReleaseFrame() { 188e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko hwc_timeline_.IncrementTimeline(); 189e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} 190e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 191e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko//////////////////////////////////////////////////////////////////////////////// 192e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// VrHwcClient 19351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 19451a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraVrHwc::VrHwc() {} 19551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 19651a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraVrHwc::~VrHwc() {} 19751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 19851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoarabool VrHwc::Initialize() { return display_.Initialize(); } 19951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 20051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoarabool VrHwc::hasCapability(Capability capability) const { return false; } 20151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 20251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoaravoid VrHwc::removeClient() { 20351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara std::lock_guard<std::mutex> guard(mutex_); 20451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara client_ = nullptr; 20551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 20651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 20751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoaravoid VrHwc::enableCallback(bool enable) { 20851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara std::lock_guard<std::mutex> guard(mutex_); 20951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara if (enable && client_ != nullptr) { 21051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara client_.promote()->onHotplug(kDefaultDisplayId, 21151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara IComposerCallback::Connection::CONNECTED); 21251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara } 21351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 21451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 21551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoarauint32_t VrHwc::getMaxVirtualDisplayCount() { return 0; } 21651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 21751a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::createVirtualDisplay(uint32_t width, uint32_t height, 21851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara PixelFormat* format, Display* outDisplay) { 21951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara *format = PixelFormat::RGBA_8888; 22051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara *outDisplay = 0; 22151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 22251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 22351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 22451a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::destroyVirtualDisplay(Display display) { return Error::NONE; } 22551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 22651a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::createLayer(Display display, Layer* outLayer) { 22751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara if (display != kDefaultDisplayId) { 22851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::BAD_DISPLAY; 22951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara } 23051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 23151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara std::lock_guard<std::mutex> guard(mutex_); 23251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 23351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara HwcLayer* layer = display_.CreateLayer(); 23451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara *outLayer = layer->id; 23551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 23651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 23751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 23851a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::destroyLayer(Display display, Layer layer) { 23951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara if (display != kDefaultDisplayId) return Error::BAD_DISPLAY; 24051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 24151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara std::lock_guard<std::mutex> guard(mutex_); 24251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 24351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return display_.DestroyLayer(layer) ? Error::NONE : Error::BAD_LAYER; 24451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 24551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 24651a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::getActiveConfig(Display display, Config* outConfig) { 24751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara if (display != kDefaultDisplayId) return Error::BAD_DISPLAY; 24851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 24951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara *outConfig = kDefaultConfigId; 25051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 25151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 25251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 25351a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::getClientTargetSupport(Display display, uint32_t width, 25451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara uint32_t height, PixelFormat format, 25551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara Dataspace dataspace) { 25651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 25751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 25851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 25951a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::getColorModes(Display display, hidl_vec<ColorMode>* outModes) { 26051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara std::vector<ColorMode> color_modes(1, ColorMode::NATIVE); 26151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara *outModes = hidl_vec<ColorMode>(color_modes); 26251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 26351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 26451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 26551a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::getDisplayAttribute(Display display, Config config, 26651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara IComposerClient::Attribute attribute, 26751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara int32_t* outValue) { 26851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara if (display != kDefaultDisplayId) { 26951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::BAD_DISPLAY; 27051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara } 27151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 27251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara if (config != kDefaultConfigId) { 27351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::BAD_CONFIG; 27451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara } 27551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 27651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara switch (attribute) { 27751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara case IComposerClient::Attribute::WIDTH: 278e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko *outValue = 1920; 27951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara break; 28051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara case IComposerClient::Attribute::HEIGHT: 281e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko *outValue = 1080; 28251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara break; 28351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara case IComposerClient::Attribute::VSYNC_PERIOD: 28451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara *outValue = 1000 * 1000 * 1000 / 30; // 30fps 28551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara break; 28651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara case IComposerClient::Attribute::DPI_X: 28751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara case IComposerClient::Attribute::DPI_Y: 28851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara *outValue = 300 * 1000; // 300dpi 28951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara break; 29051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara default: 29151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::BAD_PARAMETER; 29251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara } 29351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 29451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 29551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 29651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 29751a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::getDisplayConfigs(Display display, hidl_vec<Config>* outConfigs) { 29851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara if (display != kDefaultDisplayId) { 29951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::BAD_DISPLAY; 30051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara } 30151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 30251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara std::vector<Config> configs(1, kDefaultConfigId); 30351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara *outConfigs = hidl_vec<Config>(configs); 30451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 30551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 30651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 30751a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::getDisplayName(Display display, hidl_string* outName) { 30851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara *outName = hidl_string(); 30951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 31051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 31151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 31251a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::getDisplayType(Display display, 31351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara IComposerClient::DisplayType* outType) { 31451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara if (display != kDefaultDisplayId) { 31551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara *outType = IComposerClient::DisplayType::INVALID; 31651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::BAD_DISPLAY; 31751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara } 31851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 31951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara *outType = IComposerClient::DisplayType::PHYSICAL; 32051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 32151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 32251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 32351a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::getDozeSupport(Display display, bool* outSupport) { 32451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara *outSupport = false; 32551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara if (display == kDefaultDisplayId) 32651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 32751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara else 32851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::BAD_DISPLAY; 32951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 33051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 33151a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::getHdrCapabilities(Display display, hidl_vec<Hdr>* outTypes, 33251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara float* outMaxLuminance, 33351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara float* outMaxAverageLuminance, 33451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara float* outMinLuminance) { 33551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara *outMaxLuminance = 0; 33651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara *outMaxAverageLuminance = 0; 33751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara *outMinLuminance = 0; 33851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 33951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 34051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 34151a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setActiveConfig(Display display, Config config) { 34251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara if (display != kDefaultDisplayId) return Error::BAD_DISPLAY; 34351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 34451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara if (config != kDefaultConfigId) return Error::BAD_CONFIG; 34551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 34651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 34751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 34851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 34951a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setColorMode(Display display, ColorMode mode) { 35051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara if (display != kDefaultDisplayId) return Error::BAD_DISPLAY; 35151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 35251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 35351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 35451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 35551a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setPowerMode(Display display, IComposerClient::PowerMode mode) { 35651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara if (display != kDefaultDisplayId) return Error::BAD_DISPLAY; 35751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 35851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 35951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 36051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 36151a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setVsyncEnabled(Display display, IComposerClient::Vsync enabled) { 36251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara if (display != kDefaultDisplayId) return Error::BAD_DISPLAY; 36351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 36451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 36551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 36651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 36751a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setColorTransform(Display display, const float* matrix, 36851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara int32_t hint) { 36951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara if (display != kDefaultDisplayId) return Error::BAD_DISPLAY; 37051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 37151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 37251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 37351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 37451a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setClientTarget(Display display, buffer_handle_t target, 37551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara int32_t acquireFence, int32_t dataspace, 37651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara const std::vector<hwc_rect_t>& damage) { 37751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara base::unique_fd fence(acquireFence); 37851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara if (display != kDefaultDisplayId) return Error::BAD_DISPLAY; 37951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 38051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara if (target == nullptr) return Error::NONE; 38151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 38251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara std::lock_guard<std::mutex> guard(mutex_); 38351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 38451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara if (!display_.SetClientTarget(target, std::move(fence))) 38551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::BAD_PARAMETER; 38651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 38751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 38851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 38951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 39051a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setOutputBuffer(Display display, buffer_handle_t buffer, 39151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara int32_t releaseFence) { 39251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara base::unique_fd fence(releaseFence); 39351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara if (display != kDefaultDisplayId) return Error::BAD_DISPLAY; 39451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 39551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 39651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 39751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 39851a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::validateDisplay( 39951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara Display display, std::vector<Layer>* outChangedLayers, 40051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara std::vector<IComposerClient::Composition>* outCompositionTypes, 40151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara uint32_t* outDisplayRequestMask, std::vector<Layer>* outRequestedLayers, 40251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara std::vector<uint32_t>* outRequestMasks) { 40351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara if (display != kDefaultDisplayId) { 40451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::BAD_DISPLAY; 40551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara } 40651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 40751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara std::lock_guard<std::mutex> guard(mutex_); 40851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 40951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara display_.GetChangedCompositionTypes(outChangedLayers, outCompositionTypes); 41051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 41151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 41251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 41351a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::acceptDisplayChanges(Display display) { return Error::NONE; } 41451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 41551a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::presentDisplay(Display display, int32_t* outPresentFence, 41651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara std::vector<Layer>* outLayers, 41751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara std::vector<int32_t>* outReleaseFences) { 41851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara *outPresentFence = -1; 41951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara if (display != kDefaultDisplayId) { 42051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::BAD_DISPLAY; 42151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara } 42251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 423e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko std::vector<ComposerView::ComposerLayer> frame; 424e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko { 425e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko std::lock_guard<std::mutex> guard(mutex_); 426e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko frame = display_.GetFrame(); 427e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko display_.GetReleaseFences(outPresentFence, outLayers, outReleaseFences); 428e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko } 42951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 43051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara if (observer_) 431e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko observer_->OnNewFrame(frame); 43251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara else 433e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ReleaseFrame(); 43451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 43551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 43651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 43751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 43851a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerCursorPosition(Display display, Layer layer, int32_t x, 43951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara int32_t y) { 44051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara if (display != kDefaultDisplayId) return Error::BAD_DISPLAY; 44151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 44251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 44351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 44451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 44551a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerBuffer(Display display, Layer layer, 44651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara buffer_handle_t buffer, int32_t acquireFence) { 44751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara base::unique_fd fence(acquireFence); 44851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara if (display != kDefaultDisplayId) return Error::BAD_DISPLAY; 44951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 450e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko HwcLayer* hwc_layer = display_.GetLayer(layer); 451e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko if (!hwc_layer) return Error::BAD_LAYER; 452e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 453e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko hwc_layer->info.buffer = GetBufferFromHandle(buffer); 454e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko hwc_layer->info.fence = new Fence(fence.release()); 455e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 45651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 45751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 45851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 45951a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerSurfaceDamage(Display display, Layer layer, 46051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara const std::vector<hwc_rect_t>& damage) { 46151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara if (display != kDefaultDisplayId) return Error::BAD_DISPLAY; 46251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 46351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 46451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 46551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 46651a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerBlendMode(Display display, Layer layer, int32_t mode) { 46751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara if (display != kDefaultDisplayId) return Error::BAD_DISPLAY; 46851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 469e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko HwcLayer* hwc_layer = display_.GetLayer(layer); 470e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko if (!hwc_layer) return Error::BAD_LAYER; 471e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 472e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko hwc_layer->info.blend_mode = 473e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko static_cast<ComposerView::ComposerLayer::BlendMode>(mode); 474e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 47551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 47651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 47751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 47851a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerColor(Display display, Layer layer, 47951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara IComposerClient::Color color) { 48051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara if (display != kDefaultDisplayId) return Error::BAD_DISPLAY; 48151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 48251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 48351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 48451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 48551a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerCompositionType(Display display, Layer layer, 48651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara int32_t type) { 48751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara if (display != kDefaultDisplayId) return Error::BAD_DISPLAY; 48851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 489e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko HwcLayer* hwc_layer = display_.GetLayer(layer); 490e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko if (!hwc_layer) return Error::BAD_LAYER; 491e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 492e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko hwc_layer->composition_type = static_cast<HwcLayer::Composition>(type); 493e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 49451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 49551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 49651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 49751a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerDataspace(Display display, Layer layer, 49851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara int32_t dataspace) { 49951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara if (display != kDefaultDisplayId) return Error::BAD_DISPLAY; 50051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 50151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 50251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 50351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 50451a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerDisplayFrame(Display display, Layer layer, 50551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara const hwc_rect_t& frame) { 50651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara if (display != kDefaultDisplayId) return Error::BAD_DISPLAY; 50751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 508e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko HwcLayer* hwc_layer = display_.GetLayer(layer); 509e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko if (!hwc_layer) return Error::BAD_LAYER; 510e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 511e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko hwc_layer->info.display_frame = 512e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko {frame.left, frame.top, frame.right, frame.bottom}; 513e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 51451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 51551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 51651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 51751a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerPlaneAlpha(Display display, Layer layer, float alpha) { 51851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara if (display != kDefaultDisplayId) return Error::BAD_DISPLAY; 51951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 520e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko HwcLayer* hwc_layer = display_.GetLayer(layer); 521e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko if (!hwc_layer) return Error::BAD_LAYER; 522e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 523e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko hwc_layer->info.alpha = alpha; 524e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 52551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 52651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 52751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 52851a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerSidebandStream(Display display, Layer layer, 52951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara buffer_handle_t stream) { 53051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara if (display != kDefaultDisplayId) return Error::BAD_DISPLAY; 53151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 53251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 53351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 53451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 53551a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerSourceCrop(Display display, Layer layer, 53651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara const hwc_frect_t& crop) { 53751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara if (display != kDefaultDisplayId) return Error::BAD_DISPLAY; 53851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 539e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko HwcLayer* hwc_layer = display_.GetLayer(layer); 540e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko if (!hwc_layer) return Error::BAD_LAYER; 541e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 542e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko hwc_layer->info.crop = {crop.left, crop.top, crop.right, crop.bottom}; 543e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 54451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 54551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 54651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 54751a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerTransform(Display display, Layer layer, 54851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara int32_t transform) { 54951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara if (display != kDefaultDisplayId) return Error::BAD_DISPLAY; 55051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 55151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 55251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 55351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 55451a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerVisibleRegion(Display display, Layer layer, 55551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara const std::vector<hwc_rect_t>& visible) { 55651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara if (display != kDefaultDisplayId) return Error::BAD_DISPLAY; 55751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 55851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 55951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 56051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 56151a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerZOrder(Display display, Layer layer, uint32_t z) { 56251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara if (display != kDefaultDisplayId) return Error::BAD_DISPLAY; 56351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 564e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko HwcLayer* hwc_layer = display_.GetLayer(layer); 565e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko if (!hwc_layer) return Error::BAD_LAYER; 566e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 567e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko hwc_layer->z_order = z; 568e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 56951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 57051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 57151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 57251a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraError VrHwc::setLayerInfo(Display display, Layer layer, uint32_t type, 57351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara uint32_t appId) { 57451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara if (display != kDefaultDisplayId) return Error::BAD_DISPLAY; 57551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 576e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko HwcLayer* hwc_layer = display_.GetLayer(layer); 577e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko if (!hwc_layer) return Error::BAD_LAYER; 578e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 579e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko hwc_layer->info.type = type; 580e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko hwc_layer->info.app_id = appId; 581e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 58251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Error::NONE; 58351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 58451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 58551a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraReturn<void> VrHwc::getCapabilities(getCapabilities_cb hidl_cb) { 58651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara hidl_cb(hidl_vec<Capability>()); 58751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Void(); 58851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 58951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 59051a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraReturn<void> VrHwc::dumpDebugInfo(dumpDebugInfo_cb hidl_cb) { 59151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara hidl_cb(hidl_string()); 59251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Void(); 59351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 59451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 59551a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraReturn<void> VrHwc::createClient(createClient_cb hidl_cb) { 59651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara std::lock_guard<std::mutex> guard(mutex_); 59751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 59851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara Error status = Error::NONE; 59951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara sp<VrComposerClient> client; 60051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara if (client_ == nullptr) { 60151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara client = new VrComposerClient(*this); 60251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara client->initialize(); 60351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara } else { 60451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara ALOGE("Already have a client"); 60551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara status = Error::NO_RESOURCES; 60651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara } 60751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 60851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara client_ = client; 60951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara hidl_cb(status, client); 61051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return Void(); 61151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 61251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 61351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoaravoid VrHwc::RegisterObserver(Observer* observer) { 61451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara std::lock_guard<std::mutex> guard(mutex_); 61551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara if (observer_) 61651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara ALOGE("Overwriting observer"); 61751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara else 61851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara observer_ = observer; 61951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 62051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 62151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoaravoid VrHwc::UnregisterObserver(Observer* observer) { 62251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara std::lock_guard<std::mutex> guard(mutex_); 62351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara if (observer != observer_) 62451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara ALOGE("Trying to unregister unknown observer"); 62551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara else 62651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara observer_ = nullptr; 62751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 62851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 62951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoaravoid VrHwc::ReleaseFrame() { 63051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara std::lock_guard<std::mutex> guard(mutex_); 63151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara display_.ReleaseFrame(); 63251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 63351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 63451a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraComposerView* GetComposerViewFromIComposer( 63551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara hardware::graphics::composer::V2_1::IComposer* composer) { 63651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return static_cast<VrHwc*>(composer); 63751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 63851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 63951a0a56385f4176447d8168f9395341b3e7574a0Daniel NicoaraIComposer* HIDL_FETCH_IComposer(const char*) { return new VrHwc(); } 64051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 64151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} // namespace dvr 64251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} // namespace android 643