blob: c59f5ce9ea2b4bb039248fbc7f3b3fa2b3021b0e [file] [log] [blame]
/*
* MVKCommandPool.mm
*
* Copyright (c) 2015-2020 The Brenwill Workshop Ltd. (http://www.brenwill.com)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "MVKCommandPool.h"
#include "MVKCommandBuffer.h"
#include "MVKImage.h"
#include "MVKQueue.h"
#include "MVKDeviceMemory.h"
#include "MVKFoundation.h"
#include "mvk_datatypes.hpp"
#include "MVKLogging.h"
using namespace std;
#pragma mark -
#pragma mark MVKCommandPool
// Reset all of the command buffers
VkResult MVKCommandPool::reset(VkCommandPoolResetFlags flags) {
bool releaseRez = mvkAreAllFlagsEnabled(flags, VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT);
VkCommandBufferResetFlags cmdBuffFlags = releaseRez ? VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT : 0;
for (auto& cb : _allocatedCommandBuffers) { cb->reset(cmdBuffFlags); }
if (releaseRez) { trim(); }
return VK_SUCCESS;
}
#pragma mark Command Buffers
VkResult MVKCommandPool::allocateCommandBuffers(const VkCommandBufferAllocateInfo* pAllocateInfo,
VkCommandBuffer* pCmdBuffer) {
VkResult rslt = VK_SUCCESS;
uint32_t cbCnt = pAllocateInfo->commandBufferCount;
for (uint32_t cbIdx = 0; cbIdx < cbCnt; cbIdx++) {
MVKCommandBuffer* mvkCmdBuff = _commandBufferPool.acquireObject();
mvkCmdBuff->init(pAllocateInfo);
_allocatedCommandBuffers.insert(mvkCmdBuff);
pCmdBuffer[cbIdx] = mvkCmdBuff->getVkCommandBuffer();
// Command buffers start out in a VK_NOT_READY config result
VkResult cbRslt = mvkCmdBuff->getConfigurationResult();
if (rslt == VK_SUCCESS && cbRslt != VK_NOT_READY) { rslt = cbRslt; }
}
return rslt;
}
void MVKCommandPool::freeCommandBuffers(uint32_t commandBufferCount,
const VkCommandBuffer* pCommandBuffers) {
for (uint32_t cbIdx = 0; cbIdx < commandBufferCount; cbIdx++) {
MVKCommandBuffer* mvkCmdBuff = MVKCommandBuffer::getMVKCommandBuffer(pCommandBuffers[cbIdx]);
if (_allocatedCommandBuffers.erase(mvkCmdBuff)) {
mvkCmdBuff->reset(VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT);
_commandBufferPool.returnObject(mvkCmdBuff);
}
}
}
id<MTLCommandBuffer> MVKCommandPool::newMTLCommandBuffer(uint32_t queueIndex) {
return [[_device->getQueue(_queueFamilyIndex, queueIndex)->getMTLCommandQueue() commandBuffer] retain];
}
void MVKCommandPool::trim() {
_commandBufferPool.clear();
_commandEncodingPool.clear();
_cmdPipelineBarrierPool.clear();
_cmdBindPipelinePool.clear();
_cmdBeginRenderPassPool.clear();
_cmdNextSubpassPool.clear();
_cmdExecuteCommandsPool.clear();
_cmdEndRenderPassPool.clear();
_cmdBindDescriptorSetsPool.clear();
_cmdSetViewportPool.clear();
_cmdSetScissorPool.clear();
_cmdSetLineWidthPool.clear();
_cmdSetDepthBiasPool.clear();
_cmdSetBlendConstantsPool.clear();
_cmdSetDepthBoundsPool.clear();
_cmdSetStencilCompareMaskPool.clear();
_cmdSetStencilWriteMaskPool.clear();
_cmdSetStencilReferencePool.clear();
_cmdBindVertexBuffersPool.clear();
_cmdBindIndexBufferPool.clear();
_cmdDrawPool.clear();
_cmdDrawIndexedPool.clear();
_cmdDrawIndirectPool.clear();
_cmdDrawIndexedIndirectPool.clear();
_cmdCopyImagePool.clear();
_cmdBlitImagePool.clear();
_cmdResolveImagePool.clear();
_cmdFillBufferPool.clear();
_cmdUpdateBufferPool.clear();
_cmdCopyBufferPool.clear();
_cmdBufferImageCopyPool.clear();
_cmdClearAttachmentsPool.clear();
_cmdClearImagePool.clear();
_cmdBeginQueryPool.clear();
_cmdEndQueryPool.clear();
_cmdWriteTimestampPool.clear();
_cmdResetQueryPoolPool.clear();
_cmdCopyQueryPoolResultsPool.clear();
_cmdPushConstantsPool.clear();
_cmdDispatchPool.clear();
_cmdDispatchIndirectPool.clear();
_cmdPushDescriptorSetPool.clear();
_cmdPushDescriptorSetWithTemplatePool.clear();
_cmdDebugMarkerBeginPool.clear();
_cmdDebugMarkerEndPool.clear();
_cmdDebugMarkerInsertPool.clear();
_cmdSetResetEventPool.clear();
_cmdWaitEventsPool.clear();
}
#pragma mark Construction
MVKCommandPool::MVKCommandPool(MVKDevice* device,
const VkCommandPoolCreateInfo* pCreateInfo,
bool usePooling) :
MVKVulkanAPIDeviceObject(device),
_queueFamilyIndex(pCreateInfo->queueFamilyIndex),
_commandBufferPool(device, usePooling),
_commandEncodingPool(this),
_cmdPipelineBarrierPool(usePooling),
_cmdBindPipelinePool(usePooling),
_cmdBeginRenderPassPool(usePooling),
_cmdNextSubpassPool(usePooling),
_cmdExecuteCommandsPool(usePooling),
_cmdEndRenderPassPool(usePooling),
_cmdBindDescriptorSetsPool(usePooling),
_cmdSetViewportPool(usePooling),
_cmdSetScissorPool(usePooling),
_cmdSetLineWidthPool(usePooling),
_cmdSetDepthBiasPool(usePooling),
_cmdSetBlendConstantsPool(usePooling),
_cmdSetDepthBoundsPool(usePooling),
_cmdSetStencilCompareMaskPool(usePooling),
_cmdSetStencilWriteMaskPool(usePooling),
_cmdSetStencilReferencePool(usePooling),
_cmdBindVertexBuffersPool(usePooling),
_cmdBindIndexBufferPool(usePooling),
_cmdDrawPool(usePooling),
_cmdDrawIndexedPool(usePooling),
_cmdDrawIndirectPool(usePooling),
_cmdDrawIndexedIndirectPool(usePooling),
_cmdCopyImagePool(usePooling),
_cmdBlitImagePool(usePooling),
_cmdResolveImagePool(usePooling),
_cmdFillBufferPool(usePooling),
_cmdUpdateBufferPool(usePooling),
_cmdCopyBufferPool(usePooling),
_cmdBufferImageCopyPool(usePooling),
_cmdClearAttachmentsPool(usePooling),
_cmdClearImagePool(usePooling),
_cmdBeginQueryPool(usePooling),
_cmdEndQueryPool(usePooling),
_cmdWriteTimestampPool(usePooling),
_cmdResetQueryPoolPool(usePooling),
_cmdCopyQueryPoolResultsPool(usePooling),
_cmdPushConstantsPool(usePooling),
_cmdDispatchPool(usePooling),
_cmdDispatchIndirectPool(usePooling),
_cmdPushDescriptorSetPool(usePooling),
_cmdPushDescriptorSetWithTemplatePool(usePooling),
_cmdDebugMarkerBeginPool(usePooling),
_cmdDebugMarkerEndPool(usePooling),
_cmdDebugMarkerInsertPool(usePooling),
_cmdSetResetEventPool(usePooling),
_cmdWaitEventsPool(usePooling)
// when extending be sure to add to trim() as well
{}
MVKCommandPool::~MVKCommandPool() {
for (auto& mvkCB : _allocatedCommandBuffers) {
_commandBufferPool.returnObject(mvkCB);
}
}