unsigned instno = 0;
Function* shader = mod->getFunction("execute_shader");
std::ostringstream stream;
- stream << "execute_shader";
+ if (prog->type == GALLIVM_VS) {
+ stream << "vs_shader";
+ } else {
+ stream << "fs_shader";
+ }
stream << prog->id;
std::string func_name = stream.str();
shader->setName(func_name.c_str());
struct gallivm_prog *gallivm =
(struct gallivm_prog *)calloc(1, sizeof(struct gallivm_prog));
gallivm->id = GLOBAL_ID;
+ gallivm->type = type;
tgsi_dump(tokens, 0);
llvm::Module *mod = tgsi_to_llvm(gallivm, tokens);
passes.run(*mod);
gallivm->module = mod;
- gallivm->type = type;
gallivm_prog_dump(gallivm, 0);
const llvm::Function &func = (*itr);
std::string name = func.getName();
const llvm::Function *found = 0;
- if (name.find("execute_shader") != std::string::npos ||
+ if (name.find("vs_shader") != std::string::npos ||
+ name.find("fs_shader") != std::string::npos ||
name.find("function") != std::string::npos)
found = &func;
if (found) {
/* clang --emit-llvm llvm_builtins.c |llvm-as |opt -std-compile-opts |llvm-dis */
typedef __attribute__(( ocu_vector_type(4) )) float float4;
-#if 0
-//clang doesn't suppoer "struct->member" notation yet
-struct vertex_header {
- unsigned clipmask:12;
- unsigned edgeflag:1;
- unsigned pad:3;
- unsigned vertex_id:16;
-
- float clip[4];
-
- float data[][4];
-};
-
-inline float
-dot4(float4 a, float4 b)
-{
- float4 c = a*b;
- return c.x + c.y + c.z + c.w;
-}
-
-inline unsigned
-compute_clipmask(float4 clip, float4 (*plane), unsigned nr)
-{
- unsigned mask = 0;
- unsigned i;
-
- for (i = 0; i < nr; i++) {
- if (dot4(clip, plane[i]) < 0)
- mask |= (1<<i);
- }
-
- return mask;
-}
-
-
-inline void collect_results(float4 *results, struct vertex_header *vOut,
- float4 *planes, int nr_planes,
- float4 scale, float4 trans,
- int num_attribs)
-{
- /* store results */
- unsigned slot;
- float x, y, z, w;
- /* Handle attr[0] (position) specially:
- */
- float4 res0 = results[0];
- float *clip = vOut->clip;
- x = clip[0] = res0.x;
- y = clip[1] = res0.y;
- z = clip[2] = res0.z;
- w = clip[3] = res0.w;
- vOut->clipmask = compute_clipmask(res0, planes, nr_planes);
- vOut->edgeflag = 1;
-
- /* divide by w */
- w = 1.0f / w;
- x *= w;
- y *= w;
- z *= w;
- res0.x = x; res0.y = y; res0.z = z; res0.w = 1;
-
- /* Viewport mapping */
- res0 = res0 * scale + trans;
- vOut->data[0][0] = res0.x;
- vOut->data[0][1] = res0.y;
- vOut->data[0][2] = res0.z;
- vOut->data[0][3] = w;
-
- /* Remaining attributes are packed into sequential post-transform
- * vertex attrib slots.
- * Skip 0 since we just did it above.
- * Subtract two because of the VERTEX_HEADER, CLIP_POS attribs.
- */
- for (slot = 1; slot < num_attribs - 2; slot++) {
- float4 vec = results[slot];
- vOut->data[slot][0] = vec.x;
- vOut->data[slot][1] = vec.y;
- vOut->data[slot][2] = vec.z;
- vOut->data[slot][3] = vec.w;
-
- printf("output %d: %f %f %f %f\n", slot,
- vOut->data[slot][0],
- vOut->data[slot][1],
- vOut->data[slot][2],
- vOut->data[slot][3]);
- }
-}
-#endif
-
void from_array(float4 (*res)[16], float (*ainputs)[16][4],
int count, int num_attribs)
{