gsdf_impl_common.h#

Fully qualified name: src/device/vpu_runtime/include/cupva_device/impl/gsdf_impl_common.h

File members: src/device/vpu_runtime/include/cupva_device/impl/gsdf_impl_common.h

/*
 * Copyright (c) 2023 NVIDIA Corporation.  All rights reserved.
 *
 * NVIDIA Corporation and its licensors retain all intellectual property
 * and proprietary rights in and to this software, related documentation
 * and any modifications thereto.  Any use, reproduction, disclosure or
 * distribution of this software and related documentation without an express
 * license agreement from NVIDIA Corporation is strictly prohibited.
 */

#ifndef GSDF_IMPL_COMMON_H
#define GSDF_IMPL_COMMON_H

#include "dma_common.h"

#include <cupva_types.h>

#define CONTAINER_OF(ptr, type, member) (type *)((char *)(ptr) - (char *)&((type *)0)->member)

#define GSDF_STATIC_HEADER_SIZE (sizeof(GSDFParams) + sizeof(uint8_t) * GSDF_MAX_NUM_TILES + sizeof(GSDFSwseqPriv))
#define GSDF_ALIGNED(NUM) (((NUM) + 15U) & ~15U)
#define GSDF_NUM_VPUC_BUFFERS (2)
#define GSDF_PLANAR_GEOMETRY_STRUCT_SIZE (sizeof(PlanarGeometry))

#define VMEM_GSDF_HANDLER_MACRO(bank, name, numTiles, isUniform, macro, ...) macro

#define GSDF_DESCRCNTL_SLOT 0U
#define GSDF_LPCNTL_SLOT 1U
#define GSDF_VMEMADDR_SLOT 2U
#define GSDF_TRANSCNTL_SLOT 3U
#define GSDF_TILECNTL_SLOT 4U
#define GSDF_EXTADDR_SLOT 5U

#define GSDF_BL_X_ALIGN (32U)
#define GSDF_BL_Y_ALIGN (2U)
#define GSDF_BL_X_OFFSET(_type) (GSDF_BL_X_ALIGN / sizeof(_type))
#define GSDF_BL_Y_OFFSET (1U)

#define GSDF_VPUC_MAGIC 0xDEADC0DEU

#if (CUPVA_PVA_GEN_NUMBER > 2)
#    define GSDF_NUM_MODES (2)
#else
#    define GSDF_NUM_MODES (1)
#endif

#define GSDF_VPUC_TBL_OFFSET 0U

// Worst case scenario for buffer sizing is where we need a new VPUC table for each channel
#define GSDF_SWSEQ_MAX_NODES_PER_CHANNEL(NUM_TILES) \
    ((NUM_TILES + GSDF_SWSEQ_MAX_CHANNEL_COUNT - 1U) / GSDF_SWSEQ_MAX_CHANNEL_COUNT)
// Again the worst case number of channels is where each new tile needs its own channel
#define GSDF_SWSEQ_MAX_CHANNELS_FOR_TILES(NUM_TILES) \
    (NUM_TILES > GSDF_SWSEQ_MAX_CHANNEL_COUNT ? GSDF_SWSEQ_MAX_CHANNEL_COUNT : NUM_TILES)
#define GSDF_SWSEQ_VPUC_TBL_PAYLOAD_MAX_ENTRIES_PER_CHANNEL(NUM_TILES) \
    (GSDF_NUM_ENTRY_PER_DESC * GSDF_SWSEQ_MAX_NODES_PER_CHANNEL(NUM_TILES))
#define GSDF_SWSEQ_VPUC_TBL_MAX_SIZE_PER_CHANNEL(NUM_TILES) \
    ((GSDF_SWSEQ_VPUC_TBL_PAYLOAD_MAX_ENTRIES_PER_CHANNEL(NUM_TILES) + 1U) * (uint32_t)sizeof(GSDFVPUConfigPair))

#define GSDF_SWSEQ_VPUC_TBL_SIZE(NUM_TILES) \
    (GSDF_SWSEQ_MAX_CHANNELS_FOR_TILES(NUM_TILES) * GSDF_SWSEQ_VPUC_TBL_MAX_SIZE_PER_CHANNEL(NUM_TILES))

