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