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