| #ifndef GALLIVM_P_H |
| #define GALLIVM_P_H |
| |
| #ifdef MESA_LLVM |
| |
| #include "gallivm.h" |
| #include "pipe/p_shader_tokens.h" |
| #include "pipe/p_compiler.h" |
| |
| namespace llvm { |
| class Module; |
| } |
| |
| #if defined __cplusplus |
| extern "C" { |
| #endif |
| |
| enum gallivm_shader_type; |
| enum gallivm_vector_layout; |
| |
| struct gallivm_interpolate { |
| int attrib; |
| int chan; |
| int type; |
| }; |
| |
| struct gallivm_ir { |
| llvm::Module *module; |
| int id; |
| enum gallivm_shader_type type; |
| enum gallivm_vector_layout layout; |
| int num_components; |
| int num_consts; |
| |
| /* FIXME: this might not be enough for some shaders */ |
| struct gallivm_interpolate interpolators[32*4]; |
| int num_interp; |
| }; |
| |
| struct gallivm_prog { |
| llvm::Module *module; |
| void *function; |
| |
| int id; |
| enum gallivm_shader_type type; |
| |
| int num_consts; |
| |
| /* FIXME: this might not be enough for some shaders */ |
| struct gallivm_interpolate interpolators[32*4]; |
| int num_interp; |
| }; |
| |
| static INLINE void gallivm_swizzle_components(int swizzle, |
| int *xc, int *yc, |
| int *zc, int *wc) |
| { |
| int x = swizzle / 1000; swizzle -= x * 1000; |
| int y = swizzle / 100; swizzle -= y * 100; |
| int z = swizzle / 10; swizzle -= z * 10; |
| int w = swizzle; |
| |
| if (xc) *xc = x; |
| if (yc) *yc = y; |
| if (zc) *zc = z; |
| if (wc) *wc = w; |
| } |
| |
| static INLINE boolean gallivm_is_swizzle(int swizzle) |
| { |
| const int NO_SWIZZLE = TGSI_SWIZZLE_X * 1000 + TGSI_SWIZZLE_Y * 100 + |
| TGSI_SWIZZLE_Z * 10 + TGSI_SWIZZLE_W; |
| return swizzle != NO_SWIZZLE; |
| } |
| |
| static INLINE int gallivm_x_swizzle(int swizzle) |
| { |
| int x; |
| gallivm_swizzle_components(swizzle, &x, 0, 0, 0); |
| return x; |
| } |
| |
| static INLINE int gallivm_y_swizzle(int swizzle) |
| { |
| int y; |
| gallivm_swizzle_components(swizzle, 0, &y, 0, 0); |
| return y; |
| } |
| |
| static INLINE int gallivm_z_swizzle(int swizzle) |
| { |
| int z; |
| gallivm_swizzle_components(swizzle, 0, 0, &z, 0); |
| return z; |
| } |
| |
| static INLINE int gallivm_w_swizzle(int swizzle) |
| { |
| int w; |
| gallivm_swizzle_components(swizzle, 0, 0, 0, &w); |
| return w; |
| } |
| |
| #if defined __cplusplus |
| } |
| #endif |
| |
| #endif /* MESA_LLVM */ |
| |
| #endif |