llvmpipe: reogranise jit pointer ordering
[mesa.git] / src / gallium / drivers / llvmpipe / lp_jit.c
1 /**************************************************************************
2 *
3 * Copyright 2009 VMware, Inc.
4 * All Rights Reserved.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the
8 * "Software"), to deal in the Software without restriction, including
9 * without limitation the rights to use, copy, modify, merge, publish,
10 * distribute, sub license, and/or sell copies of the Software, and to
11 * permit persons to whom the Software is furnished to do so, subject to
12 * the following conditions:
13 *
14 * The above copyright notice and this permission notice (including the
15 * next paragraph) shall be included in all copies or substantial portions
16 * of the Software.
17 *
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21 * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
22 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25 *
26 **************************************************************************/
27
28 /**
29 * @file
30 * C - JIT interfaces
31 *
32 * @author Jose Fonseca <jfonseca@vmware.com>
33 */
34
35
36 #include "util/u_memory.h"
37 #include "gallivm/lp_bld_init.h"
38 #include "gallivm/lp_bld_debug.h"
39 #include "gallivm/lp_bld_format.h"
40 #include "lp_context.h"
41 #include "lp_jit.h"
42
43 static LLVMTypeRef
44 create_jit_texture_type(struct gallivm_state *gallivm)
45 {
46 LLVMContextRef lc = gallivm->context;
47 LLVMTypeRef texture_type;
48 LLVMTypeRef elem_types[LP_JIT_TEXTURE_NUM_FIELDS];
49
50 /* struct lp_jit_texture */
51 elem_types[LP_JIT_TEXTURE_WIDTH] =
52 elem_types[LP_JIT_TEXTURE_HEIGHT] =
53 elem_types[LP_JIT_TEXTURE_DEPTH] =
54 elem_types[LP_JIT_TEXTURE_FIRST_LEVEL] =
55 elem_types[LP_JIT_TEXTURE_LAST_LEVEL] = LLVMInt32TypeInContext(lc);
56 elem_types[LP_JIT_TEXTURE_BASE] = LLVMPointerType(LLVMInt8TypeInContext(lc), 0);
57 elem_types[LP_JIT_TEXTURE_ROW_STRIDE] =
58 elem_types[LP_JIT_TEXTURE_IMG_STRIDE] =
59 elem_types[LP_JIT_TEXTURE_MIP_OFFSETS] =
60 LLVMArrayType(LLVMInt32TypeInContext(lc), LP_MAX_TEXTURE_LEVELS);
61
62 texture_type = LLVMStructTypeInContext(lc, elem_types,
63 ARRAY_SIZE(elem_types), 0);
64
65 LP_CHECK_MEMBER_OFFSET(struct lp_jit_texture, width,
66 gallivm->target, texture_type,
67 LP_JIT_TEXTURE_WIDTH);
68 LP_CHECK_MEMBER_OFFSET(struct lp_jit_texture, height,
69 gallivm->target, texture_type,
70 LP_JIT_TEXTURE_HEIGHT);
71 LP_CHECK_MEMBER_OFFSET(struct lp_jit_texture, depth,
72 gallivm->target, texture_type,
73 LP_JIT_TEXTURE_DEPTH);
74 LP_CHECK_MEMBER_OFFSET(struct lp_jit_texture, base,
75 gallivm->target, texture_type,
76 LP_JIT_TEXTURE_BASE);
77 LP_CHECK_MEMBER_OFFSET(struct lp_jit_texture, row_stride,
78 gallivm->target, texture_type,
79 LP_JIT_TEXTURE_ROW_STRIDE);
80 LP_CHECK_MEMBER_OFFSET(struct lp_jit_texture, img_stride,
81 gallivm->target, texture_type,
82 LP_JIT_TEXTURE_IMG_STRIDE);
83 LP_CHECK_MEMBER_OFFSET(struct lp_jit_texture, first_level,
84 gallivm->target, texture_type,
85 LP_JIT_TEXTURE_FIRST_LEVEL);
86 LP_CHECK_MEMBER_OFFSET(struct lp_jit_texture, last_level,
87 gallivm->target, texture_type,
88 LP_JIT_TEXTURE_LAST_LEVEL);
89 LP_CHECK_MEMBER_OFFSET(struct lp_jit_texture, mip_offsets,
90 gallivm->target, texture_type,
91 LP_JIT_TEXTURE_MIP_OFFSETS);
92 LP_CHECK_STRUCT_SIZE(struct lp_jit_texture,
93 gallivm->target, texture_type);
94 return texture_type;
95 }
96
97 static LLVMTypeRef
98 create_jit_sampler_type(struct gallivm_state *gallivm)
99 {
100 LLVMContextRef lc = gallivm->context;
101 LLVMTypeRef sampler_type;
102 LLVMTypeRef elem_types[LP_JIT_SAMPLER_NUM_FIELDS];
103 elem_types[LP_JIT_SAMPLER_MIN_LOD] =
104 elem_types[LP_JIT_SAMPLER_MAX_LOD] =
105 elem_types[LP_JIT_SAMPLER_LOD_BIAS] = LLVMFloatTypeInContext(lc);
106 elem_types[LP_JIT_SAMPLER_BORDER_COLOR] =
107 LLVMArrayType(LLVMFloatTypeInContext(lc), 4);
108
109 sampler_type = LLVMStructTypeInContext(lc, elem_types,
110 ARRAY_SIZE(elem_types), 0);
111
112 LP_CHECK_MEMBER_OFFSET(struct lp_jit_sampler, min_lod,
113 gallivm->target, sampler_type,
114 LP_JIT_SAMPLER_MIN_LOD);
115 LP_CHECK_MEMBER_OFFSET(struct lp_jit_sampler, max_lod,
116 gallivm->target, sampler_type,
117 LP_JIT_SAMPLER_MAX_LOD);
118 LP_CHECK_MEMBER_OFFSET(struct lp_jit_sampler, lod_bias,
119 gallivm->target, sampler_type,
120 LP_JIT_SAMPLER_LOD_BIAS);
121 LP_CHECK_MEMBER_OFFSET(struct lp_jit_sampler, border_color,
122 gallivm->target, sampler_type,
123 LP_JIT_SAMPLER_BORDER_COLOR);
124 LP_CHECK_STRUCT_SIZE(struct lp_jit_sampler,
125 gallivm->target, sampler_type);
126 return sampler_type;
127 }
128
129 static LLVMTypeRef
130 create_jit_image_type(struct gallivm_state *gallivm)
131 {
132 LLVMContextRef lc = gallivm->context;
133 LLVMTypeRef image_type;
134 LLVMTypeRef elem_types[LP_JIT_IMAGE_NUM_FIELDS];
135 elem_types[LP_JIT_IMAGE_WIDTH] =
136 elem_types[LP_JIT_IMAGE_HEIGHT] =
137 elem_types[LP_JIT_IMAGE_DEPTH] = LLVMInt32TypeInContext(lc);
138 elem_types[LP_JIT_IMAGE_BASE] = LLVMPointerType(LLVMInt8TypeInContext(lc), 0);
139 elem_types[LP_JIT_IMAGE_ROW_STRIDE] =
140 elem_types[LP_JIT_IMAGE_IMG_STRIDE] = LLVMInt32TypeInContext(lc);
141
142 image_type = LLVMStructTypeInContext(lc, elem_types,
143 ARRAY_SIZE(elem_types), 0);
144 LP_CHECK_MEMBER_OFFSET(struct lp_jit_image, width,
145 gallivm->target, image_type,
146 LP_JIT_IMAGE_WIDTH);
147 LP_CHECK_MEMBER_OFFSET(struct lp_jit_image, height,
148 gallivm->target, image_type,
149 LP_JIT_IMAGE_HEIGHT);
150 LP_CHECK_MEMBER_OFFSET(struct lp_jit_image, depth,
151 gallivm->target, image_type,
152 LP_JIT_IMAGE_DEPTH);
153 LP_CHECK_MEMBER_OFFSET(struct lp_jit_image, base,
154 gallivm->target, image_type,
155 LP_JIT_IMAGE_BASE);
156 LP_CHECK_MEMBER_OFFSET(struct lp_jit_image, row_stride,
157 gallivm->target, image_type,
158 LP_JIT_IMAGE_ROW_STRIDE);
159 LP_CHECK_MEMBER_OFFSET(struct lp_jit_image, img_stride,
160 gallivm->target, image_type,
161 LP_JIT_IMAGE_IMG_STRIDE);
162 return image_type;
163 }
164
165 static void
166 lp_jit_create_types(struct lp_fragment_shader_variant *lp)
167 {
168 struct gallivm_state *gallivm = lp->gallivm;
169 LLVMContextRef lc = gallivm->context;
170 LLVMTypeRef viewport_type, texture_type, sampler_type, image_type;
171
172 /* struct lp_jit_viewport */
173 {
174 LLVMTypeRef elem_types[LP_JIT_VIEWPORT_NUM_FIELDS];
175
176 elem_types[LP_JIT_VIEWPORT_MIN_DEPTH] =
177 elem_types[LP_JIT_VIEWPORT_MAX_DEPTH] = LLVMFloatTypeInContext(lc);
178
179 viewport_type = LLVMStructTypeInContext(lc, elem_types,
180 ARRAY_SIZE(elem_types), 0);
181
182 LP_CHECK_MEMBER_OFFSET(struct lp_jit_viewport, min_depth,
183 gallivm->target, viewport_type,
184 LP_JIT_VIEWPORT_MIN_DEPTH);
185 LP_CHECK_MEMBER_OFFSET(struct lp_jit_viewport, max_depth,
186 gallivm->target, viewport_type,
187 LP_JIT_VIEWPORT_MAX_DEPTH);
188 LP_CHECK_STRUCT_SIZE(struct lp_jit_viewport,
189 gallivm->target, viewport_type);
190 }
191
192 texture_type = create_jit_texture_type(gallivm);
193 sampler_type = create_jit_sampler_type(gallivm);
194 image_type = create_jit_image_type(gallivm);
195
196 /* struct lp_jit_context */
197 {
198 LLVMTypeRef elem_types[LP_JIT_CTX_COUNT];
199 LLVMTypeRef context_type;
200
201 elem_types[LP_JIT_CTX_CONSTANTS] =
202 LLVMArrayType(LLVMPointerType(LLVMFloatTypeInContext(lc), 0), LP_MAX_TGSI_CONST_BUFFERS);
203 elem_types[LP_JIT_CTX_NUM_CONSTANTS] =
204 LLVMArrayType(LLVMInt32TypeInContext(lc), LP_MAX_TGSI_CONST_BUFFERS);
205 elem_types[LP_JIT_CTX_TEXTURES] = LLVMArrayType(texture_type,
206 PIPE_MAX_SHADER_SAMPLER_VIEWS);
207 elem_types[LP_JIT_CTX_SAMPLERS] = LLVMArrayType(sampler_type,
208 PIPE_MAX_SAMPLERS);
209 elem_types[LP_JIT_CTX_IMAGES] = LLVMArrayType(image_type,
210 PIPE_MAX_SHADER_IMAGES);
211 elem_types[LP_JIT_CTX_ALPHA_REF] = LLVMFloatTypeInContext(lc);
212 elem_types[LP_JIT_CTX_STENCIL_REF_FRONT] =
213 elem_types[LP_JIT_CTX_STENCIL_REF_BACK] = LLVMInt32TypeInContext(lc);
214 elem_types[LP_JIT_CTX_U8_BLEND_COLOR] = LLVMPointerType(LLVMInt8TypeInContext(lc), 0);
215 elem_types[LP_JIT_CTX_F_BLEND_COLOR] = LLVMPointerType(LLVMFloatTypeInContext(lc), 0);
216 elem_types[LP_JIT_CTX_VIEWPORTS] = LLVMPointerType(viewport_type, 0);
217 elem_types[LP_JIT_CTX_SSBOS] =
218 LLVMArrayType(LLVMPointerType(LLVMInt32TypeInContext(lc), 0), LP_MAX_TGSI_SHADER_BUFFERS);
219 elem_types[LP_JIT_CTX_NUM_SSBOS] =
220 LLVMArrayType(LLVMInt32TypeInContext(lc), LP_MAX_TGSI_SHADER_BUFFERS);
221 context_type = LLVMStructTypeInContext(lc, elem_types,
222 ARRAY_SIZE(elem_types), 0);
223
224 LP_CHECK_MEMBER_OFFSET(struct lp_jit_context, constants,
225 gallivm->target, context_type,
226 LP_JIT_CTX_CONSTANTS);
227 LP_CHECK_MEMBER_OFFSET(struct lp_jit_context, num_constants,
228 gallivm->target, context_type,
229 LP_JIT_CTX_NUM_CONSTANTS);
230 LP_CHECK_MEMBER_OFFSET(struct lp_jit_context, textures,
231 gallivm->target, context_type,
232 LP_JIT_CTX_TEXTURES);
233 LP_CHECK_MEMBER_OFFSET(struct lp_jit_context, samplers,
234 gallivm->target, context_type,
235 LP_JIT_CTX_SAMPLERS);
236 LP_CHECK_MEMBER_OFFSET(struct lp_jit_context, images,
237 gallivm->target, context_type,
238 LP_JIT_CTX_IMAGES);
239 LP_CHECK_MEMBER_OFFSET(struct lp_jit_context, alpha_ref_value,
240 gallivm->target, context_type,
241 LP_JIT_CTX_ALPHA_REF);
242 LP_CHECK_MEMBER_OFFSET(struct lp_jit_context, stencil_ref_front,
243 gallivm->target, context_type,
244 LP_JIT_CTX_STENCIL_REF_FRONT);
245 LP_CHECK_MEMBER_OFFSET(struct lp_jit_context, stencil_ref_back,
246 gallivm->target, context_type,
247 LP_JIT_CTX_STENCIL_REF_BACK);
248 LP_CHECK_MEMBER_OFFSET(struct lp_jit_context, u8_blend_color,
249 gallivm->target, context_type,
250 LP_JIT_CTX_U8_BLEND_COLOR);
251 LP_CHECK_MEMBER_OFFSET(struct lp_jit_context, f_blend_color,
252 gallivm->target, context_type,
253 LP_JIT_CTX_F_BLEND_COLOR);
254 LP_CHECK_MEMBER_OFFSET(struct lp_jit_context, viewports,
255 gallivm->target, context_type,
256 LP_JIT_CTX_VIEWPORTS);
257 LP_CHECK_MEMBER_OFFSET(struct lp_jit_context, ssbos,
258 gallivm->target, context_type,
259 LP_JIT_CTX_SSBOS);
260 LP_CHECK_MEMBER_OFFSET(struct lp_jit_context, num_ssbos,
261 gallivm->target, context_type,
262 LP_JIT_CTX_NUM_SSBOS);
263 LP_CHECK_STRUCT_SIZE(struct lp_jit_context,
264 gallivm->target, context_type);
265
266 lp->jit_context_ptr_type = LLVMPointerType(context_type, 0);
267 }
268
269 /* struct lp_jit_thread_data */
270 {
271 LLVMTypeRef elem_types[LP_JIT_THREAD_DATA_COUNT];
272 LLVMTypeRef thread_data_type;
273
274 elem_types[LP_JIT_THREAD_DATA_CACHE] =
275 LLVMPointerType(lp_build_format_cache_type(gallivm), 0);
276 elem_types[LP_JIT_THREAD_DATA_COUNTER] = LLVMInt64TypeInContext(lc);
277 elem_types[LP_JIT_THREAD_DATA_INVOCATIONS] = LLVMInt64TypeInContext(lc);
278 elem_types[LP_JIT_THREAD_DATA_RASTER_STATE_VIEWPORT_INDEX] =
279 LLVMInt32TypeInContext(lc);
280
281 thread_data_type = LLVMStructTypeInContext(lc, elem_types,
282 ARRAY_SIZE(elem_types), 0);
283
284 lp->jit_thread_data_ptr_type = LLVMPointerType(thread_data_type, 0);
285 }
286
287 if (gallivm_debug & GALLIVM_DEBUG_IR) {
288 #if HAVE_LLVM >= 0x304
289 char *str = LLVMPrintModuleToString(gallivm->module);
290 fprintf(stderr, "%s", str);
291 LLVMDisposeMessage(str);
292 #else
293 LLVMDumpModule(gallivm->module);
294 #endif
295 }
296 }
297
298
299 void
300 lp_jit_screen_cleanup(struct llvmpipe_screen *screen)
301 {
302 /* nothing */
303 }
304
305
306 boolean
307 lp_jit_screen_init(struct llvmpipe_screen *screen)
308 {
309 return lp_build_init();
310 }
311
312
313 void
314 lp_jit_init_types(struct lp_fragment_shader_variant *lp)
315 {
316 if (!lp->jit_context_ptr_type)
317 lp_jit_create_types(lp);
318 }