1 #include "draw_private.h"
2 #include "draw_context.h"
6 #include "gallivm/lp_bld_arit.h"
7 #include "gallivm/lp_bld_interp.h"
8 #include "gallivm/lp_bld_struct.h"
9 #include "gallivm/lp_bld_type.h"
10 #include "gallivm/lp_bld_flow.h"
11 #include "gallivm/lp_bld_debug.h"
12 #include "gallivm/lp_bld_tgsi.h"
14 #include "util/u_memory.h"
15 #include "pipe/p_state.h"
21 from_64_float(LLVMBuilderRef builder
, LLVMValueRef val
)
23 LLVMValueRef bc
= LLVMBuildBitCast(builder
, val
,
24 LLVMPointerType(LLVMDoubleType(), 0) , "");
25 LLVMValueRef l
= LLVMBuildLoad(builder
, bc
, "");
26 return LLVMBuildFPTrunc(builder
, l
, LLVMFloatType(), "");
30 from_32_float(LLVMBuilderRef builder
, LLVMValueRef val
)
32 LLVMValueRef bc
= LLVMBuildBitCast(builder
, val
,
33 LLVMPointerType(LLVMFloatType(), 0) , "");
34 return LLVMBuildLoad(builder
, bc
, "");
37 static INLINE LLVMValueRef
38 from_8_uscaled(LLVMBuilderRef builder
, LLVMValueRef val
)
40 LLVMValueRef l
= LLVMBuildLoad(builder
, val
, "");
41 return LLVMBuildUIToFP(builder
, l
, LLVMFloatType(), "");
44 static INLINE LLVMValueRef
45 from_16_uscaled(LLVMBuilderRef builder
, LLVMValueRef val
)
47 LLVMValueRef bc
= LLVMBuildBitCast(builder
, val
,
48 LLVMPointerType(LLVMIntType(16), 0) , "");
49 LLVMValueRef l
= LLVMBuildLoad(builder
, bc
, "");
50 return LLVMBuildUIToFP(builder
, l
, LLVMFloatType(), "");
53 static INLINE LLVMValueRef
54 from_32_uscaled(LLVMBuilderRef builder
, LLVMValueRef val
)
56 LLVMValueRef bc
= LLVMBuildBitCast(builder
, val
,
57 LLVMPointerType(LLVMIntType(32), 0) , "");
58 LLVMValueRef l
= LLVMBuildLoad(builder
, bc
, "");
59 return LLVMBuildUIToFP(builder
, l
, LLVMFloatType(), "");
62 static INLINE LLVMValueRef
63 from_8_sscaled(LLVMBuilderRef builder
, LLVMValueRef val
)
65 LLVMValueRef l
= LLVMBuildLoad(builder
, val
, "");
66 return LLVMBuildSIToFP(builder
, l
, LLVMFloatType(), "");
69 static INLINE LLVMValueRef
70 from_16_sscaled(LLVMBuilderRef builder
, LLVMValueRef val
)
72 LLVMValueRef bc
= LLVMBuildBitCast(builder
, val
,
73 LLVMPointerType(LLVMIntType(16), 0) , "");
74 LLVMValueRef l
= LLVMBuildLoad(builder
, bc
, "");
75 return LLVMBuildSIToFP(builder
, l
, LLVMFloatType(), "");
78 static INLINE LLVMValueRef
79 from_32_sscaled(LLVMBuilderRef builder
, LLVMValueRef val
)
81 LLVMValueRef bc
= LLVMBuildBitCast(builder
, val
,
82 LLVMPointerType(LLVMIntType(32), 0) , "");
83 LLVMValueRef l
= LLVMBuildLoad(builder
, bc
, "");
84 return LLVMBuildSIToFP(builder
, l
, LLVMFloatType(), "");
88 static INLINE LLVMValueRef
89 from_8_unorm(LLVMBuilderRef builder
, LLVMValueRef val
)
91 LLVMValueRef l
= LLVMBuildLoad(builder
, val
, "");
92 LLVMValueRef uscaled
= LLVMBuildUIToFP(builder
, l
, LLVMFloatType(), "");
93 return LLVMBuildFDiv(builder
, uscaled
,
94 LLVMConstReal(LLVMFloatType(), 255.), "");
97 static INLINE LLVMValueRef
98 from_16_unorm(LLVMBuilderRef builder
, LLVMValueRef val
)
100 LLVMValueRef bc
= LLVMBuildBitCast(builder
, val
,
101 LLVMPointerType(LLVMIntType(16), 0) , "");
102 LLVMValueRef l
= LLVMBuildLoad(builder
, bc
, "");
103 LLVMValueRef uscaled
= LLVMBuildUIToFP(builder
, l
, LLVMFloatType(), "");
104 return LLVMBuildFDiv(builder
, uscaled
,
105 LLVMConstReal(LLVMFloatType(), 65535.), "");
108 static INLINE LLVMValueRef
109 from_32_unorm(LLVMBuilderRef builder
, LLVMValueRef val
)
111 LLVMValueRef bc
= LLVMBuildBitCast(builder
, val
,
112 LLVMPointerType(LLVMIntType(32), 0) , "");
113 LLVMValueRef l
= LLVMBuildLoad(builder
, bc
, "");
114 LLVMValueRef uscaled
= LLVMBuildUIToFP(builder
, l
, LLVMFloatType(), "");
116 return LLVMBuildFDiv(builder
, uscaled
,
117 LLVMConstReal(LLVMFloatType(), 4294967295.), "");
120 static INLINE LLVMValueRef
121 from_8_snorm(LLVMBuilderRef builder
, LLVMValueRef val
)
123 LLVMValueRef l
= LLVMBuildLoad(builder
, val
, "");
124 LLVMValueRef uscaled
= LLVMBuildSIToFP(builder
, l
, LLVMFloatType(), "");
125 return LLVMBuildFDiv(builder
, uscaled
,
126 LLVMConstReal(LLVMFloatType(), 127.0), "");
129 static INLINE LLVMValueRef
130 from_16_snorm(LLVMBuilderRef builder
, LLVMValueRef val
)
132 LLVMValueRef bc
= LLVMBuildBitCast(builder
, val
,
133 LLVMPointerType(LLVMIntType(16), 0) , "");
134 LLVMValueRef l
= LLVMBuildLoad(builder
, bc
, "");
135 LLVMValueRef uscaled
= LLVMBuildSIToFP(builder
, l
, LLVMFloatType(), "");
136 return LLVMBuildFDiv(builder
, uscaled
,
137 LLVMConstReal(LLVMFloatType(), 32767.0f
), "");
140 static INLINE LLVMValueRef
141 from_32_snorm(LLVMBuilderRef builder
, LLVMValueRef val
)
143 LLVMValueRef bc
= LLVMBuildBitCast(builder
, val
,
144 LLVMPointerType(LLVMIntType(32), 0) , "");
145 LLVMValueRef l
= LLVMBuildLoad(builder
, bc
, "");
146 LLVMValueRef uscaled
= LLVMBuildSIToFP(builder
, l
, LLVMFloatType(), "");
148 return LLVMBuildFDiv(builder
, uscaled
,
149 LLVMConstReal(LLVMFloatType(), 2147483647.0), "");
152 static INLINE LLVMValueRef
153 from_32_fixed(LLVMBuilderRef builder
, LLVMValueRef val
)
155 LLVMValueRef bc
= LLVMBuildBitCast(builder
, val
,
156 LLVMPointerType(LLVMIntType(32), 0) , "");
157 LLVMValueRef l
= LLVMBuildLoad(builder
, bc
, "");
158 LLVMValueRef uscaled
= LLVMBuildSIToFP(builder
, l
, LLVMFloatType(), "");
160 return LLVMBuildFDiv(builder
, uscaled
,
161 LLVMConstReal(LLVMFloatType(), 65536.0), "");
165 to_64_float(LLVMBuilderRef builder
, LLVMValueRef fp
)
167 LLVMValueRef l
= LLVMBuildLoad(builder
, fp
, "");
168 return LLVMBuildFPExt(builder
, l
, LLVMDoubleType(), "");
172 to_32_float(LLVMBuilderRef builder
, LLVMValueRef fp
)
174 return LLVMBuildLoad(builder
, fp
, "");
177 static INLINE LLVMValueRef
178 to_8_uscaled(LLVMBuilderRef builder
, LLVMValueRef fp
)
180 LLVMValueRef l
= LLVMBuildLoad(builder
, fp
, "");
181 return LLVMBuildFPToUI(builder
, l
, LLVMIntType(8), "");
184 static INLINE LLVMValueRef
185 to_16_uscaled(LLVMBuilderRef builder
, LLVMValueRef fp
)
187 LLVMValueRef l
= LLVMBuildLoad(builder
, fp
, "");
188 return LLVMBuildFPToUI(builder
, l
, LLVMIntType(16), "");
191 static INLINE LLVMValueRef
192 to_32_uscaled(LLVMBuilderRef builder
, LLVMValueRef fp
)
194 LLVMValueRef l
= LLVMBuildLoad(builder
, fp
, "");
195 return LLVMBuildFPToUI(builder
, l
, LLVMIntType(32), "");
198 static INLINE LLVMValueRef
199 to_8_sscaled(LLVMBuilderRef builder
, LLVMValueRef fp
)
201 LLVMValueRef l
= LLVMBuildLoad(builder
, fp
, "");
202 return LLVMBuildFPToSI(builder
, l
, LLVMIntType(8), "");
205 static INLINE LLVMValueRef
206 to_16_sscaled(LLVMBuilderRef builder
, LLVMValueRef fp
)
208 LLVMValueRef l
= LLVMBuildLoad(builder
, fp
, "");
209 return LLVMBuildFPToSI(builder
, l
, LLVMIntType(16), "");
212 static INLINE LLVMValueRef
213 to_32_sscaled(LLVMBuilderRef builder
, LLVMValueRef fp
)
215 LLVMValueRef l
= LLVMBuildLoad(builder
, fp
, "");
216 return LLVMBuildFPToSI(builder
, l
, LLVMIntType(32), "");
219 static INLINE LLVMValueRef
220 to_8_unorm(LLVMBuilderRef builder
, LLVMValueRef fp
)
222 LLVMValueRef l
= LLVMBuildLoad(builder
, fp
, "");
223 LLVMValueRef uscaled
= LLVMBuildFPToUI(builder
, l
, LLVMIntType(8), "");
224 return LLVMBuildFMul(builder
, uscaled
,
225 LLVMConstReal(LLVMFloatType(), 255.), "");
228 static INLINE LLVMValueRef
229 to_16_unorm(LLVMBuilderRef builder
, LLVMValueRef fp
)
231 LLVMValueRef l
= LLVMBuildLoad(builder
, fp
, "");
232 LLVMValueRef uscaled
= LLVMBuildFPToUI(builder
, l
, LLVMIntType(32), "");
233 return LLVMBuildFMul(builder
, uscaled
,
234 LLVMConstReal(LLVMFloatType(), 65535.), "");
237 static INLINE LLVMValueRef
238 to_32_unorm(LLVMBuilderRef builder
, LLVMValueRef fp
)
240 LLVMValueRef l
= LLVMBuildLoad(builder
, fp
, "");
241 LLVMValueRef uscaled
= LLVMBuildFPToUI(builder
, l
, LLVMIntType(32), "");
243 return LLVMBuildFMul(builder
, uscaled
,
244 LLVMConstReal(LLVMFloatType(), 4294967295.), "");
247 static INLINE LLVMValueRef
248 to_8_snorm(LLVMBuilderRef builder
, LLVMValueRef val
)
250 LLVMValueRef l
= LLVMBuildLoad(builder
, val
, "");
251 LLVMValueRef uscaled
= LLVMBuildFPToSI(builder
, l
, LLVMIntType(8), "");
252 return LLVMBuildFMul(builder
, uscaled
,
253 LLVMConstReal(LLVMFloatType(), 127.0), "");
256 static INLINE LLVMValueRef
257 to_16_snorm(LLVMBuilderRef builder
, LLVMValueRef fp
)
259 LLVMValueRef l
= LLVMBuildLoad(builder
, fp
, "");
260 LLVMValueRef uscaled
= LLVMBuildFPToSI(builder
, l
, LLVMIntType(16), "");
261 return LLVMBuildFMul(builder
, uscaled
,
262 LLVMConstReal(LLVMFloatType(), 32767.0f
), "");
265 static INLINE LLVMValueRef
266 to_32_snorm(LLVMBuilderRef builder
, LLVMValueRef fp
)
268 LLVMValueRef l
= LLVMBuildLoad(builder
, fp
, "");
269 LLVMValueRef uscaled
= LLVMBuildFPToSI(builder
, l
, LLVMIntType(32), "");
271 return LLVMBuildFMul(builder
, uscaled
,
272 LLVMConstReal(LLVMFloatType(), 2147483647.0), "");
275 static INLINE LLVMValueRef
276 to_32_fixed(LLVMBuilderRef builder
, LLVMValueRef fp
)
278 LLVMValueRef l
= LLVMBuildLoad(builder
, fp
, "");
279 LLVMValueRef uscaled
= LLVMBuildFPToSI(builder
, l
, LLVMIntType(32), "");
281 return LLVMBuildFMul(builder
, uscaled
,
282 LLVMConstReal(LLVMFloatType(), 65536.0), "");
285 typedef LLVMValueRef (*from_func
)(LLVMBuilderRef
, LLVMValueRef
);
286 typedef LLVMValueRef (*to_func
)(LLVMBuilderRef
, LLVMValueRef
);
288 /* so that underneath can avoid function calls which are prohibited
289 * for static initialization we need this conversion */
298 static INLINE LLVMTypeRef
299 ll_type_to_llvm(enum ll_type type
)
303 return LLVMDoubleType();
305 return LLVMFloatType();
307 return LLVMInt32Type();
309 return LLVMIntType(16);
311 return LLVMIntType(8);
313 return LLVMIntType(8);
317 ll_type_size(enum ll_type type
)
334 struct draw_llvm_translate
{
342 {PIPE_FORMAT_R64_FLOAT
, from_64_float
, to_64_float
, LL_Double
, 1},
343 {PIPE_FORMAT_R64G64_FLOAT
, from_64_float
, to_64_float
, LL_Double
, 2},
344 {PIPE_FORMAT_R64G64B64_FLOAT
, from_64_float
, to_64_float
, LL_Double
, 3},
345 {PIPE_FORMAT_R64G64B64A64_FLOAT
, from_64_float
, to_64_float
, LL_Double
, 4},
346 {PIPE_FORMAT_R32_FLOAT
, from_32_float
, to_32_float
, LL_Float
, 1},
347 {PIPE_FORMAT_R32G32_FLOAT
, from_32_float
, to_32_float
, LL_Float
, 2},
348 {PIPE_FORMAT_R32G32B32_FLOAT
, from_32_float
, to_32_float
, LL_Float
, 3},
349 {PIPE_FORMAT_R32G32B32A32_FLOAT
, from_32_float
, to_32_float
, LL_Float
, 4},
351 {PIPE_FORMAT_R32_UNORM
, from_32_unorm
, to_32_unorm
, LL_Int32
, 1},
352 {PIPE_FORMAT_R32G32_UNORM
, from_32_unorm
, to_32_unorm
, LL_Int32
, 2},
353 {PIPE_FORMAT_R32G32B32_UNORM
, from_32_unorm
, to_32_unorm
, LL_Int32
, 3},
354 {PIPE_FORMAT_R32G32B32A32_UNORM
, from_32_unorm
, to_32_unorm
, LL_Int32
, 4},
356 {PIPE_FORMAT_R32_USCALED
, from_32_uscaled
, to_32_uscaled
, LL_Int32
, 1},
357 {PIPE_FORMAT_R32G32_USCALED
, from_32_uscaled
, to_32_uscaled
, LL_Int32
, 2},
358 {PIPE_FORMAT_R32G32B32_USCALED
, from_32_uscaled
, to_32_uscaled
, LL_Int32
, 3},
359 {PIPE_FORMAT_R32G32B32A32_USCALED
, from_32_uscaled
, to_32_uscaled
, LL_Int32
, 4},
361 {PIPE_FORMAT_R32_SNORM
, from_32_snorm
, to_32_snorm
, LL_Int32
, 1},
362 {PIPE_FORMAT_R32G32_SNORM
, from_32_snorm
, to_32_snorm
, LL_Int32
, 2},
363 {PIPE_FORMAT_R32G32B32_SNORM
, from_32_snorm
, to_32_snorm
, LL_Int32
, 3},
364 {PIPE_FORMAT_R32G32B32A32_SNORM
, from_32_snorm
, to_32_snorm
, LL_Int32
, 4},
366 {PIPE_FORMAT_R32_SSCALED
, from_32_sscaled
, to_32_sscaled
, LL_Int32
, 1},
367 {PIPE_FORMAT_R32G32_SSCALED
, from_32_sscaled
, to_32_sscaled
, LL_Int32
, 2},
368 {PIPE_FORMAT_R32G32B32_SSCALED
, from_32_sscaled
, to_32_sscaled
, LL_Int32
, 3},
369 {PIPE_FORMAT_R32G32B32A32_SSCALED
, from_32_sscaled
, to_32_sscaled
, LL_Int32
, 4},
371 {PIPE_FORMAT_R16_UNORM
, from_16_unorm
, to_16_unorm
, LL_Int16
, 1},
372 {PIPE_FORMAT_R16G16_UNORM
, from_16_unorm
, to_16_unorm
, LL_Int16
, 2},
373 {PIPE_FORMAT_R16G16B16_UNORM
, from_16_unorm
, to_16_unorm
, LL_Int16
, 3},
374 {PIPE_FORMAT_R16G16B16A16_UNORM
, from_16_unorm
, to_16_unorm
, LL_Int16
, 4},
376 {PIPE_FORMAT_R16_USCALED
, from_16_uscaled
, to_16_uscaled
, LL_Int16
, 1},
377 {PIPE_FORMAT_R16G16_USCALED
, from_16_uscaled
, to_16_uscaled
, LL_Int16
, 2},
378 {PIPE_FORMAT_R16G16B16_USCALED
, from_16_uscaled
, to_16_uscaled
, LL_Int16
, 3},
379 {PIPE_FORMAT_R16G16B16A16_USCALED
, from_16_uscaled
, to_16_uscaled
, LL_Int16
, 4},
381 {PIPE_FORMAT_R16_SNORM
, from_16_snorm
, to_16_snorm
, LL_Int16
, 1},
382 {PIPE_FORMAT_R16G16_SNORM
, from_16_snorm
, to_16_snorm
, LL_Int16
, 2},
383 {PIPE_FORMAT_R16G16B16_SNORM
, from_16_snorm
, to_16_snorm
, LL_Int16
, 3},
384 {PIPE_FORMAT_R16G16B16A16_SNORM
, from_16_snorm
, to_16_snorm
, LL_Int16
, 4},
386 {PIPE_FORMAT_R16_SSCALED
, from_16_sscaled
, to_16_sscaled
, LL_Int16
, 1},
387 {PIPE_FORMAT_R16G16_SSCALED
, from_16_sscaled
, to_16_sscaled
, LL_Int16
, 2},
388 {PIPE_FORMAT_R16G16B16_SSCALED
, from_16_sscaled
, to_16_sscaled
, LL_Int16
, 3},
389 {PIPE_FORMAT_R16G16B16A16_SSCALED
, from_16_sscaled
, to_16_sscaled
, LL_Int16
, 4},
391 {PIPE_FORMAT_R8_UNORM
, from_8_unorm
, to_8_unorm
, LL_Int8
, 1},
392 {PIPE_FORMAT_R8G8_UNORM
, from_8_unorm
, to_8_unorm
, LL_Int8
, 2},
393 {PIPE_FORMAT_R8G8B8_UNORM
, from_8_unorm
, to_8_unorm
, LL_Int8
, 3},
394 {PIPE_FORMAT_R8G8B8A8_UNORM
, from_8_unorm
, to_8_unorm
, LL_Int8
, 4},
396 {PIPE_FORMAT_R8_USCALED
, from_8_uscaled
, to_8_uscaled
, LL_Int8
, 1},
397 {PIPE_FORMAT_R8G8_USCALED
, from_8_uscaled
, to_8_uscaled
, LL_Int8
, 2},
398 {PIPE_FORMAT_R8G8B8_USCALED
, from_8_uscaled
, to_8_uscaled
, LL_Int8
, 3},
399 {PIPE_FORMAT_R8G8B8A8_USCALED
, from_8_uscaled
, to_8_uscaled
, LL_Int8
, 4},
401 {PIPE_FORMAT_R8_SNORM
, from_8_snorm
, to_8_snorm
, LL_Int8
, 1},
402 {PIPE_FORMAT_R8G8_SNORM
, from_8_snorm
, to_8_snorm
, LL_Int8
, 2},
403 {PIPE_FORMAT_R8G8B8_SNORM
, from_8_snorm
, to_8_snorm
, LL_Int8
, 3},
404 {PIPE_FORMAT_R8G8B8A8_SNORM
, from_8_snorm
, to_8_snorm
, LL_Int8
, 4},
406 {PIPE_FORMAT_R8_SSCALED
, from_8_sscaled
, to_8_sscaled
, LL_Int8
, 1},
407 {PIPE_FORMAT_R8G8_SSCALED
, from_8_sscaled
, to_8_sscaled
, LL_Int8
, 2},
408 {PIPE_FORMAT_R8G8B8_SSCALED
, from_8_sscaled
, to_8_sscaled
, LL_Int8
, 3},
409 {PIPE_FORMAT_R8G8B8A8_SSCALED
, from_8_sscaled
, to_8_sscaled
, LL_Int8
, 4},
411 {PIPE_FORMAT_R32_FIXED
, from_32_fixed
, to_32_fixed
, LL_Int32
, 1},
412 {PIPE_FORMAT_R32G32_FIXED
, from_32_fixed
, to_32_fixed
, LL_Int32
, 2},
413 {PIPE_FORMAT_R32G32B32_FIXED
, from_32_fixed
, to_32_fixed
, LL_Int32
, 3},
414 {PIPE_FORMAT_R32G32B32A32_FIXED
, from_32_fixed
, to_32_fixed
, LL_Int32
, 4},
416 {PIPE_FORMAT_A8R8G8B8_UNORM
, from_8_unorm
, to_8_unorm
, LL_Int8
, 4},
417 {PIPE_FORMAT_B8G8R8A8_UNORM
, from_8_unorm
, to_8_unorm
, LL_Int8
, 4},
422 fetch(LLVMBuilderRef builder
,
423 LLVMValueRef ptr
, int val_size
, int nr_components
,
428 LLVMValueRef res
= LLVMConstNull(
429 LLVMVectorType(LLVMFloatType(), 4));
431 for (i
= 0; i
< nr_components
; ++i
) {
432 LLVMValueRef src_index
= LLVMConstInt(LLVMInt32Type(), offset
, 0);
433 LLVMValueRef dst_index
= LLVMConstInt(LLVMInt32Type(), i
, 0);
434 LLVMValueRef src_tmp
= LLVMBuildGEP(builder
, ptr
, &src_index
, 1, "");
435 LLVMValueRef component
;
437 src_tmp
= LLVMBuildLoad(builder
, src_tmp
, "");
439 /* convert src_tmp to float */
440 component
= func(builder
, src_tmp
);
442 /* vec.comp = component */
443 res
= LLVMBuildInsertElement(builder
,
454 draw_llvm_translate_from(LLVMBuilderRef builder
,
455 LLVMValueRef vbuffer
,
456 enum pipe_format from_format
)
459 for (i
= 0; i
< Elements(translates
); ++i
) {
460 if (translates
[i
].format
== from_format
) {
461 /*LLVMTypeRef type = ll_type_to_llvm(translates[i].type);*/
462 return fetch(builder
,
464 ll_type_size(translates
[i
].type
),
465 translates
[i
].num_components
,
469 return LLVMGetUndef(LLVMVectorType(LLVMFloatType(), 4));