Chromium Code Reviews| 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 |