#define GSDF_SWSEQ_TRANSPOSE_TBL_OFFSET(NUM_TILES) (GSDF_VPUC_TBL_OFFSET + GSDF_SWSEQ_VPUC_TBL_SIZE(NUM_TILES))
#define GSDF_SWSEQ_TRANSPOSE_TBL_LP (GSDF_MAX_NUM_TILES + 1U)
#define GSDF_SWSEQ_TRANSPOSE_TBL_SIZE_PER_TABLE \
    (GSDF_NUM_ENTRY_PER_DESC * GSDF_SWSEQ_TRANSPOSE_TBL_LP * sizeof(uint32_t))
#define GSDF_SWSEQ_TRANSPOSE_TBL_SIZE (GSDF_NUM_VPUC_BUFFERS * GSDF_SWSEQ_TRANSPOSE_TBL_SIZE_PER_TABLE)
#define GSDF_SWSEQ_HANDLER_TOTAL_SIZE(NUM_TILES) \
    (GSDF_STATIC_HEADER_SIZE + GSDF_SWSEQ_TRANSPOSE_TBL_OFFSET(NUM_TILES) + GSDF_SWSEQ_TRANSPOSE_TBL_SIZE)

#define GSDF_HWSEQ_MODE0 (0xDEADU)
#define GSDF_HWSEQ_MODE2 (0xC0DAU)
#define GSDF_HWSEQ_NUM_ENTRY_AT_CLOSE (7U)
#define GSDF_HWSEQ_HEADER (12U)
#define GSDF_HWSEQ_NUMCOLS_SHIFT (24U)
#define GSDF_HWSEQ_ENTRY_SIZE (8U)
#define GSDF_HWSEQ_NUM_PREAMBLE_ENTRY (4U)
#define GSDF_HWSEQ_MULTI_ENTRY_OFFSET (3U)
#define GSDF_HWSEQ_VPUC_TBL_PAYLOAD_ENTRIES(NUM_TILES, ISUNIFORM) \
    ((ISUNIFORM)                                                  \
         ? GSDF_NUM_ENTRY_PER_DESC + NUM_TILES - 1U               \
         : (GSDF_NUM_ENTRY_PER_DESC - GSDF_HWSEQ_MULTI_ENTRY_OFFSET) * NUM_TILES + GSDF_HWSEQ_MULTI_ENTRY_OFFSET)
#define GSDF_HWSEQ_VPUC_TBL_ENTRIES(NUM_TILES, ISUNIFORM) \
    (GSDF_HWSEQ_NUM_PREAMBLE_ENTRY + GSDF_HWSEQ_VPUC_TBL_PAYLOAD_ENTRIES(NUM_TILES, ISUNIFORM))
#define GSDF_HWSEQ_VPUC_TBL_SIZE(NUM_TILES, ISUNIFORM) \
    (GSDF_ALIGNED(GSDF_HWSEQ_VPUC_TBL_ENTRIES(NUM_TILES, ISUNIFORM) + 1U) * (uint32_t)sizeof(GSDFVPUConfigPair))
#define GSDF_HWSEQ_HANDLER_TOTAL_SIZE(NUM_TILES, ISUNIFORM) \
    (GSDF_STATIC_HEADER_SIZE + 2U * GSDF_HWSEQ_VPUC_TBL_SIZE(NUM_TILES, ISUNIFORM))

#define GSDF_HANDLER_TOTAL_SIZE(NUM_TILES, ISUNIFORM) \
    CUPVA_MAX(GSDF_SWSEQ_HANDLER_TOTAL_SIZE(NUM_TILES), GSDF_HWSEQ_HANDLER_TOTAL_SIZE(NUM_TILES, ISUNIFORM))

