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