1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2018 Google Inc. 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#ifndef GrVkCommandPool_DEFINED 9cb93a386Sopenharmony_ci#define GrVkCommandPool_DEFINED 10cb93a386Sopenharmony_ci 11cb93a386Sopenharmony_ci#include "src/gpu/vk/GrVkInterface.h" 12cb93a386Sopenharmony_ci#include "src/gpu/vk/GrVkManagedResource.h" 13cb93a386Sopenharmony_ci#include "src/gpu/vk/GrVkResourceProvider.h" 14cb93a386Sopenharmony_ci 15cb93a386Sopenharmony_ci#include <cinttypes> 16cb93a386Sopenharmony_ci 17cb93a386Sopenharmony_ciclass GrVkPrimaryCommandBuffer; 18cb93a386Sopenharmony_ciclass GrVkSecondaryCommandBuffer; 19cb93a386Sopenharmony_ciclass GrVkGpu; 20cb93a386Sopenharmony_ci 21cb93a386Sopenharmony_ciclass GrVkCommandPool : public GrVkManagedResource { 22cb93a386Sopenharmony_cipublic: 23cb93a386Sopenharmony_ci static GrVkCommandPool* Create(GrVkGpu* gpu); 24cb93a386Sopenharmony_ci 25cb93a386Sopenharmony_ci VkCommandPool vkCommandPool() const { 26cb93a386Sopenharmony_ci return fCommandPool; 27cb93a386Sopenharmony_ci } 28cb93a386Sopenharmony_ci 29cb93a386Sopenharmony_ci void reset(GrVkGpu* gpu); 30cb93a386Sopenharmony_ci 31cb93a386Sopenharmony_ci void releaseResources(); 32cb93a386Sopenharmony_ci 33cb93a386Sopenharmony_ci GrVkPrimaryCommandBuffer* getPrimaryCommandBuffer() { return fPrimaryCommandBuffer.get(); } 34cb93a386Sopenharmony_ci 35cb93a386Sopenharmony_ci std::unique_ptr<GrVkSecondaryCommandBuffer> findOrCreateSecondaryCommandBuffer(GrVkGpu* gpu); 36cb93a386Sopenharmony_ci 37cb93a386Sopenharmony_ci void recycleSecondaryCommandBuffer(GrVkSecondaryCommandBuffer* buffer); 38cb93a386Sopenharmony_ci 39cb93a386Sopenharmony_ci // marks that we are finished with this command pool; it is not legal to continue creating or 40cb93a386Sopenharmony_ci // writing to command buffers in a closed pool 41cb93a386Sopenharmony_ci void close(); 42cb93a386Sopenharmony_ci 43cb93a386Sopenharmony_ci // returns true if close() has not been called 44cb93a386Sopenharmony_ci bool isOpen() const { return fOpen; } 45cb93a386Sopenharmony_ci 46cb93a386Sopenharmony_ci#ifdef SK_TRACE_MANAGED_RESOURCES 47cb93a386Sopenharmony_ci void dumpInfo() const override { 48cb93a386Sopenharmony_ci SkDebugf("GrVkCommandPool: %" PRIdPTR " (%d refs)\n", 49cb93a386Sopenharmony_ci (intptr_t)fCommandPool, this->getRefCnt()); 50cb93a386Sopenharmony_ci } 51cb93a386Sopenharmony_ci#endif 52cb93a386Sopenharmony_ci 53cb93a386Sopenharmony_ciprivate: 54cb93a386Sopenharmony_ci GrVkCommandPool() = delete; 55cb93a386Sopenharmony_ci 56cb93a386Sopenharmony_ci GrVkCommandPool(GrVkGpu* gpu, VkCommandPool commandPool, GrVkPrimaryCommandBuffer*); 57cb93a386Sopenharmony_ci 58cb93a386Sopenharmony_ci void freeGPUData() const override; 59cb93a386Sopenharmony_ci 60cb93a386Sopenharmony_ci bool fOpen = true; 61cb93a386Sopenharmony_ci 62cb93a386Sopenharmony_ci VkCommandPool fCommandPool; 63cb93a386Sopenharmony_ci 64cb93a386Sopenharmony_ci std::unique_ptr<GrVkPrimaryCommandBuffer> fPrimaryCommandBuffer; 65cb93a386Sopenharmony_ci 66cb93a386Sopenharmony_ci // Array of available secondary command buffers that are not in flight 67cb93a386Sopenharmony_ci SkSTArray<4, std::unique_ptr<GrVkSecondaryCommandBuffer>, true> fAvailableSecondaryBuffers; 68cb93a386Sopenharmony_ci int fMaxCachedSecondaryCommandBuffers; 69cb93a386Sopenharmony_ci}; 70cb93a386Sopenharmony_ci 71cb93a386Sopenharmony_ci#endif 72