mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-01 18:58:10 +02:00
radeonsi: add symbols to si_shader_binary
Reviewed-by: Marek Olšák <marek.olsak@amd.com> Signed-off-by: Qiang Yu <yuq825@gmail.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/22573>
This commit is contained in:
parent
6a360e4a71
commit
7aac3508dc
4 changed files with 20 additions and 1 deletions
|
|
@ -3335,6 +3335,9 @@ void si_shader_binary_clean(struct si_shader_binary *binary)
|
|||
free(binary->llvm_ir_string);
|
||||
binary->llvm_ir_string = NULL;
|
||||
|
||||
free((void *)binary->symbols);
|
||||
binary->symbols = NULL;
|
||||
|
||||
free(binary->uploaded_code);
|
||||
binary->uploaded_code = NULL;
|
||||
binary->uploaded_code_size = 0;
|
||||
|
|
|
|||
|
|
@ -826,6 +826,9 @@ struct si_shader_binary {
|
|||
|
||||
const char *disasm_string;
|
||||
size_t disasm_size;
|
||||
|
||||
const unsigned *symbols;
|
||||
unsigned num_symbols;
|
||||
};
|
||||
|
||||
struct gfx9_gs_info {
|
||||
|
|
|
|||
|
|
@ -107,6 +107,14 @@ si_aco_build_shader_binary(void **data, const struct ac_shader_config *config,
|
|||
memcpy(shader->binary.llvm_ir_string, llvm_ir_str, llvm_ir_size);
|
||||
}
|
||||
|
||||
if (num_symbols) {
|
||||
unsigned symbol_size = num_symbols * sizeof(*symbols);
|
||||
void *data = MALLOC(symbol_size);
|
||||
memcpy(data, symbols, symbol_size);
|
||||
shader->binary.symbols = data;
|
||||
shader->binary.num_symbols = num_symbols;
|
||||
}
|
||||
|
||||
shader->config = *config;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -274,13 +274,15 @@ static uint32_t *si_get_shader_binary(struct si_shader *shader)
|
|||
|
||||
/* Refuse to allocate overly large buffers and guard against integer
|
||||
* overflow. */
|
||||
if (shader->binary.code_size > UINT_MAX / 4 || llvm_ir_size > UINT_MAX / 4)
|
||||
if (shader->binary.code_size > UINT_MAX / 4 || llvm_ir_size > UINT_MAX / 4 ||
|
||||
shader->binary.num_symbols > UINT_MAX / 32)
|
||||
return NULL;
|
||||
|
||||
unsigned size = sizeof(struct si_shader_blob_head) +
|
||||
align(sizeof(shader->config), 4) +
|
||||
align(sizeof(shader->info), 4) +
|
||||
4 + align(shader->binary.code_size, 4) +
|
||||
4 + shader->binary.num_symbols * 8 +
|
||||
4 + align(llvm_ir_size, 4);
|
||||
uint32_t *buffer = (uint32_t*)CALLOC(1, size);
|
||||
if (!buffer)
|
||||
|
|
@ -296,6 +298,7 @@ static uint32_t *si_get_shader_binary(struct si_shader *shader)
|
|||
ptr = write_data(ptr, &shader->config, sizeof(shader->config));
|
||||
ptr = write_data(ptr, &shader->info, sizeof(shader->info));
|
||||
ptr = write_chunk(ptr, shader->binary.code_buffer, shader->binary.code_size);
|
||||
ptr = write_chunk(ptr, shader->binary.symbols, shader->binary.num_symbols * 8);
|
||||
ptr = write_chunk(ptr, shader->binary.llvm_ir_string, llvm_ir_size);
|
||||
assert((char *)ptr - (char *)buffer == (ptrdiff_t)size);
|
||||
|
||||
|
|
@ -322,6 +325,8 @@ static bool si_load_shader_binary(struct si_shader *shader, void *binary)
|
|||
ptr = read_data(ptr, &shader->info, sizeof(shader->info));
|
||||
ptr = read_chunk(ptr, (void **)&shader->binary.code_buffer, &code_size);
|
||||
shader->binary.code_size = code_size;
|
||||
ptr = read_chunk(ptr, (void **)&shader->binary.symbols, &chunk_size);
|
||||
shader->binary.num_symbols = chunk_size / 8;
|
||||
ptr = read_chunk(ptr, (void **)&shader->binary.llvm_ir_string, &chunk_size);
|
||||
|
||||
if (!shader->is_gs_copy_shader &&
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue