clray

annotate src/rt.cc @ 7:575383f3a239

foo
author John Tsiombikas <nuclear@member.fsf.org>
date Fri, 23 Jul 2010 01:22:03 +0100
parents 9f0ddb701882
children deaf85acf6af
rev   line source
nuclear@0 1 #include <stdio.h>
nuclear@2 2 #include <math.h>
nuclear@0 3 #include <assert.h>
nuclear@0 4 #include "ocl.h"
nuclear@0 5
nuclear@2 6 struct RendInfo {
nuclear@2 7 int xsz, ysz;
nuclear@3 8 int num_sph, num_lights;
nuclear@2 9 int max_iter;
nuclear@2 10 } __attribute__((packed));
nuclear@2 11
nuclear@1 12 struct Sphere {
nuclear@1 13 cl_float4 pos;
nuclear@5 14 cl_float4 kd, ks;
nuclear@1 15 cl_float radius;
nuclear@4 16 cl_float spow;
nuclear@4 17 cl_float kr, kt;
nuclear@1 18 } __attribute__((packed));
nuclear@1 19
nuclear@1 20 struct Ray {
nuclear@1 21 cl_float4 origin, dir;
nuclear@1 22 } __attribute__((packed));
nuclear@1 23
nuclear@3 24 struct Light {
nuclear@3 25 cl_float4 pos, color;
nuclear@3 26 } __attribute__((packed));
nuclear@1 27
nuclear@7 28 struct Matrix4x4 {
nuclear@7 29 cl_float m[16];
nuclear@7 30 };
nuclear@2 31
nuclear@3 32 static Ray get_primary_ray(int x, int y, int w, int h, float vfov_deg);
nuclear@3 33
nuclear@3 34 static Ray *prim_rays;
nuclear@3 35 static CLProgram *prog;
nuclear@3 36 static int global_size;
nuclear@3 37
nuclear@4 38 static Sphere sphlist[] = {
nuclear@5 39 {{0, 0, 8, 1}, {0.7, 0.2, 0.15, 1}, {1, 1, 1, 1}, 1.0, 60, 0, 0},
nuclear@5 40 {{-0.2, 0.4, 5, 1}, {0.2, 0.9, 0.3, 1}, {1, 1, 1, 1}, 0.25, 40, 0, 0}
nuclear@4 41 };
nuclear@4 42
nuclear@4 43 static Light lightlist[] = {
nuclear@4 44 {{-10, 10, -20, 1}, {1, 1, 1, 1}}
nuclear@4 45 };
nuclear@4 46
nuclear@7 47 static Matrix4x4 xform = {
nuclear@7 48 {1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1}
nuclear@7 49 };
nuclear@7 50
nuclear@4 51 static RendInfo rinf;
nuclear@4 52
nuclear@4 53
nuclear@3 54 bool init_renderer(int xsz, int ysz, float *fb)
nuclear@0 55 {
nuclear@4 56 // render info
nuclear@4 57 rinf.xsz = xsz;
nuclear@4 58 rinf.ysz = ysz;
nuclear@4 59 rinf.num_sph = sizeof sphlist / sizeof *sphlist;
nuclear@4 60 rinf.num_lights = sizeof lightlist / sizeof *lightlist;
nuclear@4 61 rinf.max_iter = 6;
nuclear@4 62
nuclear@3 63 /* calculate primary rays */
nuclear@3 64 prim_rays = new Ray[xsz * ysz];
nuclear@2 65
nuclear@2 66 for(int i=0; i<ysz; i++) {
nuclear@2 67 for(int j=0; j<xsz; j++) {
nuclear@2 68 prim_rays[i * xsz + j] = get_primary_ray(j, i, xsz, ysz, 45.0);
nuclear@2 69 }
nuclear@0 70 }
nuclear@0 71
nuclear@2 72 /* setup opencl */
nuclear@3 73 prog = new CLProgram("render");
nuclear@3 74 if(!prog->load("rt.cl")) {
nuclear@0 75 return 1;
nuclear@0 76 }
nuclear@0 77
nuclear@3 78 /* setup argument buffers */
nuclear@3 79 prog->set_arg_buffer(0, ARG_WR, xsz * ysz * 4 * sizeof(float), fb);
nuclear@3 80 prog->set_arg_buffer(1, ARG_RD, sizeof rinf, &rinf);
nuclear@3 81 prog->set_arg_buffer(2, ARG_RD, sizeof sphlist, sphlist);
nuclear@3 82 prog->set_arg_buffer(3, ARG_RD, sizeof lightlist, lightlist);
nuclear@3 83 prog->set_arg_buffer(4, ARG_RD, xsz * ysz * sizeof *prim_rays, prim_rays);
nuclear@7 84 prog->set_arg_buffer(5, ARG_RD, sizeof xform, &xform);
nuclear@2 85
nuclear@3 86 global_size = xsz * ysz;
nuclear@3 87 return true;
nuclear@3 88 }
nuclear@3 89
nuclear@3 90 void destroy_renderer()
nuclear@3 91 {
nuclear@3 92 delete [] prim_rays;
nuclear@3 93 delete prog;
nuclear@3 94 }
nuclear@3 95
nuclear@3 96 bool render()
nuclear@3 97 {
nuclear@3 98 if(!prog->run(1, global_size)) {
nuclear@3 99 return false;
nuclear@0 100 }
nuclear@0 101
nuclear@3 102 CLMemBuffer *mbuf = prog->get_arg_buffer(0);
nuclear@0 103 map_mem_buffer(mbuf, MAP_RD);
nuclear@3 104 /*if(!write_ppm("out.ppm", fb, xsz, ysz)) {
nuclear@2 105 return 1;
nuclear@3 106 }*/
nuclear@2 107 unmap_mem_buffer(mbuf);
nuclear@3 108 return true;
nuclear@0 109 }
nuclear@2 110
nuclear@3 111 static Ray get_primary_ray(int x, int y, int w, int h, float vfov_deg)
nuclear@2 112 {
nuclear@2 113 float vfov = M_PI * vfov_deg / 180.0;
nuclear@2 114 float aspect = (float)w / (float)h;
nuclear@2 115
nuclear@2 116 float ysz = 2.0;
nuclear@2 117 float xsz = aspect * ysz;
nuclear@2 118
nuclear@2 119 float px = ((float)x / (float)w) * xsz - xsz / 2.0;
nuclear@2 120 float py = 1.0 - ((float)y / (float)h) * ysz;
nuclear@2 121 float pz = 1.0 / tan(0.5 * vfov);
nuclear@2 122
nuclear@4 123 px *= 100.0;
nuclear@4 124 py *= 100.0;
nuclear@4 125 pz *= 100.0;
nuclear@2 126
nuclear@2 127 Ray ray = {{0, 0, 0, 1}, {px, py, pz, 1}};
nuclear@2 128 return ray;
nuclear@2 129 }