blob: 4b900314d36d0df79933f30804a62af608809f11 [file] [log] [blame]
Daniel Nicoara51a0a562016-12-08 16:48:20 -05001/*
2 * Copyright 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Daniel Nicoara95a99a12017-03-21 15:30:45 -040017#include <android/frameworks/vr/composer/1.0/IVrComposerClient.h>
Daniel Nicoara51a0a562016-12-08 16:48:20 -050018#include <hardware/gralloc.h>
19#include <hardware/gralloc1.h>
20#include <log/log.h>
21
Daniel Nicoara4251e922017-04-13 15:19:15 -040022#include "impl/vr_hwc.h"
23#include "impl/vr_composer_client.h"
Daniel Nicoara51a0a562016-12-08 16:48:20 -050024
25namespace android {
26namespace dvr {
27
28using android::hardware::graphics::common::V1_0::PixelFormat;
Daniel Nicoara95a99a12017-03-21 15:30:45 -040029using android::frameworks::vr::composer::V1_0::IVrComposerClient;
Daniel Nicoara51a0a562016-12-08 16:48:20 -050030
Chia-I Wu29e146b2018-01-30 12:17:56 -080031VrComposerClient::VrComposerClient(dvr::VrHwc& hal)
32 : ComposerClient(&hal), mVrHal(hal) {
33 if (!init()) {
34 LOG_ALWAYS_FATAL("failed to initialize VrComposerClient");
35 }
36}
Daniel Nicoaraa50abc22017-05-15 10:34:08 -040037
Chia-I Wu29e146b2018-01-30 12:17:56 -080038VrComposerClient::~VrComposerClient() {}
Daniel Nicoara51a0a562016-12-08 16:48:20 -050039
Chia-I Wu69f8fb72018-01-30 12:39:00 -080040std::unique_ptr<ComposerCommandEngine>
Chia-I Wu29e146b2018-01-30 12:17:56 -080041VrComposerClient::createCommandEngine() {
Chia-I Wu69f8fb72018-01-30 12:39:00 -080042 return std::unique_ptr<VrCommandEngine>(new VrCommandEngine(*this));
Daniel Nicoara51a0a562016-12-08 16:48:20 -050043}
44
Chia-I Wu29e146b2018-01-30 12:17:56 -080045VrComposerClient::VrCommandEngine::VrCommandEngine(VrComposerClient& client)
46 : ComposerCommandEngine(client.mHal, client.mResources.get()), mVrClient(client),
Chia-I Wu69f8fb72018-01-30 12:39:00 -080047 mVrHal(client.mVrHal) {}
Daniel Nicoara51a0a562016-12-08 16:48:20 -050048
Chia-I Wu29e146b2018-01-30 12:17:56 -080049VrComposerClient::VrCommandEngine::~VrCommandEngine() {}
Daniel Nicoara51a0a562016-12-08 16:48:20 -050050
Chia-I Wu29e146b2018-01-30 12:17:56 -080051bool VrComposerClient::VrCommandEngine::executeCommand(
Daniel Nicoara51a0a562016-12-08 16:48:20 -050052 IComposerClient::Command command, uint16_t length) {
53 IVrComposerClient::VrCommand vrCommand =
54 static_cast<IVrComposerClient::VrCommand>(command);
55 switch (vrCommand) {
56 case IVrComposerClient::VrCommand::SET_LAYER_INFO:
Chia-I Wu69f8fb72018-01-30 12:39:00 -080057 return executeSetLayerInfo(length);
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -040058 case IVrComposerClient::VrCommand::SET_CLIENT_TARGET_METADATA:
Chia-I Wu69f8fb72018-01-30 12:39:00 -080059 return executeSetClientTargetMetadata(length);
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -040060 case IVrComposerClient::VrCommand::SET_LAYER_BUFFER_METADATA:
Chia-I Wu69f8fb72018-01-30 12:39:00 -080061 return executeSetLayerBufferMetadata(length);
Daniel Nicoara51a0a562016-12-08 16:48:20 -050062 default:
Chia-I Wu69f8fb72018-01-30 12:39:00 -080063 return ComposerCommandEngine::executeCommand(command, length);
Daniel Nicoara51a0a562016-12-08 16:48:20 -050064 }
65}
66
Chia-I Wu29e146b2018-01-30 12:17:56 -080067bool VrComposerClient::VrCommandEngine::executeSetLayerInfo(uint16_t length) {
Daniel Nicoara51a0a562016-12-08 16:48:20 -050068 if (length != 2) {
69 return false;
70 }
71
Chia-I Wu69f8fb72018-01-30 12:39:00 -080072 auto err = mVrHal.setLayerInfo(mCurrentDisplay, mCurrentLayer, read(), read());
Daniel Nicoara51a0a562016-12-08 16:48:20 -050073 if (err != Error::NONE) {
74 mWriter.setError(getCommandLoc(), err);
75 }
76
77 return true;
78}
79
Chia-I Wu29e146b2018-01-30 12:17:56 -080080bool VrComposerClient::VrCommandEngine::executeSetClientTargetMetadata(
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -040081 uint16_t length) {
82 if (length != 7)
83 return false;
84
Chia-I Wu69f8fb72018-01-30 12:39:00 -080085 auto err = mVrHal.setClientTargetMetadata(mCurrentDisplay, readBufferMetadata());
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -040086 if (err != Error::NONE)
87 mWriter.setError(getCommandLoc(), err);
88
89 return true;
90}
91
Chia-I Wu29e146b2018-01-30 12:17:56 -080092bool VrComposerClient::VrCommandEngine::executeSetLayerBufferMetadata(
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -040093 uint16_t length) {
94 if (length != 7)
95 return false;
96
Chia-I Wu69f8fb72018-01-30 12:39:00 -080097 auto err = mVrHal.setLayerBufferMetadata(mCurrentDisplay, mCurrentLayer,
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -040098 readBufferMetadata());
99 if (err != Error::NONE)
100 mWriter.setError(getCommandLoc(), err);
101
102 return true;
103}
104
105IVrComposerClient::BufferMetadata
Chia-I Wu29e146b2018-01-30 12:17:56 -0800106VrComposerClient::VrCommandEngine::readBufferMetadata() {
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400107 IVrComposerClient::BufferMetadata metadata = {
108 .width = read(),
109 .height = read(),
110 .stride = read(),
111 .layerCount = read(),
112 .format = static_cast<PixelFormat>(readSigned()),
113 .usage = read64(),
114 };
115 return metadata;
116}
117
Daniel Nicoara51a0a562016-12-08 16:48:20 -0500118} // namespace dvr
119} // namespace android