| /* |
| * Copyright (c) 2019-2021, 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_commandbuffer_next.h |
| //! \brief Container for comamnd buffer |
| //! |
| |
| #ifndef __MOS_COMMANDBUFFER_NEXT_H__ |
| #define __MOS_COMMANDBUFFER_NEXT_H__ |
| |
| #include "mos_graphicsresource_next.h" |
| #include "mos_gpucontext_next.h" |
| |
| //! |
| //! \class CommandBuffer |
| //! |
| class CommandBufferNext |
| { |
| public: |
| //! |
| //! \brief Constructor |
| //! |
| CommandBufferNext(CmdBufMgrNext *cmdBufMgr) |
| { |
| m_cmdBufMgr = cmdBufMgr; |
| } |
| |
| //! |
| //! \brief Destructor |
| //! |
| virtual ~CommandBufferNext(){} |
| |
| //! |
| //! \brief Create Os specific command buffer |
| //! \return CommandBufferNext* |
| //! Os specific command buffer |
| //! |
| static class CommandBufferNext *CreateCmdBuf(CmdBufMgrNext *cmdBufMgr); |
| |
| //! |
| //! \brief Allocate graphics resource for current command buffer |
| //! \param [in] osContext |
| //! Related os context |
| //! \param [in] size |
| //! Required size |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, otherwise fail reason |
| //! |
| virtual MOS_STATUS Allocate(OsContextNext* osContext, uint32_t size) = 0; |
| |
| //! |
| //! \brief Free allocated graphics resource for current command buffer |
| //! |
| virtual void Free() = 0; |
| |
| //! |
| //! \brief Bind current command buffer to gived gpu context |
| //! \param [in] gpuContext |
| //! Gpu context to be binded |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, otherwise fail reason |
| //! |
| virtual MOS_STATUS BindToGpuContext(GpuContextNext* gpuContext) = 0; |
| |
| //! |
| //! \brief Unbind current command buffer from gpu context |
| //! \param [in] isNative |
| //! Indicate it is unbinded from dummy or native gpu context in async mode |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, otherwise fail reason |
| //! |
| virtual void UnBindToGpuContext(bool isNative = true) = 0; |
| |
| //! |
| //! \brief Resize command buffer |
| //! \param [in] newSize |
| //! Required size |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, otherwise fail reason |
| //! |
| virtual MOS_STATUS ReSize(uint32_t newSize) = 0; |
| |
| //! |
| //! \brief Query command buffer if it is in HW execution |
| //! Always return false in normal mode, only return true in aync mode |
| //! when cmd buffer still in use by HW |
| //! \return bool |
| //! True if is used by HW, false if not |
| //! |
| virtual bool IsUsedByHw() { return false; } |
| |
| //! |
| //! \brief Query command buffer if it is in Cmd List |
| //! Always return false in normal mode, only return true in aync mode |
| //! when cmd buffer still in one or multiple cmd Lists |
| //! \return bool |
| //! True if is in cmdlist, false if not |
| //! |
| virtual bool IsInCmdList() { return false; } |
| |
| //! |
| //! \brief Query command buffer ready to use |
| //! \return bool |
| //! True if ready, false if not ready |
| //! |
| bool IsReadyToUse() { return m_readyToUse; } |
| |
| //! |
| //! \brief Get command buffer size |
| //! \return uint32_t |
| //! Command buffer size |
| //! |
| uint32_t GetCmdBufSize() { return m_size; } |
| |
| //! |
| //! \brief Get current command buffer attached resource |
| //! \return GraphicsResource* |
| //! Attached graphics resource |
| //! |
| GraphicsResourceNext* GetResource() { return m_graphicsResource; } |
| |
| //! |
| //! \brief Get current command buffer's lock address for cpu side usage |
| //! \return uint8_t* |
| //! Current command buffer's lock address for cpu side usage |
| //! |
| uint8_t* GetLockAddr() { return m_lockAddr; } |
| |
| //! |
| //! \brief Get last native gpu context |
| //! \return GpuContextNext* |
| //! Pointer to the last native gpu context |
| //! |
| GpuContextNext *GetLastNativeGpuContext() |
| { |
| return m_lastNativeGpuContextHandle == MOS_GPU_CONTEXT_INVALID_HANDLE ? |
| nullptr : m_lastNativeGpuContext; |
| } |
| |
| //! |
| //! \brief Get last native gpu context handle |
| //! \return GPU_CONTEXT_HANDLE |
| //! Pointer to the last native gpu context handle |
| //! |
| GPU_CONTEXT_HANDLE GetLastNativeGpuContextHandle() |
| { |
| return m_lastNativeGpuContextHandle; |
| } |
| |
| //! |
| //! \brief Reset last native gpu context |
| //! \return void |
| //! |
| void ResetLastNativeGpuContext() |
| { |
| m_lastNativeGpuContextHandle = MOS_GPU_CONTEXT_INVALID_HANDLE; |
| m_lastNativeGpuContext = nullptr; |
| return; |
| } |
| |
| //! |
| //! \brief Get last gpu context |
| //! \return GpuContextNext* |
| //! Pointer to the last gpu context |
| //! |
| GpuContextNext *GetGpuContext() |
| { |
| return m_gpuContext; |
| } |
| |
| //! |
| //! \brief Get last gpu context handle |
| //! \return GPU_CONTEXT_HANDLE |
| //! Pointer to the last gpu context handle |
| //! |
| GPU_CONTEXT_HANDLE GetGpuContextHandle() |
| { |
| return m_gpuContextHandle; |
| } |
| |
| //! |
| //! \brief Reset gpu context |
| //! \return void |
| //! |
| void ResetGpuContext() |
| { |
| m_gpuContextHandle = MOS_GPU_CONTEXT_INVALID_HANDLE; |
| m_gpuContext = nullptr; |
| return; |
| } |
| |
| //! |
| //! \brief Get cmd buffer manager current cmd buffer belong to |
| //! \return CmdBufMgrNext * |
| //! Pointer to the command buffer manager |
| //! |
| CmdBufMgrNext *GetCmdBufferMgr() |
| { |
| return m_cmdBufMgr; |
| } |
| |
| protected: |
| //! |
| //! \brief Set ready to use |
| //! \params [in] readyToUse |
| //! |
| void SetReadyToUse(bool readyToUse) { m_readyToUse = readyToUse; } |
| |
| //! \brief Os context |
| OsContextNext* m_osContext = nullptr; |
| |
| //! \brief Gpu context binded to |
| GpuContextNext* m_gpuContext = nullptr; |
| |
| //! \brief Gpu context handle |
| GPU_CONTEXT_HANDLE m_gpuContextHandle = MOS_GPU_CONTEXT_INVALID_HANDLE; |
| |
| //! \brief Last executed native Gpu context in async mode (Should not be used in normal mode) |
| GpuContextNext *m_lastNativeGpuContext = nullptr; |
| |
| //! \brief the cmd buf manager it belongs to |
| CmdBufMgrNext *m_cmdBufMgr = nullptr; |
| |
| //! \brief Last native Gpu context handle |
| GPU_CONTEXT_HANDLE m_lastNativeGpuContextHandle = MOS_GPU_CONTEXT_INVALID_HANDLE; |
| |
| //! \brief Graphics resouce for command buffer |
| GraphicsResourceNext* m_graphicsResource = nullptr; |
| |
| //! \brief Lock address for cpu side usage |
| uint8_t* m_lockAddr = nullptr; |
| |
| //! \brief Indicate if ready to use |
| bool m_readyToUse = false; |
| |
| //! \brief Command buffer size |
| uint32_t m_size = 0; |
| }; |
| #endif // __MOS_COMMANDBUFFERNext_NEXT_H__ |