blob: 74ec8f9c60c862eabe24624d22a1c294ff603827 [file] [log] [blame]
/*
* Copyright (c) 2017, Intel Corporation
*
* 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 AUTHORS OR COPYRIGHT HOLDERS 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.
*/
//!
//! \file cm_surface_3d.h
//! \brief Contains CmSurface3D declarations.
//!
#ifndef MEDIADRIVER_AGNOSTIC_COMMON_CM_CMSURFACE3D_H_
#define MEDIADRIVER_AGNOSTIC_COMMON_CM_CMSURFACE3D_H_
#include "cm_def.h"
namespace CMRT_UMD
{
class CmEvent;
//! \brief CmSurface3D class to manage 3D surface in video memory.
//! \details CmSurface3D represents a 3D surface in video memory. Each
//! CmSurface3D object is associated with a SurfaceIndex object
//! containing a unique index value the surface is mapped to when
//! created by the CmDevice. The CmDevice keeps the mapping b/w
//! index and CmSurface3D. The SurfaceIndex is passed to CM kernel
//! function as argument to indicate the surface.
class CmSurface3D
{
public:
//! \brief This function returns the SurfaceIndex object associated
//! with the surface.
//! \param [out] index
//! Reference to the pointer to the SurfaceIndex.
//! \returns Always returns CM_SUCCESS.
CM_RT_API virtual int32_t GetIndex(SurfaceIndex* &index) = 0;
//! \brief Copy the surface content to system memory.
//! \details The size of data copied is the size of data in surface. It is
//! the caller's responsibility to allocate the system memory.
//! This is a blocking function, i.e. the function will not
//! return until the copy operation is completed. Surface
//! reading will not happen until the status of the dependent
//! event becomes CM_STATUS_FINISHED. It is application's
//! responsibility to make sure no other task enqueued after
//! the task corresponding to the dependent task but before
//! ReadSurface. If sysMemSize is given, it will be checked
//! against the size needed for the surface.
//! \param [in] sysMem
//! pointer to the target system memory.
//! \param [in] event
//! pointer to the dependent event. See also CmEvent.
//! \param [in] sysMemSize
//! size of the system memory. Default value is -1 which means
//! no memory size checking.
//! \retval CM_SUCCESS if the copy is successful.
//! \retval CM_INVALID_ARG_VALUE if sysMem is nullptr or the sysMemSize
//! is less than total size of CmSurface3D.
//! \retval CM_LOCK_SURFACE_FAIL if surface locking is failed.
//! \retval CM_EXCEED_MAX_TIMEOUT if the dependent task times out.
//! \retval CM_FAILURE otherwise.
CM_RT_API virtual int32_t
ReadSurface(unsigned char *sysMem,
CmEvent *event,
uint64_t sysMemSize = 0xFFFFFFFFFFFFFFFFULL) = 0;
//! \brief Copy system memory content to surface.
//! \details The size of data copied is the size of data in surface. It is the
//! caller's responsibility to allocate the system memory. This
//! is a blocking function, i.e. the function will not return
//! until the copy operation is completed. Surface writing will
//! not happen until the status of the dependent event becomes
//! CM_STATUS_FINISHED. The dependent event for WriteSurface is
//! usually NULL. If sysMemSize is given, it will be checked
//! against the size needed for the surface.
//! \param [in] sysMem
//! pointer to the source system memory.
//! \param [in] event
//! pointer to the dependent event. See also CmEvent.
//! \param [in] sysMemSize
//! size of the system memory. The default value is -1, which
//! means no memory size checking.
//! \retval CM_SUCCESS if the copy is successful.
//! \retval CM_INVALID_ARG_VALUE if sysMem is nullptr or the sysMemSize
//! is less than total size of CmSurface3D.
//! \retval CM_LOCK_SURFACE_FAIL if surface locking is failed.
//! \retval CM_EXCEED_MAX_TIMEOUT if the dependent task times out.
//! \retval CM_FAILURE otherwise.
CM_RT_API virtual int32_t
WriteSurface(const unsigned char *sysMem,
CmEvent *event,
uint64_t sysMemSize = 0xFFFFFFFFFFFFFFFFULL) = 0;
//! \brief Set memory in surface to initValue.
//! \details The size of data initialized is the size of data in the surface. This
//! is a blocking function, i.e. the function will not return
//! until the memset operation is completed. Surface
//! initialization will not happen until the status of the
//! dependent event becomes CM_STATUS_FINISHED. The dependent
//! event for InitSurface is usually NULL.
//! \param [in] initValue
//! 4-byte value used to initilize the memory.
//! \param [in] event
//! pointer to the dependent event. See also CmEvent.
//! \retval CM_SUCCESS if the copy is successful.
//! \retval CM_LOCK_SURFACE_FAIL if surface locking is failed.
//! \retval CM_FAILURE otherwise.
CM_RT_API virtual int32_t InitSurface(const uint32_t initValue,
CmEvent *event) = 0;
//! \brief Selects one of the pre-defined memory object control
//! settings for this surface.
//! \param [in] memCtrl
//! the selected pre-defined memory object control setting.
//! See also MEMORY_OBJECT_CONTROL.
//! \retval CM_SUCCESS if the copy is successful.
//! \retval CM_FAILURE otherwise.
//! \note This API is platform related, and only for SKL and plus platforms.
CM_RT_API virtual int32_t
SelectMemoryObjectControlSetting(MEMORY_OBJECT_CONTROL memCtrl) = 0;
//!
//! \brief Selects one of the pre-defined MOS resource usage settings for this surface.
//! \note This function works on Gen9+ paltforms.
//! \param [in] mosUsage
//! The selected pre-defined MOS resource usage for memory object control setting.
//! \retval CM_SUCCESS if the given parameter is valid
//! \retval CM_FAILURE otherwise.
//!
CMRT_UMD_API virtual int32_t SetResourceUsage(const MOS_HW_RESOURCE_DEF mosUsage) = 0;
};
};//namespace
#endif // #ifndef MEDIADRIVER_AGNOSTIC_COMMON_CM_CMSURFACE3D_H_