Lines Matching refs:image

43 static void pvr_image_init_memlayout(struct pvr_image *image)
45 switch (image->vk.tiling) {
49 if (image->vk.wsi_legacy_scanout)
50 image->memlayout = PVR_MEMLAYOUT_LINEAR;
51 else if (image->vk.image_type == VK_IMAGE_TYPE_3D)
52 image->memlayout = PVR_MEMLAYOUT_3DTWIDDLED;
54 image->memlayout = PVR_MEMLAYOUT_TWIDDLED;
57 image->memlayout = PVR_MEMLAYOUT_LINEAR;
62 static void pvr_image_init_physical_extent(struct pvr_image *image)
64 assert(image->memlayout != PVR_MEMLAYOUT_UNDEFINED);
67 if (image->vk.mip_levels > 1 ||
68 image->memlayout == PVR_MEMLAYOUT_TWIDDLED ||
69 image->memlayout == PVR_MEMLAYOUT_3DTWIDDLED) {
71 image->physical_extent.width =
72 util_next_power_of_two(image->vk.extent.width);
73 image->physical_extent.height =
74 util_next_power_of_two(image->vk.extent.height);
75 image->physical_extent.depth =
76 util_next_power_of_two(image->vk.extent.depth);
78 assert(image->memlayout == PVR_MEMLAYOUT_LINEAR);
79 image->physical_extent = image->vk.extent;
83 static void pvr_image_setup_mip_levels(struct pvr_image *image)
86 image->vk.image_type == VK_IMAGE_TYPE_3D ? 4 : 1;
87 const unsigned int cpp = vk_format_get_blocksize(image->vk.format);
92 const uint32_t level_alignment = image->vk.mip_levels > 1 ? 4 : 1;
94 assert(image->vk.mip_levels <= ARRAY_SIZE(image->mip_levels));
96 image->layer_size = 0;
98 for (uint32_t i = 0; i < image->vk.mip_levels; i++) {
99 const uint32_t height = u_minify(image->physical_extent.height, i);
100 const uint32_t width = u_minify(image->physical_extent.width, i);
101 const uint32_t depth = u_minify(image->physical_extent.depth, i);
102 struct pvr_mip_level *mip_level = &image->mip_levels[i];
106 mip_level->size = image->vk.samples * mip_level->pitch *
110 mip_level->offset = image->layer_size;
112 image->layer_size += mip_level->size;
115 /* TODO: It might be useful to store the alignment in the image so it can be
120 if (image->vk.array_layers > 1)
121 image->layer_size = ALIGN(image->layer_size, image->alignment);
123 image->size = image->layer_size * image->vk.array_layers;
132 struct pvr_image *image;
136 image =
137 vk_image_create(&device->vk, pCreateInfo, pAllocator, sizeof(*image));
138 if (!image)
144 image->alignment = 4096U;
146 /* Initialize the image using the saved information from pCreateInfo */
147 pvr_image_init_memlayout(image);
148 pvr_image_init_physical_extent(image);
149 pvr_image_setup_mip_levels(image);
151 *pImage = pvr_image_to_handle(image);
161 PVR_FROM_HANDLE(pvr_image, image, _image);
163 if (!image)
166 if (image->vma)
167 pvr_unbind_memory(device, image->vma);
169 vk_image_destroy(&device->vk, pAllocator, &image->vk);
213 PVR_FROM_HANDLE(pvr_image, image, pBindInfos[i].image);
218 image->size,
219 image->alignment,
220 &image->vma,
221 &image->dev_addr);
224 PVR_FROM_HANDLE(pvr_image, image, pBindInfos[i].image);
226 pvr_unbind_memory(device, image->vma);
241 PVR_FROM_HANDLE(pvr_image, image, _image);
243 &image->mip_levels[subresource->mipLevel];
245 pvr_assert(subresource->mipLevel < image->vk.mip_levels);
246 pvr_assert(subresource->arrayLayer < image->vk.array_layers);
249 subresource->arrayLayer * image->layer_size + mip_level->offset;
252 layout->arrayPitch = image->layer_size;
261 PVR_FROM_HANDLE(pvr_image, image, pCreateInfo->image);
277 iview->image = image;
282 info.extent = image->vk.extent;
286 info.offset = iview->vk.base_array_layer * image->layer_size +
287 image->mip_levels[info.base_level].offset;
288 info.mipmaps_present = (image->vk.mip_levels > 1) ? true : false;
289 info.stride = image->physical_extent.width;
291 info.mem_layout = image->memlayout;
293 info.sample_count = image->vk.samples;
294 info.addr = image->dev_addr;
314 if (info.is_cube && image->vk.usage & VK_IMAGE_USAGE_STORAGE_BIT) {
325 * impression that this is the only level in the image. This also requires
334 info.stride = u_minify(image->physical_extent.width, info.base_level);