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 */ 1651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 1795a99a1d3cdbd19343d0d27271098c9c01a63e78Daniel Nicoara#include <android/frameworks/vr/composer/1.0/IVrComposerClient.h> 1851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara#include <hardware/gralloc.h> 1951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara#include <hardware/gralloc1.h> 2051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara#include <log/log.h> 2151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 224251e92b6dacb5653aa9528d88484085ee333e3bDaniel Nicoara#include "impl/vr_hwc.h" 234251e92b6dacb5653aa9528d88484085ee333e3bDaniel Nicoara#include "impl/vr_composer_client.h" 2451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 2551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoaranamespace android { 2651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoaranamespace dvr { 2751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 2851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoarausing android::hardware::graphics::common::V1_0::PixelFormat; 2995a99a1d3cdbd19343d0d27271098c9c01a63e78Daniel Nicoarausing android::frameworks::vr::composer::V1_0::IVrComposerClient; 3051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 3129e146b284b74ae65670a3a4f3698cd9ee155f1dChia-I WuVrComposerClient::VrComposerClient(dvr::VrHwc& hal) 3229e146b284b74ae65670a3a4f3698cd9ee155f1dChia-I Wu : ComposerClient(&hal), mVrHal(hal) { 3329e146b284b74ae65670a3a4f3698cd9ee155f1dChia-I Wu if (!init()) { 3429e146b284b74ae65670a3a4f3698cd9ee155f1dChia-I Wu LOG_ALWAYS_FATAL("failed to initialize VrComposerClient"); 3529e146b284b74ae65670a3a4f3698cd9ee155f1dChia-I Wu } 3629e146b284b74ae65670a3a4f3698cd9ee155f1dChia-I Wu} 3751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 3829e146b284b74ae65670a3a4f3698cd9ee155f1dChia-I WuVrComposerClient::~VrComposerClient() {} 3951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 4069f8fb7e5c8cb3ec4cb77ee3354231c5e6703026Chia-I Wustd::unique_ptr<ComposerCommandEngine> 4129e146b284b74ae65670a3a4f3698cd9ee155f1dChia-I WuVrComposerClient::createCommandEngine() { 4269f8fb7e5c8cb3ec4cb77ee3354231c5e6703026Chia-I Wu return std::unique_ptr<VrCommandEngine>(new VrCommandEngine(*this)); 4351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 4451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 4529e146b284b74ae65670a3a4f3698cd9ee155f1dChia-I WuVrComposerClient::VrCommandEngine::VrCommandEngine(VrComposerClient& client) 4629e146b284b74ae65670a3a4f3698cd9ee155f1dChia-I Wu : ComposerCommandEngine(client.mHal, client.mResources.get()), mVrClient(client), 4769f8fb7e5c8cb3ec4cb77ee3354231c5e6703026Chia-I Wu mVrHal(client.mVrHal) {} 4851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 4929e146b284b74ae65670a3a4f3698cd9ee155f1dChia-I WuVrComposerClient::VrCommandEngine::~VrCommandEngine() {} 5051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 5129e146b284b74ae65670a3a4f3698cd9ee155f1dChia-I Wubool VrComposerClient::VrCommandEngine::executeCommand( 5251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara IComposerClient::Command command, uint16_t length) { 5351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara IVrComposerClient::VrCommand vrCommand = 5451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara static_cast<IVrComposerClient::VrCommand>(command); 5551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara switch (vrCommand) { 5651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara case IVrComposerClient::VrCommand::SET_LAYER_INFO: 5769f8fb7e5c8cb3ec4cb77ee3354231c5e6703026Chia-I Wu return executeSetLayerInfo(length); 581f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara case IVrComposerClient::VrCommand::SET_CLIENT_TARGET_METADATA: 5969f8fb7e5c8cb3ec4cb77ee3354231c5e6703026Chia-I Wu return executeSetClientTargetMetadata(length); 601f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara case IVrComposerClient::VrCommand::SET_LAYER_BUFFER_METADATA: 6169f8fb7e5c8cb3ec4cb77ee3354231c5e6703026Chia-I Wu return executeSetLayerBufferMetadata(length); 6251a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara default: 6369f8fb7e5c8cb3ec4cb77ee3354231c5e6703026Chia-I Wu return ComposerCommandEngine::executeCommand(command, length); 6451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara } 6551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 6651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 6729e146b284b74ae65670a3a4f3698cd9ee155f1dChia-I Wubool VrComposerClient::VrCommandEngine::executeSetLayerInfo(uint16_t length) { 6851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara if (length != 2) { 6951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return false; 7051a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara } 7151a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 7269f8fb7e5c8cb3ec4cb77ee3354231c5e6703026Chia-I Wu auto err = mVrHal.setLayerInfo(mCurrentDisplay, mCurrentLayer, read(), read()); 7351a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara if (err != Error::NONE) { 7451a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara mWriter.setError(getCommandLoc(), err); 7551a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara } 7651a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 7751a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara return true; 7851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} 7951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara 8029e146b284b74ae65670a3a4f3698cd9ee155f1dChia-I Wubool VrComposerClient::VrCommandEngine::executeSetClientTargetMetadata( 811f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara uint16_t length) { 821f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara if (length != 7) 831f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara return false; 841f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara 8569f8fb7e5c8cb3ec4cb77ee3354231c5e6703026Chia-I Wu auto err = mVrHal.setClientTargetMetadata(mCurrentDisplay, readBufferMetadata()); 861f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara if (err != Error::NONE) 871f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara mWriter.setError(getCommandLoc(), err); 881f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara 891f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara return true; 901f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara} 911f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara 9229e146b284b74ae65670a3a4f3698cd9ee155f1dChia-I Wubool VrComposerClient::VrCommandEngine::executeSetLayerBufferMetadata( 931f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara uint16_t length) { 941f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara if (length != 7) 951f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara return false; 961f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara 9769f8fb7e5c8cb3ec4cb77ee3354231c5e6703026Chia-I Wu auto err = mVrHal.setLayerBufferMetadata(mCurrentDisplay, mCurrentLayer, 981f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara readBufferMetadata()); 991f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara if (err != Error::NONE) 1001f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara mWriter.setError(getCommandLoc(), err); 1011f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara 1021f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara return true; 1031f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara} 1041f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara 1051f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel NicoaraIVrComposerClient::BufferMetadata 10629e146b284b74ae65670a3a4f3698cd9ee155f1dChia-I WuVrComposerClient::VrCommandEngine::readBufferMetadata() { 1071f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara IVrComposerClient::BufferMetadata metadata = { 1081f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara .width = read(), 1091f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara .height = read(), 1101f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara .stride = read(), 1111f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara .layerCount = read(), 1121f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara .format = static_cast<PixelFormat>(readSigned()), 1131f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara .usage = read64(), 1141f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara }; 1151f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara return metadata; 1161f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara} 1171f42e3a02c4f9a1ba1916a2f0e47082bedb73e41Daniel Nicoara 11851a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} // namespace dvr 11951a0a56385f4176447d8168f9395341b3e7574a0Daniel Nicoara} // namespace android 120