vk/image: Add explicit constructors for buffer/image view types
authorJason Ekstrand <jason.ekstrand@intel.com>
Fri, 10 Jul 2015 19:25:30 +0000 (12:25 -0700)
committerJason Ekstrand <jason.ekstrand@intel.com>
Fri, 10 Jul 2015 19:26:31 +0000 (12:26 -0700)
src/vulkan/device.c
src/vulkan/image.c
src/vulkan/private.h

index 312105a946de8bce270a94591321f789f247e13a..e9c3eebea96754d47f90d687b545bad65988739f 100644 (file)
@@ -1159,9 +1159,20 @@ VkResult anv_DestroyObject(
       /* These are just dummys anyway, so we don't need to destroy them */
       return VK_SUCCESS;
 
+   case VK_OBJECT_TYPE_BUFFER_VIEW:
+      return anv_DestroyBufferView(_device, _object);
+
+   case VK_OBJECT_TYPE_IMAGE_VIEW:
+      return anv_DestroyImageView(_device, _object);
+
+   case VK_OBJECT_TYPE_COLOR_ATTACHMENT_VIEW:
+      return anv_DestroyColorAttachmentView(_device, _object);
+
+   case VK_OBJECT_TYPE_DEPTH_STENCIL_VIEW:
+      return anv_DestroyDepthStencilView(_device, _object);
+
    case VK_OBJECT_TYPE_BUFFER:
    case VK_OBJECT_TYPE_IMAGE:
-   case VK_OBJECT_TYPE_DEPTH_STENCIL_VIEW:
    case VK_OBJECT_TYPE_SHADER:
    case VK_OBJECT_TYPE_SHADER_MODULE:
    case VK_OBJECT_TYPE_PIPELINE_LAYOUT:
@@ -1182,9 +1193,6 @@ VkResult anv_DestroyObject(
    case VK_OBJECT_TYPE_FENCE:
    case VK_OBJECT_TYPE_QUERY_POOL:
    case VK_OBJECT_TYPE_FRAMEBUFFER:
-   case VK_OBJECT_TYPE_BUFFER_VIEW:
-   case VK_OBJECT_TYPE_IMAGE_VIEW:
-   case VK_OBJECT_TYPE_COLOR_ATTACHMENT_VIEW:
       (object->destructor)(device, object, objType);
       return VK_SUCCESS;
 
@@ -1571,8 +1579,6 @@ VkResult anv_CreateBufferView(
    if (view == NULL)
       return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY);
 
-   view->base.destructor = anv_surface_view_destroy;
-
    view->bo = buffer->bo;
    view->offset = buffer->offset + pCreateInfo->offset;
    view->surface_state =
@@ -1588,6 +1594,17 @@ VkResult anv_CreateBufferView(
    return VK_SUCCESS;
 }
 
+VkResult anv_DestroyBufferView(
+    VkDevice                                    _device,
+    VkBufferView                                _view)
+{
+   ANV_FROM_HANDLE(anv_device, device, _device);
+
+   anv_surface_view_destroy(device, (struct anv_surface_view *)_view);
+
+   return VK_SUCCESS;
+}
+
 // Sampler functions
 
 VkResult anv_CreateSampler(
index d63ae1dfed826809313a6c15200ea7bf56f7fc34..5f82ed369cbf9048ae11b66dcf91c799998d5d28 100644 (file)
@@ -317,14 +317,8 @@ VkResult anv_GetImageSubresourceLayout(
 
 void
 anv_surface_view_destroy(struct anv_device *device,
-                         struct anv_object *obj, VkObjectType obj_type)
+                         struct anv_surface_view *view)
 {
-   struct anv_surface_view *view = (struct anv_surface_view *)obj;
-
-   assert(obj_type == VK_OBJECT_TYPE_BUFFER_VIEW ||
-          obj_type == VK_OBJECT_TYPE_IMAGE_VIEW ||
-          obj_type == VK_OBJECT_TYPE_COLOR_ATTACHMENT_VIEW);
-
    anv_state_pool_free(&device->surface_state_pool, view->surface_state);
 
    anv_device_free(device, view);
@@ -544,13 +538,21 @@ anv_CreateImageView(VkDevice _device,
 
    anv_image_view_init(view, device, pCreateInfo, NULL);
 
-   view->base.destructor = anv_surface_view_destroy;
-
    *pView = (VkImageView) view;
 
    return VK_SUCCESS;
 }
 
+VkResult
+anv_DestroyImageView(VkDevice _device, VkImageView _view)
+{
+   ANV_FROM_HANDLE(anv_device, device, _device);
+
+   anv_surface_view_destroy(device, (struct anv_surface_view *)_view);
+
+   return VK_SUCCESS;
+}
+
 void
 anv_color_attachment_view_init(struct anv_surface_view *view,
                                struct anv_device *device,
@@ -664,13 +666,21 @@ anv_CreateColorAttachmentView(VkDevice _device,
 
    anv_color_attachment_view_init(view, device, pCreateInfo, NULL);
 
-   view->base.destructor = anv_surface_view_destroy;
-
    *pView = (VkColorAttachmentView) view;
 
    return VK_SUCCESS;
 }
 
+VkResult
+anv_DestroyColorAttachmentView(VkDevice _device, VkColorAttachmentView _view)
+{
+   ANV_FROM_HANDLE(anv_device, device, _device);
+
+   anv_surface_view_destroy(device, (struct anv_surface_view *)_view);
+
+   return VK_SUCCESS;
+}
+
 VkResult
 anv_CreateDepthStencilView(VkDevice _device,
                            const VkDepthStencilViewCreateInfo *pCreateInfo,
@@ -711,3 +721,14 @@ anv_CreateDepthStencilView(VkDevice _device,
 
    return VK_SUCCESS;
 }
+
+VkResult
+anv_DestroyDepthStencilView(VkDevice _device, VkDepthStencilView _view)
+{
+   ANV_FROM_HANDLE(anv_device, device, _device);
+   ANV_FROM_HANDLE(anv_depth_stencil_view, view, _view);
+
+   anv_device_free(device, view);
+
+   return VK_SUCCESS;
+}
index ef4b183056e8713ba88fd8abb4628d0adb53d554..91f3e50b5d8281a60d6101ec444f49f099262147 100644 (file)
@@ -857,8 +857,6 @@ struct anv_image {
 };
 
 struct anv_surface_view {
-   struct anv_object                            base;
-
    struct anv_state                             surface_state;
    struct anv_bo *                              bo;
    uint32_t                                     offset;
@@ -888,7 +886,7 @@ void anv_color_attachment_view_init(struct anv_surface_view *view,
                                     struct anv_cmd_buffer *cmd_buffer);
 
 void anv_surface_view_destroy(struct anv_device *device,
-                              struct anv_object *obj, VkObjectType obj_type);
+                              struct anv_surface_view *view);
 
 struct anv_sampler {
    uint32_t state[4];
@@ -945,6 +943,12 @@ anv_cmd_buffer_clear(struct anv_cmd_buffer *cmd_buffer,
 void *
 anv_lookup_entrypoint(const char *name);
 
+VkResult anv_DestroyImageView(VkDevice device, VkImageView imageView);
+VkResult anv_DestroyBufferView(VkDevice device, VkBufferView bufferView);
+VkResult anv_DestroyColorAttachmentView(VkDevice device,
+                                        VkColorAttachmentView view);
+VkResult anv_DestroyDepthStencilView(VkDevice device, VkDepthStencilView view);
+
 #define ANV_DEFINE_CASTS(__anv_type, __VkType)     \
 static inline struct __anv_type *                  \
 __anv_type ## _from_handle(__VkType _handle)       \