blob: d2f969fde1ddb34db63b9edb040b4c163c8ba194 [file] [log] [blame]
/* Copyright 2022 Advanced Micro Devices, Inc.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE.
*
* Authors: AMD
*
*/
/** @mainpage VPELIB
* @section intro_sec Introduction
*
* VPE is a hardware pipeline that does baseline video processing from DRAM to DRAM.
* The objective of VPE is to offload the graphic workload to VPE to save power.
* The main functionality of VPE is to read video stream from memory, process the video stream and
* write it back to memory. VPE is meant to augment the abilities of both the graphics (GFX) and
* multi plane overlay (MPO) and deliver more power efficient use cases.
*
*
* @section main_api Main API Functions
* @subsection create VPE Create
* @link vpe_create @endlink
* @subsection destroy VPE Destroy
* @link vpe_destroy @endlink
* @subsection check_support VPE Check Support
* @link vpe_check_support @endlink
* @subsection vpe_build_noops VPE Build No-Operation Commands
* @link vpe_build_noops @endlink
* @subsection build_commands VPE Build Commands
* @link vpe_build_commands @endlink
* @subsection get_optimal_num_of_taps VPE Get the Optimal Number of Taps
* @link vpe_get_optimal_num_of_taps @endlink
* @file vpelib.h
* @brief This is the file containing the main API for the VPE library.
*
*/
#pragma once
#include "vpe_types.h"
#include "vpe_version.h"
#ifdef __cplusplus
extern "C" {
#endif
/** @brief Create the VPE lib instance.
*
* Caler provides the current asic info,
* logging and system memory APIs.
* It initializes all the necessary resources for the asic
* and returns the general capabilities of the engines.
*
* For capabilities based on conditions,
* shall be done by vpe->cap_funcs.*
*
*
* @param[in] params provide the asic version, APIs for logging and memory
* @return vpe instance if supported. NULL otherwise
*/
struct vpe *vpe_create(const struct vpe_init_data *params);
/** @brief Destroy the VPE lib instance and resources
*
* @param[in] vpe the vpe instance created by vpe_create
*/
void vpe_destroy(struct vpe **vpe);
/**
* @brief Check if the VPE operation is supported.
*
* Caller must call this to check if the VPE supports
* the requested operation before calling vpe_build_commands().
* If operation is supported, it returns the memory requirement.
*
* The caller has to prepare those required memories
* and pass them to the vpe_build_commands().
*
* @param[in] vpe vpe instance returned by vpe_initialize()
* @param[in] param build params
* @param[out] req memory required for the command buffer and
embedded data if return VPE_OK.
caller has to alloc them and provide it to build_vpbilts API.
* @return VPE_OK if supported
*/
enum vpe_status vpe_check_support(
struct vpe *vpe, const struct vpe_build_param *param, struct vpe_bufs_req *req);
/************************************
* Command building functions
************************************/
/**
* Build the command descriptors for No-Op operation
* @param[in] vpe vpe instance created by vpe_create()
* @param[in] num_dwords number of noops
* @param[in,out] ppcmd_space in: dword aligned command buffer start address
* out: dword aligned next good write address
* @return status
*/
enum vpe_status vpe_build_noops(struct vpe *vpe, uint32_t num_dwords, uint32_t **ppcmd_space);
/**
* build the command descriptors for the given param.
* caller must call vpe_check_support() before this function,
* unexpected result otherwise.
*
* @param[in] vpe vpe instance created by vpe_create()
* @param[in] param vpe build params
* @param[in,out] bufs [in] memory allocated for the command buffer, embedded buffer and 3dlut.
* If size is 0, it reports the required size for this checked
* operation. [out] the next write address and the filled sizes.
* @return status
*/
enum vpe_status vpe_build_commands(
struct vpe *vpe, const struct vpe_build_param *param, struct vpe_build_bufs *bufs);
/**
* get the optimal number of taps based on the scaling ratio.
* @param[in] vpe vpe instance created by vpe_create()
* @param[in,out] scaling_info [in] source and destination rectangles [out] calculated taps.
*/
void vpe_get_optimal_num_of_taps(struct vpe *vpe, struct vpe_scaling_info *scaling_info);
#ifdef __cplusplus
}
#endif