radeon/llvm: Use a struct for storing compiled code
authorTom Stellard <thomas.stellard@amd.com>
Thu, 4 Apr 2013 16:57:13 +0000 (09:57 -0700)
committerTom Stellard <thomas.stellard@amd.com>
Mon, 15 Apr 2013 17:13:10 +0000 (10:13 -0700)
src/gallium/drivers/r600/r600_llvm.c
src/gallium/drivers/radeon/radeon_llvm_emit.cpp
src/gallium/drivers/radeon/radeon_llvm_emit.h
src/gallium/drivers/radeonsi/radeonsi_shader.c

index 127149faefe2df6c4a77f82f72f7cdbe6375973d..e605e6bec4c60f7bb85550dd47fc7bd0fc3b0a1f 100644 (file)
@@ -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
index a23532bee5fa4dbc046c7519dfffa911b0251669..9c5fd78f1e15783d3ffc80e92f14fc7dbb20602f 100644 (file)
@@ -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;
 }
index b68100f372fd4e3e226af508483b4a9a9b4738b7..f78fc19faf7ce8e45036d9c0a4ad761bd122d0ba 100644 (file)
 
 #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);
 
index bddf3bd132712f3c385419d5323c749c84fffe99..3bb2d6b2343841aa81c5ff75c7545a50b965cfb7 100644 (file)
@@ -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;
 }