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