1 /* 2 * Copyright 2022 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 #include <aidl/android/hardware/graphics/composer3/CommandResultPayload.h> 20 #include <aidl/android/hardware/graphics/composer3/IComposerClient.h> 21 #include <inttypes.h> 22 #include <string.h> 23 24 #include <algorithm> 25 #include <limits> 26 #include <memory> 27 #include <vector> 28 29 #include "Util.h" 30 31 namespace aidl::android::hardware::graphics::composer3::impl { 32 33 class ComposerServiceWriter { 34 public: ComposerServiceWriter()35 ComposerServiceWriter() { reset(); } 36 ~ComposerServiceWriter()37 virtual ~ComposerServiceWriter() { reset(); } 38 reset()39 void reset() { mCommandsResults.clear(); } 40 setError(int32_t index,int32_t errorCode)41 void setError(int32_t index, int32_t errorCode) { 42 CommandError error; 43 error.commandIndex = index; 44 error.errorCode = errorCode; 45 mCommandsResults.emplace_back(std::move(error)); 46 } 47 setPresentOrValidateResult(int64_t display,PresentOrValidate::Result result)48 void setPresentOrValidateResult(int64_t display, PresentOrValidate::Result result) { 49 PresentOrValidate presentOrValidate; 50 presentOrValidate.display = display; 51 presentOrValidate.result = result; 52 mCommandsResults.emplace_back(std::move(presentOrValidate)); 53 } 54 setChangedCompositionTypes(int64_t display,const std::vector<int64_t> & layers,const std::vector<Composition> & types)55 void setChangedCompositionTypes(int64_t display, const std::vector<int64_t>& layers, 56 const std::vector<Composition>& types) { 57 ChangedCompositionTypes changedCompositionTypes; 58 changedCompositionTypes.display = display; 59 changedCompositionTypes.layers.reserve(layers.size()); 60 for (int i = 0; i < layers.size(); i++) { 61 auto layer = ChangedCompositionLayer{.layer = layers[i], .composition = types[i]}; 62 changedCompositionTypes.layers.emplace_back(std::move(layer)); 63 } 64 mCommandsResults.emplace_back(std::move(changedCompositionTypes)); 65 } 66 setDisplayRequests(int64_t display,int32_t displayRequestMask,const std::vector<int64_t> & layers,const std::vector<int32_t> & layerRequestMasks)67 void setDisplayRequests(int64_t display, int32_t displayRequestMask, 68 const std::vector<int64_t>& layers, 69 const std::vector<int32_t>& layerRequestMasks) { 70 DisplayRequest displayRequest; 71 displayRequest.display = display; 72 displayRequest.mask = displayRequestMask; 73 displayRequest.layerRequests.reserve(layers.size()); 74 for (int i = 0; i < layers.size(); i++) { 75 auto layerRequest = 76 DisplayRequest::LayerRequest{.layer = layers[i], .mask = layerRequestMasks[i]}; 77 displayRequest.layerRequests.emplace_back(std::move(layerRequest)); 78 } 79 mCommandsResults.emplace_back(std::move(displayRequest)); 80 } 81 setPresentFence(int64_t display,::ndk::ScopedFileDescriptor presentFence)82 void setPresentFence(int64_t display, ::ndk::ScopedFileDescriptor presentFence) { 83 if (presentFence.get() >= 0) { 84 PresentFence presentFenceCommand; 85 presentFenceCommand.fence = std::move(presentFence); 86 presentFenceCommand.display = display; 87 mCommandsResults.emplace_back(std::move(presentFenceCommand)); 88 } else { 89 LOG(WARNING) << __func__ << ": invalid present fence " << presentFence.get(); 90 } 91 } 92 setReleaseFences(int64_t display,const std::vector<int64_t> & layers,std::vector<::ndk::ScopedFileDescriptor> releaseFences)93 void setReleaseFences(int64_t display, const std::vector<int64_t>& layers, 94 std::vector<::ndk::ScopedFileDescriptor> releaseFences) { 95 ReleaseFences releaseFencesCommand; 96 releaseFencesCommand.display = display; 97 for (int i = 0; i < layers.size(); i++) { 98 if (releaseFences[i].get() >= 0) { 99 ReleaseFences::Layer layer; 100 layer.layer = layers[i]; 101 layer.fence = std::move(releaseFences[i]); 102 releaseFencesCommand.layers.emplace_back(std::move(layer)); 103 } else { 104 LOG(WARNING) << __func__ << ": invalid release fence " << releaseFences[i].get(); 105 } 106 } 107 mCommandsResults.emplace_back(std::move(releaseFencesCommand)); 108 } 109 setClientTargetProperty(int64_t display,const ClientTargetProperty & clientTargetProperty,float brightness,const DimmingStage & dimmingStage)110 void setClientTargetProperty(int64_t display, const ClientTargetProperty& clientTargetProperty, 111 float brightness, const DimmingStage& dimmingStage) { 112 ClientTargetPropertyWithBrightness clientTargetPropertyWithBrightness; 113 clientTargetPropertyWithBrightness.display = display; 114 clientTargetPropertyWithBrightness.clientTargetProperty = clientTargetProperty; 115 clientTargetPropertyWithBrightness.brightness = brightness; 116 clientTargetPropertyWithBrightness.dimmingStage = dimmingStage; 117 mCommandsResults.emplace_back(std::move(clientTargetPropertyWithBrightness)); 118 } 119 getPendingCommandResults()120 std::vector<CommandResultPayload> getPendingCommandResults() { 121 return std::move(mCommandsResults); 122 } 123 124 private: 125 std::vector<CommandResultPayload> mCommandsResults; 126 }; 127 128 } // namespace aidl::android::hardware::graphics::composer3::impl