blob: 6355104fc6699a3355a08572afd89a0438c6a338 [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 mos_graphicsresource_specific.h
//! \brief Container class for the linux/Android specfic graphic resource
//!
#ifndef __GRAPHICS_RESOURCE_SPECIFIC_H__
#define __GRAPHICS_RESOURCE_SPECIFIC_H__
#include "mos_graphicsresource.h"
class GraphicsResourceSpecific : public GraphicsResource
{
public:
//!
//! \brief Constructor
//!
GraphicsResourceSpecific();
//!
//! \brief Destructor
//!
~GraphicsResourceSpecific();
//!
//! \brief to sync render target for multi-threading decoding mode
//!
struct HybridSem
{
public:
//!
//! \brief Semaphore queue for hybrid decoding multi-threading case
//!
PMOS_SEMAPHORE* m_pCurrentFrameSemaphore = nullptr;
//!
//! \brief Semaphore queue for hybrid decoding multi-threading case; post when a
//! surface is not used as reference frame
//!
PMOS_SEMAPHORE* m_pReferenceFrameSemaphore = nullptr;
//!
//! \brief Flag to mark whether the semaphore has been initialized
//!
bool m_semInitialized = false;
};
//!
//! \brief Add a sync tag to the graphic resource
//! \param [in] osContextPtr
//! Pointer to the osContext handle
//! \param [in] params
//! Parameters to do the synchronization
//! \return MOS_SUCCESS on success case
//!
MOS_STATUS SetSyncTag(OsContext* osContextPtr, SyncParams& params, uint32_t streamIndex);
//!
//! \brief Check whether the resource is nullptr
//! \return ture if the resource is nullptr, false on other cases
//!
bool ResourceIsNull();
//!
//! \brief Allocate the graphic memory to back up the graphic resource
//! \param [in] osContextPtr
//! Pointer to the osContext handle
//! \param [in] params
//! Resource creation Params
//! \return MOS_STATUS_SUCCESS on success case, MOS error status on fail cases
//!
MOS_STATUS Allocate(OsContext* osContextPtr, CreateParams& params);
//!
//! \brief Frees the specified resource with flag, if locked, unlocks it.
//! \param [in] osContextPtr
//! Pointer to the osContext handle
//! \param [in] freeFlag
//! flags for the free operation
//!
void Free(OsContext* osContextPtr, uint32_t freeFlag = 0);
//!
//! \brief Check whether the specific graphic resouces is equal to the current one
//! \param [in] toCompare
//! ptr to the graphics resource to be compared with
//! \return Returns true if the two resources are equal and false otherwise.
//!
bool IsEqual(GraphicsResource* toCompare);
//!
//! \brief Check whether the current graphic resouce is valid
//! \return Returns true if a resource is valid and false otherwise.
//!
bool IsValid();
//!
//! \brief Locks a resource and returns a mapped system memory pointer.
//! \param [in] osContextPtr
//! Pointer to the osContext handle
//! \param [in] params
//! Resource lock Params
//! \return CPU side lock address in success case, nullptr in fail cases
//!
void* Lock(OsContext* osContextPtr, LockParams& params);
//!
//! \brief Unlocks a resource that has already been locked, if no lock has
//! occurred, this function does nothing
//! \param [in] osContextPtr
//! Pointer to the osContext handle
//! \return MOS_SUCCESS in success case, MOS error status in fail cases
//!
MOS_STATUS Unlock(OsContext* osContextPtr);
//!
//! \brief Converts an OS specific resource to a MOS resource.
//! \param [in] mosResourcePtr
//! ptr to the MosResource to be filled w/ the conversion result
//! \return MOS_SUCCESS on success case
//!
MOS_STATUS ConvertToMosResource(MOS_RESOURCE* mosResourcePtr);
MOS_LINUX_BO* GetBufferObject(){return m_bo;};
protected:
//!
//! \brief Converts MOS format infot GMM format.
//! \return the converting result.
//!
GMM_RESOURCE_FORMAT ConvertMosFmtToGmmFmt(MOS_FORMAT format);
private:
//!
//! \brief Pointer to the GMM info structure
//!
GMM_RESOURCE_INFO* m_gmmResInfo = nullptr;
//!
//! \brief Whether the graphic resource is mapped at CPU side
//!
bool m_mapped = false;
//!
//! \brief The map operation type we use
//!
MOS_MMAP_OPERATION m_mmapOperation = MOS_MMAP_OPERATION_NONE;
//!
//! \brief the ptr to the buffer object of the graphic buffer
//!
MOS_LINUX_BO* m_bo = nullptr;
//!
//! \brief the semaphore used in hybrid decoder corresponding to the graphic buffer
//!
HybridSem m_hybridSem = {};
uint8_t* m_systemShadow = nullptr; //!< System shadow surface for s/w untiling
};
#endif // #ifndef __GRAPHICS_RESOURCE_SPECIFIC_H__