Lines Matching refs:image
74 v3d_setup_slices(struct v3dv_image *image)
76 assert(image->cpp > 0);
78 uint32_t width = image->vk.extent.width;
79 uint32_t height = image->vk.extent.height;
80 uint32_t depth = image->vk.extent.depth;
91 uint32_t utile_w = v3d_utile_width(image->cpp);
92 uint32_t utile_h = v3d_utile_height(image->cpp);
96 uint32_t block_width = vk_format_get_blockwidth(image->vk.format);
97 uint32_t block_height = vk_format_get_blockheight(image->vk.format);
99 assert(image->vk.samples == VK_SAMPLE_COUNT_1_BIT ||
100 image->vk.samples == VK_SAMPLE_COUNT_4_BIT);
101 bool msaa = image->vk.samples != VK_SAMPLE_COUNT_1_BIT;
105 assert(image->vk.array_layers > 0);
107 assert(image->vk.mip_levels >= 1);
110 for (int32_t i = image->vk.mip_levels - 1; i >= 0; i--) {
111 struct v3d_resource_slice *slice = &image->slices[i];
135 if (!image->tiled) {
137 if (image->vk.image_type == VK_IMAGE_TYPE_1D)
138 level_width = align(level_width, 64 / image->cpp);
160 slice->ub_pad = v3d_get_ub_pad(image->cpp, level_height);
177 slice->stride = level_width * image->cpp;
182 slice->padded_height / (2 * v3d_utile_height(image->cpp));
202 image->size = offset;
212 image->alignment = image->tiled ? 4096 : image->cpp;
214 align(image->slices[0].offset, image->alignment) - image->slices[0].offset;
216 image->size += align_offset;
217 for (int i = 0; i < image->vk.mip_levels; i++)
218 image->slices[i].offset += align_offset;
225 if (image->vk.image_type != VK_IMAGE_TYPE_3D) {
226 image->cube_map_stride =
227 align(image->slices[0].offset + image->slices[0].size, 64);
228 image->size += image->cube_map_stride * (image->vk.array_layers - 1);
230 image->cube_map_stride = image->slices[0].size;
235 v3dv_layer_offset(const struct v3dv_image *image, uint32_t level, uint32_t layer)
237 const struct v3d_resource_slice *slice = &image->slices[level];
239 if (image->vk.image_type == VK_IMAGE_TYPE_3D)
240 return image->mem_offset + slice->offset + layer * slice->size;
242 return image->mem_offset + slice->offset + layer * image->cube_map_stride;
251 struct v3dv_image *image = NULL;
253 image = vk_image_create(&device->vk, pCreateInfo, pAllocator, sizeof(*image));
254 if (image == NULL)
295 image->vk.wsi_legacy_scanout) {
311 vk_image_destroy(&device->vk, pAllocator, &image->vk);
327 image->format = format;
328 image->cpp = vk_format_get_blocksize(image->vk.format);
329 image->tiled = tiling == VK_IMAGE_TILING_OPTIMAL ||
333 image->vk.tiling = tiling;
334 image->vk.drm_format_mod = modifier;
336 /* Our meta paths can create image views with compatible formats for any
337 * image, so always set this flag to keep the common Vulkan image code
340 image->vk.create_flags |= VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
342 v3d_setup_slices(image);
346 image->slices[0].stride = native_buf_stride;
347 image->slices[0].size = image->size = native_buf_size;
351 v3dv_image_to_handle(image));
353 vk_object_free(&device->vk, pAllocator, image);
359 *pImage = v3dv_image_to_handle(image);
381 /* The spec requires TILING_OPTIMAL as input, but the swapchain image may
383 * #swapchain-wsi-image-create-info .
434 V3DV_FROM_HANDLE(v3dv_image, image, _image);
437 &image->slices[subresource->mipLevel];
439 v3dv_layer_offset(image, subresource->mipLevel, subresource->arrayLayer) -
440 image->mem_offset;
442 layout->depthPitch = image->cube_map_stride;
443 layout->arrayPitch = image->cube_map_stride;
445 if (image->vk.image_type != VK_IMAGE_TYPE_3D) {
449 * in the 3D image, so we have to multiply by the depth extent of the
455 layout->size = slice->size * image->vk.extent.depth;
458 &image->slices[subresource->mipLevel - 1];
470 V3DV_FROM_HANDLE(v3dv_image, image, _image);
472 if (image == NULL)
476 if (image->is_native_buffer_memory)
477 v3dv_FreeMemory(_device, v3dv_device_memory_to_handle(image->mem), pAllocator);
480 vk_image_destroy(&device->vk, pAllocator, &image->vk);
491 unreachable("Invalid image type");
502 V3DV_FROM_HANDLE(v3dv_image, image, pCreateInfo->image);
512 iview->offset = v3dv_layer_offset(image, iview->vk.base_mip_level,