gsdf_impl_swseq.h#
Fully qualified name: src/device/vpu_runtime/include/cupva_device/impl/gsdf_impl_swseq.h
File members: src/device/vpu_runtime/include/cupva_device/impl/gsdf_impl_swseq.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_SWSEQ_H
#define GSDF_IMPL_SWSEQ_H
#include "dma_common.h"
#include "gsdf_impl_common.h"
#include <cupva_types.h>
// Struct to base tile size. Matches tileCntl layout.
struct GSDFTileBase
{
uint16_t alignX;
uint16_t alignY;
};
// Data which exists on a per config buffer basis
struct GSDFSwseqConfigBuffer
{
ExtMemPointer extPointer;
uint32_t vmemAddr;
GSDFBufferMetadata bufferMetadata;
uint32_t *transposeTable;
GSDFTileBase tileBase[GSDF_MAX_NUM_TILES];
};
// Private GSDF struct
struct GSDFSwseqPriv
{
GSDFSwseqConfigBuffer configBuffers[GSDF_NUM_VPUC_BUFFERS];
uint8_t copyIters;
uint8_t configIdx;
uint8_t triggered;
uint8_t reserved[5];
AgenCFG transposeAgen;
AgenCFG vpuCAgen;
};
// Implementation of flipping GSDF buffer
inline void cupvaGSDFSwseqCycleBuffersImpl(GSDFSwseqPriv *priv)
{
priv->configIdx = (uint8_t)mod_inc((int32_t)priv->configIdx, GSDF_NUM_VPUC_BUFFERS - 1);
}
// Flush current transpose table to VPUC area
inline void cupvaGSDFSwseqFlushImpl(GSDFSwseqPriv *priv)
{
cupvaModifyAgenCfgBase(&priv->transposeAgen, priv->configBuffers[priv->configIdx].transposeTable);
agen transposeInAgen = init_agen_from_cfg(priv->transposeAgen);
agen vpuCOutAgen = init_agen_from_cfg(priv->vpuCAgen);
dvintx vOut;
vOut.lo = replicatew(0);
vOut.hi = replicatew(0);
uint32_t const pred = 0x00000555U;
chess_separator_scheduler();
// Fill in addresses and values to VPUC table
for (uint32_t i = 0; i < priv->copyIters; i++) chess_loop_range(2, 32)
chess_prepare_for_pipelining
{
vOut.lo = vint_load_transp(transposeInAgen);
vstore_i(vOut, vpuCOutAgen, (int32_t)pred);
}
}
// Implementation of GSDF trigger.
inline void cupvaGSDFSwseqTrigImpl(GSDFParams *params, GSDFSwseqPriv *priv)
{
cupvaGSDFSwseqFlushImpl(priv);
cupvaGSDFSwseqCycleBuffersImpl(priv);
priv->triggered = 1U;
cupvaDataFlowTrig(params->trigger);
}
// Implementation of GSDF sync.
inline void cupvaGSDFSwseqSyncImpl(GSDFParams *params, GSDFSwseqPriv *priv)
{
uint32_t trigger = (priv->triggered == 1U) ? params->trigger : 0U;
cupvaDataFlowSync(trigger);
}
// GSDF SWSEQ private functions.
// Implementation of GSDF trig private function.
inline void cupvaGSDFSwseqTrigPriv(GSDFHandler const *handler, GSDFParams *params, void *priv)
{
chess_dont_warn_dead(handler);
cupvaGSDFSwseqTrigImpl(params, POINTER_CAST(GSDFSwseqPriv, priv));
}
// Implementation of GSDF sync private function.
inline void cupvaGSDFSwseqSyncPriv(GSDFHandler const *handler, GSDFParams *params, void *priv)
{
chess_dont_warn_dead(handler);
cupvaGSDFSwseqSyncImpl(params, POINTER_CAST(GSDFSwseqPriv, priv));
}
// Implementation of GSDF CycleBuffers private function.
inline void cupvaGSDFSwseqCycleBuffersPriv(GSDFHandler const *handler, void *priv)
{
chess_dont_warn_dead(handler);
cupvaGSDFSwseqCycleBuffersImpl(POINTER_CAST(GSDFSwseqPriv, priv));
}
// Implementation of GSDF trig private function.
inline void cupvaGSDFSwseqTrigPriv(GSDFHandlerUniform const *handler, GSDFParams *params, void *priv)
{
chess_dont_warn_dead(handler);
cupvaGSDFSwseqTrigImpl(params, POINTER_CAST(GSDFSwseqPriv, priv));
}
// Implementation of GSDF sync private function.
inline void cupvaGSDFSwseqSyncPriv(GSDFHandlerUniform const *handler, GSDFParams *params, void *priv)
{
chess_dont_warn_dead(handler);
cupvaGSDFSwseqSyncImpl(params, POINTER_CAST(GSDFSwseqPriv, priv));
}
// Implementation of GSDF CycleBuffers private function.
inline void cupvaGSDFSwseqCycleBuffersPriv(GSDFHandlerUniform const *handler, void *priv)
{
chess_dont_warn_dead(handler);
cupvaGSDFSwseqCycleBuffersImpl(POINTER_CAST(GSDFSwseqPriv, priv));
}
bool cupvaGSDFSwseqOpenPriv(GSDFHandler *handler, void *addr, uint16_t linePitch, uint32_t stride);
void cupvaGSDFSwseqClosePriv(GSDFHandler *handler);
bool cupvaGSDFSwseqResetExtBasePriv(GSDFHandler *handler, ExtMemPointer const *addr, uint16_t width, uint16_t height,
uint16_t linePitch);
bool cupvaGSDFSwseqResetExtBasePriv(GSDFHandler *handler, VPUSurfaceData const *surfObj);
bool cupvaGSDFSwseqResetExtBasePriv(GSDFHandler *handler, VPUSurfaceData const *surfObj, PlanarGeometry const *geom);
bool cupvaGSDFSwseqResetExtBasePriv(GSDFHandler *handler, ExtMemPointer const *addr, PlanarGeometry const *geom);
void cupvaGSDFSwseqUpdateVmemAddrPriv(GSDFHandler *handler, void *addr, uint16_t linePitch, uint32_t stride);
void cupvaGSDFSwseqUpdateOffsets1DPriv(GSDFHandler *handler, int32_t const *offsets);
void cupvaGSDFSwseqUpdateOffsets2DPriv(GSDFHandler *handler, int32_t const *xCoords, int32_t const *yCoords);
void cupvaGSDFSwseqUpdateSize1DPriv(GSDFHandler *handler, uint16_t const *transferSizes, int32_t size);
void cupvaGSDFSwseqUpdateSize1DPriv(GSDFHandler *handler, uint16_t transferSize, int32_t size);
void cupvaGSDFSwseqUpdateSize2DPriv(GSDFHandler *handler, uint16_t const *tx, uint16_t const *ty, int32_t size);
void cupvaGSDFSwseqUpdateSize2DPriv(GSDFHandler *handler, uint16_t tx, uint16_t ty, int32_t size);
void cupvaGSDFSwseqUpdateTilesPriv(GSDFHandler *handler, int32_t const *xCoords, int32_t const *yCoords,
uint16_t const *tx, uint16_t const *ty, int32_t size);
void cupvaGSDFSwseqUpdateTilesPriv(GSDFHandler *handler, int32_t const *xCoords, int32_t const *yCoords,
uint16_t const tx, uint16_t const ty, int32_t size);
void cupvaGSDFSwseqUpdateTilesPriv(GSDFHandler *handler, int32_t const *xCoords, int32_t const *yCoords, int32_t size);
void cupvaGSDFSwseqUpdateTilesWithOffsetsPriv(GSDFHandler *handler, int32_t const *xCoords, int32_t const *yCoords,
int32_t const *offsets, uint16_t const *tx, uint16_t const *ty,
int32_t size);
void cupvaGSDFSwseqUpdateTilesWithOffsetsPriv(GSDFHandler *handler, int32_t const *xCoords, int32_t const *yCoords,
int32_t const *offsets, uint16_t const tx, uint16_t const ty,
int32_t size);
void cupvaGSDFSwseqUpdateTilesWithOffsetsPriv(GSDFHandler *handler, int32_t const *xCoords, int32_t const *yCoords,
int32_t const *offsets, int32_t size);
void cupvaGSDFSwseqUpdatePlaneIndicesPriv(GSDFHandler *handler, uint8_t const *planeIndices, int32_t const size);
bool cupvaGSDFSwseqOpenPriv(GSDFHandlerUniform *handler, void *addr, uint16_t linePitch, uint32_t stride);
void cupvaGSDFSwseqClosePriv(GSDFHandlerUniform *handler);
bool cupvaGSDFSwseqResetExtBasePriv(GSDFHandlerUniform *handler, ExtMemPointer const *addr, uint16_t width,
uint16_t height, uint16_t linePitch);
bool cupvaGSDFSwseqResetExtBasePriv(GSDFHandlerUniform *handler, ExtMemPointer const *addr, PlanarGeometry const *geom);
void cupvaGSDFSwseqUpdateVmemAddrPriv(GSDFHandlerUniform *handler, void *addr, uint16_t linePitch, uint32_t stride);
void cupvaGSDFSwseqUpdateOffsets1DPriv(GSDFHandlerUniform *handler, int32_t const *offsets);
void cupvaGSDFSwseqUpdateOffsets2DPriv(GSDFHandlerUniform *handler, int32_t const *xCoords, int32_t const *yCoords);
void cupvaGSDFSwseqUpdateSize1DPriv(GSDFHandlerUniform *handler, uint16_t transferSize);
void cupvaGSDFSwseqUpdateSize2DPriv(GSDFHandlerUniform *handler, uint16_t tx, uint16_t ty);
void cupvaGSDFSwseqUpdatePlaneIndicesPriv(GSDFHandlerUniform *handler, uint8_t const *planeIndices);
#endif