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

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

vknulldrv: implement VkBuffer objects

Change-Id: Idda564392cf8daae6ea8c3a9809e6df990433a33
(cherry picked from commit aee62ea7ff379dde787344e1377b51fefb2385d6)
parent 73ab0acc
Loading
Loading
Loading
Loading
+58 −15
Original line number Diff line number Diff line
@@ -119,6 +119,21 @@ VkInstance_T* GetInstanceFromPhysicalDevice(

namespace null_driver {

template <typename HandleT>
struct HandleTraits {};

template <typename HandleT>
typename HandleTraits<HandleT>::PointerType GetObjectFromHandle(
    const HandleT& h) {
    return reinterpret_cast<typename HandleTraits<HandleT>::PointerType>(
        uintptr_t(h.handle));
}

template <typename T>
typename T::HandleType GetHandleToObject(const T* obj) {
    return typename T::HandleType(reinterpret_cast<uintptr_t>(obj));
}

// -----------------------------------------------------------------------------
// Global

@@ -221,6 +236,49 @@ VkResult GetDeviceQueue(VkDevice device, uint32_t, uint32_t, VkQueue* queue) {
    return VK_SUCCESS;
}

// -----------------------------------------------------------------------------
// Buffer

struct Buffer {
    typedef VkBuffer HandleType;
    VkDeviceSize size;
};
template <>
struct HandleTraits<VkBuffer> {
    typedef Buffer* PointerType;
};

VkResult CreateBuffer(VkDevice device,
                      const VkBufferCreateInfo* create_info,
                      VkBuffer* buffer_handle) {
    const VkAllocCallbacks* alloc = device->instance->alloc;
    Buffer* buffer = static_cast<Buffer*>(
        alloc->pfnAlloc(alloc->pUserData, sizeof(Buffer), alignof(Buffer),
                        VK_SYSTEM_ALLOC_TYPE_API_OBJECT));
    if (!buffer)
        return VK_ERROR_OUT_OF_HOST_MEMORY;
    buffer->size = create_info->size;
    *buffer_handle = GetHandleToObject(buffer);
    return VK_SUCCESS;
}

VkResult GetBufferMemoryRequirements(VkDevice,
                                     VkBuffer buffer_handle,
                                     VkMemoryRequirements* requirements) {
    Buffer* buffer = GetObjectFromHandle(buffer_handle);
    requirements->size = buffer->size;
    requirements->alignment = 16;  // allow fast Neon/SSE memcpy
    requirements->memoryTypeBits = 0x1;
    return VK_SUCCESS;
}

VkResult DestroyBuffer(VkDevice device, VkBuffer buffer_handle) {
    const VkAllocCallbacks* alloc = device->instance->alloc;
    Buffer* buffer = GetObjectFromHandle(buffer_handle);
    alloc->pfnFree(alloc->pUserData, buffer);
    return VK_SUCCESS;
}

// -----------------------------------------------------------------------------
// No-op entrypoints

@@ -323,11 +381,6 @@ VkResult GetDeviceMemoryCommitment(VkDevice device, VkDeviceMemory memory, VkDev
    return VK_SUCCESS;
}

VkResult GetBufferMemoryRequirements(VkDevice device, VkBuffer buffer, VkMemoryRequirements* pMemoryRequirements) {
    ALOGV("TODO: vk%s", __FUNCTION__);
    return VK_SUCCESS;
}

VkResult BindBufferMemory(VkDevice device, VkBuffer buffer, VkDeviceMemory mem, VkDeviceSize memOffset) {
    ALOGV("TODO: vk%s", __FUNCTION__);
    return VK_SUCCESS;
@@ -453,16 +506,6 @@ VkResult GetQueryPoolResults(VkDevice device, VkQueryPool queryPool, uint32_t st
    return VK_SUCCESS;
}

VkResult CreateBuffer(VkDevice device, const VkBufferCreateInfo* pCreateInfo, VkBuffer* pBuffer) {
    ALOGV("TODO: vk%s", __FUNCTION__);
    return VK_SUCCESS;
}

VkResult DestroyBuffer(VkDevice device, VkBuffer buffer) {
    ALOGV("TODO: vk%s", __FUNCTION__);
    return VK_SUCCESS;
}

VkResult CreateBufferView(VkDevice device, const VkBufferViewCreateInfo* pCreateInfo, VkBufferView* pView) {
    ALOGV("TODO: vk%s", __FUNCTION__);
    return VK_SUCCESS;