178211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu/* 278211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu * Copyright 2018 The Android Open Source Project 378211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu * 478211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu * Licensed under the Apache License, Version 2.0 (the "License"); 578211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu * you may not use this file except in compliance with the License. 678211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu * You may obtain a copy of the License at 778211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu * 878211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu * http://www.apache.org/licenses/LICENSE-2.0 978211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu * 1078211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu * Unless required by applicable law or agreed to in writing, software 1178211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu * distributed under the License is distributed on an "AS IS" BASIS, 1278211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1378211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu * See the License for the specific language governing permissions and 1478211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu * limitations under the License. 1578211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu */ 1678211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 1778211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu#pragma once 1878211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 1978211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu#ifndef LOG_TAG 2078211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu#warning "ComposerCommandEngine.h included without LOG_TAG" 2178211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu#endif 2278211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 2378211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu#include <vector> 2478211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 2578211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu#include <composer-command-buffer/2.1/ComposerCommandBuffer.h> 2678211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu#include <composer-hal/2.1/ComposerHal.h> 2778211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu#include <composer-hal/2.1/ComposerResources.h> 2878211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu// TODO remove hwcomposer_defs.h dependency 2978211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu#include <hardware/hwcomposer_defs.h> 3078211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu#include <log/log.h> 3178211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 3278211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wunamespace android { 3378211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wunamespace hardware { 3478211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wunamespace graphics { 3578211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wunamespace composer { 3678211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wunamespace V2_1 { 3778211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wunamespace hal { 3878211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 3978211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu// TODO own a CommandReaderBase rather than subclassing 4078211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wuclass ComposerCommandEngine : protected CommandReaderBase { 4178211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu public: 4278211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu ComposerCommandEngine(ComposerHal* hal, ComposerResources* resources) 4378211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu : mHal(hal), mResources(resources) {} 4478211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 4578211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu virtual ~ComposerCommandEngine() = default; 4678211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 4778211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu bool setInputMQDescriptor(const MQDescriptorSync<uint32_t>& descriptor) { 4878211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu return setMQDescriptor(descriptor); 4978211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 5078211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 5178211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu Error execute(uint32_t inLength, const hidl_vec<hidl_handle>& inHandles, bool* outQueueChanged, 5278211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu uint32_t* outCommandLength, hidl_vec<hidl_handle>* outCommandHandles) { 5378211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu if (!readQueue(inLength, inHandles)) { 5478211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu return Error::BAD_PARAMETER; 5578211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 5678211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 5778211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu IComposerClient::Command command; 5878211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu uint16_t length = 0; 5978211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu while (!isEmpty()) { 6078211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu if (!beginCommand(&command, &length)) { 6178211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu break; 6278211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 6378211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 6478211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu bool parsed = executeCommand(command, length); 6578211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu endCommand(); 6678211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 6778211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu if (!parsed) { 6878211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu ALOGE("failed to parse command 0x%x, length %" PRIu16, command, length); 6978211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu break; 7078211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 7178211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 7278211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 7378211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu if (!isEmpty()) { 7478211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu return Error::BAD_PARAMETER; 7578211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 7678211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 7778211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu return mWriter.writeQueue(outQueueChanged, outCommandLength, outCommandHandles) 7878211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu ? Error::NONE 7978211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu : Error::NO_RESOURCES; 8078211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 8178211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 8278211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu const MQDescriptorSync<uint32_t>* getOutputMQDescriptor() { return mWriter.getMQDescriptor(); } 8378211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 8478211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu void reset() { 8578211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu CommandReaderBase::reset(); 8678211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu mWriter.reset(); 8778211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 8878211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 8978211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu protected: 9078211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu virtual bool executeCommand(IComposerClient::Command command, uint16_t length) { 9178211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu switch (command) { 9278211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu case IComposerClient::Command::SELECT_DISPLAY: 9378211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu return executeSelectDisplay(length); 9478211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu case IComposerClient::Command::SELECT_LAYER: 9578211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu return executeSelectLayer(length); 9678211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu case IComposerClient::Command::SET_COLOR_TRANSFORM: 9778211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu return executeSetColorTransform(length); 9878211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu case IComposerClient::Command::SET_CLIENT_TARGET: 9978211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu return executeSetClientTarget(length); 10078211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu case IComposerClient::Command::SET_OUTPUT_BUFFER: 10178211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu return executeSetOutputBuffer(length); 10278211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu case IComposerClient::Command::VALIDATE_DISPLAY: 10378211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu return executeValidateDisplay(length); 10478211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu case IComposerClient::Command::PRESENT_OR_VALIDATE_DISPLAY: 10578211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu return executePresentOrValidateDisplay(length); 10678211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu case IComposerClient::Command::ACCEPT_DISPLAY_CHANGES: 10778211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu return executeAcceptDisplayChanges(length); 10878211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu case IComposerClient::Command::PRESENT_DISPLAY: 10978211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu return executePresentDisplay(length); 11078211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu case IComposerClient::Command::SET_LAYER_CURSOR_POSITION: 11178211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu return executeSetLayerCursorPosition(length); 11278211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu case IComposerClient::Command::SET_LAYER_BUFFER: 11378211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu return executeSetLayerBuffer(length); 11478211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu case IComposerClient::Command::SET_LAYER_SURFACE_DAMAGE: 11578211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu return executeSetLayerSurfaceDamage(length); 11678211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu case IComposerClient::Command::SET_LAYER_BLEND_MODE: 11778211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu return executeSetLayerBlendMode(length); 11878211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu case IComposerClient::Command::SET_LAYER_COLOR: 11978211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu return executeSetLayerColor(length); 12078211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu case IComposerClient::Command::SET_LAYER_COMPOSITION_TYPE: 12178211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu return executeSetLayerCompositionType(length); 12278211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu case IComposerClient::Command::SET_LAYER_DATASPACE: 12378211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu return executeSetLayerDataspace(length); 12478211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu case IComposerClient::Command::SET_LAYER_DISPLAY_FRAME: 12578211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu return executeSetLayerDisplayFrame(length); 12678211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu case IComposerClient::Command::SET_LAYER_PLANE_ALPHA: 12778211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu return executeSetLayerPlaneAlpha(length); 12878211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu case IComposerClient::Command::SET_LAYER_SIDEBAND_STREAM: 12978211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu return executeSetLayerSidebandStream(length); 13078211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu case IComposerClient::Command::SET_LAYER_SOURCE_CROP: 13178211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu return executeSetLayerSourceCrop(length); 13278211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu case IComposerClient::Command::SET_LAYER_TRANSFORM: 13378211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu return executeSetLayerTransform(length); 13478211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu case IComposerClient::Command::SET_LAYER_VISIBLE_REGION: 13578211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu return executeSetLayerVisibleRegion(length); 13678211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu case IComposerClient::Command::SET_LAYER_Z_ORDER: 13778211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu return executeSetLayerZOrder(length); 13878211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu default: 13978211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu return false; 14078211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 14178211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 14278211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 14378211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu bool executeSelectDisplay(uint16_t length) { 14478211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu if (length != CommandWriterBase::kSelectDisplayLength) { 14578211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu return false; 14678211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 14778211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 14878211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu mCurrentDisplay = read64(); 14978211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu mWriter.selectDisplay(mCurrentDisplay); 15078211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 15178211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu return true; 15278211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 15378211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 15478211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu bool executeSelectLayer(uint16_t length) { 15578211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu if (length != CommandWriterBase::kSelectLayerLength) { 15678211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu return false; 15778211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 15878211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 15978211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu mCurrentLayer = read64(); 16078211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 16178211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu return true; 16278211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 16378211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 16478211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu bool executeSetColorTransform(uint16_t length) { 16578211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu if (length != CommandWriterBase::kSetColorTransformLength) { 16678211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu return false; 16778211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 16878211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 16978211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu float matrix[16]; 17078211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu for (int i = 0; i < 16; i++) { 17178211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu matrix[i] = readFloat(); 17278211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 17378211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu auto transform = readSigned(); 17478211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 17578211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu auto err = mHal->setColorTransform(mCurrentDisplay, matrix, transform); 17678211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu if (err != Error::NONE) { 17778211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu mWriter.setError(getCommandLoc(), err); 17878211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 17978211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 18078211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu return true; 18178211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 18278211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 18378211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu bool executeSetClientTarget(uint16_t length) { 18478211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu // 4 parameters followed by N rectangles 18578211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu if ((length - 4) % 4 != 0) { 18678211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu return false; 18778211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 18878211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 18978211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu bool useCache = false; 19078211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu auto slot = read(); 19178211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu auto rawHandle = readHandle(&useCache); 19278211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu auto fence = readFence(); 19378211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu auto dataspace = readSigned(); 19478211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu auto damage = readRegion((length - 4) / 4); 19578211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu bool closeFence = true; 19678211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 19778211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu const native_handle_t* clientTarget; 19878211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu ComposerResources::ReplacedBufferHandle replacedClientTarget; 19978211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu auto err = mResources->getDisplayClientTarget(mCurrentDisplay, slot, useCache, rawHandle, 20078211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu &clientTarget, &replacedClientTarget); 20178211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu if (err == Error::NONE) { 20278211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu err = mHal->setClientTarget(mCurrentDisplay, clientTarget, fence, dataspace, damage); 20378211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu if (err == Error::NONE) { 20478211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu closeFence = false; 20578211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 20678211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 20778211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu if (closeFence) { 20878211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu close(fence); 20978211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 21078211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu if (err != Error::NONE) { 21178211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu mWriter.setError(getCommandLoc(), err); 21278211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 21378211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 21478211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu return true; 21578211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 21678211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 21778211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu bool executeSetOutputBuffer(uint16_t length) { 21878211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu if (length != CommandWriterBase::kSetOutputBufferLength) { 21978211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu return false; 22078211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 22178211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 22278211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu bool useCache = false; 22378211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu auto slot = read(); 22478211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu auto rawhandle = readHandle(&useCache); 22578211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu auto fence = readFence(); 22678211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu bool closeFence = true; 22778211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 22878211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu const native_handle_t* outputBuffer; 22978211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu ComposerResources::ReplacedBufferHandle replacedOutputBuffer; 23078211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu auto err = mResources->getDisplayOutputBuffer(mCurrentDisplay, slot, useCache, rawhandle, 23178211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu &outputBuffer, &replacedOutputBuffer); 23278211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu if (err == Error::NONE) { 23378211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu err = mHal->setOutputBuffer(mCurrentDisplay, outputBuffer, fence); 23478211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu if (err == Error::NONE) { 23578211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu closeFence = false; 23678211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 23778211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 23878211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu if (closeFence) { 23978211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu close(fence); 24078211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 24178211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu if (err != Error::NONE) { 24278211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu mWriter.setError(getCommandLoc(), err); 24378211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 24478211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 24578211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu return true; 24678211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 24778211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 24878211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu bool executeValidateDisplay(uint16_t length) { 24978211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu if (length != CommandWriterBase::kValidateDisplayLength) { 25078211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu return false; 25178211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 25278211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 25378211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu std::vector<Layer> changedLayers; 25478211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu std::vector<IComposerClient::Composition> compositionTypes; 25578211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu uint32_t displayRequestMask = 0x0; 25678211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu std::vector<Layer> requestedLayers; 25778211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu std::vector<uint32_t> requestMasks; 25878211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 25978211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu auto err = mHal->validateDisplay(mCurrentDisplay, &changedLayers, &compositionTypes, 26078211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu &displayRequestMask, &requestedLayers, &requestMasks); 26178211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu if (err == Error::NONE) { 26278211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu mWriter.setChangedCompositionTypes(changedLayers, compositionTypes); 26378211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu mWriter.setDisplayRequests(displayRequestMask, requestedLayers, requestMasks); 26478211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } else { 26578211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu mWriter.setError(getCommandLoc(), err); 26678211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 26778211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 26878211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu return true; 26978211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 27078211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 27178211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu bool executePresentOrValidateDisplay(uint16_t length) { 27278211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu if (length != CommandWriterBase::kPresentOrValidateDisplayLength) { 27378211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu return false; 27478211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 27578211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 27678211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu // First try to Present as is. 27778211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu if (mHal->hasCapability(HWC2_CAPABILITY_SKIP_VALIDATE)) { 27878211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu int presentFence = -1; 27978211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu std::vector<Layer> layers; 28078211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu std::vector<int> fences; 28178211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu auto err = mHal->presentDisplay(mCurrentDisplay, &presentFence, &layers, &fences); 28278211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu if (err == Error::NONE) { 28378211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu mWriter.setPresentOrValidateResult(1); 28478211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu mWriter.setPresentFence(presentFence); 28578211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu mWriter.setReleaseFences(layers, fences); 28678211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu return true; 28778211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 28878211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 28978211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 29078211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu // Present has failed. We need to fallback to validate 29178211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu std::vector<Layer> changedLayers; 29278211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu std::vector<IComposerClient::Composition> compositionTypes; 29378211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu uint32_t displayRequestMask = 0x0; 29478211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu std::vector<Layer> requestedLayers; 29578211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu std::vector<uint32_t> requestMasks; 29678211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 29778211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu auto err = mHal->validateDisplay(mCurrentDisplay, &changedLayers, &compositionTypes, 29878211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu &displayRequestMask, &requestedLayers, &requestMasks); 29978211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu if (err == Error::NONE) { 30078211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu mWriter.setPresentOrValidateResult(0); 30178211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu mWriter.setChangedCompositionTypes(changedLayers, compositionTypes); 30278211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu mWriter.setDisplayRequests(displayRequestMask, requestedLayers, requestMasks); 30378211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } else { 30478211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu mWriter.setError(getCommandLoc(), err); 30578211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 30678211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 30778211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu return true; 30878211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 30978211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 31078211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu bool executeAcceptDisplayChanges(uint16_t length) { 31178211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu if (length != CommandWriterBase::kAcceptDisplayChangesLength) { 31278211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu return false; 31378211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 31478211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 31578211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu auto err = mHal->acceptDisplayChanges(mCurrentDisplay); 31678211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu if (err != Error::NONE) { 31778211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu mWriter.setError(getCommandLoc(), err); 31878211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 31978211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 32078211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu return true; 32178211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 32278211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 32378211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu bool executePresentDisplay(uint16_t length) { 32478211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu if (length != CommandWriterBase::kPresentDisplayLength) { 32578211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu return false; 32678211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 32778211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 32878211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu int presentFence = -1; 32978211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu std::vector<Layer> layers; 33078211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu std::vector<int> fences; 33178211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu auto err = mHal->presentDisplay(mCurrentDisplay, &presentFence, &layers, &fences); 33278211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu if (err == Error::NONE) { 33378211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu mWriter.setPresentFence(presentFence); 33478211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu mWriter.setReleaseFences(layers, fences); 33578211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } else { 33678211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu mWriter.setError(getCommandLoc(), err); 33778211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 33878211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 33978211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu return true; 34078211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 34178211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 34278211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu bool executeSetLayerCursorPosition(uint16_t length) { 34378211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu if (length != CommandWriterBase::kSetLayerCursorPositionLength) { 34478211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu return false; 34578211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 34678211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 34778211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu auto err = mHal->setLayerCursorPosition(mCurrentDisplay, mCurrentLayer, readSigned(), 34878211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu readSigned()); 34978211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu if (err != Error::NONE) { 35078211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu mWriter.setError(getCommandLoc(), err); 35178211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 35278211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 35378211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu return true; 35478211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 35578211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 35678211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu bool executeSetLayerBuffer(uint16_t length) { 35778211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu if (length != CommandWriterBase::kSetLayerBufferLength) { 35878211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu return false; 35978211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 36078211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 36178211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu bool useCache = false; 36278211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu auto slot = read(); 36378211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu auto rawHandle = readHandle(&useCache); 36478211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu auto fence = readFence(); 36578211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu bool closeFence = true; 36678211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 36778211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu const native_handle_t* buffer; 36878211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu ComposerResources::ReplacedBufferHandle replacedBuffer; 36978211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu auto err = mResources->getLayerBuffer(mCurrentDisplay, mCurrentLayer, slot, useCache, 37078211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu rawHandle, &buffer, &replacedBuffer); 37178211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu if (err == Error::NONE) { 37278211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu err = mHal->setLayerBuffer(mCurrentDisplay, mCurrentLayer, buffer, fence); 37378211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu if (err == Error::NONE) { 37478211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu closeFence = false; 37578211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 37678211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 37778211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu if (closeFence) { 37878211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu close(fence); 37978211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 38078211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu if (err != Error::NONE) { 38178211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu mWriter.setError(getCommandLoc(), err); 38278211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 38378211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 38478211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu return true; 38578211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 38678211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 38778211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu bool executeSetLayerSurfaceDamage(uint16_t length) { 38878211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu // N rectangles 38978211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu if (length % 4 != 0) { 39078211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu return false; 39178211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 39278211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 39378211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu auto damage = readRegion(length / 4); 39478211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu auto err = mHal->setLayerSurfaceDamage(mCurrentDisplay, mCurrentLayer, damage); 39578211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu if (err != Error::NONE) { 39678211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu mWriter.setError(getCommandLoc(), err); 39778211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 39878211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 39978211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu return true; 40078211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 40178211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 40278211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu bool executeSetLayerBlendMode(uint16_t length) { 40378211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu if (length != CommandWriterBase::kSetLayerBlendModeLength) { 40478211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu return false; 40578211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 40678211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 40778211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu auto err = mHal->setLayerBlendMode(mCurrentDisplay, mCurrentLayer, readSigned()); 40878211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu if (err != Error::NONE) { 40978211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu mWriter.setError(getCommandLoc(), err); 41078211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 41178211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 41278211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu return true; 41378211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 41478211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 41578211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu bool executeSetLayerColor(uint16_t length) { 41678211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu if (length != CommandWriterBase::kSetLayerColorLength) { 41778211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu return false; 41878211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 41978211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 42078211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu auto err = mHal->setLayerColor(mCurrentDisplay, mCurrentLayer, readColor()); 42178211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu if (err != Error::NONE) { 42278211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu mWriter.setError(getCommandLoc(), err); 42378211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 42478211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 42578211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu return true; 42678211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 42778211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 42878211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu bool executeSetLayerCompositionType(uint16_t length) { 42978211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu if (length != CommandWriterBase::kSetLayerCompositionTypeLength) { 43078211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu return false; 43178211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 43278211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 43378211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu auto err = mHal->setLayerCompositionType(mCurrentDisplay, mCurrentLayer, readSigned()); 43478211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu if (err != Error::NONE) { 43578211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu mWriter.setError(getCommandLoc(), err); 43678211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 43778211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 43878211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu return true; 43978211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 44078211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 44178211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu bool executeSetLayerDataspace(uint16_t length) { 44278211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu if (length != CommandWriterBase::kSetLayerDataspaceLength) { 44378211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu return false; 44478211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 44578211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 44678211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu auto err = mHal->setLayerDataspace(mCurrentDisplay, mCurrentLayer, readSigned()); 44778211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu if (err != Error::NONE) { 44878211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu mWriter.setError(getCommandLoc(), err); 44978211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 45078211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 45178211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu return true; 45278211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 45378211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 45478211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu bool executeSetLayerDisplayFrame(uint16_t length) { 45578211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu if (length != CommandWriterBase::kSetLayerDisplayFrameLength) { 45678211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu return false; 45778211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 45878211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 45978211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu auto err = mHal->setLayerDisplayFrame(mCurrentDisplay, mCurrentLayer, readRect()); 46078211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu if (err != Error::NONE) { 46178211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu mWriter.setError(getCommandLoc(), err); 46278211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 46378211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 46478211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu return true; 46578211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 46678211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 46778211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu bool executeSetLayerPlaneAlpha(uint16_t length) { 46878211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu if (length != CommandWriterBase::kSetLayerPlaneAlphaLength) { 46978211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu return false; 47078211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 47178211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 47278211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu auto err = mHal->setLayerPlaneAlpha(mCurrentDisplay, mCurrentLayer, readFloat()); 47378211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu if (err != Error::NONE) { 47478211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu mWriter.setError(getCommandLoc(), err); 47578211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 47678211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 47778211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu return true; 47878211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 47978211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 48078211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu bool executeSetLayerSidebandStream(uint16_t length) { 48178211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu if (length != CommandWriterBase::kSetLayerSidebandStreamLength) { 48278211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu return false; 48378211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 48478211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 48578211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu auto rawHandle = readHandle(); 48678211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 48778211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu const native_handle_t* stream; 48878211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu ComposerResources::ReplacedStreamHandle replacedStream; 48978211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu auto err = mResources->getLayerSidebandStream(mCurrentDisplay, mCurrentLayer, rawHandle, 49078211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu &stream, &replacedStream); 49178211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu if (err == Error::NONE) { 49278211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu err = mHal->setLayerSidebandStream(mCurrentDisplay, mCurrentLayer, stream); 49378211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 49478211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu if (err != Error::NONE) { 49578211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu mWriter.setError(getCommandLoc(), err); 49678211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 49778211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 49878211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu return true; 49978211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 50078211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 50178211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu bool executeSetLayerSourceCrop(uint16_t length) { 50278211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu if (length != CommandWriterBase::kSetLayerSourceCropLength) { 50378211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu return false; 50478211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 50578211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 50678211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu auto err = mHal->setLayerSourceCrop(mCurrentDisplay, mCurrentLayer, readFRect()); 50778211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu if (err != Error::NONE) { 50878211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu mWriter.setError(getCommandLoc(), err); 50978211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 51078211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 51178211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu return true; 51278211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 51378211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 51478211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu bool executeSetLayerTransform(uint16_t length) { 51578211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu if (length != CommandWriterBase::kSetLayerTransformLength) { 51678211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu return false; 51778211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 51878211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 51978211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu auto err = mHal->setLayerTransform(mCurrentDisplay, mCurrentLayer, readSigned()); 52078211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu if (err != Error::NONE) { 52178211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu mWriter.setError(getCommandLoc(), err); 52278211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 52378211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 52478211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu return true; 52578211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 52678211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 52778211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu bool executeSetLayerVisibleRegion(uint16_t length) { 52878211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu // N rectangles 52978211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu if (length % 4 != 0) { 53078211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu return false; 53178211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 53278211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 53378211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu auto region = readRegion(length / 4); 53478211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu auto err = mHal->setLayerVisibleRegion(mCurrentDisplay, mCurrentLayer, region); 53578211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu if (err != Error::NONE) { 53678211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu mWriter.setError(getCommandLoc(), err); 53778211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 53878211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 53978211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu return true; 54078211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 54178211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 54278211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu bool executeSetLayerZOrder(uint16_t length) { 54378211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu if (length != CommandWriterBase::kSetLayerZOrderLength) { 54478211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu return false; 54578211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 54678211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 54778211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu auto err = mHal->setLayerZOrder(mCurrentDisplay, mCurrentLayer, read()); 54878211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu if (err != Error::NONE) { 54978211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu mWriter.setError(getCommandLoc(), err); 55078211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 55178211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 55278211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu return true; 55378211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 55478211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 55578211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu hwc_rect_t readRect() { 55678211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu return hwc_rect_t{ 55778211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu readSigned(), readSigned(), readSigned(), readSigned(), 55878211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu }; 55978211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 56078211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 56178211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu std::vector<hwc_rect_t> readRegion(size_t count) { 56278211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu std::vector<hwc_rect_t> region; 56378211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu region.reserve(count); 56478211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu while (count > 0) { 56578211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu region.emplace_back(readRect()); 56678211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu count--; 56778211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 56878211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 56978211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu return region; 57078211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 57178211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 57278211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu hwc_frect_t readFRect() { 57378211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu return hwc_frect_t{ 57478211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu readFloat(), readFloat(), readFloat(), readFloat(), 57578211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu }; 57678211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu } 57778211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 57878211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu ComposerHal* mHal; 57978211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu ComposerResources* mResources; 58078211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 58178211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu // 64KiB minus a small space for metadata such as read/write pointers 58278211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu static constexpr size_t kWriterInitialSize = 64 * 1024 / sizeof(uint32_t) - 16; 58378211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu CommandWriterBase mWriter{kWriterInitialSize}; 58478211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 58578211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu Display mCurrentDisplay = 0; 58678211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu Layer mCurrentLayer = 0; 58778211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu}; 58878211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu 58978211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu} // namespace hal 59078211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu} // namespace V2_1 59178211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu} // namespace composer 59278211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu} // namespace graphics 59378211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu} // namespace hardware 59478211cf7d02059c0f4fd4813d78a606a502de94dChia-I Wu} // namespace android 595