#define VMEM_GSDF_HANDLER_IMPL(bank, name, numTiles)                                                     \
    VMEM_1D(bank, uint8_t, _##name, GSDF_HANDLER_TOTAL_SIZE(numTiles, false));                           \
    CUPVA_EXPORT(POINTER_CAST(GSDFHandler, _##name)->params, _M##name);                                  \
    CUPVA_EXPORT_IMPL(POINTER_CAST(GSDFHandler, _##name)->data[GSDF_VPUC_TBL_OFFSET], _V##name##_export, \
                      GSDF_SWSEQ_VPUC_TBL_SIZE(numTiles), VMEM_TYPE_VPUC_TABLE);                         \
    CUPVA_EXPORT(POINTER_CAST(GSDFHandler, _##name)->priv.swseq.configBuffers[0].extPointer, _P##name,   \
                 VMEM_TYPE_POINTER_EX);                                                                  \
    GSDFHandler *const name = POINTER_CAST(GSDFHandler, _##name);

#define VMEM_GSDF_HANDLER_UNIFORM_IMPL(bank, name, numTiles, isUniform)                                         \
    VMEM_1D(bank, uint8_t, _##name, GSDF_HANDLER_TOTAL_SIZE(numTiles, isUniform));                              \
    CUPVA_EXPORT(POINTER_CAST(GSDFHandlerUniform, _##name)->params, _M##name);                                  \
    CUPVA_EXPORT_IMPL(POINTER_CAST(GSDFHandlerUniform, _##name)->data[GSDF_VPUC_TBL_OFFSET], _U##name##_export, \
                      GSDF_SWSEQ_VPUC_TBL_SIZE(numTiles), VMEM_TYPE_VPUC_TABLE);                                \
    CUPVA_EXPORT(POINTER_CAST(GSDFHandlerUniform, _##name)->priv.swseq.configBuffers[0].extPointer, _P##name,   \
                 VMEM_TYPE_POINTER_EX);                                                                         \
    GSDFHandlerUniform *const name = POINTER_CAST(GSDFHandlerUniform, _##name);

// Forward declaration
struct GSDFHandler;
struct GSDFHandlerUniform;

#define GSDF_ENABLE_HWSEQ (CUPVA_PVA_GEN_NUMBER > 2)
#define CHECK_HWSEQ_ENABLED(_N, ...) (_N->params.useHwseq == 1U)

#if GSDF_ENABLE_HWSEQ
#    define GSDF_IMPL_FUNC(_a, ...)                \
        if (CHECK_HWSEQ_ENABLED(__VA_ARGS__))      \
        {                                          \
            cupvaGSDFHwseq##_a##Priv(__VA_ARGS__); \
        }                                          \
        else                                       \
        {                                          \
            cupvaGSDFSwseq##_a##Priv(__VA_ARGS__); \
        }

#    define GSDF_IMPL_FUNC_RET(_a, _b, ...)                 \
        {                                                   \
            if (CHECK_HWSEQ_ENABLED(__VA_ARGS__))           \
            {                                               \
                _b = cupvaGSDFHwseq##_a##Priv(__VA_ARGS__); \
            }                                               \
            else                                            \
            {                                               \
                _b = cupvaGSDFSwseq##_a##Priv(__VA_ARGS__); \
            }                                               \
        }
#else
#    define GSDF_IMPL_FUNC(_a, ...) cupvaGSDFSwseq##_a##Priv(__VA_ARGS__)
#    define GSDF_IMPL_FUNC_RET(_a, _b, ...)             \
        {                                               \
            _b = cupvaGSDFSwseq##_a##Priv(__VA_ARGS__); \
        }
#endif

struct GSDFBufferMetadata
{
    uint32_t vmemStride;
    uint16_t vmemLinePitch;
    uint8_t extFormat;
    uint8_t extIsRaw;
    uint8_t extTransMode;
};

#if CUPVA_BUILD_MODE == CUPVA_NATIVE
// In GSDF, vector load is used to read the offsets. The ALIGNED_COPY macro is needed to prevent out of
// bound errors when ASAN is on in native mode.
#    define ALIGNED_COPY(_x, _type, _size)                                         \
        _type _x##_aligned[GSDF_MAX_NUM_TILES];                                    \
        if (_x != NULL)                                                            \
        {                                                                          \
            (void)memcpy((void *)_x##_aligned, (void *)_x, _size * sizeof(_type)); \
            _x = _x##_aligned;                                                     \
        }
#else
#    define ALIGNED_COPY(_x, _type, _size)
#endif

#endif // CUPVA_GSDF_IMPL_COMMON_H