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