radeon/llvm: replace shader type intrinsic with function attribute
authorChristian König <christian.koenig@amd.com>
Mon, 4 Mar 2013 14:35:30 +0000 (15:35 +0100)
committerChristian König <christian.koenig@amd.com>
Thu, 7 Mar 2013 09:03:22 +0000 (10:03 +0100)
Signed-off-by: Christian König <christian.koenig@amd.com>
Reviewed-by: Tom Stellard <thomas.stellard@amd.com>
src/gallium/drivers/radeon/radeon_llvm_emit.cpp
src/gallium/drivers/radeon/radeon_llvm_emit.h
src/gallium/drivers/radeonsi/radeonsi_shader.c

index 0491e64bb6ff5bf37e6a946dc66c0438640e8741..ee82a902872e036a83238e3800d66165c6ffceb4 100644 (file)
 #if HAVE_LLVM < 0x0303
 #include <llvm/LLVMContext.h>
 #include <llvm/Module.h>
+#include <llvm/Function.h>
 #include <llvm/DataLayout.h>
 #else
 #include <llvm/IR/LLVMContext.h>
 #include <llvm/IR/Module.h>
+#include <llvm/IR/Function.h>
 #include <llvm/IR/DataLayout.h>
 #endif
 
@@ -68,6 +70,26 @@ static LLVMEnsureMultithreaded lLVMEnsureMultithreaded;
 
 }
 
+/**
+ * Set the shader type we want to compile
+ *
+ * @param type shader type to set
+ */
+extern "C" void
+radeon_llvm_shader_type(LLVMValueRef F, unsigned type)
+{
+  Function *Func = unwrap<Function>(F);
+  int Idx = AttributeSet::FunctionIndex;
+  AttrBuilder B;
+  char Str[2];
+
+  sprintf(Str, "%1d", type);
+  B.addAttribute("ShaderType", Str);
+
+  AttributeSet Set = AttributeSet::get(Func->getContext(), Idx, B);
+  Func->addAttributes(Idx, Set);
+}
+
 /**
  * Compile an LLVM module to machine code.
  *
index bdb242bfa0ecdef9c91cf779da2ad49e857081b4..b68100f372fd4e3e226af508483b4a9a9b4738b7 100644 (file)
@@ -33,6 +33,8 @@
 extern "C" {
 #endif
 
+void radeon_llvm_shader_type(LLVMValueRef F, unsigned type);
+
 unsigned radeon_llvm_bitcode_compile(
    unsigned char * bitcode, unsigned bitcode_len,
    unsigned char ** bytes, unsigned * byte_count,
index 958d3a3a4d6062582e31532585e7dd4883b14cc3..af05078012e61210b2e233a29b77c62ee933676d 100644 (file)
@@ -542,17 +542,6 @@ static void si_llvm_init_export_args(struct lp_build_tgsi_context *bld_base,
         * stage. */
 }
 
-static void si_llvm_emit_prologue(struct lp_build_tgsi_context *bld_base)
-{
-       struct si_shader_context *si_shader_ctx = si_shader_context(bld_base);
-       struct gallivm_state *gallivm = bld_base->base.gallivm;
-       lp_build_intrinsic_unary(gallivm->builder,
-                       "llvm.AMDGPU.shader.type",
-                       LLVMVoidTypeInContext(gallivm->context),
-                       lp_build_const_int32(gallivm, si_shader_ctx->type));
-}
-
-
 static void si_alpha_test(struct lp_build_tgsi_context *bld_base,
                          unsigned index)
 {
@@ -1032,7 +1021,6 @@ int si_pipe_shader_create(
        shader->shader.uses_kill = shader_info.uses_kill;
        bld_base->info = &shader_info;
        bld_base->emit_fetch_funcs[TGSI_FILE_CONSTANT] = fetch_constant;
-       bld_base->emit_prologue = si_llvm_emit_prologue;
        bld_base->emit_epilogue = si_llvm_emit_epilogue;
 
        bld_base->op_actions[TGSI_OPCODE_TEX] = tex_action;
@@ -1048,6 +1036,8 @@ int si_pipe_shader_create(
        si_shader_ctx.type = si_shader_ctx.parse.FullHeader.Processor.Processor;
        si_shader_ctx.rctx = rctx;
 
+       radeon_llvm_shader_type(si_shader_ctx.radeon_bld.main_fn, si_shader_ctx.type);
+
        shader->shader.nr_cbufs = rctx->framebuffer.nr_cbufs;
 
        /* Dump TGSI code before doing TGSI->LLVM conversion in case the