summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorTom Stellard <[email protected]>2013-04-04 09:57:13 -0700
committerTom Stellard <[email protected]>2013-04-15 10:13:10 -0700
commit7782d19cdccfd8cefebec7e665aff27463b00ec1 (patch)
tree86bf11d519e1aa71cd71e787f83725b2d4815e48 /src
parent1d6eb23f2dc1bb53636802cb698e6788ca0a26ac (diff)
radeon/llvm: Use a struct for storing compiled code
Diffstat (limited to 'src')
-rw-r--r--src/gallium/drivers/r600/r600_llvm.c8
-rw-r--r--src/gallium/drivers/radeon/radeon_llvm_emit.cpp12
-rw-r--r--src/gallium/drivers/radeon/radeon_llvm_emit.h11
-rw-r--r--src/gallium/drivers/radeonsi/radeonsi_shader.c35
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 <llvm-c/Core.h>
+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;
}