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