| Index: gpu/vulkan/vulkan_command_buffer.h
|
| diff --git a/gpu/vulkan/vulkan_command_buffer.h b/gpu/vulkan/vulkan_command_buffer.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..31f37a64d1f2731ec8dfbdaa4d218b1f2925d2b0
|
| --- /dev/null
|
| +++ b/gpu/vulkan/vulkan_command_buffer.h
|
| @@ -0,0 +1,133 @@
|
| +// Copyright (c) 2016 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#ifndef GPU_VULKAN_VULKAN_COMMAND_BUFFER_H_
|
| +#define GPU_VULKAN_VULKAN_COMMAND_BUFFER_H_
|
| +
|
| +#include <vulkan/vulkan.h>
|
| +
|
| +#include "base/logging.h"
|
| +#include "base/macros.h"
|
| +#include "base/memory/scoped_ptr.h"
|
| +#include "gpu/vulkan/vulkan_export.h"
|
| +
|
| +namespace gpu {
|
| +
|
| +class VulkanCommandPool;
|
| +
|
| +class VULKAN_EXPORT VulkanCommandBuffer {
|
| + public:
|
| + VulkanCommandBuffer(VulkanCommandPool* command_pool, bool primary);
|
| + ~VulkanCommandBuffer();
|
| +
|
| + bool Initialize();
|
| + void Destroy();
|
| +
|
| + // Submit primary command buffer to the queue.
|
| + bool Submit(VkQueue queue,
|
| + uint32_t num_wait_semaphores,
|
| + VkSemaphore* wait_semaphores,
|
| + uint32_t num_signal_semaphores,
|
| + VkSemaphore* signal_semaphores);
|
| +
|
| + // Enqueue secondary command buffer within a primary command buffer.
|
| + void Enqueue(VkCommandBuffer primary_command_buffer);
|
| +
|
| + void Clear();
|
| +
|
| + // This blocks until the commands from the previous submit are done.
|
| + void Wait(uint64_t timeout);
|
| +
|
| + // This simply tests asynchronously if the commands from the previous submit
|
| + // is finished.
|
| + bool SubmissionFinished();
|
| +
|
| + private:
|
| + friend class CommandBufferRecorderBase;
|
| +
|
| + enum RecordType {
|
| + // Nothing has been recorded yet.
|
| + RECORD_TYPE_EMPTY,
|
| +
|
| + // Recorded for single use, will be reset upon submission.
|
| + RECORD_TYPE_SINGLE_USE,
|
| +
|
| + // Recording for multi use, once submitted it can't be modified until reset.
|
| + RECORD_TYPE_MULTI_USE,
|
| +
|
| + // Recorded for multi-use, can no longer be modified unless reset.
|
| + RECORD_TYPE_RECORDED,
|
| +
|
| + // Dirty, should be cleared before use. This assumes its externally
|
| + // synchronized and the command buffer is no longer in use.
|
| + RECORD_TYPE_DIRTY,
|
| + };
|
| +
|
| + void PostExecution();
|
| + void ResetIfDirty();
|
| +
|
| + const bool primary_;
|
| + bool recording_ = false;
|
| + RecordType record_type_ = RECORD_TYPE_EMPTY;
|
| + VulkanCommandPool* command_pool_;
|
| + VkCommandBuffer command_buffer_ = VK_NULL_HANDLE;
|
| + VkFence submission_fence_ = VK_NULL_HANDLE;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(VulkanCommandBuffer);
|
| +};
|
| +
|
| +class VULKAN_EXPORT CommandBufferRecorderBase {
|
| + public:
|
| + VkCommandBuffer handle() const { return handle_; }
|
| +
|
| + protected:
|
| + CommandBufferRecorderBase(VulkanCommandBuffer& command_buffer)
|
| + : handle_(command_buffer.command_buffer_) {
|
| + command_buffer.ResetIfDirty();
|
| + }
|
| +
|
| + virtual ~CommandBufferRecorderBase();
|
| +
|
| + void ValidateSingleUse(VulkanCommandBuffer& command_buffer) {
|
| + DCHECK((VulkanCommandBuffer::RECORD_TYPE_SINGLE_USE ==
|
| + command_buffer.record_type_) ||
|
| + (VulkanCommandBuffer::RECORD_TYPE_EMPTY ==
|
| + command_buffer.record_type_));
|
| + command_buffer.record_type_ = VulkanCommandBuffer::RECORD_TYPE_SINGLE_USE;
|
| + }
|
| +
|
| + void ValidateMultiUse(VulkanCommandBuffer& command_buffer) {
|
| + DCHECK((VulkanCommandBuffer::RECORD_TYPE_MULTI_USE ==
|
| + command_buffer.record_type_) ||
|
| + (VulkanCommandBuffer::RECORD_TYPE_EMPTY ==
|
| + command_buffer.record_type_));
|
| + command_buffer.record_type_ = VulkanCommandBuffer::RECORD_TYPE_MULTI_USE;
|
| + }
|
| +
|
| + VkCommandBuffer handle_;
|
| +};
|
| +
|
| +class VULKAN_EXPORT ScopedMultiUseCommandBufferRecorder
|
| + : public CommandBufferRecorderBase {
|
| + public:
|
| + ScopedMultiUseCommandBufferRecorder(VulkanCommandBuffer& command_buffer);
|
| + ~ScopedMultiUseCommandBufferRecorder() override {}
|
| +
|
| + private:
|
| + DISALLOW_COPY_AND_ASSIGN(ScopedMultiUseCommandBufferRecorder);
|
| +};
|
| +
|
| +class VULKAN_EXPORT ScopedSingleUseCommandBufferRecorder
|
| + : public CommandBufferRecorderBase {
|
| + public:
|
| + ScopedSingleUseCommandBufferRecorder(VulkanCommandBuffer& command_buffer);
|
| + ~ScopedSingleUseCommandBufferRecorder() override {}
|
| +
|
| + private:
|
| + DISALLOW_COPY_AND_ASSIGN(ScopedSingleUseCommandBufferRecorder);
|
| +};
|
| +
|
| +} // namespace gpu
|
| +
|
| +#endif // GPU_VULKAN_VULKAN_COMMAND_BUFFER_H_
|
|
|