blob: 016a3e98d8464d885111ba4eb536d00f9a08bd07 [file] [log] [blame]
/*
* 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_gpucontext_next.h
//! \brief Container class for the basic gpu context
//!
#ifndef __MOS_GPU_CONTEXT_NEXT_H__
#define __MOS_GPU_CONTEXT_NEXT_H__
#include "mos_os_next.h"
class CmdBufMgrNext;
class CommandBufferNext;
class CommandBufferSpecificNext;
class GraphicsResourceNext;
//!
//! \class GpuContext
//!
class GpuContextNext
{
public:
//!
//! \brief Constructor
//!
GpuContextNext(){}
//!
//! \brief Destructor
//!
virtual ~GpuContextNext(){}
//!
//! \brief Static entrypoint, get the gpu context object
//! \param [in] gpuNode
//! Gpu node
//! \param [in] cmdBufMgr
//! Command buffer manager
//! \param [in] reusedContext
//! Reused gpu context
//! \return GpuContextNext*
//! the os specific object for gpu context
//!
static class GpuContextNext* Create(
const MOS_GPU_NODE gpuNode,
CmdBufMgrNext *cmdBufMgr,
GpuContextNext *reusedContext);
//!
//! \brief Clear gpu context
//!
virtual void Clear() = 0;
//!
//! \brief Verify command buffer size
//! \details Verifys the buffer to be used for rendering GPU commands is large enough
//! \param [in] requestedSize
//! Buffer size requested
//! \return MOS_STATUS
//! Return MOS_STATUS_SUCCESS if successful (command buffer will be large enough)
//! otherwise failed reason
//!
virtual MOS_STATUS VerifyCommandBufferSize(
const uint32_t requestedSize) = 0;
//!
//! \brief Get indirect state size
//! \details Retrieves indirect state to be used for rendering purposes
//! \param [out] offset
//! Reference to indirect buffer offset
//! \param [out] size
//! Reference to indirect buffer size
//! \return MOS_STATUS
//! Return MOS_STATUS_SUCCESS if successful, otherwise failed
//!
virtual MOS_STATUS GetIndirectState(
uint32_t &offset,
uint32_t &size) = 0;
//!
//! \brief Get Indirect State Pointer
//! \param [out] indirectState
//! Pointer to Indirect State Buffer
//! \return MOS_STATUS
//! Return MOS_STATUS_SUCCESS if successful, otherwise failed
//!
virtual MOS_STATUS GetIndirectStatePointer(
uint8_t **indirectState) = 0;
//!
//! \brief Get command buffer
//! \details Retrieves buffer to be used for rendering GPU commands
//! \param [in/out] cmdBuffer
//! Pointer to Command Buffer control structure
//! \param [in] flags
//! Flags to indicate command buffer property
//! \return MOS_STATUS
//! Return MOS_STATUS_SUCCESS if successful, otherwise failed
//!
virtual MOS_STATUS GetCommandBuffer(
PMOS_COMMAND_BUFFER cmdBuffer,
uint32_t flags) = 0;
//!
//! \brief Return command buffer space
//! \details Return unused command buffer space
//! \param [in/out] cmdBuffer
//! Pointer to Command Buffer control structure
//! \param [in] flags
//! Flags to indicate command buffer property
//!
virtual void ReturnCommandBuffer(
PMOS_COMMAND_BUFFER cmdBuffer,
uint32_t flags) = 0;
//!
//! \brief Submit command buffer
//! \details Submit the command buffer
//! \param [in] streamState
//! OS stream state
//! \param [in] cmdBuffer
//! Pointer to Command Buffer control structure
//! \param [in] nullRendering
//! boolean null rendering
//! \return MOS_STATUS
//! Return MOS_STATUS_SUCCESS if successful, otherwise failed
//!
virtual MOS_STATUS SubmitCommandBuffer(
MOS_STREAM_HANDLE streamState,
PMOS_COMMAND_BUFFER cmdBuffer,
bool nullRendering) = 0;
//!
//! \brief Resizes the buffer to be used for rendering GPU commands
//! \param [in] requestedCommandBufferSize
//! requested command buffer size
//! \param [in] requestedPatchListSize
//! requested patch list size
//! \param [in] flags
//! Flags to indicate command buffer property
//! \return MOS_STATUS
//! Return MOS_STATUS_SUCCESS if successful, otherwise failed
//!
virtual MOS_STATUS ResizeCommandBufferAndPatchList(
uint32_t requestedCommandBufferSize,
uint32_t requestedPatchListSize,
uint32_t flags) = 0;
//!
//! \brief Resets Gpu context States
//! \details Resets all status in current gpu status
//!
virtual void ResetGpuContextStatus() = 0;
//!
//! \brief Get Gpu context handle
//! \details return the index in gpucontextNext mgr pool for current gpu context
//!
GPU_CONTEXT_HANDLE GetGpuContextHandle() { return m_gpuContextHandle; }
//!
//! \brief Set Gpu context handle
//! \details Register the index in gpucontextNext mgr pool for current gpu context
//!
void SetGpuContextHandle(GPU_CONTEXT_HANDLE gpuContextHandle)
{
m_gpuContextHandle = gpuContextHandle;
}
//!
//! \brief Set Gpu context
//! \details Set MOS Gpu context
//!
void SetGpuContext(MOS_GPU_CONTEXT gpuContext)
{
m_gpuContext = gpuContext;
}
//!
//! \brief Get Gpu context Node
//! \details Return the hardware node for current gpu context
//!
MOS_GPU_NODE GetContextNode() { return m_nodeOrdinal; }
//!
//! \brief Set Gpu context Node
//! \details Set the hardware node for current gpu context
//!
void SetContextNode(MOS_GPU_NODE nodeOrdinal) { m_nodeOrdinal = nodeOrdinal; }
//!
//! \brief Get Gpu context ID
//! \details Return the umd side gpu context id for current gpu context
//!
MOS_GPU_CONTEXT GetCpuContextID() { return m_gpuContext; }
//!
//! \brief Get indirect state size
//!
uint32_t GetIndirectStateSize() { return m_IndirectHeapSize; }
//!
//! \brief Set indirect state size
//!
virtual MOS_STATUS SetIndirectStateSize(const uint32_t size) = 0;
//!
//! \brief Get status buffer resource for current gpu context
//! \return MOS_RESOURCE_HANDLE
//!
MOS_RESOURCE_HANDLE GetStatusBufferResource()
{
return m_statusBufferResource;
}
//!
//! \brief Get VE attribute buffer for current gpu context
//! \return MOS_CMD_BUF_ATTRI_VE*
//!
MOS_CMD_BUF_ATTRI_VE *GetAttributeVeBuffer()
{
return &m_bufAttriVe;
}
virtual MOS_STATUS ResetCmdBuffer()
{
return MOS_STATUS_SUCCESS;
}
protected:
//! \brief Hardware node for current gpu context
MOS_GPU_NODE m_nodeOrdinal;
//! \brief Indirect heap size (SSH area in DMA buffer)
uint32_t m_IndirectHeapSize = 0;
//! \brief Related command buffer manager
CmdBufMgrNext *m_cmdBufMgr = nullptr;
//! \brief Related command buffer manager
uint64_t m_cmdBufMgrHandle = UINT64_MAX;
//! \brief Index in gpucontextNext mgr pool for current gpu context
GPU_CONTEXT_HANDLE m_gpuContextHandle = 0;
//! \brief Gpu status report buffer
MOS_RESOURCE_HANDLE m_statusBufferResource = nullptr;
//! \brief Track the GPU Context Client Info
MOS_GPU_CONTEXT m_gpuContext;
//! \brief VE attribute buffer
MOS_CMD_BUF_ATTRI_VE m_bufAttriVe = {};
};
#endif // #ifndef __MOS_GPU_CONTEXT_NEXT_H__