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