xref: /aosp_15_r20/external/mesa3d/src/util/helpers.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright 2024 Advanced Micro Devices, Inc.
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 #include "helpers.h"
8*61046927SAndroid Build Coastguard Worker 
9*61046927SAndroid Build Coastguard Worker bool
util_lower_clearsize_to_dword(const void * clear_value,int * clear_value_size,uint32_t * out)10*61046927SAndroid Build Coastguard Worker util_lower_clearsize_to_dword(const void *clear_value, int *clear_value_size,
11*61046927SAndroid Build Coastguard Worker                               uint32_t *out)
12*61046927SAndroid Build Coastguard Worker {
13*61046927SAndroid Build Coastguard Worker    /* Reduce a large clear value size if possible. */
14*61046927SAndroid Build Coastguard Worker    if (*clear_value_size > 4) {
15*61046927SAndroid Build Coastguard Worker       bool clear_dword_duplicated = true;
16*61046927SAndroid Build Coastguard Worker       const uint32_t *value = clear_value;
17*61046927SAndroid Build Coastguard Worker 
18*61046927SAndroid Build Coastguard Worker       /* See if we can lower large fills to dword fills. */
19*61046927SAndroid Build Coastguard Worker       for (unsigned i = 1; i < *clear_value_size / 4; i++) {
20*61046927SAndroid Build Coastguard Worker          if (value[0] != value[i]) {
21*61046927SAndroid Build Coastguard Worker             clear_dword_duplicated = false;
22*61046927SAndroid Build Coastguard Worker             break;
23*61046927SAndroid Build Coastguard Worker          }
24*61046927SAndroid Build Coastguard Worker       }
25*61046927SAndroid Build Coastguard Worker       if (clear_dword_duplicated) {
26*61046927SAndroid Build Coastguard Worker          *out = *value;
27*61046927SAndroid Build Coastguard Worker          *clear_value_size = 4;
28*61046927SAndroid Build Coastguard Worker       }
29*61046927SAndroid Build Coastguard Worker       return clear_dword_duplicated;
30*61046927SAndroid Build Coastguard Worker    }
31*61046927SAndroid Build Coastguard Worker 
32*61046927SAndroid Build Coastguard Worker    /* Expand a small clear value size. */
33*61046927SAndroid Build Coastguard Worker    if (*clear_value_size <= 2) {
34*61046927SAndroid Build Coastguard Worker       if (*clear_value_size == 1) {
35*61046927SAndroid Build Coastguard Worker          *out = *(uint8_t *)clear_value;
36*61046927SAndroid Build Coastguard Worker          *out |=
37*61046927SAndroid Build Coastguard Worker             (*out << 8) | (*out << 16) | (*out << 24);
38*61046927SAndroid Build Coastguard Worker       } else {
39*61046927SAndroid Build Coastguard Worker          *out = *(uint16_t *)clear_value;
40*61046927SAndroid Build Coastguard Worker          *out |= *out << 16;
41*61046927SAndroid Build Coastguard Worker       }
42*61046927SAndroid Build Coastguard Worker       *clear_value_size = 4;
43*61046927SAndroid Build Coastguard Worker       return true;
44*61046927SAndroid Build Coastguard Worker    }
45*61046927SAndroid Build Coastguard Worker    return false;
46*61046927SAndroid Build Coastguard Worker }
47