// Copyright 2022 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either expresso or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#include "Hwc2.h"

namespace gfxstream {

std::unique_ptr<FlatComposeRequest> ToFlatComposeRequest(
        const ComposeDevice* composeRequest) {
    auto flatComposeRequest = std::make_unique<FlatComposeRequest>();
    flatComposeRequest->displayId = 0;
    flatComposeRequest->targetHandle = composeRequest->targetHandle;
    for (uint32_t i = 0; i < composeRequest->numLayers; i++) {
        flatComposeRequest->layers.emplace_back(composeRequest->layer[i]);
    }
    return flatComposeRequest;
}

std::unique_ptr<FlatComposeRequest> ToFlatComposeRequest(
        const ComposeDevice_v2* composeRequest) {
    auto flatComposeRequest = std::make_unique<FlatComposeRequest>();
    flatComposeRequest->displayId = composeRequest->displayId;
    flatComposeRequest->targetHandle = composeRequest->targetHandle;
    for (uint32_t i = 0; i < composeRequest->numLayers; i++) {
        flatComposeRequest->layers.emplace_back(composeRequest->layer[i]);
    }
    return flatComposeRequest;
}

}  // namespace gfxstream