OSDN Git Service

vknulldrv: implement VkBuffer objects
authorJesse Hall <jessehall@google.com>
Sat, 29 Aug 2015 16:06:12 +0000 (17:06 +0100)
committerJesse Hall <jessehall@google.com>
Mon, 25 Jan 2016 21:49:31 +0000 (13:49 -0800)
Change-Id: Idda564392cf8daae6ea8c3a9809e6df990433a33
(cherry picked from commit aee62ea7ff379dde787344e1377b51fefb2385d6)

vulkan/nulldrv/null_driver.cpp

index 9a0f07a..ec9cae6 100644 (file)
@@ -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
 
@@ -222,6 +237,49 @@ VkResult GetDeviceQueue(VkDevice device, uint32_t, uint32_t, VkQueue* queue) {
 }
 
 // -----------------------------------------------------------------------------
+// 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
 
 // clang-format off
@@ -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;