1/*
2 * Copyright 2019 Google LLC
3 * SPDX-License-Identifier: MIT
4 *
5 * based in part on anv and radv which are:
6 * Copyright © 2015 Intel Corporation
7 * Copyright © 2016 Red Hat.
8 * Copyright © 2016 Bas Nieuwenhuizen
9 */
10
11#ifndef VN_IMAGE_H
12#define VN_IMAGE_H
13
14#include "vn_common.h"
15
16/* changing this to VK_IMAGE_LAYOUT_PRESENT_SRC_KHR disables ownership
17 * transfers and can be useful for debugging
18 */
19#define VN_PRESENT_SRC_INTERNAL_LAYOUT VK_IMAGE_LAYOUT_GENERAL
20
21struct vn_image_memory_requirements {
22   VkMemoryRequirements2 memory;
23   VkMemoryDedicatedRequirements dedicated;
24};
25
26struct vn_image_create_deferred_info {
27   VkImageCreateInfo create;
28   VkImageFormatListCreateInfo list;
29   VkImageStencilUsageCreateInfo stencil;
30
31   /* True if VkImageCreateInfo::format is translated from a non-zero
32    * VkExternalFormatANDROID::externalFormat for the AHB image.
33    */
34   bool from_external_format;
35   /* track whether vn_image_init_deferred succeeds */
36   bool initialized;
37};
38
39struct vn_image {
40   struct vn_object_base base;
41
42   VkSharingMode sharing_mode;
43
44   struct vn_image_memory_requirements requirements[4];
45
46   /* For VK_ANDROID_external_memory_android_hardware_buffer, real image
47    * creation is deferred until bind image memory.
48    */
49   struct vn_image_create_deferred_info *deferred_info;
50
51   struct {
52      /* True if this is a swapchain image and VK_IMAGE_LAYOUT_PRESENT_SRC_KHR
53       * is a valid layout.  A swapchain image can be created internally
54       * (wsi_image_create_info) or externally (VkNativeBufferANDROID and
55       * VkImageSwapchainCreateInfoKHR).
56       */
57      bool is_wsi;
58      bool is_prime_blit_src;
59      VkImageTiling tiling_override;
60      /* valid when tiling is VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT */
61      uint64_t drm_format_modifier;
62
63      struct vn_device_memory *memory;
64
65      /* For VK_ANDROID_native_buffer, the WSI image owns the memory. */
66      bool memory_owned;
67   } wsi;
68};
69VK_DEFINE_NONDISP_HANDLE_CASTS(vn_image,
70                               base.base,
71                               VkImage,
72                               VK_OBJECT_TYPE_IMAGE)
73
74struct vn_image_view {
75   struct vn_object_base base;
76
77   const struct vn_image *image;
78};
79VK_DEFINE_NONDISP_HANDLE_CASTS(vn_image_view,
80                               base.base,
81                               VkImageView,
82                               VK_OBJECT_TYPE_IMAGE_VIEW)
83
84struct vn_sampler {
85   struct vn_object_base base;
86};
87VK_DEFINE_NONDISP_HANDLE_CASTS(vn_sampler,
88                               base.base,
89                               VkSampler,
90                               VK_OBJECT_TYPE_SAMPLER)
91
92struct vn_sampler_ycbcr_conversion {
93   struct vn_object_base base;
94};
95VK_DEFINE_NONDISP_HANDLE_CASTS(vn_sampler_ycbcr_conversion,
96                               base.base,
97                               VkSamplerYcbcrConversion,
98                               VK_OBJECT_TYPE_SAMPLER_YCBCR_CONVERSION)
99
100VkResult
101vn_image_create(struct vn_device *dev,
102                const VkImageCreateInfo *create_info,
103                const VkAllocationCallbacks *alloc,
104                struct vn_image **out_img);
105
106VkResult
107vn_image_init_deferred(struct vn_device *dev,
108                       const VkImageCreateInfo *create_info,
109                       struct vn_image *img);
110
111VkResult
112vn_image_create_deferred(struct vn_device *dev,
113                         const VkImageCreateInfo *create_info,
114                         const VkAllocationCallbacks *alloc,
115                         struct vn_image **out_img);
116
117#endif /* VN_IMAGE_H */
118