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