1 #include "draw_private.h"
2 #include "draw_context.h"
6 #include "gallivm/lp_bld_arit.h"
7 #include "gallivm/lp_bld_struct.h"
8 #include "gallivm/lp_bld_type.h"
9 #include "gallivm/lp_bld_debug.h"
11 #include "util/u_memory.h"
12 #include "pipe/p_state.h"
18 from_64_float(LLVMBuilderRef builder
, LLVMValueRef val
)
20 LLVMValueRef bc
= LLVMBuildBitCast(builder
, val
,
21 LLVMPointerType(LLVMDoubleType(), 0) , "");
22 LLVMValueRef l
= LLVMBuildLoad(builder
, bc
, "");
23 return LLVMBuildFPTrunc(builder
, l
, LLVMFloatType(), "");
27 from_32_float(LLVMBuilderRef builder
, LLVMValueRef val
)
29 LLVMValueRef bc
= LLVMBuildBitCast(builder
, val
,
30 LLVMPointerType(LLVMFloatType(), 0) , "");
31 return LLVMBuildLoad(builder
, bc
, "");
34 static INLINE LLVMValueRef
35 from_8_uscaled(LLVMBuilderRef builder
, LLVMValueRef val
)
37 LLVMValueRef l
= LLVMBuildLoad(builder
, val
, "");
38 return LLVMBuildUIToFP(builder
, l
, LLVMFloatType(), "");
41 static INLINE LLVMValueRef
42 from_16_uscaled(LLVMBuilderRef builder
, LLVMValueRef val
)
44 LLVMValueRef bc
= LLVMBuildBitCast(builder
, val
,
45 LLVMPointerType(LLVMIntType(16), 0) , "");
46 LLVMValueRef l
= LLVMBuildLoad(builder
, bc
, "");
47 return LLVMBuildUIToFP(builder
, l
, LLVMFloatType(), "");
50 static INLINE LLVMValueRef
51 from_32_uscaled(LLVMBuilderRef builder
, LLVMValueRef val
)
53 LLVMValueRef bc
= LLVMBuildBitCast(builder
, val
,
54 LLVMPointerType(LLVMIntType(32), 0) , "");
55 LLVMValueRef l
= LLVMBuildLoad(builder
, bc
, "");
56 return LLVMBuildUIToFP(builder
, l
, LLVMFloatType(), "");
59 static INLINE LLVMValueRef
60 from_8_sscaled(LLVMBuilderRef builder
, LLVMValueRef val
)
62 LLVMValueRef l
= LLVMBuildLoad(builder
, val
, "");
63 return LLVMBuildSIToFP(builder
, l
, LLVMFloatType(), "");
66 static INLINE LLVMValueRef
67 from_16_sscaled(LLVMBuilderRef builder
, LLVMValueRef val
)
69 LLVMValueRef bc
= LLVMBuildBitCast(builder
, val
,
70 LLVMPointerType(LLVMIntType(16), 0) , "");
71 LLVMValueRef l
= LLVMBuildLoad(builder
, bc
, "");
72 return LLVMBuildSIToFP(builder
, l
, LLVMFloatType(), "");
75 static INLINE LLVMValueRef
76 from_32_sscaled(LLVMBuilderRef builder
, LLVMValueRef val
)
78 LLVMValueRef bc
= LLVMBuildBitCast(builder
, val
,
79 LLVMPointerType(LLVMIntType(32), 0) , "");
80 LLVMValueRef l
= LLVMBuildLoad(builder
, bc
, "");
81 return LLVMBuildSIToFP(builder
, l
, LLVMFloatType(), "");
85 static INLINE LLVMValueRef
86 from_8_unorm(LLVMBuilderRef builder
, LLVMValueRef val
)
88 LLVMValueRef l
= LLVMBuildLoad(builder
, val
, "");
89 LLVMValueRef uscaled
= LLVMBuildUIToFP(builder
, l
, LLVMFloatType(), "");
90 return LLVMBuildFDiv(builder
, uscaled
,
91 LLVMConstReal(LLVMFloatType(), 255.), "");
94 static INLINE LLVMValueRef
95 from_16_unorm(LLVMBuilderRef builder
, LLVMValueRef val
)
97 LLVMValueRef bc
= LLVMBuildBitCast(builder
, val
,
98 LLVMPointerType(LLVMIntType(16), 0) , "");
99 LLVMValueRef l
= LLVMBuildLoad(builder
, bc
, "");
100 LLVMValueRef uscaled
= LLVMBuildUIToFP(builder
, l
, LLVMFloatType(), "");
101 return LLVMBuildFDiv(builder
, uscaled
,
102 LLVMConstReal(LLVMFloatType(), 65535.), "");
105 static INLINE LLVMValueRef
106 from_32_unorm(LLVMBuilderRef builder
, LLVMValueRef val
)
108 LLVMValueRef bc
= LLVMBuildBitCast(builder
, val
,
109 LLVMPointerType(LLVMIntType(32), 0) , "");
110 LLVMValueRef l
= LLVMBuildLoad(builder
, bc
, "");
111 LLVMValueRef uscaled
= LLVMBuildUIToFP(builder
, l
, LLVMFloatType(), "");
113 return LLVMBuildFDiv(builder
, uscaled
,
114 LLVMConstReal(LLVMFloatType(), 4294967295.), "");
117 static INLINE LLVMValueRef
118 from_8_snorm(LLVMBuilderRef builder
, LLVMValueRef val
)
120 LLVMValueRef l
= LLVMBuildLoad(builder
, val
, "");
121 LLVMValueRef uscaled
= LLVMBuildSIToFP(builder
, l
, LLVMFloatType(), "");
122 return LLVMBuildFDiv(builder
, uscaled
,
123 LLVMConstReal(LLVMFloatType(), 127.0), "");
126 static INLINE LLVMValueRef
127 from_16_snorm(LLVMBuilderRef builder
, LLVMValueRef val
)
129 LLVMValueRef bc
= LLVMBuildBitCast(builder
, val
,
130 LLVMPointerType(LLVMIntType(16), 0) , "");
131 LLVMValueRef l
= LLVMBuildLoad(builder
, bc
, "");
132 LLVMValueRef uscaled
= LLVMBuildSIToFP(builder
, l
, LLVMFloatType(), "");
133 return LLVMBuildFDiv(builder
, uscaled
,
134 LLVMConstReal(LLVMFloatType(), 32767.0f
), "");
137 static INLINE LLVMValueRef
138 from_32_snorm(LLVMBuilderRef builder
, LLVMValueRef val
)
140 LLVMValueRef bc
= LLVMBuildBitCast(builder
, val
,
141 LLVMPointerType(LLVMIntType(32), 0) , "");
142 LLVMValueRef l
= LLVMBuildLoad(builder
, bc
, "");
143 LLVMValueRef uscaled
= LLVMBuildSIToFP(builder
, l
, LLVMFloatType(), "");
145 return LLVMBuildFDiv(builder
, uscaled
,
146 LLVMConstReal(LLVMFloatType(), 2147483647.0), "");
149 static INLINE LLVMValueRef
150 from_32_fixed(LLVMBuilderRef builder
, LLVMValueRef val
)
152 LLVMValueRef bc
= LLVMBuildBitCast(builder
, val
,
153 LLVMPointerType(LLVMIntType(32), 0) , "");
154 LLVMValueRef l
= LLVMBuildLoad(builder
, bc
, "");
155 LLVMValueRef uscaled
= LLVMBuildSIToFP(builder
, l
, LLVMFloatType(), "");
157 return LLVMBuildFDiv(builder
, uscaled
,
158 LLVMConstReal(LLVMFloatType(), 65536.0), "");
162 to_64_float(LLVMBuilderRef builder
, LLVMValueRef fp
)
164 LLVMValueRef l
= LLVMBuildLoad(builder
, fp
, "");
165 return LLVMBuildFPExt(builder
, l
, LLVMDoubleType(), "");
169 to_32_float(LLVMBuilderRef builder
, LLVMValueRef fp
)
171 return LLVMBuildLoad(builder
, fp
, "");
174 static INLINE LLVMValueRef
175 to_8_uscaled(LLVMBuilderRef builder
, LLVMValueRef fp
)
177 LLVMValueRef l
= LLVMBuildLoad(builder
, fp
, "");
178 return LLVMBuildFPToUI(builder
, l
, LLVMIntType(8), "");
181 static INLINE LLVMValueRef
182 to_16_uscaled(LLVMBuilderRef builder
, LLVMValueRef fp
)
184 LLVMValueRef l
= LLVMBuildLoad(builder
, fp
, "");
185 return LLVMBuildFPToUI(builder
, l
, LLVMIntType(16), "");
188 static INLINE LLVMValueRef
189 to_32_uscaled(LLVMBuilderRef builder
, LLVMValueRef fp
)
191 LLVMValueRef l
= LLVMBuildLoad(builder
, fp
, "");
192 return LLVMBuildFPToUI(builder
, l
, LLVMIntType(32), "");
195 static INLINE LLVMValueRef
196 to_8_sscaled(LLVMBuilderRef builder
, LLVMValueRef fp
)
198 LLVMValueRef l
= LLVMBuildLoad(builder
, fp
, "");
199 return LLVMBuildFPToSI(builder
, l
, LLVMIntType(8), "");
202 static INLINE LLVMValueRef
203 to_16_sscaled(LLVMBuilderRef builder
, LLVMValueRef fp
)
205 LLVMValueRef l
= LLVMBuildLoad(builder
, fp
, "");
206 return LLVMBuildFPToSI(builder
, l
, LLVMIntType(16), "");
209 static INLINE LLVMValueRef
210 to_32_sscaled(LLVMBuilderRef builder
, LLVMValueRef fp
)
212 LLVMValueRef l
= LLVMBuildLoad(builder
, fp
, "");
213 return LLVMBuildFPToSI(builder
, l
, LLVMIntType(32), "");
216 static INLINE LLVMValueRef
217 to_8_unorm(LLVMBuilderRef builder
, LLVMValueRef fp
)
219 LLVMValueRef l
= LLVMBuildLoad(builder
, fp
, "");
220 LLVMValueRef uscaled
= LLVMBuildFPToUI(builder
, l
, LLVMIntType(8), "");
221 return LLVMBuildFMul(builder
, uscaled
,
222 LLVMConstReal(LLVMFloatType(), 255.), "");
225 static INLINE LLVMValueRef
226 to_16_unorm(LLVMBuilderRef builder
, LLVMValueRef fp
)
228 LLVMValueRef l
= LLVMBuildLoad(builder
, fp
, "");
229 LLVMValueRef uscaled
= LLVMBuildFPToUI(builder
, l
, LLVMIntType(32), "");
230 return LLVMBuildFMul(builder
, uscaled
,
231 LLVMConstReal(LLVMFloatType(), 65535.), "");
234 static INLINE LLVMValueRef
235 to_32_unorm(LLVMBuilderRef builder
, LLVMValueRef fp
)
237 LLVMValueRef l
= LLVMBuildLoad(builder
, fp
, "");
238 LLVMValueRef uscaled
= LLVMBuildFPToUI(builder
, l
, LLVMIntType(32), "");
240 return LLVMBuildFMul(builder
, uscaled
,
241 LLVMConstReal(LLVMFloatType(), 4294967295.), "");
244 static INLINE LLVMValueRef
245 to_8_snorm(LLVMBuilderRef builder
, LLVMValueRef val
)
247 LLVMValueRef l
= LLVMBuildLoad(builder
, val
, "");
248 LLVMValueRef uscaled
= LLVMBuildFPToSI(builder
, l
, LLVMIntType(8), "");
249 return LLVMBuildFMul(builder
, uscaled
,
250 LLVMConstReal(LLVMFloatType(), 127.0), "");
253 static INLINE LLVMValueRef
254 to_16_snorm(LLVMBuilderRef builder
, LLVMValueRef fp
)
256 LLVMValueRef l
= LLVMBuildLoad(builder
, fp
, "");
257 LLVMValueRef uscaled
= LLVMBuildFPToSI(builder
, l
, LLVMIntType(16), "");
258 return LLVMBuildFMul(builder
, uscaled
,
259 LLVMConstReal(LLVMFloatType(), 32767.0f
), "");
262 static INLINE LLVMValueRef
263 to_32_snorm(LLVMBuilderRef builder
, LLVMValueRef fp
)
265 LLVMValueRef l
= LLVMBuildLoad(builder
, fp
, "");
266 LLVMValueRef uscaled
= LLVMBuildFPToSI(builder
, l
, LLVMIntType(32), "");
268 return LLVMBuildFMul(builder
, uscaled
,
269 LLVMConstReal(LLVMFloatType(), 2147483647.0), "");
272 static INLINE LLVMValueRef
273 to_32_fixed(LLVMBuilderRef builder
, LLVMValueRef fp
)
275 LLVMValueRef l
= LLVMBuildLoad(builder
, fp
, "");
276 LLVMValueRef uscaled
= LLVMBuildFPToSI(builder
, l
, LLVMIntType(32), "");
278 return LLVMBuildFMul(builder
, uscaled
,
279 LLVMConstReal(LLVMFloatType(), 65536.0), "");
282 typedef LLVMValueRef (*from_func
)(LLVMBuilderRef
, LLVMValueRef
);
283 typedef LLVMValueRef (*to_func
)(LLVMBuilderRef
, LLVMValueRef
);
285 /* so that underneath can avoid function calls which are prohibited
286 * for static initialization we need this conversion */
295 static INLINE LLVMTypeRef
296 ll_type_to_llvm(enum ll_type type
)
300 return LLVMDoubleType();
302 return LLVMFloatType();
304 return LLVMInt32Type();
306 return LLVMIntType(16);
308 return LLVMIntType(8);
310 return LLVMIntType(8);
314 ll_type_size(enum ll_type type
)
331 struct draw_llvm_translate
{
339 {PIPE_FORMAT_R64_FLOAT
, from_64_float
, to_64_float
, LL_Double
, 1},
340 {PIPE_FORMAT_R64G64_FLOAT
, from_64_float
, to_64_float
, LL_Double
, 2},
341 {PIPE_FORMAT_R64G64B64_FLOAT
, from_64_float
, to_64_float
, LL_Double
, 3},
342 {PIPE_FORMAT_R64G64B64A64_FLOAT
, from_64_float
, to_64_float
, LL_Double
, 4},
343 {PIPE_FORMAT_R32_FLOAT
, from_32_float
, to_32_float
, LL_Float
, 1},
344 {PIPE_FORMAT_R32G32_FLOAT
, from_32_float
, to_32_float
, LL_Float
, 2},
345 {PIPE_FORMAT_R32G32B32_FLOAT
, from_32_float
, to_32_float
, LL_Float
, 3},
346 {PIPE_FORMAT_R32G32B32A32_FLOAT
, from_32_float
, to_32_float
, LL_Float
, 4},
348 {PIPE_FORMAT_R32_UNORM
, from_32_unorm
, to_32_unorm
, LL_Int32
, 1},
349 {PIPE_FORMAT_R32G32_UNORM
, from_32_unorm
, to_32_unorm
, LL_Int32
, 2},
350 {PIPE_FORMAT_R32G32B32_UNORM
, from_32_unorm
, to_32_unorm
, LL_Int32
, 3},
351 {PIPE_FORMAT_R32G32B32A32_UNORM
, from_32_unorm
, to_32_unorm
, LL_Int32
, 4},
353 {PIPE_FORMAT_R32_USCALED
, from_32_uscaled
, to_32_uscaled
, LL_Int32
, 1},
354 {PIPE_FORMAT_R32G32_USCALED
, from_32_uscaled
, to_32_uscaled
, LL_Int32
, 2},
355 {PIPE_FORMAT_R32G32B32_USCALED
, from_32_uscaled
, to_32_uscaled
, LL_Int32
, 3},
356 {PIPE_FORMAT_R32G32B32A32_USCALED
, from_32_uscaled
, to_32_uscaled
, LL_Int32
, 4},
358 {PIPE_FORMAT_R32_SNORM
, from_32_snorm
, to_32_snorm
, LL_Int32
, 1},
359 {PIPE_FORMAT_R32G32_SNORM
, from_32_snorm
, to_32_snorm
, LL_Int32
, 2},
360 {PIPE_FORMAT_R32G32B32_SNORM
, from_32_snorm
, to_32_snorm
, LL_Int32
, 3},
361 {PIPE_FORMAT_R32G32B32A32_SNORM
, from_32_snorm
, to_32_snorm
, LL_Int32
, 4},
363 {PIPE_FORMAT_R32_SSCALED
, from_32_sscaled
, to_32_sscaled
, LL_Int32
, 1},
364 {PIPE_FORMAT_R32G32_SSCALED
, from_32_sscaled
, to_32_sscaled
, LL_Int32
, 2},
365 {PIPE_FORMAT_R32G32B32_SSCALED
, from_32_sscaled
, to_32_sscaled
, LL_Int32
, 3},
366 {PIPE_FORMAT_R32G32B32A32_SSCALED
, from_32_sscaled
, to_32_sscaled
, LL_Int32
, 4},
368 {PIPE_FORMAT_R16_UNORM
, from_16_unorm
, to_16_unorm
, LL_Int16
, 1},
369 {PIPE_FORMAT_R16G16_UNORM
, from_16_unorm
, to_16_unorm
, LL_Int16
, 2},
370 {PIPE_FORMAT_R16G16B16_UNORM
, from_16_unorm
, to_16_unorm
, LL_Int16
, 3},
371 {PIPE_FORMAT_R16G16B16A16_UNORM
, from_16_unorm
, to_16_unorm
, LL_Int16
, 4},
373 {PIPE_FORMAT_R16_USCALED
, from_16_uscaled
, to_16_uscaled
, LL_Int16
, 1},
374 {PIPE_FORMAT_R16G16_USCALED
, from_16_uscaled
, to_16_uscaled
, LL_Int16
, 2},
375 {PIPE_FORMAT_R16G16B16_USCALED
, from_16_uscaled
, to_16_uscaled
, LL_Int16
, 3},
376 {PIPE_FORMAT_R16G16B16A16_USCALED
, from_16_uscaled
, to_16_uscaled
, LL_Int16
, 4},
378 {PIPE_FORMAT_R16_SNORM
, from_16_snorm
, to_16_snorm
, LL_Int16
, 1},
379 {PIPE_FORMAT_R16G16_SNORM
, from_16_snorm
, to_16_snorm
, LL_Int16
, 2},
380 {PIPE_FORMAT_R16G16B16_SNORM
, from_16_snorm
, to_16_snorm
, LL_Int16
, 3},
381 {PIPE_FORMAT_R16G16B16A16_SNORM
, from_16_snorm
, to_16_snorm
, LL_Int16
, 4},
383 {PIPE_FORMAT_R16_SSCALED
, from_16_sscaled
, to_16_sscaled
, LL_Int16
, 1},
384 {PIPE_FORMAT_R16G16_SSCALED
, from_16_sscaled
, to_16_sscaled
, LL_Int16
, 2},
385 {PIPE_FORMAT_R16G16B16_SSCALED
, from_16_sscaled
, to_16_sscaled
, LL_Int16
, 3},
386 {PIPE_FORMAT_R16G16B16A16_SSCALED
, from_16_sscaled
, to_16_sscaled
, LL_Int16
, 4},
388 {PIPE_FORMAT_R8_UNORM
, from_8_unorm
, to_8_unorm
, LL_Int8
, 1},
389 {PIPE_FORMAT_R8G8_UNORM
, from_8_unorm
, to_8_unorm
, LL_Int8
, 2},
390 {PIPE_FORMAT_R8G8B8_UNORM
, from_8_unorm
, to_8_unorm
, LL_Int8
, 3},
391 {PIPE_FORMAT_R8G8B8A8_UNORM
, from_8_unorm
, to_8_unorm
, LL_Int8
, 4},
393 {PIPE_FORMAT_R8_USCALED
, from_8_uscaled
, to_8_uscaled
, LL_Int8
, 1},
394 {PIPE_FORMAT_R8G8_USCALED
, from_8_uscaled
, to_8_uscaled
, LL_Int8
, 2},
395 {PIPE_FORMAT_R8G8B8_USCALED
, from_8_uscaled
, to_8_uscaled
, LL_Int8
, 3},
396 {PIPE_FORMAT_R8G8B8A8_USCALED
, from_8_uscaled
, to_8_uscaled
, LL_Int8
, 4},
398 {PIPE_FORMAT_R8_SNORM
, from_8_snorm
, to_8_snorm
, LL_Int8
, 1},
399 {PIPE_FORMAT_R8G8_SNORM
, from_8_snorm
, to_8_snorm
, LL_Int8
, 2},
400 {PIPE_FORMAT_R8G8B8_SNORM
, from_8_snorm
, to_8_snorm
, LL_Int8
, 3},
401 {PIPE_FORMAT_R8G8B8A8_SNORM
, from_8_snorm
, to_8_snorm
, LL_Int8
, 4},
403 {PIPE_FORMAT_R8_SSCALED
, from_8_sscaled
, to_8_sscaled
, LL_Int8
, 1},
404 {PIPE_FORMAT_R8G8_SSCALED
, from_8_sscaled
, to_8_sscaled
, LL_Int8
, 2},
405 {PIPE_FORMAT_R8G8B8_SSCALED
, from_8_sscaled
, to_8_sscaled
, LL_Int8
, 3},
406 {PIPE_FORMAT_R8G8B8A8_SSCALED
, from_8_sscaled
, to_8_sscaled
, LL_Int8
, 4},
408 {PIPE_FORMAT_R32_FIXED
, from_32_fixed
, to_32_fixed
, LL_Int32
, 1},
409 {PIPE_FORMAT_R32G32_FIXED
, from_32_fixed
, to_32_fixed
, LL_Int32
, 2},
410 {PIPE_FORMAT_R32G32B32_FIXED
, from_32_fixed
, to_32_fixed
, LL_Int32
, 3},
411 {PIPE_FORMAT_R32G32B32A32_FIXED
, from_32_fixed
, to_32_fixed
, LL_Int32
, 4},
413 {PIPE_FORMAT_A8R8G8B8_UNORM
, from_8_unorm
, to_8_unorm
, LL_Int8
, 4},
414 {PIPE_FORMAT_B8G8R8A8_UNORM
, from_8_unorm
, to_8_unorm
, LL_Int8
, 4},
419 fetch(LLVMBuilderRef builder
,
420 LLVMValueRef ptr
, int val_size
, int nr_components
,
425 LLVMValueRef res
= LLVMConstNull(
426 LLVMVectorType(LLVMFloatType(), 4));
427 LLVMValueRef defaults
[4];
429 defaults
[0] = LLVMConstReal(LLVMFloatType(), 0);
430 defaults
[1] = LLVMConstReal(LLVMFloatType(), 0);
431 defaults
[2] = LLVMConstReal(LLVMFloatType(), 0);
432 defaults
[3] = LLVMConstReal(LLVMFloatType(), 1);
434 for (i
= 0; i
< nr_components
; ++i
) {
435 LLVMValueRef src_index
= LLVMConstInt(LLVMInt32Type(), offset
, 0);
436 LLVMValueRef dst_index
= LLVMConstInt(LLVMInt32Type(), i
, 0);
437 LLVMValueRef src_tmp
;
438 LLVMValueRef component
;
440 src_tmp
= LLVMBuildGEP(builder
, ptr
, &src_index
, 1, "src_tmp");
442 /* convert src_tmp to float */
443 component
= func(builder
, src_tmp
);
445 /* vec.comp = component */
446 res
= LLVMBuildInsertElement(builder
,
453 LLVMValueRef dst_index
= LLVMConstInt(LLVMInt32Type(), i
, 0);
454 res
= LLVMBuildInsertElement(builder
,
464 draw_llvm_translate_from(LLVMBuilderRef builder
,
465 LLVMValueRef vbuffer
,
466 enum pipe_format from_format
)
469 for (i
= 0; i
< Elements(translates
); ++i
) {
470 if (translates
[i
].format
== from_format
) {
471 /*LLVMTypeRef type = ll_type_to_llvm(translates[i].type);*/
472 return fetch(builder
,
474 ll_type_size(translates
[i
].type
),
475 translates
[i
].num_components
,
479 return LLVMGetUndef(LLVMVectorType(LLVMFloatType(), 4));