Index: gpu/vulkan/vulkan_implementation.cc |
diff --git a/gpu/vulkan/vulkan_implementation.cc b/gpu/vulkan/vulkan_implementation.cc |
index 672bc008875027f8db1d650cf910edb9b62fb36b..b1ed010d1e1b99af47aaeb53ecc7b68c5a273485 100644 |
--- a/gpu/vulkan/vulkan_implementation.cc |
+++ b/gpu/vulkan/vulkan_implementation.cc |
@@ -9,6 +9,7 @@ |
#include <vulkan/vulkan.h> |
#include "base/macros.h" |
+#include "gpu/vulkan/vulkan_command_buffer.h" |
#if defined(VK_USE_PLATFORM_XLIB_KHR) |
#include "ui/gfx/x/x11_types.h" |
@@ -17,10 +18,11 @@ |
namespace gfx { |
struct VulkanInstance { |
- VulkanInstance() : valid(false) {} |
+ VulkanInstance() {} |
void Initialize() { |
- valid = InitializeVulkanInstance() && InitializeVulkanDevice(); |
+ valid = InitializeVulkanInstance() && InitializeVulkanDevice() && |
+ CreateCommandPool(); |
} |
bool InitializeVulkanInstance() { |
@@ -117,6 +119,9 @@ struct VulkanInstance { |
if (queue_index == -1) |
return false; |
+ vk_physical_device = devices[device_index]; |
+ vk_queue_index = queue_index; |
+ |
float queue_priority = 0.0f; |
VkDeviceQueueCreateInfo queue_create_info = {}; |
queue_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO; |
@@ -133,7 +138,7 @@ struct VulkanInstance { |
device_create_info.enabledExtensionCount = arraysize(device_extensions); |
device_create_info.ppEnabledExtensionNames = device_extensions; |
- status = vkCreateDevice(devices[device_index], &device_create_info, nullptr, |
+ status = vkCreateDevice(vk_physical_device, &device_create_info, nullptr, |
&vk_device); |
if (VK_SUCCESS != status) |
return false; |
@@ -143,10 +148,28 @@ struct VulkanInstance { |
return true; |
} |
- bool valid; |
+ bool CreateCommandPool() { |
+ VkCommandPoolCreateInfo command_pool_create_info = {}; |
+ command_pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO; |
+ command_pool_create_info.queueFamilyIndex = vk_queue_index; |
piman
2016/03/09 01:25:34
If we reset command buffers individually, we need
David Yen
2016/03/10 01:39:48
Interesting, I missed this. Done.
|
+ |
+ VkResult result = vkCreateCommandPool(vk_device, &command_pool_create_info, |
+ nullptr, &vk_command_pool); |
+ if (VK_SUCCESS != result) { |
+ LOG(ERROR) << "vkCreateCommandPool() failed: " << result; |
piman
2016/03/09 01:25:33
nit: DLOG
David Yen
2016/03/10 01:39:48
Done.
|
+ return false; |
+ } |
+ |
+ return true; |
+ } |
+ |
+ bool valid = false; |
VkInstance vk_instance; |
+ VkPhysicalDevice vk_physical_device; |
VkDevice vk_device; |
VkQueue vk_queue; |
+ uint32_t vk_queue_index = 0; |
+ VkCommandPool vk_command_pool; |
piman
2016/03/09 01:25:33
We'll definitely need more than one pool - typical
David Yen
2016/03/10 01:39:48
Done. Separated out into a separate class. I now h
|
}; |
static VulkanInstance* vulkan_instance = nullptr; |
@@ -164,6 +187,12 @@ VkInstance GetVulkanInstance() { |
return vulkan_instance->vk_instance; |
} |
+VkPhysicalDevice GetVulkanPhysicalDevice() { |
+ DCHECK(vulkan_instance); |
+ DCHECK(vulkan_instance->valid); |
+ return vulkan_instance->vk_physical_device; |
+} |
+ |
VkDevice GetVulkanDevice() { |
DCHECK(vulkan_instance); |
DCHECK(vulkan_instance->valid); |
@@ -176,4 +205,24 @@ VkQueue GetVulkanQueue() { |
return vulkan_instance->vk_queue; |
} |
+scoped_ptr<VulkanCommandBuffer> CreatePrimaryCommandBuffer() { |
+ DCHECK(vulkan_instance); |
+ DCHECK(vulkan_instance->valid); |
+ |
+ scoped_ptr<VulkanCommandBuffer> command_buffer( |
+ new VulkanCommandBuffer(vulkan_instance->vk_command_pool, true)); |
+ command_buffer->Initialize(); |
piman
2016/03/09 01:25:33
don't we need to handle the return value?
At a hi
David Yen
2016/03/10 01:39:48
I'll have this function return nullptr on errors.
|
+ return command_buffer; |
+} |
+ |
+scoped_ptr<VulkanCommandBuffer> CreateSecondaryCommandBuffer() { |
+ DCHECK(vulkan_instance); |
+ DCHECK(vulkan_instance->valid); |
+ |
+ scoped_ptr<VulkanCommandBuffer> command_buffer( |
+ new VulkanCommandBuffer(vulkan_instance->vk_command_pool, false)); |
+ command_buffer->Initialize(); |
+ return command_buffer; |
+} |
+ |
} // namespace gfx |