179d13ff0f5cd3c4242445baf5b2f01a52f0ed06fChia-I Wu/*
279d13ff0f5cd3c4242445baf5b2f01a52f0ed06fChia-I Wu * Copyright 2016 The Android Open Source Project
379d13ff0f5cd3c4242445baf5b2f01a52f0ed06fChia-I Wu *
479d13ff0f5cd3c4242445baf5b2f01a52f0ed06fChia-I Wu * Licensed under the Apache License, Version 2.0 (the "License");
579d13ff0f5cd3c4242445baf5b2f01a52f0ed06fChia-I Wu * you may not use this file except in compliance with the License.
679d13ff0f5cd3c4242445baf5b2f01a52f0ed06fChia-I Wu * You may obtain a copy of the License at
779d13ff0f5cd3c4242445baf5b2f01a52f0ed06fChia-I Wu *
879d13ff0f5cd3c4242445baf5b2f01a52f0ed06fChia-I Wu *      http://www.apache.org/licenses/LICENSE-2.0
979d13ff0f5cd3c4242445baf5b2f01a52f0ed06fChia-I Wu *
1079d13ff0f5cd3c4242445baf5b2f01a52f0ed06fChia-I Wu * Unless required by applicable law or agreed to in writing, software
1179d13ff0f5cd3c4242445baf5b2f01a52f0ed06fChia-I Wu * distributed under the License is distributed on an "AS IS" BASIS,
1279d13ff0f5cd3c4242445baf5b2f01a52f0ed06fChia-I Wu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1379d13ff0f5cd3c4242445baf5b2f01a52f0ed06fChia-I Wu * See the License for the specific language governing permissions and
1479d13ff0f5cd3c4242445baf5b2f01a52f0ed06fChia-I Wu * limitations under the License.
1579d13ff0f5cd3c4242445baf5b2f01a52f0ed06fChia-I Wu */
1679d13ff0f5cd3c4242445baf5b2f01a52f0ed06fChia-I Wu
1779d13ff0f5cd3c4242445baf5b2f01a52f0ed06fChia-I Wu#ifndef ANDROID_HARDWARE_GRAPHICS_MAPPER_V2_0_GRALLOCBUFFERDESCRIPTOR_H
1879d13ff0f5cd3c4242445baf5b2f01a52f0ed06fChia-I Wu#define ANDROID_HARDWARE_GRAPHICS_MAPPER_V2_0_GRALLOCBUFFERDESCRIPTOR_H
1979d13ff0f5cd3c4242445baf5b2f01a52f0ed06fChia-I Wu
2079d13ff0f5cd3c4242445baf5b2f01a52f0ed06fChia-I Wu#include <android/hardware/graphics/mapper/2.0/IMapper.h>
2179d13ff0f5cd3c4242445baf5b2f01a52f0ed06fChia-I Wu
2279d13ff0f5cd3c4242445baf5b2f01a52f0ed06fChia-I Wunamespace android {
2379d13ff0f5cd3c4242445baf5b2f01a52f0ed06fChia-I Wunamespace hardware {
2479d13ff0f5cd3c4242445baf5b2f01a52f0ed06fChia-I Wunamespace graphics {
2579d13ff0f5cd3c4242445baf5b2f01a52f0ed06fChia-I Wunamespace mapper {
2679d13ff0f5cd3c4242445baf5b2f01a52f0ed06fChia-I Wunamespace V2_0 {
2779d13ff0f5cd3c4242445baf5b2f01a52f0ed06fChia-I Wunamespace implementation {
2879d13ff0f5cd3c4242445baf5b2f01a52f0ed06fChia-I Wu
2979d13ff0f5cd3c4242445baf5b2f01a52f0ed06fChia-I Wuusing android::hardware::graphics::common::V1_0::PixelFormat;
3079d13ff0f5cd3c4242445baf5b2f01a52f0ed06fChia-I Wu
3179d13ff0f5cd3c4242445baf5b2f01a52f0ed06fChia-I Wu/**
3279d13ff0f5cd3c4242445baf5b2f01a52f0ed06fChia-I Wu * BufferDescriptor is created by IMapper and consumed by IAllocator. It is
3379d13ff0f5cd3c4242445baf5b2f01a52f0ed06fChia-I Wu * versioned so that IMapper and IAllocator can be updated independently.
3479d13ff0f5cd3c4242445baf5b2f01a52f0ed06fChia-I Wu */
3579d13ff0f5cd3c4242445baf5b2f01a52f0ed06fChia-I Wuconstexpr uint32_t grallocBufferDescriptorSize = 7;
3679d13ff0f5cd3c4242445baf5b2f01a52f0ed06fChia-I Wuconstexpr uint32_t grallocBufferDescriptorMagicVersion = ((0x9487 << 16) | 0);
3779d13ff0f5cd3c4242445baf5b2f01a52f0ed06fChia-I Wu
3879d13ff0f5cd3c4242445baf5b2f01a52f0ed06fChia-I Wuinline BufferDescriptor grallocEncodeBufferDescriptor(
3979d13ff0f5cd3c4242445baf5b2f01a52f0ed06fChia-I Wu    const IMapper::BufferDescriptorInfo& descriptorInfo) {
4079d13ff0f5cd3c4242445baf5b2f01a52f0ed06fChia-I Wu    BufferDescriptor descriptor;
4179d13ff0f5cd3c4242445baf5b2f01a52f0ed06fChia-I Wu    descriptor.resize(grallocBufferDescriptorSize);
4279d13ff0f5cd3c4242445baf5b2f01a52f0ed06fChia-I Wu    descriptor[0] = grallocBufferDescriptorMagicVersion;
4379d13ff0f5cd3c4242445baf5b2f01a52f0ed06fChia-I Wu    descriptor[1] = descriptorInfo.width;
4479d13ff0f5cd3c4242445baf5b2f01a52f0ed06fChia-I Wu    descriptor[2] = descriptorInfo.height;
4579d13ff0f5cd3c4242445baf5b2f01a52f0ed06fChia-I Wu    descriptor[3] = descriptorInfo.layerCount;
4679d13ff0f5cd3c4242445baf5b2f01a52f0ed06fChia-I Wu    descriptor[4] = static_cast<uint32_t>(descriptorInfo.format);
4779d13ff0f5cd3c4242445baf5b2f01a52f0ed06fChia-I Wu    descriptor[5] = static_cast<uint32_t>(descriptorInfo.usage);
4879d13ff0f5cd3c4242445baf5b2f01a52f0ed06fChia-I Wu    descriptor[6] = static_cast<uint32_t>(descriptorInfo.usage >> 32);
4979d13ff0f5cd3c4242445baf5b2f01a52f0ed06fChia-I Wu
5079d13ff0f5cd3c4242445baf5b2f01a52f0ed06fChia-I Wu    return descriptor;
5179d13ff0f5cd3c4242445baf5b2f01a52f0ed06fChia-I Wu}
5279d13ff0f5cd3c4242445baf5b2f01a52f0ed06fChia-I Wu
5379d13ff0f5cd3c4242445baf5b2f01a52f0ed06fChia-I Wuinline bool grallocDecodeBufferDescriptor(
5479d13ff0f5cd3c4242445baf5b2f01a52f0ed06fChia-I Wu    const BufferDescriptor& descriptor,
5579d13ff0f5cd3c4242445baf5b2f01a52f0ed06fChia-I Wu    IMapper::BufferDescriptorInfo* outDescriptorInfo) {
5679d13ff0f5cd3c4242445baf5b2f01a52f0ed06fChia-I Wu    if (descriptor.size() != grallocBufferDescriptorSize ||
5779d13ff0f5cd3c4242445baf5b2f01a52f0ed06fChia-I Wu        descriptor[0] != grallocBufferDescriptorMagicVersion) {
5879d13ff0f5cd3c4242445baf5b2f01a52f0ed06fChia-I Wu        return false;
5979d13ff0f5cd3c4242445baf5b2f01a52f0ed06fChia-I Wu    }
6079d13ff0f5cd3c4242445baf5b2f01a52f0ed06fChia-I Wu
6179d13ff0f5cd3c4242445baf5b2f01a52f0ed06fChia-I Wu    *outDescriptorInfo = IMapper::BufferDescriptorInfo{
6279d13ff0f5cd3c4242445baf5b2f01a52f0ed06fChia-I Wu        descriptor[1],
6379d13ff0f5cd3c4242445baf5b2f01a52f0ed06fChia-I Wu        descriptor[2],
6479d13ff0f5cd3c4242445baf5b2f01a52f0ed06fChia-I Wu        descriptor[3],
6579d13ff0f5cd3c4242445baf5b2f01a52f0ed06fChia-I Wu        static_cast<PixelFormat>(descriptor[4]),
6679d13ff0f5cd3c4242445baf5b2f01a52f0ed06fChia-I Wu        (static_cast<uint64_t>(descriptor[6]) << 32) | descriptor[5],
6779d13ff0f5cd3c4242445baf5b2f01a52f0ed06fChia-I Wu    };
6879d13ff0f5cd3c4242445baf5b2f01a52f0ed06fChia-I Wu
6979d13ff0f5cd3c4242445baf5b2f01a52f0ed06fChia-I Wu    return true;
7079d13ff0f5cd3c4242445baf5b2f01a52f0ed06fChia-I Wu}
7179d13ff0f5cd3c4242445baf5b2f01a52f0ed06fChia-I Wu
7279d13ff0f5cd3c4242445baf5b2f01a52f0ed06fChia-I Wu}  // namespace implementation
7379d13ff0f5cd3c4242445baf5b2f01a52f0ed06fChia-I Wu}  // namespace V2_0
7479d13ff0f5cd3c4242445baf5b2f01a52f0ed06fChia-I Wu}  // namespace mapper
7579d13ff0f5cd3c4242445baf5b2f01a52f0ed06fChia-I Wu}  // namespace graphics
7679d13ff0f5cd3c4242445baf5b2f01a52f0ed06fChia-I Wu}  // namespace hardware
7779d13ff0f5cd3c4242445baf5b2f01a52f0ed06fChia-I Wu}  // namespace android
7879d13ff0f5cd3c4242445baf5b2f01a52f0ed06fChia-I Wu
7979d13ff0f5cd3c4242445baf5b2f01a52f0ed06fChia-I Wu#endif  // ANDROID_HARDWARE_GRAPHICS_MAPPER_V2_0_GRALLOCBUFFERDESCRIPTOR_H
80