blob: 33b1a2bcf7d25977acfe9fc3aeedeaa5435e6ce1 [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 heap.h
//! \brief A heap is a buffer in graphics memory in which the driver may store information
//! \details Heaps are created for the client via the heap manager, through which the client
//! is expected to claim blocks of memory for data storage. The client has no direct
//! access to the heap.
//!
#ifndef __HEAP_H__
#define __HEAP_H__
#include "mos_os.h"
#include "mos_util_debug.h"
//! Evaluates the status and returns if failure
#define HEAP_CHK_STATUS(_stmt) \
MOS_CHK_STATUS_RETURN(MOS_COMPONENT_HW, MOS_HW_SUBCOMP_ALL, _stmt)
//! Checks the pointer and returns if nullptr
#define HEAP_CHK_NULL(_ptr) \
MOS_CHK_NULL_RETURN(MOS_COMPONENT_HW, MOS_HW_SUBCOMP_ALL, _ptr)
//! Asserts and prints \a _message at critical message level
#define HEAP_ASSERTMESSAGE(_message, ...) \
MOS_ASSERTMESSAGE(MOS_COMPONENT_HW, MOS_SUBCOMP_SELF, _message, ##__VA_ARGS__)
//! Prints \a _message at normal message level
#define HEAP_NORMALMESSAGE(_message, ...) \
MOS_NORMALMESSAGE(MOS_COMPONENT_HW, MOS_SUBCOMP_SELF, _message, ##__VA_ARGS__)
//! Prints \a _message at verbose message level
#define HEAP_VERBOSEMESSAGE(_message, ...) \
MOS_VERBOSEMESSAGE(MOS_COMPONENT_HW, MOS_SUBCOMP_SELF, _message, ##__VA_ARGS__)
//! Prints the function name at function enter message level
#define HEAP_FUNCTION_ENTER \
MOS_FUNCTION_ENTER(MOS_COMPONENT_HW, MOS_SUBCOMP_SELF)
//! Prints the function name at verbose function enter message level
#define HEAP_FUNCTION_ENTER_VERBOSE \
MOS_FUNCTION_ENTER_VERBOSE(MOS_COMPONENT_HW, MOS_SUBCOMP_SELF)
//! \brief Generic heap for storing client written data in graphics memory
class Heap
{
friend class MemoryBlockInternal;
friend class MemoryBlockManager;
public:
//!
//! \brief Default constructor
//! Identifier for the heap
//!
Heap();
//!
//! \brief Copy constructor
//!
Heap(const Heap&) = delete;
//!
//! \brief Copy assignment operator
//!
Heap& operator=(const Heap&) = delete;
//!
//! \brief Constructor
//! \param [in] id
//! Identifier for the heap
//!
Heap(uint32_t id);
virtual ~Heap();
//!
//! \brief Dumps the contents of the heap
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS Dump();
//!
//! \brief Checks heap for validity
//! \return bool
//! true if the heap is valid and false if not
//!
bool IsValid() { return (m_size > 0); }
//!
//! \brief Gets the graphics resource for the heap
//! \param [out] resource
//! Container for the output graphics resource
//! \return MOS_RESOURCE*
//! Valid pointer if success, nullptr for any fail
//!
MOS_RESOURCE* GetResource()
{
HEAP_FUNCTION_ENTER_VERBOSE;
if (m_size && !Mos_ResourceIsNull(m_resource))
{
return m_resource;
}
HEAP_ASSERTMESSAGE("Resource is not valid");
return nullptr;
}
//!
//! \brief Gets the size of the heap
//! \return The size of the heap \see m_size
//!
uint32_t GetSize() { return m_size; }
//!
//! \brief Gets the used size of the heap
//! \return The amount of space used in the heaps \see m_usedSize
//!
uint32_t GetUsedSize() { return m_usedSpace; }
//!
//! \brief Gets the ID for the heap
//! \return The Heap ID \see m_id
//!
uint32_t GetId() { return m_id; }
//!
//! \brief Whether or not the heap has been marked for freeing.
//! \return If the heap is being freed \see m_freeInProgress
//!
bool IsFreeInProgress() { return m_freeInProgress; }
//! \brief Invalid heap ID.
static const uint8_t m_invalidId = 0;
//!
//! \brief Mark the heap as hardware write only heap or not
void SetHeapHwWriteOnly(bool isHwWriteOnly) { m_hwWriteOnly = isHwWriteOnly; }
protected:
//!
//! \brief Stores the provided OS interface in the heap
//! \param [in] osInterface
//! Must be valid
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS RegisterOsInterface(PMOS_INTERFACE osInterface);
//!
//! \brief Allocates a graphics resource of size \a heapSize
//! \param [in] heapSize
//! The size of the state heap, must be non-zero
//! \param [in] keepLocked
//! Locks the heap when allocated and does not unlock it until it is destroyed
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS Allocate(uint32_t heapSize, bool keepLocked);
//!
//! \brief Locks the heap asynchonously
//! \return uint8_t*
//! If successful, pointer to data in the heap resource; if failed, nullptr \see m_resource
//!
uint8_t* Lock();
//!
//! \brief Unlocks the heap
//!
void Unlock()
{
HEAP_FUNCTION_ENTER_VERBOSE;
if (!m_keepLocked)
{
if (m_osInterface == nullptr)
{
HEAP_ASSERTMESSAGE("Invalid m_osInterface(nullptr)");
return;
}
m_osInterface->pfnUnlockResource(m_osInterface, m_resource);
}
}
//!
//! \brief Prepares the heap for being freed which will occur when all blocks are
//! no longer in use.
//!
void PrepareForFree()
{
HEAP_FUNCTION_ENTER;
m_freeInProgress = true;
}
//!
//! \brief Adjusts the free space in the heap.
//! \param [in] addedSpace
//! Space to be added and subtracted from the free and used space
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS AdjustFreeSpace(uint32_t addedSpace);
//!
//! \brief Adjusts the used space in the heap.
//! \param [in] addedSpace
//! Space to be added and subtracted from the free and used space
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS AdjustUsedSpace(uint32_t addedSpace);
private:
//! \brief Indicates that the heap is in the process of being freed
bool m_freeInProgress = false;
bool m_keepLocked = false; //!< Indictaes that heap is kept locked until freed.
PMOS_RESOURCE m_resource = nullptr; //!< Graphics resource for the heap.
uint32_t m_size = 0; //!< The size of the heap.
//! \brief Pointer to the locked heap data.
//! \details This pointer is only valid if the heap is locked always
uint8_t *m_lockedHeap = nullptr;
uint32_t m_freeSpace = 0; //!< The amount of space available in the heap
uint32_t m_usedSpace = 0; //!< The amount of used space within the heap
//! \brief OS interface used for managing graphics resources
PMOS_INTERFACE m_osInterface = nullptr;
//! \brief unique identifier for the heap within the heap manager
uint32_t m_id = m_invalidId;
bool m_hwWriteOnly = false; //!< Indictaes that heap is used by hardware write only.
};
#endif // __HEAP_H__