blob: 478b3741ccccdb07a59b3cf861f0dcd028aec85b [file] [log] [blame]
/*
* Copyright (c) 2017-2018, 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 codechal_mmc.h
//! \brief Defines the public interface for CodecHal Media Memory Compression
//!
#ifndef __CODECHAL_MMC_H__
#define __CODECHAL_MMC_H__
#include "codechal_utilities.h"
//!
//! \brief Forward declarations
//!
typedef struct _MHW_PIPE_CONTROL_PARAMS *PMHW_PIPE_CONTROL_PARAMS;
typedef struct _MHW_VDBOX_SURFACE_PARAMS *PMHW_VDBOX_SURFACE_PARAMS;
using PMHW_VDBOX_PIPE_BUF_ADDR_PARAMS = MHW_VDBOX_PIPE_BUF_ADDR_PARAMS * ;
//! \class CodecHalMmcState
//! \brief Media memory compression state. This class defines the member fields
//! functions etc used by memory compression.
//!
class CodecHalMmcState
{
public:
//!
//! \brief Constructor
//!
CodecHalMmcState(CodechalHwInterface *hwInterface);
//!
//! \brief Destructor
//!
virtual ~CodecHalMmcState() {};
//!
//! \brief Check if MMC is enabled
//!
//! \return bool
//! true if mmc is enabled, else false
//!
bool IsMmcEnabled();
//!
//! \brief Disable MMC state
//!
//! \return void
//!
void SetMmcDisabled();
//!
//! \brief Get surface memory compression state
//! \param [out] surface
//! Pointer to PMOS_SURFACE
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS GetSurfaceMmcState(PMOS_SURFACE surface);
//!
//! \brief Disable surface memory compression state
//! \param [in,out] surface
//! Pointer to PMOS_SURFACE
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS DisableSurfaceMmcState(PMOS_SURFACE surface);
//!
//! \brief Set destinate surface memory compression state by source surface
//! \param [out] dstSurface
//! Pointer to PMOS_SURFACE
//! \param [in] srcSurface
//! Pointer to PMOS_SURFACE
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS SetSurfaceMmcMode(
PMOS_SURFACE dstSurface,
PMOS_SURFACE srcSurface);
//!
//! \brief Set surface paramter
//! \param [in,out] surfaceParams
//! Pointer to PCODECHAL_SURFACE_CODEC_PARAMS
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS SetSurfaceParams(
PCODECHAL_SURFACE_CODEC_PARAMS surfaceParams);
//!
//! \brief Set pipe buffer address parameter
//! \details Set pipe buffer address parameter in MMC case
//!
//! \param [in,out] pipeBufAddrParams
//! Pointer to PMHW_VDBOX_PIPE_BUF_ADDR_PARAMS
//! \param [in] cmdBuffer
//! Pointer to MOS command buffer
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS SetPipeBufAddr(
PMHW_VDBOX_PIPE_BUF_ADDR_PARAMS pipeBufAddrParams,
PMOS_COMMAND_BUFFER cmdBuffer = nullptr)
{
return MOS_STATUS_SUCCESS;
};
//!
//! \brief Set Surface State MMC state parameter
//! \details Set MMC state for speficied SurfaceState cmd parameters
//!
//! \param [in,out] surfaceStateParams
//! Pointer to PMHW_VDBOX_SURFACE_PARAMS
//! \param [in] cmdBuffer
//! Pointer to MOS command buffer
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS SetSurfaceState(
PMHW_VDBOX_SURFACE_PARAMS surfaceStateParams,
PMOS_COMMAND_BUFFER cmdBuffer = nullptr)
{
return MOS_STATUS_SUCCESS;
};
//!
//! \brief Send prolog MI cmds used to control MMC state
//! \details Send H/W MMIO cmds used to initialze MMC related states
//!
//! \param [in] miInterface
//! Pointer to MhwMiInterface
//! \param [in] cmdBuffer
//! Command buffer pointer
//! \param [in] gpuContext
//! Current pipe of the cmd buffer
//!
//! \return MOS_STATUS
//! Return status of sending register MMIOs
virtual MOS_STATUS SendPrologCmd(
MhwMiInterface *miInterface,
MOS_COMMAND_BUFFER *cmdBuffer,
MOS_GPU_CONTEXT gpuContext)
{
return MOS_STATUS_SUCCESS;
}
//!
//! \brief Set reference sync
//! \details Set reference sync, check if reference surface needs to be synchronized in MMC case
//!
//! \param [in] disableDecodeSyncLock
//! Indicates if decode sync lock is disabled
//! \param [in] disableLockForTranscode
//! Indicates if transcoe lock is disabled
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS SetRefrenceSync(
bool disableDecodeSyncLock,
bool disableLockForTranscode)
{
MOS_UNUSED(disableDecodeSyncLock);
MOS_UNUSED(disableLockForTranscode);
return MOS_STATUS_SUCCESS;
};
//!
//! \brief Check reference list
//! \details Check reference list, including self-reference detection and mmc state consistence detection
//!
//! \param [in,out] pipeBufAddrParams
//! Pointer to PMHW_VDBOX_PIPE_BUF_ADDR_PARAMS
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS CheckReferenceList(
PMHW_VDBOX_PIPE_BUF_ADDR_PARAMS pipeBufAddrParams)
{
return MOS_STATUS_SUCCESS;
};
#if (_DEBUG || _RELEASE_INTERNAL)
//!
//! \brief Update mmc user feature key
//! \details Report out the memory compression state for render target surface
//!
//! \param [in] surface
//! Pointer to PMOS_SURFACE
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS UpdateUserFeatureKey(PMOS_SURFACE surface);
#endif
//!
//! \brief Is extension MMC
//! \details Report if is extension MMC
//!
//! \return bool
//!
bool IsMmcExtensionEnabled()
{
return m_mmcExtensionEnabled;
}
protected:
bool m_mmcEnabled = false; //!< Indicate if media memory compression is enabled
PMOS_INTERFACE m_osInterface = nullptr; //!< Os Inteface
CodechalHwInterface *m_hwInterface = nullptr; //!< Pointer to HW Interface
bool m_hcpMmcEnabled = false; //!< Inidate if hcp mmc is enabled
bool m_10bitMmcEnabled = false; //!< Inidate if 10bit mmc is enabled
bool m_gpuMmuPageFaultEnabled = false; //!< Inidate if page fault is enabled
#if (_DEBUG || _RELEASE_INTERNAL)
bool m_userFeatureUpdated = false; //!< Inidate if mmc user feature key is updated
uint32_t m_compressibleId = 0;
uint32_t m_compressModeId = 0;
#endif
bool m_mmcExtensionEnabled = false; //!< Indicate if extension MMC
};
#endif // __CODECHAL_MMC_H__