Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c7a6eb56 authored by Jesse Hall's avatar Jesse Hall
Browse files

vulkan: Set up VkCmdBuffer dispatching

Change-Id: Ifb3cea05dab8828c2c00b8ed60c5ad991cdcbea7
(cherry picked from commit 10bf73e13b6904afa606fdcdc05bcc510c605180)
parent f8faf0ce
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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")))
+1 −1
Original line number Diff line number Diff line
@@ -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}}
+22 −0
Original line number Diff line number Diff line
@@ -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<hwvulkan_dispatch_t*>(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<Device*>(vtbl->device);
+3 −0
Original line number Diff line number Diff line
@@ -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);

// -----------------------------------------------------------------------------
+52 −44
Original line number Diff line number Diff line
@@ -298,6 +298,29 @@ VkResult GetDeviceQueue(VkDevice device, uint32_t, uint32_t, VkQueue* queue) {
    return VK_SUCCESS;
}

// -----------------------------------------------------------------------------
// CmdBuffer

VkResult CreateCommandBuffer(VkDevice device,
                             const VkCmdBufferCreateInfo*,
                             VkCmdBuffer* out_cmdbuf) {
    const VkAllocCallbacks* alloc = device->instance->alloc;
    VkCmdBuffer_T* cmdbuf = static_cast<VkCmdBuffer_T*>(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

@@ -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;
}