• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2018 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 
17 #pragma once
18 
19 #ifndef LOG_TAG
20 #warn "ComposerCommandBuffer.h included without LOG_TAG"
21 #endif
22 
23 #undef LOG_NDEBUG
24 #define LOG_NDEBUG 0
25 
26 #include <algorithm>
27 #include <limits>
28 #include <memory>
29 #include <vector>
30 
31 #include <inttypes.h>
32 #include <string.h>
33 
34 #include <android/hardware/graphics/composer/2.2/IComposer.h>
35 #include <android/hardware/graphics/composer/2.2/IComposerClient.h>
36 #include <fmq/MessageQueue.h>
37 #include <log/log.h>
38 #include <sync/sync.h>
39 
40 #include <composer-command-buffer/2.1/ComposerCommandBuffer.h>
41 
42 namespace android {
43 namespace hardware {
44 namespace graphics {
45 namespace composer {
46 namespace V2_2 {
47 
48 using android::hardware::MessageQueue;
49 using android::hardware::graphics::common::V1_0::ColorTransform;
50 using android::hardware::graphics::common::V1_0::Transform;
51 using android::hardware::graphics::common::V1_1::Dataspace;
52 using android::hardware::graphics::composer::V2_1::Config;
53 using android::hardware::graphics::composer::V2_1::Display;
54 using android::hardware::graphics::composer::V2_1::Error;
55 using android::hardware::graphics::composer::V2_1::IComposerCallback;
56 using android::hardware::graphics::composer::V2_1::Layer;
57 using android::hardware::graphics::composer::V2_2::IComposerClient;
58 
59 using CommandQueueType = MessageQueue<uint32_t, kSynchronizedReadWrite>;
60 
61 // This class helps build a command queue.  Note that all sizes/lengths are in
62 // units of uint32_t's.
63 class CommandWriterBase : public V2_1::CommandWriterBase {
64    public:
CommandWriterBase(uint32_t initialMaxSize)65     CommandWriterBase(uint32_t initialMaxSize) : V2_1::CommandWriterBase(initialMaxSize) {}
66 
setClientTarget(uint32_t slot,const native_handle_t * target,int acquireFence,Dataspace dataspace,const std::vector<IComposerClient::Rect> & damage)67     void setClientTarget(uint32_t slot, const native_handle_t* target, int acquireFence,
68                          Dataspace dataspace, const std::vector<IComposerClient::Rect>& damage) {
69         setClientTargetInternal(slot, target, acquireFence, static_cast<int32_t>(dataspace),
70                                 damage);
71     }
72 
setLayerDataspace(Dataspace dataspace)73     void setLayerDataspace(Dataspace dataspace) {
74         setLayerDataspaceInternal(static_cast<int32_t>(dataspace));
75     }
76 
77     static constexpr uint16_t kSetLayerFloatColorLength = 4;
setLayerFloatColor(IComposerClient::FloatColor color)78     void setLayerFloatColor(IComposerClient::FloatColor color) {
79         beginCommand_2_2(IComposerClient::Command::SET_LAYER_FLOAT_COLOR,
80                          kSetLayerFloatColorLength);
81         writeFloatColor(color);
82         endCommand();
83     }
84 
setLayerPerFrameMetadata(const hidl_vec<IComposerClient::PerFrameMetadata> & metadataVec)85     void setLayerPerFrameMetadata(const hidl_vec<IComposerClient::PerFrameMetadata>& metadataVec) {
86         beginCommand_2_2(IComposerClient::Command::SET_LAYER_PER_FRAME_METADATA,
87                          metadataVec.size() * 2);
88         for (const auto& metadata : metadataVec) {
89             writeSigned(static_cast<int32_t>(metadata.key));
90             writeFloat(metadata.value);
91         }
92         endCommand();
93     }
94 
95    protected:
beginCommand_2_2(IComposerClient::Command command,uint16_t length)96     void beginCommand_2_2(IComposerClient::Command command, uint16_t length) {
97         V2_1::CommandWriterBase::beginCommand(
98             static_cast<V2_1::IComposerClient::Command>(static_cast<int32_t>(command)), length);
99     }
100 
writeFloatColor(const IComposerClient::FloatColor & color)101     void writeFloatColor(const IComposerClient::FloatColor& color) {
102         writeFloat(color.r);
103         writeFloat(color.g);
104         writeFloat(color.b);
105         writeFloat(color.a);
106     }
107 };
108 
109 // This class helps parse a command queue.  Note that all sizes/lengths are in
110 // units of uint32_t's.
111 class CommandReaderBase : public V2_1::CommandReaderBase {
112    public:
CommandReaderBase()113     CommandReaderBase() : V2_1::CommandReaderBase(){};
114 
115    protected:
readFloatColor()116     IComposerClient::FloatColor readFloatColor() {
117         float r = readFloat();
118         float g = readFloat();
119         float b = readFloat();
120         float a = readFloat();
121         return IComposerClient::FloatColor{r, g, b, a};
122     }
123 };
124 
125 }  // namespace V2_2
126 }  // namespace composer
127 }  // namespace graphics
128 }  // namespace hardware
129 }  // namespace android
130