﻿/*
* Copyright (c) 2019, 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_gpucontextmgr_next.h
//! \brief    Container class for the gpu context manager
//!

#ifndef __MOS_GPU_CONTEXT_MGR_NEXT_H__
#define __MOS_GPU_CONTEXT_MGR_NEXT_H__

#include "mos_os_next.h"
#include "mos_gpucontext_next.h"

class OsContextNext;
//!
//! \class  GpuContextMgr
//!
class GpuContextMgrNext
{
public:
    //!
    //! \brief  Constructor
    //!
    GpuContextMgrNext(GT_SYSTEM_INFO *gtSystemInfo, OsContextNext *osContext);

    //!
    //! \brief    Copy constructor
    //!
    GpuContextMgrNext(const GpuContextMgrNext&) = delete;

    //!
    //! \brief    Copy assignment operator
    //!
    GpuContextMgrNext& operator=(const GpuContextMgrNext&) = delete;

    //!
    //! \brief  Destructor
    //!
    virtual ~GpuContextMgrNext();

    //!
    //! \brief    Static entrypoint, get gpu context manager object
    //! \return   GpuContextMgrNext*
    //!           gpu context manager specific object if success, else nullptr
    //!
    static GpuContextMgrNext* GetObject(
        GT_SYSTEM_INFO *gtSystemInfo,
        OsContextNext      *osContext);

    //!
    //! \brief    Initialized the gpu context manager
    //!
    //!
    virtual MOS_STATUS Initialize();

    //!
    //! \brief    Clean up the gpu context manager
    //! \details  This function mainly celar all allocated gpu context in 
    //!           apu context array
    //!
    void CleanUp();

    //!
    //! \brief    Create GPU context
    //! \param    [in] gpuNode
    //!           Reqired gpu node
    //! \param    [in] cmdBufMgr
    //!           Command buffer manager 
    //! \return   GpuContext*
    //!           Gpu context pointer if success, otherwise nullptr
    //!
    virtual GpuContextNext* CreateGpuContext(
        const MOS_GPU_NODE gpuNode,
        CmdBufMgrNext     *cmdBufMgr);

    //!
    //! \brief    Get GPU context base on gpu context handle
    //! \detail   Gpu context manager maintain an array, gpu context handle
    //!           as its index.
    //! \param    [in] gpuContextHandle
    //!           Reqired gpu context's handle
    //! \return   GpuContext*
    //!           Gpu context pointer if success, otherwise nullptr
    //!
    virtual GpuContextNext* GetGpuContext(GPU_CONTEXT_HANDLE gpuContextHandle);

    //!
    //! \brief    Destroy specified gpu context
    //! \param    [in] gpuContext
    //!           Gpu context need to be destroyed
    //!
    virtual void DestroyGpuContext(GpuContextNext *gpuContext);

    //!
    //! \brief    Destroy all gpu context instance
    //! \detail   Destroy all gpu context maintained in m_gpuContextArray
    //!
    void DestroyAllGpuContexts();

    //!
    //! \brief    Determine whether gpu context reuse is needed
    //! \detail   Implementation to be added after reuse scheme is nailed down
    //! \return   bool
    //!           True if needed, otherwise false
    //!
    bool ContextReuseNeeded();

    //!
    //! \brief    Select one gpu context to be reused
    //! \detail   Implementation to be added after reuse scheme is nailed down
    //! \return   GpuContext*
    //!           Gpu context pointer if success, otherwise nullptr
    //!
    GpuContextNext* SelectContextToReuse();

    //!
    //! \brief    Get os context used in manager
    //! \return   OsContext*
    //!           Os context pointer if success, otherwise nullptr
    //!
    OsContextNext* GetOsContext(){ return m_osContext; }

    //!
    //! \brief    Get Gpu context number
    //! \return   uint32_t
    //!           Number of all Gpu contexts, include the node which was already destroyed
    //!
    uint32_t GetGpuContextNumber()
    {
        return m_gpuContextArray.size();
    }

        //!
    //! \brief    Get the validity flag
    //! \return   bool
    //!           Get the validity flag of GpuContextMgrNext
    //!
    bool IsInitialized()
    {
        return m_initialized;
    }

    //! \brief   Indicate whether new gpu context is inserted into the first slot w/ null ctx handle 
    //!          or always at the end of the gpucontext array
    bool m_noCycledGpuCxtMgmt = false;

protected:
    GpuContextMgrNext() = default;
    //! \brief    Gt system info 
    //! \detail   reserve to reuse gpu context
    GT_SYSTEM_INFO m_gtSystemInfo = {};

    //! \brief    Os Context
    OsContextNext *m_osContext = nullptr;

    //! \brief    Gpu context array mutex
    PMOS_MUTEX m_gpuContextArrayMutex = nullptr;
    
    //! \brief    Gpu context count
    uint32_t m_gpuContextCount = 0;

    //! \brief    Maintained gpu context array
    std::vector<GpuContextNext *> m_gpuContextArray;

    //! \brief   Flag to indicate gpu context mgr initialized or not
    bool m_initialized = false;
};

#endif  // #ifndef __MOS_GPU_CONTEXT_MGR_NEXT_H__
