Program Listing for File DataLayout.hpp

Return to documentation for file (nvcv_types/include/nvcv/DataLayout.hpp)

/*
 * SPDX-FileCopyrightText: Copyright (c) 2022-2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
 * SPDX-License-Identifier: Apache-2.0
 *
 * 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 express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef NVCV_DATALAYOUT_HPP
#define NVCV_DATALAYOUT_HPP

#include "DataLayout.h"

#include <nvcv/detail/CheckError.hpp>

#include <array>
#include <cstddef>
#include <cstdint>

namespace nvcv {

enum class Packing : int32_t
{
    NONE,
    X1 = NVCV_PACKING_X1,
    X2 = NVCV_PACKING_X2,
    X4 = NVCV_PACKING_X4,
    X8 = NVCV_PACKING_X8,
    X4Y4 = NVCV_PACKING_X4Y4,
    X3Y3Z2 = NVCV_PACKING_X3Y3Z2,

    X16 = NVCV_PACKING_X16,
    b6X10 = NVCV_PACKING_b6X10,
    X10b6 = NVCV_PACKING_X10b6,
    b4X12 = NVCV_PACKING_b4X12,
    X12b4 = NVCV_PACKING_X12b4,
    b2X14 = NVCV_PACKING_b2X14,

    X8_Y8 = NVCV_PACKING_X8_Y8,

    X5Y5Z6 = NVCV_PACKING_X5Y5Z6,
    X5Y6Z5 = NVCV_PACKING_X5Y6Z5,
    X6Y5Z5 = NVCV_PACKING_X6Y5Z5,
    b4X4Y4Z4 = NVCV_PACKING_b4X4Y4Z4,
    b1X5Y5Z5 = NVCV_PACKING_b1X5Y5Z5,
    X5Y5b1Z5 = NVCV_PACKING_X5Y5b1Z5,

    X1Y5Z5W5 = NVCV_PACKING_X1Y5Z5W5,
    X4Y4Z4W4 = NVCV_PACKING_X4Y4Z4W4,
    X5Y1Z5W5 = NVCV_PACKING_X5Y1Z5W5,
    X5Y5Z1W5 = NVCV_PACKING_X5Y5Z1W5,
    X5Y5Z5W1 = NVCV_PACKING_X5Y5Z5W1,

    X8_Y8__X8_Z8 = NVCV_PACKING_X8_Y8__X8_Z8,
    Y8_X8__Z8_X8 = NVCV_PACKING_Y8_X8__Z8_X8,

    X24 = NVCV_PACKING_X24,

    X8_Y8_Z8 = NVCV_PACKING_X8_Y8_Z8,

    X32 = NVCV_PACKING_X32,
    b12X20 = NVCV_PACKING_b12X20,

    X16_Y16 = NVCV_PACKING_X16_Y16,
    X10b6_Y10b6 = NVCV_PACKING_X10b6_Y10b6,
    X12b4_Y12b4 = NVCV_PACKING_X12b4_Y12b4,

    X10Y11Z11 = NVCV_PACKING_X10Y11Z11,
    X11Y11Z10 = NVCV_PACKING_X11Y11Z10,

    X8_Y8_Z8_W8 = NVCV_PACKING_X8_Y8_Z8_W8,
    X2Y10Z10W10 = NVCV_PACKING_X2Y10Z10W10,
    X10Y10Z10W2 = NVCV_PACKING_X10Y10Z10W2,

    X48 = NVCV_PACKING_X48,
    X16_Y16_Z16 = NVCV_PACKING_X16_Y16_Z16,

    X64 = NVCV_PACKING_X64,
    X32_Y32 = NVCV_PACKING_X32_Y32,
    X16_Y16_Z16_W16 = NVCV_PACKING_X16_Y16_Z16_W16,

    X96 = NVCV_PACKING_X96,
    X32_Y32_Z32 = NVCV_PACKING_X32_Y32_Z32,

    X128 = NVCV_PACKING_X128,
    X64_Y64 = NVCV_PACKING_X64_Y64,
    X32_Y32_Z32_W32 = NVCV_PACKING_X32_Y32_Z32_W32,

    X192 = NVCV_PACKING_X192,
    X64_Y64_Z64 = NVCV_PACKING_X64_Y64_Z64,

    X256 = NVCV_PACKING_X256,
    X128_Y128 = NVCV_PACKING_X128_Y128,
    X64_Y64_Z64_W64 = NVCV_PACKING_X64_Y64_Z64_W64,
};

using ExtraChannelInfo = NVCVExtraChannelInfo;

enum class DataKind : int8_t
{
    UNSPECIFIED = NVCV_DATA_KIND_UNSPECIFIED,
    UNSIGNED    = NVCV_DATA_KIND_UNSIGNED,
    SIGNED      = NVCV_DATA_KIND_SIGNED,
    FLOAT       = NVCV_DATA_KIND_FLOAT,
    COMPLEX     = NVCV_DATA_KIND_COMPLEX
};

enum class MemLayout : int8_t
{
    PITCH_LINEAR   = NVCV_MEM_LAYOUT_PITCH_LINEAR,
    BLOCK1_LINEAR  = NVCV_MEM_LAYOUT_BLOCK1_LINEAR,
    BLOCK2_LINEAR  = NVCV_MEM_LAYOUT_BLOCK2_LINEAR,
    BLOCK4_LINEAR  = NVCV_MEM_LAYOUT_BLOCK4_LINEAR,
    BLOCK8_LINEAR  = NVCV_MEM_LAYOUT_BLOCK8_LINEAR,
    BLOCK16_LINEAR = NVCV_MEM_LAYOUT_BLOCK16_LINEAR,
    BLOCK32_LINEAR = NVCV_MEM_LAYOUT_BLOCK32_LINEAR,

    BLOCK_LINEAR = NVCV_MEM_LAYOUT_BLOCK_LINEAR,
    PL           = NVCV_MEM_LAYOUT_PL,
    BL           = NVCV_MEM_LAYOUT_BL
};

enum class Channel : int8_t
{
    NONE = NVCV_CHANNEL_0,
    X    = NVCV_CHANNEL_X,
    Y    = NVCV_CHANNEL_Y,
    Z    = NVCV_CHANNEL_Z,
    W    = NVCV_CHANNEL_W,
    MAX  = NVCV_CHANNEL_1,
};

enum class ExtraChannel : int8_t
{
    U     = NVCV_EXTRA_CHANNEL_U,
    D     = NVCV_EXTRA_CHANNEL_D,
    POS3D = NVCV_EXTRA_CHANNEL_POS3D,
};

enum class AlphaType : int8_t
{
    ASSOCIATED   = NVCV_ALPHA_ASSOCIATED,
    UNASSOCIATED = NVCV_ALPHA_UNASSOCIATED,
};

enum class Swizzle : int32_t
{
    S_0000        = NVCV_SWIZZLE_0000,
    S_1000        = NVCV_SWIZZLE_1000,
    S_0001        = NVCV_SWIZZLE_0001,
    S_XYZW        = NVCV_SWIZZLE_XYZW,
    S_ZYXW        = NVCV_SWIZZLE_ZYXW,
    S_WXYZ        = NVCV_SWIZZLE_WXYZ,
    S_WZYX        = NVCV_SWIZZLE_WZYX,
    S_YZWX        = NVCV_SWIZZLE_YZWX,
    S_XYZ1        = NVCV_SWIZZLE_XYZ1,
    S_XYZ0        = NVCV_SWIZZLE_XYZ0,
    S_YZW1        = NVCV_SWIZZLE_YZW1,
    S_XXX1        = NVCV_SWIZZLE_XXX1,
    S_XZY1        = NVCV_SWIZZLE_XZY1,
    S_ZYX1        = NVCV_SWIZZLE_ZYX1,
    S_ZYX0        = NVCV_SWIZZLE_ZYX0,
    S_WZY1        = NVCV_SWIZZLE_WZY1,
    S_X000        = NVCV_SWIZZLE_X000,
    S_0X00        = NVCV_SWIZZLE_0X00,
    S_00X0        = NVCV_SWIZZLE_00X0,
    S_000X        = NVCV_SWIZZLE_000X,
    S_Y000        = NVCV_SWIZZLE_Y000,
    S_0Y00        = NVCV_SWIZZLE_0Y00,
    S_00Y0        = NVCV_SWIZZLE_00Y0,
    S_000Y        = NVCV_SWIZZLE_000Y,
    S_0XY0        = NVCV_SWIZZLE_0XY0,
    S_XXXY        = NVCV_SWIZZLE_XXXY,
    S_YYYX        = NVCV_SWIZZLE_YYYX,
    S_0YX0        = NVCV_SWIZZLE_0YX0,
    S_X00Y        = NVCV_SWIZZLE_X00Y,
    S_Y00X        = NVCV_SWIZZLE_Y00X,
    S_X001        = NVCV_SWIZZLE_X001,
    S_XY01        = NVCV_SWIZZLE_XY01,
    S_XY00        = NVCV_SWIZZLE_XY00,
    S_0XZ0        = NVCV_SWIZZLE_0XZ0,
    S_0ZX0        = NVCV_SWIZZLE_0ZX0,
    S_XZY0        = NVCV_SWIZZLE_XZY0,
    S_YZX1        = NVCV_SWIZZLE_YZX1,
    S_ZYW1        = NVCV_SWIZZLE_ZYW1,
    S_0YX1        = NVCV_SWIZZLE_0YX1,
    S_XYXZ        = NVCV_SWIZZLE_XYXZ,
    S_YXZX        = NVCV_SWIZZLE_YXZX,
    S_XZ00        = NVCV_SWIZZLE_XZ00,
    S_WYXZ        = NVCV_SWIZZLE_WYXZ,
    S_YX00        = NVCV_SWIZZLE_YX00,
    S_YX01        = NVCV_SWIZZLE_YX01,
    S_00YX        = NVCV_SWIZZLE_00YX,
    S_00XY        = NVCV_SWIZZLE_00XY,
    S_0XY1        = NVCV_SWIZZLE_0XY1,
    S_0X01        = NVCV_SWIZZLE_0X01,
    S_YZXW        = NVCV_SWIZZLE_YZXW,
    S_YW00        = NVCV_SWIZZLE_YW00,
    S_XYW0        = NVCV_SWIZZLE_XYW0,
    S_YZW0        = NVCV_SWIZZLE_YZW0,
    S_YZ00        = NVCV_SWIZZLE_YZ00,
    S_00X1        = NVCV_SWIZZLE_00X1,
    S_0ZXY        = NVCV_SWIZZLE_0ZXY,
    S_UNSUPPORTED = NVCV_SWIZZLE_UNSUPPORTED
};

inline Swizzle MakeSwizzle(Channel x, Channel y, Channel z, Channel w)
{
    NVCVSwizzle out;
    detail::CheckThrow(nvcvMakeSwizzle(&out, static_cast<NVCVChannel>(x), static_cast<NVCVChannel>(y),
                                       static_cast<NVCVChannel>(z), static_cast<NVCVChannel>(w)));
    return static_cast<Swizzle>(out);
}

inline std::array<Channel, 4> GetChannels(Swizzle swizzle)
{
    NVCVChannel channels[4];
    detail::CheckThrow(nvcvSwizzleGetChannels(static_cast<NVCVSwizzle>(swizzle), channels));

    return {static_cast<Channel>(channels[0]), static_cast<Channel>(channels[1]), static_cast<Channel>(channels[2]),
            static_cast<Channel>(channels[3])};
}

inline int32_t GetNumChannels(Swizzle swizzle)
{
    int32_t out;
    detail::CheckThrow(nvcvSwizzleGetNumChannels(static_cast<NVCVSwizzle>(swizzle), &out));
    return out;
}

#ifdef BIG_ENDIAN
#    undef BIG_ENDIAN
#endif

enum class ByteOrder : int8_t
{
    LSB,
    MSB
};

struct PackingParams
{
    ByteOrder byteOrder;
    Swizzle   swizzle;

    std::array<int32_t, NVCV_MAX_CHANNEL_COUNT> bits;
};

inline Packing MakePacking(const PackingParams &params)
{
    NVCVPackingParams p{};
    p.byteOrder = static_cast<NVCVByteOrder>(params.byteOrder);
    p.swizzle   = static_cast<NVCVSwizzle>(params.swizzle);
    for (size_t i = 0; i < params.bits.size(); ++i)
    {
        p.bits[i] = params.bits[i];
    }

    NVCVPacking out{};
    detail::CheckThrow(nvcvMakePacking(&out, &p));
    return static_cast<Packing>(out);
};

inline PackingParams GetParams(Packing packing)
{
    NVCVPackingParams p;
    detail::CheckThrow(nvcvPackingGetParams(static_cast<NVCVPacking>(packing), &p));

    PackingParams out;
    out.byteOrder = static_cast<ByteOrder>(p.byteOrder);
    out.swizzle   = static_cast<Swizzle>(p.swizzle);

    for (size_t i = 0; i < out.bits.size(); ++i)
    {
        out.bits[i] = p.bits[i];
    }
    return out;
}

inline int32_t GetNumComponents(Packing packing)
{
    int32_t out;
    detail::CheckThrow(nvcvPackingGetNumComponents(static_cast<NVCVPacking>(packing), &out));
    return out;
}

inline std::array<int32_t, 4> GetBitsPerComponent(Packing packing)
{
    int32_t bits[4];
    detail::CheckThrow(nvcvPackingGetBitsPerComponent(static_cast<NVCVPacking>(packing), bits));
    return {bits[0], bits[1], bits[2], bits[3]};
}

inline int32_t GetBitsPerPixel(Packing packing)
{
    int32_t out;
    detail::CheckThrow(nvcvPackingGetBitsPerPixel(static_cast<NVCVPacking>(packing), &out));
    return out;
}

inline int32_t GetAlignment(Packing packing)
{
    int32_t out;
    detail::CheckThrow(nvcvPackingGetAlignment(static_cast<NVCVPacking>(packing), &out));
    return out;
}

inline std::ostream &operator<<(std::ostream &out, DataKind dataKind)
{
    return out << nvcvDataKindGetName(static_cast<NVCVDataKind>(dataKind));
}

inline std::ostream &operator<<(std::ostream &out, Packing packing)
{
    return out << nvcvPackingGetName(static_cast<NVCVPacking>(packing));
}

inline std::ostream &operator<<(std::ostream &out, MemLayout memLayout)
{
    return out << nvcvMemLayoutGetName(static_cast<NVCVMemLayout>(memLayout));
}

inline std::ostream &operator<<(std::ostream &out, Channel swizzleChannel)
{
    return out << nvcvChannelGetName(static_cast<NVCVChannel>(swizzleChannel));
}

inline std::ostream &operator<<(std::ostream &out, Swizzle swizzle)
{
    return out << nvcvSwizzleGetName(static_cast<NVCVSwizzle>(swizzle));
}

inline std::ostream &operator<<(std::ostream &out, ByteOrder byteOrder)
{
    return out << nvcvByteOrderGetName(static_cast<NVCVByteOrder>(byteOrder));
}

} // namespace nvcv

inline std::ostream &operator<<(std::ostream &out, NVCVDataKind dataKind)
{
    return out << nvcvDataKindGetName(dataKind);
}

inline std::ostream &operator<<(std::ostream &out, NVCVPacking packing)
{
    return out << nvcvPackingGetName(packing);
}

inline std::ostream &operator<<(std::ostream &out, NVCVMemLayout memLayout)
{
    return out << nvcvMemLayoutGetName(memLayout);
}

inline std::ostream &operator<<(std::ostream &out, NVCVChannel swizzleChannel)
{
    return out << nvcvChannelGetName(swizzleChannel);
}

inline std::ostream &operator<<(std::ostream &out, NVCVSwizzle swizzle)
{
    return out << nvcvSwizzleGetName(swizzle);
}

inline std::ostream &operator<<(std::ostream &out, NVCVByteOrder byteOrder)
{
    return out << nvcvByteOrderGetName(byteOrder);
}

#endif // NVCV_DATALAYOUT_HPP