diff --git a/src/gallium/drivers/radeonsi/si_shader.h b/src/gallium/drivers/radeonsi/si_shader.h index e52ee99a72c..1e3ede70a92 100644 --- a/src/gallium/drivers/radeonsi/si_shader.h +++ b/src/gallium/drivers/radeonsi/si_shader.h @@ -842,6 +842,7 @@ struct si_shader_binary { /* Depends on binary type, either ELF or raw buffer. */ const char *code_buffer; size_t code_size; + uint32_t exec_size; char *uploaded_code; size_t uploaded_code_size; diff --git a/src/gallium/drivers/radeonsi/si_shader_aco.c b/src/gallium/drivers/radeonsi/si_shader_aco.c index c6ae491fe30..4e1f371e7fa 100644 --- a/src/gallium/drivers/radeonsi/si_shader_aco.c +++ b/src/gallium/drivers/radeonsi/si_shader_aco.c @@ -110,6 +110,7 @@ si_aco_build_shader_binary(void **data, const struct ac_shader_config *config, shader->binary.type = SI_SHADER_BINARY_RAW; shader->binary.code_buffer = buffer; shader->binary.code_size = code_size; + shader->binary.exec_size = exec_size; if (disasm_size) { memcpy(buffer + code_size, disasm_str, disasm_size); diff --git a/src/gallium/drivers/radeonsi/si_state_shaders.cpp b/src/gallium/drivers/radeonsi/si_state_shaders.cpp index af5cf848841..ca49937abd8 100644 --- a/src/gallium/drivers/radeonsi/si_state_shaders.cpp +++ b/src/gallium/drivers/radeonsi/si_state_shaders.cpp @@ -253,7 +253,7 @@ static uint32_t *si_get_shader_binary(struct si_shader *shader) 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 + 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); @@ -269,6 +269,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_data(ptr, &shader->binary.exec_size, 4); 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); @@ -295,6 +296,7 @@ static bool si_load_shader_binary(struct si_shader *shader, void *binary) shader->binary.type = (enum si_shader_binary_type)head->type; ptr = read_data(ptr, &shader->config, sizeof(shader->config)); ptr = read_data(ptr, &shader->info, sizeof(shader->info)); + ptr = read_data(ptr, &shader->binary.exec_size, 4); 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);