Merge commit 'origin/master' into gallium-msaa
[mesa.git] / src / gallium / auxiliary / draw / draw_llvm.h
1 #ifndef HAVE_LLVM_H
2 #define HAVE_LLVM_H
3
4 #include "draw/draw_private.h"
5
6 #include "pipe/p_context.h"
7
8 #include <llvm-c/Core.h>
9 #include <llvm-c/Analysis.h>
10 #include <llvm-c/Target.h>
11 #include <llvm-c/ExecutionEngine.h>
12
13 struct draw_jit_texture
14 {
15 uint32_t width;
16 uint32_t height;
17 uint32_t stride;
18 const void *data;
19 };
20
21 enum {
22 DRAW_JIT_TEXTURE_WIDTH = 0,
23 DRAW_JIT_TEXTURE_HEIGHT,
24 DRAW_JIT_TEXTURE_STRIDE,
25 DRAW_JIT_TEXTURE_DATA
26 };
27
28 enum {
29 DRAW_JIT_VERTEX_VERTEX_ID = 0,
30 DRAW_JIT_VERTEX_CLIP,
31 DRAW_JIT_VERTEX_DATA
32 };
33
34 /**
35 * This structure is passed directly to the generated vertex shader.
36 *
37 * It contains the derived state.
38 *
39 * Changes here must be reflected in the draw_jit_context_* macros.
40 * Changes to the ordering should be avoided.
41 *
42 * Only use types with a clear size and padding here, in particular prefer the
43 * stdint.h types to the basic integer types.
44 */
45 struct draw_jit_context
46 {
47 const float *vs_constants;
48 const float *gs_constants;
49
50
51 struct draw_jit_texture textures[PIPE_MAX_SAMPLERS];
52 };
53
54
55 #define draw_jit_context_vs_constants(_builder, _ptr) \
56 lp_build_struct_get(_builder, _ptr, 0, "vs_constants")
57
58 #define draw_jit_context_gs_constants(_builder, _ptr) \
59 lp_build_struct_get(_builder, _ptr, 1, "gs_constants")
60
61 #define DRAW_JIT_CONTEXT_TEXTURES_INDEX 2
62
63 #define draw_jit_context_textures(_builder, _ptr) \
64 lp_build_struct_get_ptr(_builder, _ptr, DRAW_JIT_CONTEXT_TEXTURES_INDEX, "textures")
65
66
67
68 #define draw_jit_header_id(_builder, _ptr) \
69 lp_build_struct_get_ptr(_builder, _ptr, 0, "id")
70
71 #define draw_jit_header_clip(_builder, _ptr) \
72 lp_build_struct_get(_builder, _ptr, 1, "clip")
73
74 #define draw_jit_header_data(_builder, _ptr) \
75 lp_build_struct_get_ptr(_builder, _ptr, 2, "data")
76
77
78 #define draw_jit_vbuffer_stride(_builder, _ptr) \
79 lp_build_struct_get(_builder, _ptr, 0, "stride")
80
81 #define draw_jit_vbuffer_max_index(_builder, _ptr) \
82 lp_build_struct_get(_builder, _ptr, 1, "max_index")
83
84 #define draw_jit_vbuffer_offset(_builder, _ptr) \
85 lp_build_struct_get(_builder, _ptr, 2, "buffer_offset")
86
87
88 typedef void
89 (*draw_jit_vert_func)(struct draw_jit_context *context,
90 struct vertex_header *io,
91 const char *vbuffers[PIPE_MAX_ATTRIBS],
92 unsigned start,
93 unsigned count,
94 unsigned stride,
95 struct pipe_vertex_buffer *vertex_buffers);
96
97
98 typedef void
99 (*draw_jit_vert_func_elts)(struct draw_jit_context *context,
100 struct vertex_header *io,
101 const char *vbuffers[PIPE_MAX_ATTRIBS],
102 const unsigned *fetch_elts,
103 unsigned fetch_count,
104 unsigned stride,
105 struct pipe_vertex_buffer *vertex_buffers);
106
107 struct draw_llvm {
108 struct draw_context *draw;
109
110 struct draw_jit_context jit_context;
111
112 LLVMModuleRef module;
113 LLVMExecutionEngineRef engine;
114 LLVMModuleProviderRef provider;
115 LLVMTargetDataRef target;
116 LLVMPassManagerRef pass;
117
118 LLVMTypeRef context_ptr_type;
119 LLVMTypeRef vertex_header_ptr_type;
120 LLVMTypeRef buffer_ptr_type;
121 LLVMTypeRef vb_ptr_type;
122 };
123
124 struct draw_llvm_variant_key
125 {
126 struct pipe_vertex_element vertex_element[PIPE_MAX_ATTRIBS];
127 unsigned nr_vertex_elements;
128 struct pipe_shader_state vs;
129 };
130
131 struct draw_llvm_variant
132 {
133 struct draw_llvm_variant_key key;
134 LLVMValueRef function;
135 LLVMValueRef function_elts;
136 draw_jit_vert_func jit_func;
137 draw_jit_vert_func_elts jit_func_elts;
138
139 struct draw_llvm_variant *next;
140 };
141
142 struct draw_llvm *
143 draw_llvm_create(struct draw_context *draw);
144
145 void
146 draw_llvm_destroy(struct draw_llvm *llvm);
147
148 struct draw_llvm_variant *
149 draw_llvm_prepare(struct draw_llvm *llvm, int num_inputs);
150
151 void
152 draw_llvm_make_variant_key(struct draw_llvm *llvm,
153 struct draw_llvm_variant_key *key);
154
155 LLVMValueRef
156 draw_llvm_translate_from(LLVMBuilderRef builder,
157 LLVMValueRef vbuffer,
158 enum pipe_format from_format);
159 #endif