CommandPoolVk.h#

The PVRVk CommandPool, a pool that can Allocate and Free Command Buffers.

Includes#

  • PVRVk/DeviceVk.h

Included By#

Namespaces#

Classes#

Source Code#

#pragma once
#include "PVRVk/DeviceVk.h"

namespace pvrvk {
struct CommandPoolCreateInfo
{
public:
    explicit CommandPoolCreateInfo(uint32_t queueFamilyIndex, CommandPoolCreateFlags flags = CommandPoolCreateFlags::e_NONE, VkDeviceSize safetyCriticalCommandPoolReservedSize = 0,
        uint32_t safetyCriticalCommandPoolMaxCommandBuffers = 0)
        : _flags(flags), _queueFamilyIndex(queueFamilyIndex), _safetyCriticalCommandPoolReservedSize(safetyCriticalCommandPoolReservedSize),
          _safetyCriticalCommandPoolMaxCommandBuffers(safetyCriticalCommandPoolMaxCommandBuffers)
    {}

    inline CommandPoolCreateFlags getFlags() const { return _flags; }
    inline void setFlags(CommandPoolCreateFlags flags) { this->_flags = flags; }
    inline uint32_t getQueueFamilyIndex() const { return _queueFamilyIndex; }
    inline void setQueueFamilyIndex(uint32_t queueFamilyIndex) { this->_queueFamilyIndex = queueFamilyIndex; }
    inline VkDeviceSize getCommandPoolReservedSize() const { return _safetyCriticalCommandPoolReservedSize; }
    inline void setCommandPoolReservedSize(VkDeviceSize inSafetyCriticalCommandPoolReservedSize)
    {
        this->_safetyCriticalCommandPoolReservedSize = inSafetyCriticalCommandPoolReservedSize;
    }
    inline uint32_t getCommandPoolMaxCommandBuffers() const { return _safetyCriticalCommandPoolMaxCommandBuffers; }
    inline void setCommandPoolMaxCommandBuffers(uint32_t safetyCriticalCommandPoolMaxCommandBuffers)
    {
        this->_safetyCriticalCommandPoolMaxCommandBuffers = safetyCriticalCommandPoolMaxCommandBuffers;
    }

private:
    CommandPoolCreateFlags _flags;
    uint32_t _queueFamilyIndex;
    VkDeviceSize _safetyCriticalCommandPoolReservedSize;
    uint32_t _safetyCriticalCommandPoolMaxCommandBuffers;
};

namespace impl {
class CommandPool_ : public PVRVkDeviceObjectBase<VkCommandPool, ObjectType::e_COMMAND_POOL>, public DeviceObjectDebugUtils<CommandPool_>, public std::enable_shared_from_this<CommandPool_>
{
private:
    friend class Device_;

    class make_shared_enabler
    {
    protected:
        make_shared_enabler() {}
        friend class CommandPool_;
    };

    static CommandPool constructShared(const DeviceWeakPtr& device, const CommandPoolCreateInfo& createInfo)
    {
        return std::make_shared<CommandPool_>(make_shared_enabler{}, device, createInfo);
    }

    CommandPoolCreateInfo _createInfo;

public:
    DECLARE_NO_COPY_SEMANTICS(CommandPool_)
    CommandPool_(make_shared_enabler, const DeviceWeakPtr& device, const CommandPoolCreateInfo& createInfo);

    ~CommandPool_()
    {
        if (getVkHandle() != VK_NULL_HANDLE)
        {
            if (!_device.expired())
            {
                getDevice()->getVkBindings().vkDestroyCommandPool(getDevice()->getVkHandle(), getVkHandle(), nullptr);
                _vkHandle = VK_NULL_HANDLE;
            }
            else
            {
                reportDestroyedAfterDevice();
            }
        }
    }

    CommandBuffer allocateCommandBuffer();

    void allocateCommandBuffers(uint32_t numCommandbuffers, CommandBuffer* outCmdBuffers);

    SecondaryCommandBuffer allocateSecondaryCommandBuffer();

    void allocateSecondaryCommandBuffers(uint32_t numCommandbuffers, SecondaryCommandBuffer* outCmdBuffers);

    inline CommandPoolCreateFlags getFlags() const { return _createInfo.getFlags(); }
    inline uint32_t getQueueFamilyIndex() const { return _createInfo.getQueueFamilyIndex(); }

    void reset(pvrvk::CommandPoolResetFlags flags);
};
} // namespace impl
} // namespace pvrvk