blob: fd88b84428497e0f5bb39502b0ae3d3cd3854929 [file] [log] [blame]
/*
* Copyright (c) 2013-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 codechal_memdecomp.h
//! \brief Defines data structures and interfaces for media memory decompression.
//! \details
//!
#ifndef __CODECHAL_MEDIAMEMCOMP_H__
#define __CODECHAL_MEDIAMEMCOMP_H__
#include "mhw_render.h"
#include "mos_os.h"
#include "mediamemdecomp.h"
//!
//! \class MediaMemDecompState
//! \brief Media memory decompression state. This class defines the member fields
//! functions etc used by memory decompression.
//!
class MediaMemDecompState : public MediaMemDecompBaseState
{
public:
//!
//! \brief Constructor
//!
MediaMemDecompState();
//!
//! \brief Copy constructor
//!
MediaMemDecompState(const MediaMemDecompState&) = delete;
//!
//! \brief Copy assignment operator
//!
MediaMemDecompState& operator=(const MediaMemDecompState&) = delete;
//!
//! \brief Destructor
//!
virtual ~MediaMemDecompState();
//!
//! \brief Media memory decompression
//! \details Entry point to decompress media memory
//! \param targetResource
//! [in] The surface will be decompressed
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS MemoryDecompress(
PMOS_RESOURCE targetResource);
//!
//! \brief Initialize memory decompress state
//! \details Initialize memory decompress state
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS Initialize(
PMOS_INTERFACE osInterface,
MhwCpInterface *cpInterface,
MhwMiInterface *miInterface,
MhwRenderInterface *renderInterface);
virtual PMOS_INTERFACE GetDecompStateMosInterface()
{
return m_osInterface;
}
protected:
//!
//! \enum DecompKernelStateIdx
//! \brief Decompress kernel state index
//!
enum DecompKernelStateIdx
{
decompKernelStatePa = 0,
decompKernelStatePl2,
decompKernelStateMax
};
//!
//! \enum CopyBindingTableOffset
//! \brief Decompress copy kernel binding table offset
//!
enum CopyBindingTableOffset
{
copySurfaceSrcY = 0,
copySurfaceSrcU = 1,
copySurfaceSrcV = 2,
copySurfaceDstY = 3,
copySurfaceDstU = 4,
copySurfaceDstV = 5,
copySurfaceNum = 6
};
//!
//! \brief Initialize kernel state
//! \details Initialize kernel state
//! \param kernelStateIdx
//! [in] Kernel state index
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS InitKernelState(uint32_t kernelStateIdx);
//!
//! \brief Gets a kernel information for a specific unique kernel identifier
//! \details Gets a kernel information for a specific unique kernel identifier
//! from the combined kernel
//! \param kernelBase
//! [in] The combined kernel
//! \param krnUniId
//! [in] The unique kernel identifier in the combined kernel
//! \param kernelBinary
//! [in,out] The binary of the kernel specified by krnUniId
//! \param kernelSize
//! [in,out] The size of the kernel specified by krnUniId
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS GetKernelBinaryAndSize(
uint8_t *kernelBase,
uint32_t krnUniId,
uint8_t **kernelBinary,
uint32_t *kernelSize);
//!
//! \brief Sets up the CURBE data for MMC and loads it into the DSH
//! \details Calculates the kernel binary location and size and saves this information to either the
//! state heap interface or the provided kernel state
//! \param kernelStateIdx
//! [in] The type of copy kernel (PA or PL2)
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS SetMediaObjectCopyCurbe(
DecompKernelStateIdx kernelStateIdx);
//!
//! \brief Set copy kernel states parameters
//! \details Set copy kernel states parameters for MMC
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS SetKernelStateParams();
//!
//! \brief Get resource information
//! \details Get resource information for the specifc surface
//! \param surface
//! [in] Surface pointer
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS GetResourceInfo(PMOS_SURFACE surface);
//!
//! \brief Get the surface width in bytes
//! \details Get the suface width in bytes
//! \param surface
//! [in] Surface pointer
//! \return uint32_t
//! Output the surface width
//!
uint32_t GetSurfaceWidthInBytes(PMOS_SURFACE surface);
//!
//! \brief Updates GPU Sync Tag (H/W Tag) using MI_STORE_DATA_IMM command.
//! \details Updates GPU Sync Tag (H/W Tag) using MI_STORE_DATA_IMM command.
//! \param cmdBuffer
//! [in] Resource to decompress
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS WriteSyncTagToResourceCmd(
PMOS_COMMAND_BUFFER cmdBuffer);
static constexpr uint32_t m_numMemDecompSyncTags = 8; //!< Number of memory decompress sync tags
PMOS_INTERFACE m_osInterface = nullptr; //!< Pointer to Os Inteface
MhwCpInterface *m_cpInterface = nullptr; //!< Pointer to Cp Interface
MhwMiInterface *m_miInterface = nullptr; //!< Pointer to MhwMiInterface
MhwRenderInterface *m_renderInterface = nullptr; //!< Pointer to MhwRenderInterface
PMHW_STATE_HEAP_INTERFACE m_stateHeapInterface = nullptr; //!< Pointer to PMHW_STATE_HEAP_INTERFACE
uint8_t *m_kernelBase = nullptr; //!< Pointer to kernel base address
MHW_STATE_HEAP_SETTINGS m_stateHeapSettings; //!< State heap setting
uint32_t m_krnUniId[decompKernelStateMax]; //!< Kernel unique ID
uint8_t *m_kernelBinary[decompKernelStateMax]; //!< Kernel binary
uint32_t m_kernelSize[decompKernelStateMax]; //!< Kernel size
MHW_KERNEL_STATE m_kernelStates[decompKernelStateMax]; //!< Kernel state
MOS_GPU_CONTEXT m_renderContext; //!< Render GPU context
bool m_renderContextUsesNullHw = false; //!< Indicate if render context use null hw or not
bool m_disableDecodeSyncLock = false; //!< Indicate if decode sync lock disabled or not
bool m_disableLockForTranscode = false; //!< Indicate if lock is disabled for transcode or not
uint32_t *m_cmdBufIdGlobal = nullptr; //!< Pointer to command buffer global Id
MOS_RESOURCE m_resCmdBufIdGlobal; //!< Resource for command buffer global Id
uint32_t m_currCmdBufId; //!< Current command buffer Id
};
#endif //__CODECHAL_MEDIAMEMCOMP_H__