From c7a6eb56a2c967685f70d30c643f899b0425c0ea Mon Sep 17 00:00:00 2001 From: Jesse Hall Date: Mon, 31 Aug 2015 12:52:03 -0700 Subject: [PATCH] vulkan: Set up VkCmdBuffer dispatching Change-Id: Ifb3cea05dab8828c2c00b8ed60c5ad991cdcbea7 (cherry picked from commit 10bf73e13b6904afa606fdcdc05bcc510c605180) --- vulkan/libvulkan/entry.cpp | 2 +- vulkan/libvulkan/entry.cpp.tmpl | 2 +- vulkan/libvulkan/loader.cpp | 22 ++++++++++ vulkan/libvulkan/loader.h | 3 ++ vulkan/nulldrv/null_driver.cpp | 96 ++++++++++++++++++++++------------------- 5 files changed, 79 insertions(+), 46 deletions(-) diff --git a/vulkan/libvulkan/entry.cpp b/vulkan/libvulkan/entry.cpp index 7bfaaf2cc6..f2b4482ad5 100644 --- a/vulkan/libvulkan/entry.cpp +++ b/vulkan/libvulkan/entry.cpp @@ -578,7 +578,7 @@ VkResult vkResetCommandPool(VkDevice device, VkCmdPool cmdPool, VkCmdPoolResetFl __attribute__((visibility("default"))) VkResult vkCreateCommandBuffer(VkDevice device, const VkCmdBufferCreateInfo* pCreateInfo, VkCmdBuffer* pCmdBuffer) { - return GetVtbl(device).CreateCommandBuffer(device, pCreateInfo, pCmdBuffer); + return vulkan::CreateCommandBuffer(device, pCreateInfo, pCmdBuffer); } __attribute__((visibility("default"))) diff --git a/vulkan/libvulkan/entry.cpp.tmpl b/vulkan/libvulkan/entry.cpp.tmpl index 249f8fdcad..3eabe2edad 100644 --- a/vulkan/libvulkan/entry.cpp.tmpl +++ b/vulkan/libvulkan/entry.cpp.tmpl @@ -73,7 +73,7 @@ namespace { */}} {{define "IsSpecialEntry"}} {{/* TODO: figure out how to do this in a cleaner or at least multi-line way */}} - {{if or (eq $ "vkGetInstanceProcAddr") (or (eq $ "vkGetDeviceProcAddr") (or (eq $ "vkGetDeviceQueue") (eq $ "vkDestroyDevice")))}} + {{if or (eq $ "vkGetInstanceProcAddr") (or (eq $ "vkGetDeviceProcAddr") (or (eq $ "vkGetDeviceQueue") (or (eq $ "vkCreateCommandBuffer") (eq $ "vkDestroyDevice"))))}} true {{end}} {{end}} diff --git a/vulkan/libvulkan/loader.cpp b/vulkan/libvulkan/loader.cpp index a99e90a72b..19ca9f22b0 100644 --- a/vulkan/libvulkan/loader.cpp +++ b/vulkan/libvulkan/loader.cpp @@ -494,6 +494,7 @@ PFN_vkVoidFunction GetDeviceProcAddr(VkDevice device, const char* name) { return GetGlobalDeviceProcAddr(name); // For special-case functions we always return the loader entry if (strcmp(name, "vkGetDeviceQueue") == 0 || + strcmp(name, "vkCreateCommandBuffer") == 0 || strcmp(name, "vkDestroyDevice") == 0) { return GetGlobalDeviceProcAddr(name); } @@ -521,6 +522,27 @@ VkResult GetDeviceQueue(VkDevice drv_device, return VK_SUCCESS; } +VkResult CreateCommandBuffer(VkDevice drv_device, + const VkCmdBufferCreateInfo* create_info, + VkCmdBuffer* out_cmdbuf) { + const DeviceVtbl* vtbl = GetVtbl(drv_device); + VkCmdBuffer cmdbuf; + VkResult result = + vtbl->CreateCommandBuffer(drv_device, create_info, &cmdbuf); + if (result != VK_SUCCESS) + return result; + hwvulkan_dispatch_t* dispatch = + reinterpret_cast(cmdbuf); + if (dispatch->magic != HWVULKAN_DISPATCH_MAGIC) { + ALOGE("invalid VkCmdBuffer dispatch magic: 0x%" PRIxPTR, + dispatch->magic); + return VK_ERROR_INITIALIZATION_FAILED; + } + dispatch->vtbl = vtbl; + *out_cmdbuf = cmdbuf; + return VK_SUCCESS; +} + VkResult DestroyDevice(VkDevice drv_device) { const DeviceVtbl* vtbl = GetVtbl(drv_device); Device* device = static_cast(vtbl->device); diff --git a/vulkan/libvulkan/loader.h b/vulkan/libvulkan/loader.h index 1f6a1d4ec2..fad92a7c5b 100644 --- a/vulkan/libvulkan/loader.h +++ b/vulkan/libvulkan/loader.h @@ -187,6 +187,9 @@ VkResult GetDeviceQueue(VkDevice drv_device, uint32_t family, uint32_t index, VkQueue* out_queue); +VkResult CreateCommandBuffer(VkDevice device, + const VkCmdBufferCreateInfo* create_info, + VkCmdBuffer* out_cmdbuf); VkResult DestroyDevice(VkDevice drv_device); // ----------------------------------------------------------------------------- diff --git a/vulkan/nulldrv/null_driver.cpp b/vulkan/nulldrv/null_driver.cpp index 281873de92..ad7011f32c 100644 --- a/vulkan/nulldrv/null_driver.cpp +++ b/vulkan/nulldrv/null_driver.cpp @@ -48,36 +48,36 @@ namespace { // Using a namespace here instead of 'enum class' since we want scoped // constants but also want implicit conversions to integral types. namespace HandleType { - enum Enum { - kAttachmentView, - kBufferView, - kCmdPool, - kDescriptorPool, - kDescriptorSet, - kDescriptorSetLayout, - kDynamicColorBlendState, - kDynamicDepthStencilState, - kDynamicRasterState, - kDynamicViewportState, - kEvent, - kFence, - kFramebuffer, - kImageView, - kPipeline, - kPipelineCache, - kPipelineLayout, - kQueryPool, - kRenderPass, - kSampler, - kSemaphore, - kShader, - kShaderModule, - - kNumTypes - }; -} // namespace HandleType +enum Enum { + kAttachmentView, + kBufferView, + kCmdPool, + kDescriptorPool, + kDescriptorSet, + kDescriptorSetLayout, + kDynamicColorBlendState, + kDynamicDepthStencilState, + kDynamicRasterState, + kDynamicViewportState, + kEvent, + kFence, + kFramebuffer, + kImageView, + kPipeline, + kPipelineCache, + kPipelineLayout, + kQueryPool, + kRenderPass, + kSampler, + kSemaphore, + kShader, + kShaderModule, + + kNumTypes +}; +} // namespace HandleType uint64_t AllocHandle(VkDevice device, HandleType::Enum type); -} // anonymous namespace +} // anonymous namespace struct VkDevice_T { hwvulkan_dispatch_t dispatch; @@ -299,6 +299,29 @@ VkResult GetDeviceQueue(VkDevice device, uint32_t, uint32_t, VkQueue* queue) { } // ----------------------------------------------------------------------------- +// CmdBuffer + +VkResult CreateCommandBuffer(VkDevice device, + const VkCmdBufferCreateInfo*, + VkCmdBuffer* out_cmdbuf) { + const VkAllocCallbacks* alloc = device->instance->alloc; + VkCmdBuffer_T* cmdbuf = static_cast(alloc->pfnAlloc( + alloc->pUserData, sizeof(VkCmdBuffer_T), alignof(VkCmdBuffer_T), + VK_SYSTEM_ALLOC_TYPE_API_OBJECT)); + if (!cmdbuf) + return VK_ERROR_OUT_OF_HOST_MEMORY; + cmdbuf->dispatch.magic = HWVULKAN_DISPATCH_MAGIC; + *out_cmdbuf = cmdbuf; + return VK_SUCCESS; +} + +VkResult DestroyCommandBuffer(VkDevice device, VkCmdBuffer cmdbuf) { + const VkAllocCallbacks* alloc = device->instance->alloc; + alloc->pfnFree(alloc->pUserData, cmdbuf); + return VK_SUCCESS; +} + +// ----------------------------------------------------------------------------- // DeviceMemory struct DeviceMemory { @@ -629,7 +652,6 @@ VkResult GetPhysicalDeviceExtensionProperties(VkPhysicalDevice physicalDevice, c } VkResult QueueSubmit(VkQueue queue, uint32_t cmdBufferCount, const VkCmdBuffer* pCmdBuffers, VkFence fence) { - ALOGV("TODO: vk%s", __FUNCTION__); return VK_SUCCESS; } @@ -706,7 +728,6 @@ VkResult DestroyFence(VkDevice device, VkFence fence) { } VkResult ResetFences(VkDevice device, uint32_t fenceCount, const VkFence* pFences) { - ALOGV("TODO: vk%s", __FUNCTION__); return VK_SUCCESS; } @@ -716,7 +737,6 @@ VkResult GetFenceStatus(VkDevice device, VkFence fence) { } VkResult WaitForFences(VkDevice device, uint32_t fenceCount, const VkFence* pFences, VkBool32 waitAll, uint64_t timeout) { - ALOGV("TODO: vk%s", __FUNCTION__); return VK_SUCCESS; } @@ -889,23 +909,11 @@ VkResult ResetCommandPool(VkDevice device, VkCmdPool cmdPool, VkCmdPoolResetFlag return VK_SUCCESS; } -VkResult CreateCommandBuffer(VkDevice device, const VkCmdBufferCreateInfo* pCreateInfo, VkCmdBuffer* pCmdBuffer) { - ALOGV("TODO: vk%s", __FUNCTION__); - return VK_SUCCESS; -} - -VkResult DestroyCommandBuffer(VkDevice device, VkCmdBuffer commandBuffer) { - ALOGV("TODO: vk%s", __FUNCTION__); - return VK_SUCCESS; -} - VkResult BeginCommandBuffer(VkCmdBuffer cmdBuffer, const VkCmdBufferBeginInfo* pBeginInfo) { - ALOGV("TODO: vk%s", __FUNCTION__); return VK_SUCCESS; } VkResult EndCommandBuffer(VkCmdBuffer cmdBuffer) { - ALOGV("TODO: vk%s", __FUNCTION__); return VK_SUCCESS; } -- 2.11.0