1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker * Copyright © 2023 Valve Corporation
3*61046927SAndroid Build Coastguard Worker *
4*61046927SAndroid Build Coastguard Worker * SPDX-License-Identifier: MIT
5*61046927SAndroid Build Coastguard Worker */
6*61046927SAndroid Build Coastguard Worker
7*61046927SAndroid Build Coastguard Worker #ifndef RADV_SDMA_H
8*61046927SAndroid Build Coastguard Worker #define RADV_SDMA_H
9*61046927SAndroid Build Coastguard Worker
10*61046927SAndroid Build Coastguard Worker #include "radv_image.h"
11*61046927SAndroid Build Coastguard Worker
12*61046927SAndroid Build Coastguard Worker #ifdef __cplusplus
13*61046927SAndroid Build Coastguard Worker extern "C" {
14*61046927SAndroid Build Coastguard Worker #endif
15*61046927SAndroid Build Coastguard Worker
16*61046927SAndroid Build Coastguard Worker struct radv_sdma_surf {
17*61046927SAndroid Build Coastguard Worker VkExtent3D extent; /* Image extent. */
18*61046927SAndroid Build Coastguard Worker VkOffset3D offset; /* Image offset. */
19*61046927SAndroid Build Coastguard Worker uint64_t va; /* Virtual address of image data. */
20*61046927SAndroid Build Coastguard Worker unsigned bpp; /* Bytes per pixel. */
21*61046927SAndroid Build Coastguard Worker unsigned blk_w; /* Image format block width in pixels. */
22*61046927SAndroid Build Coastguard Worker unsigned blk_h; /* Image format block height in pixels. */
23*61046927SAndroid Build Coastguard Worker unsigned mip_levels; /* Mip levels in the image. */
24*61046927SAndroid Build Coastguard Worker uint8_t micro_tile_mode; /* Micro tile mode of the image. */
25*61046927SAndroid Build Coastguard Worker bool is_linear; /* Whether the image is linear. */
26*61046927SAndroid Build Coastguard Worker bool is_3d; /* Whether the image is 3-dimensional. */
27*61046927SAndroid Build Coastguard Worker
28*61046927SAndroid Build Coastguard Worker union {
29*61046927SAndroid Build Coastguard Worker /* linear images only */
30*61046927SAndroid Build Coastguard Worker struct {
31*61046927SAndroid Build Coastguard Worker unsigned pitch; /* Row pitch in bytes. */
32*61046927SAndroid Build Coastguard Worker unsigned slice_pitch; /* Slice pitch in bytes. */
33*61046927SAndroid Build Coastguard Worker };
34*61046927SAndroid Build Coastguard Worker /* tiled images only */
35*61046927SAndroid Build Coastguard Worker struct {
36*61046927SAndroid Build Coastguard Worker uint64_t meta_va; /* Virtual address of metadata. */
37*61046927SAndroid Build Coastguard Worker uint32_t meta_config; /* Metadata configuration DWORD. */
38*61046927SAndroid Build Coastguard Worker uint32_t header_dword; /* Extra bits for the copy packet header. */
39*61046927SAndroid Build Coastguard Worker uint32_t info_dword; /* Image information DWORD. */
40*61046927SAndroid Build Coastguard Worker };
41*61046927SAndroid Build Coastguard Worker };
42*61046927SAndroid Build Coastguard Worker };
43*61046927SAndroid Build Coastguard Worker
44*61046927SAndroid Build Coastguard Worker ALWAYS_INLINE static VkExtent3D
radv_sdma_get_copy_extent(const struct radv_image * const image,const VkImageSubresourceLayers subresource,VkExtent3D extent)45*61046927SAndroid Build Coastguard Worker radv_sdma_get_copy_extent(const struct radv_image *const image, const VkImageSubresourceLayers subresource,
46*61046927SAndroid Build Coastguard Worker VkExtent3D extent)
47*61046927SAndroid Build Coastguard Worker {
48*61046927SAndroid Build Coastguard Worker if (image->vk.image_type != VK_IMAGE_TYPE_3D)
49*61046927SAndroid Build Coastguard Worker extent.depth = vk_image_subresource_layer_count(&image->vk, &subresource);
50*61046927SAndroid Build Coastguard Worker
51*61046927SAndroid Build Coastguard Worker return extent;
52*61046927SAndroid Build Coastguard Worker }
53*61046927SAndroid Build Coastguard Worker
54*61046927SAndroid Build Coastguard Worker struct radv_sdma_surf radv_sdma_get_buf_surf(const struct radv_buffer *const buffer,
55*61046927SAndroid Build Coastguard Worker const struct radv_image *const image,
56*61046927SAndroid Build Coastguard Worker const VkBufferImageCopy2 *const region,
57*61046927SAndroid Build Coastguard Worker const VkImageAspectFlags aspect_mask);
58*61046927SAndroid Build Coastguard Worker struct radv_sdma_surf radv_sdma_get_surf(const struct radv_device *const device, const struct radv_image *const image,
59*61046927SAndroid Build Coastguard Worker const VkImageSubresourceLayers subresource, const VkOffset3D offset,
60*61046927SAndroid Build Coastguard Worker const VkImageAspectFlags aspect_mask);
61*61046927SAndroid Build Coastguard Worker void radv_sdma_copy_buffer_image(const struct radv_device *device, struct radeon_cmdbuf *cs,
62*61046927SAndroid Build Coastguard Worker const struct radv_sdma_surf *buf, const struct radv_sdma_surf *img,
63*61046927SAndroid Build Coastguard Worker const VkExtent3D extent, bool to_image);
64*61046927SAndroid Build Coastguard Worker bool radv_sdma_use_unaligned_buffer_image_copy(const struct radv_device *device, const struct radv_sdma_surf *buf,
65*61046927SAndroid Build Coastguard Worker const struct radv_sdma_surf *img, const VkExtent3D ext);
66*61046927SAndroid Build Coastguard Worker void radv_sdma_copy_buffer_image_unaligned(const struct radv_device *device, struct radeon_cmdbuf *cs,
67*61046927SAndroid Build Coastguard Worker const struct radv_sdma_surf *buf, const struct radv_sdma_surf *img_in,
68*61046927SAndroid Build Coastguard Worker const VkExtent3D copy_extent, struct radeon_winsys_bo *temp_bo,
69*61046927SAndroid Build Coastguard Worker bool to_image);
70*61046927SAndroid Build Coastguard Worker void radv_sdma_copy_image(const struct radv_device *device, struct radeon_cmdbuf *cs, const struct radv_sdma_surf *src,
71*61046927SAndroid Build Coastguard Worker const struct radv_sdma_surf *dst, const VkExtent3D extent);
72*61046927SAndroid Build Coastguard Worker bool radv_sdma_use_t2t_scanline_copy(const struct radv_device *device, const struct radv_sdma_surf *src,
73*61046927SAndroid Build Coastguard Worker const struct radv_sdma_surf *dst, const VkExtent3D extent);
74*61046927SAndroid Build Coastguard Worker void radv_sdma_copy_image_t2t_scanline(const struct radv_device *device, struct radeon_cmdbuf *cs,
75*61046927SAndroid Build Coastguard Worker const struct radv_sdma_surf *src, const struct radv_sdma_surf *dst,
76*61046927SAndroid Build Coastguard Worker const VkExtent3D extent, struct radeon_winsys_bo *temp_bo);
77*61046927SAndroid Build Coastguard Worker void radv_sdma_copy_buffer(const struct radv_device *device, struct radeon_cmdbuf *cs, uint64_t src_va, uint64_t dst_va,
78*61046927SAndroid Build Coastguard Worker uint64_t size);
79*61046927SAndroid Build Coastguard Worker void radv_sdma_fill_buffer(const struct radv_device *device, struct radeon_cmdbuf *cs, const uint64_t va,
80*61046927SAndroid Build Coastguard Worker const uint64_t size, const uint32_t value);
81*61046927SAndroid Build Coastguard Worker
82*61046927SAndroid Build Coastguard Worker #ifdef __cplusplus
83*61046927SAndroid Build Coastguard Worker }
84*61046927SAndroid Build Coastguard Worker #endif
85*61046927SAndroid Build Coastguard Worker
86*61046927SAndroid Build Coastguard Worker #endif /* RADV_SDMA_H */
87