From 7782d19cdccfd8cefebec7e665aff27463b00ec1 Mon Sep 17 00:00:00 2001 From: Tom Stellard Date: Thu, 4 Apr 2013 09:57:13 -0700 Subject: [PATCH] radeon/llvm: Use a struct for storing compiled code --- src/gallium/drivers/r600/r600_llvm.c | 8 +++-- .../drivers/radeon/radeon_llvm_emit.cpp | 12 +++---- src/gallium/drivers/radeon/radeon_llvm_emit.h | 11 ++++-- .../drivers/radeonsi/radeonsi_shader.c | 35 +++++++++---------- 4 files changed, 38 insertions(+), 28 deletions(-) diff --git a/src/gallium/drivers/r600/r600_llvm.c b/src/gallium/drivers/r600/r600_llvm.c index 127149faefe..e605e6bec4c 100644 --- a/src/gallium/drivers/r600/r600_llvm.c +++ b/src/gallium/drivers/r600/r600_llvm.c @@ -557,9 +557,13 @@ unsigned r600_llvm_compile( enum radeon_family family, unsigned dump) { + unsigned r; + struct radeon_llvm_binary binary; const char * gpu_family = r600_llvm_gpu_string(family); - return radeon_llvm_compile(mod, inst_bytes, inst_byte_count, - gpu_family, dump); + r = radeon_llvm_compile(mod, &binary, gpu_family, dump); + *inst_bytes = binary.code; + *inst_byte_count = binary.code_size; + return r; } #endif diff --git a/src/gallium/drivers/radeon/radeon_llvm_emit.cpp b/src/gallium/drivers/radeon/radeon_llvm_emit.cpp index a23532bee5f..9c5fd78f1e1 100644 --- a/src/gallium/drivers/radeon/radeon_llvm_emit.cpp +++ b/src/gallium/drivers/radeon/radeon_llvm_emit.cpp @@ -96,9 +96,8 @@ radeon_llvm_shader_type(LLVMValueRef F, unsigned type) * caller's responsibility to free it. */ extern "C" unsigned -radeon_llvm_compile(LLVMModuleRef M, unsigned char ** bytes, - unsigned * byte_count, const char * gpu_family, - unsigned dump) { +radeon_llvm_compile(LLVMModuleRef M, struct radeon_llvm_binary *binary, + const char * gpu_family, unsigned dump) { Triple AMDGPUTriple(sys::getDefaultTargetTriple()); @@ -155,9 +154,10 @@ radeon_llvm_compile(LLVMModuleRef M, unsigned char ** bytes, out.flush(); std::string &data = oStream.str(); - *bytes = (unsigned char*)malloc(data.length() * sizeof(unsigned char)); - memcpy(*bytes, data.c_str(), data.length() * sizeof(unsigned char)); - *byte_count = data.length(); + + binary->code = (unsigned char*)malloc(data.length() * sizeof(unsigned char)); + memcpy(binary->code, data.c_str(), data.length() * sizeof(unsigned char)); + binary->code_size = data.length(); return 0; } diff --git a/src/gallium/drivers/radeon/radeon_llvm_emit.h b/src/gallium/drivers/radeon/radeon_llvm_emit.h index b68100f372f..f78fc19faf7 100644 --- a/src/gallium/drivers/radeon/radeon_llvm_emit.h +++ b/src/gallium/drivers/radeon/radeon_llvm_emit.h @@ -29,6 +29,14 @@ #include +struct radeon_llvm_binary { + unsigned char *code; + unsigned code_size; + unsigned char *config; + unsigned config_size; +}; + + #ifdef __cplusplus extern "C" { #endif @@ -42,8 +50,7 @@ unsigned radeon_llvm_bitcode_compile( unsigned radeon_llvm_compile( LLVMModuleRef M, - unsigned char ** bytes, - unsigned * byte_count, + struct radeon_llvm_binary *binary, const char * gpu_family, unsigned dump); diff --git a/src/gallium/drivers/radeonsi/radeonsi_shader.c b/src/gallium/drivers/radeonsi/radeonsi_shader.c index bddf3bd1327..3bb2d6b2343 100644 --- a/src/gallium/drivers/radeonsi/radeonsi_shader.c +++ b/src/gallium/drivers/radeonsi/radeonsi_shader.c @@ -1091,50 +1091,49 @@ static void preload_samplers(struct si_shader_context *si_shader_ctx) int si_compile_llvm(struct r600_context *rctx, struct si_pipe_shader *shader, LLVMModuleRef mod) { - unsigned char *inst_bytes; - unsigned inst_byte_count; unsigned i; uint32_t *ptr; bool dump; + struct radeon_llvm_binary binary; dump = debug_get_bool_option("RADEON_DUMP_SHADERS", FALSE); - radeon_llvm_compile(mod, &inst_bytes, &inst_byte_count, - r600_get_llvm_processor_name(rctx->screen->family), - dump); - + memset(&binary, 0, sizeof(binary)); + radeon_llvm_compile(mod, &binary, + r600_get_llvm_processor_name(rctx->screen->family), dump); if (dump) { fprintf(stderr, "SI CODE:\n"); - for (i = 0; i < inst_byte_count; i+=4 ) { - fprintf(stderr, "%02x%02x%02x%02x\n", inst_bytes[i + 3], - inst_bytes[i + 2], inst_bytes[i + 1], - inst_bytes[i]); + for (i = 0; i < binary.code_size; i+=4 ) { + fprintf(stderr, "%02x%02x%02x%02x\n", binary.code[i + 3], + binary.code[i + 2], binary.code[i + 1], + binary.code[i]); } } - shader->num_sgprs = util_le32_to_cpu(*(uint32_t*)inst_bytes); - shader->num_vgprs = util_le32_to_cpu(*(uint32_t*)(inst_bytes + 4)); - shader->spi_ps_input_ena = util_le32_to_cpu(*(uint32_t*)(inst_bytes + 8)); + shader->num_sgprs = util_le32_to_cpu(*(uint32_t*)binary.code); + shader->num_vgprs = util_le32_to_cpu(*(uint32_t*)(binary.code + 4)); + shader->spi_ps_input_ena = util_le32_to_cpu(*(uint32_t*)(binary.code + 8)); /* copy new shader */ si_resource_reference(&shader->bo, NULL); shader->bo = si_resource_create_custom(rctx->context.screen, PIPE_USAGE_IMMUTABLE, - inst_byte_count - 12); + binary.code_size - 12); if (shader->bo == NULL) { return -ENOMEM; } ptr = (uint32_t*)rctx->ws->buffer_map(shader->bo->cs_buf, rctx->cs, PIPE_TRANSFER_WRITE); if (0 /*R600_BIG_ENDIAN*/) { - for (i = 0; i < (inst_byte_count-12)/4; ++i) { - ptr[i] = util_bswap32(*(uint32_t*)(inst_bytes+12 + i*4)); + for (i = 0; i < (binary.code_size - 12) / 4; ++i) { + ptr[i] = util_bswap32(*(uint32_t*)(binary.code+12 + i*4)); } } else { - memcpy(ptr, inst_bytes + 12, inst_byte_count - 12); + memcpy(ptr, binary.code + 12, binary.code_size - 12); } rctx->ws->buffer_unmap(shader->bo->cs_buf); - free(inst_bytes); + free(binary.code); + free(binary.config); return 0; } -- 2.30.2