Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(506)

Side by Side Diff: gpu/vulkan/vulkan_command_buffer.h

Issue 1776453003: Added initial implementation of Vulkan Render Passes. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@gn_vulkan
Patch Set: Ensure vulkan handles all initialized to null, check destruction in destructor Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright (c) 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #ifndef GPU_VULKAN_VULKAN_COMMAND_BUFFER_H_
6 #define GPU_VULKAN_VULKAN_COMMAND_BUFFER_H_
7
8 #include <vulkan/vulkan.h>
9
10 #include "base/macros.h"
11 #include "base/memory/scoped_ptr.h"
12
13 namespace gfx {
14
15 class VulkanCommandBuffer {
16 public:
17 VulkanCommandBuffer(VkCommandPool command_pool, bool primary);
18 ~VulkanCommandBuffer();
19
20 bool Initialize();
21 void Destroy();
22
23 // Submit primary command buffer to the queue.
24 bool Submit();
piman 2016/03/09 01:25:33 I would prefer being explicit here and passing the
David Yen 2016/03/10 01:39:48 Done.
25
26 // Enqueue secondary command buffer within a primary command buffer.
27 void Enqueue(VkCommandBuffer primary_command_buffer);
28
29 void Clear();
30
31 private:
32 friend class CommandBufferRecorderBase;
33
34 enum RecordType {
35 // Nothing has been recorded yet.
36 RECORD_TYPE_EMPTY,
37
38 // Recorded for single use, will be reset upon submission.
39 RECORD_TYPE_SINGLE_USE,
40
41 // Recording for multi use, once submitted it can't be modified until reset.
42 RECORD_TYPE_MULTI_USE,
43
44 // Recorded for multi-use, can no longer be modified unless reset.
45 RECORD_TYPE_RECORDED,
46
47 // Dirty, should be cleared before use. This assumes its externally
48 // synchronized and the command buffer is no longer in use.
49 RECORD_TYPE_DIRTY,
50 };
51
52 void PostExecution();
53 void ResetIfDirty();
54
55 const bool primary_;
56 bool recording_ = false;
57 RecordType record_type_ = RECORD_TYPE_EMPTY;
58 VkCommandBuffer command_buffer_ = VK_NULL_HANDLE;
59 VkCommandPool command_pool_;
60
61 DISALLOW_COPY_AND_ASSIGN(VulkanCommandBuffer);
62 };
63
64 class CommandBufferRecorderBase {
65 public:
66 VkCommandBuffer handle() { return handle_; }
67
68 protected:
69 CommandBufferRecorderBase(VulkanCommandBuffer& command_buffer)
70 : handle_(command_buffer.command_buffer_) {
71 command_buffer.ResetIfDirty();
72 }
73
74 virtual ~CommandBufferRecorderBase();
75
76 void ValidateSingleUse(VulkanCommandBuffer& command_buffer) {
77 DCHECK((VulkanCommandBuffer::RECORD_TYPE_SINGLE_USE ==
78 command_buffer.record_type_) ||
79 (VulkanCommandBuffer::RECORD_TYPE_EMPTY ==
80 command_buffer.record_type_));
81 command_buffer.record_type_ = VulkanCommandBuffer::RECORD_TYPE_SINGLE_USE;
82 }
83
84 void ValidateMultiUse(VulkanCommandBuffer& command_buffer) {
85 DCHECK((VulkanCommandBuffer::RECORD_TYPE_MULTI_USE ==
86 command_buffer.record_type_) ||
87 (VulkanCommandBuffer::RECORD_TYPE_EMPTY ==
88 command_buffer.record_type_));
89 command_buffer.record_type_ = VulkanCommandBuffer::RECORD_TYPE_MULTI_USE;
90 }
91
92 VkCommandBuffer handle_;
93 };
94
95 class ScopedMultiUseCommandBufferRecorder : public CommandBufferRecorderBase {
96 public:
97 ScopedMultiUseCommandBufferRecorder(VulkanCommandBuffer& command_buffer)
98 : CommandBufferRecorderBase(command_buffer) {
99 ValidateMultiUse(command_buffer);
100 VkCommandBufferBeginInfo begin_info = {};
101 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
102 vkBeginCommandBuffer(handle_, &begin_info);
103 }
104
105 ~ScopedMultiUseCommandBufferRecorder() override {}
106
107 private:
108 DISALLOW_COPY_AND_ASSIGN(ScopedMultiUseCommandBufferRecorder);
109 };
110
111 class ScopedSingleUseCommandBufferRecorder : public CommandBufferRecorderBase {
112 public:
113 ScopedSingleUseCommandBufferRecorder(VulkanCommandBuffer& command_buffer)
114 : CommandBufferRecorderBase(command_buffer) {
115 ValidateSingleUse(command_buffer);
116 VkCommandBufferBeginInfo begin_info = {};
117 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
118 begin_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
119 vkBeginCommandBuffer(handle_, &begin_info);
120 }
121
122 ~ScopedSingleUseCommandBufferRecorder() override {}
123
124 private:
125 DISALLOW_COPY_AND_ASSIGN(ScopedSingleUseCommandBufferRecorder);
126 };
127
128 } // namespace gfx
129
130 #endif // GPU_VULKAN_VULKAN_COMMAND_BUFFER_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698