xref: /aosp_15_r20/external/mesa3d/src/freedreno/common/freedreno_ubwc.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1 /*
2  * Copyright © Google, Inc.
3  * SPDX-License-Identifier: MIT
4  */
5 
6 #ifndef __FREEDRENO_UBWC_H__
7 #define __FREEDRENO_UBWC_H__
8 
9 #include "util/format/u_format.h"
10 
11 #include "freedreno_dev_info.h"
12 
13 enum fd6_ubwc_compat_type {
14    FD6_UBWC_UNKNOWN_COMPAT,
15    FD6_UBWC_R8G8_UNORM,
16    FD6_UBWC_R8G8_INT,
17    FD6_UBWC_R8G8B8A8_UNORM,
18    FD6_UBWC_R8G8B8A8_INT,
19    FD6_UBWC_B8G8R8A8_UNORM,
20    FD6_UBWC_R16G16_UNORM,
21    FD6_UBWC_R16G16_INT,
22    FD6_UBWC_R16G16B16A16_UNORM,
23    FD6_UBWC_R16G16B16A16_INT,
24    FD6_UBWC_R32_INT,
25    FD6_UBWC_R32G32_INT,
26    FD6_UBWC_R32G32B32A32_INT,
27    FD6_UBWC_R32_FLOAT,
28 };
29 
30 static inline enum fd6_ubwc_compat_type
fd6_ubwc_compat_mode(const struct fd_dev_info * info,enum pipe_format format)31 fd6_ubwc_compat_mode(const struct fd_dev_info *info, enum pipe_format format)
32 {
33    switch (format) {
34    case PIPE_FORMAT_R8G8_UNORM:
35    case PIPE_FORMAT_R8G8_SRGB:
36       return info->a7xx.ubwc_unorm_snorm_int_compatible ?
37          FD6_UBWC_R8G8_INT : FD6_UBWC_R8G8_UNORM;
38 
39    case PIPE_FORMAT_R8G8_SNORM:
40       return info->a7xx.ubwc_unorm_snorm_int_compatible ?
41          FD6_UBWC_R8G8_INT : FD6_UBWC_UNKNOWN_COMPAT;
42 
43    case PIPE_FORMAT_R8G8_UINT:
44    case PIPE_FORMAT_R8G8_SINT:
45       return FD6_UBWC_R8G8_INT;
46 
47    case PIPE_FORMAT_R8G8B8A8_UNORM:
48    case PIPE_FORMAT_R8G8B8A8_SRGB:
49       return info->a7xx.ubwc_unorm_snorm_int_compatible ?
50          FD6_UBWC_R8G8B8A8_INT : FD6_UBWC_R8G8B8A8_UNORM;
51 
52    case PIPE_FORMAT_R8G8B8A8_SNORM:
53       return info->a7xx.ubwc_unorm_snorm_int_compatible ?
54          FD6_UBWC_R8G8B8A8_INT : FD6_UBWC_UNKNOWN_COMPAT;
55 
56    case PIPE_FORMAT_R8G8B8A8_UINT:
57    case PIPE_FORMAT_R8G8B8A8_SINT:
58       return FD6_UBWC_R8G8B8A8_INT;
59 
60    case PIPE_FORMAT_R16G16_UNORM:
61       return info->a7xx.ubwc_unorm_snorm_int_compatible ?
62          FD6_UBWC_R16G16_INT : FD6_UBWC_R16G16_UNORM;
63 
64    case PIPE_FORMAT_R16G16_SNORM:
65       return info->a7xx.ubwc_unorm_snorm_int_compatible ?
66          FD6_UBWC_R16G16_INT : FD6_UBWC_UNKNOWN_COMPAT;
67 
68    case PIPE_FORMAT_R16G16_UINT:
69    case PIPE_FORMAT_R16G16_SINT:
70       return FD6_UBWC_R16G16_INT;
71 
72    case PIPE_FORMAT_R16G16B16A16_UNORM:
73       return info->a7xx.ubwc_unorm_snorm_int_compatible ?
74          FD6_UBWC_R16G16B16A16_INT : FD6_UBWC_R16G16B16A16_UNORM;
75 
76    case PIPE_FORMAT_R16G16B16A16_SNORM:
77       return info->a7xx.ubwc_unorm_snorm_int_compatible ?
78          FD6_UBWC_R16G16B16A16_INT : FD6_UBWC_UNKNOWN_COMPAT;
79 
80    case PIPE_FORMAT_R16G16B16A16_UINT:
81    case PIPE_FORMAT_R16G16B16A16_SINT:
82       return FD6_UBWC_R16G16B16A16_INT;
83 
84    case PIPE_FORMAT_R32_UINT:
85    case PIPE_FORMAT_R32_SINT:
86       return FD6_UBWC_R32_INT;
87 
88    case PIPE_FORMAT_R32G32_UINT:
89    case PIPE_FORMAT_R32G32_SINT:
90       return FD6_UBWC_R32G32_INT;
91 
92    case PIPE_FORMAT_R32G32B32A32_UINT:
93    case PIPE_FORMAT_R32G32B32A32_SINT:
94       return FD6_UBWC_R32G32B32A32_INT;
95 
96    case PIPE_FORMAT_Z32_FLOAT:
97    case PIPE_FORMAT_R32_FLOAT:
98       /* TODO: a630 blob allows these, but not a660.  When is it legal? */
99       return FD6_UBWC_UNKNOWN_COMPAT;
100 
101    case PIPE_FORMAT_B8G8R8A8_UNORM:
102    case PIPE_FORMAT_B8G8R8A8_SRGB:
103       /* The blob doesn't list these as compatible, but they surely are.
104        * freedreno's happy to cast between them, and zink would really like
105        * to.
106        */
107       return FD6_UBWC_B8G8R8A8_UNORM;
108 
109    default:
110       return FD6_UBWC_UNKNOWN_COMPAT;
111    }
112 }
113 
114 
115 #endif
116