| /* |
| * Copyright 2024 Advanced Micro Devices, Inc. |
| * |
| * SPDX-License-Identifier: MIT |
| */ |
| |
| #include "helpers.h" |
| |
| bool |
| util_lower_clearsize_to_dword(const void *clear_value, int *clear_value_size, |
| uint32_t *out) |
| { |
| /* Reduce a large clear value size if possible. */ |
| if (*clear_value_size > 4) { |
| bool clear_dword_duplicated = true; |
| const uint32_t *value = clear_value; |
| |
| /* See if we can lower large fills to dword fills. */ |
| for (unsigned i = 1; i < *clear_value_size / 4; i++) { |
| if (value[0] != value[i]) { |
| clear_dword_duplicated = false; |
| break; |
| } |
| } |
| if (clear_dword_duplicated) { |
| *out = *value; |
| *clear_value_size = 4; |
| } |
| return clear_dword_duplicated; |
| } |
| |
| /* Expand a small clear value size. */ |
| if (*clear_value_size <= 2) { |
| if (*clear_value_size == 1) { |
| *out = *(uint8_t *)clear_value; |
| *out |= |
| (*out << 8) | (*out << 16) | (*out << 24); |
| } else { |
| *out = *(uint16_t *)clear_value; |
| *out |= *out << 16; |
| } |
| *clear_value_size = 4; |
| return true; |
| } |
| return false; |
| } |