Commit a9b45efea2ef12d0121f7f78c980f5ca60a60b42

Authored by Pavel Govyadinov
1 parent 7e099e80

changes to spider

Showing 1 changed file with 217 additions and 7 deletions   Show diff stats
gl/gl_spider.h
1 1 #ifndef STIM_GL_SPIDER_H
2 2 #define STIM_GL_SPIDER_H
3 3  
  4 +#include <GL/glew.h>
4 5 #include <GL/glut.h>
5   -//#include <GL/glew.h>
  6 +#include <cuda.h>
  7 +#include <cuda_gl_interop.h>
  8 +#include <cudaGL.h>
6 9 #include "gl_texture.h"
7 10 #include "../visualization/camera.h"
8 11 #include "./error.h"
9 12 #include "../math/vector.h"
10 13 #include "../math/rect.h"
  14 +#include "../cuda/cost.h"
  15 +#include "../cuda/glbind.h"
11 16  
12 17 namespace stim
13 18 {
... ... @@ -25,10 +30,14 @@ class gl_spider : public virtual gl_texture&lt;T&gt;
25 30 stim::vec<float> magnitude; //magnitude of the direction vector.
26 31 //mag[0] = length.
27 32 //mag[1] = width.
28   - // Also maybe we some texture representation of
29   - // of the spider i.e [WH_pxl, BL_pxl, WH_pxl].
30 33 using gl_texture<T>::texID;
31   -
  34 + using image_stack<T>::S;
  35 + cudaArray* c_Array;
  36 + //void** devPtr;
  37 + //size_t size;
  38 + cudaGraphicsResource_t resource;
  39 + GLuint fboID;
  40 + GLuint texbufferID;
32 41  
33 42 void
34 43 findOptimalDirection()
... ... @@ -66,7 +75,7 @@ class gl_spider : public virtual gl_texture&lt;T&gt;
66 75 position can be set with gl_texture coordinates */
67 76  
68 77 }
69   -
  78 +
70 79 void
71 80 Optimize()
72 81 {
... ... @@ -92,7 +101,8 @@ class gl_spider : public virtual gl_texture&lt;T&gt;
92 101 setPosition(0.0,0.0,0.0);
93 102 setDirection(1.0,1.0,1.0);
94 103 setMagnitude(0.1,0.1);
95   - Update();
  104 + //GenerateFBO(400,200);
  105 + //Update();
96 106 }
97 107  
98 108 gl_spider
... ... @@ -101,7 +111,8 @@ class gl_spider : public virtual gl_texture&lt;T&gt;
101 111 position = pos;
102 112 direction = dir;
103 113 magnitude = mag;
104   - Update();
  114 + //GenerateFBO(400,200);
  115 + //Update();
105 116 }
106 117 //temporary cost for convenience.
107 118 gl_spider
... ... @@ -111,6 +122,15 @@ class gl_spider : public virtual gl_texture&lt;T&gt;
111 122 setPosition(pos_x, pos_y, pos_z);
112 123 setDirection(dir_x, dir_y, dir_z);
113 124 setMagnitude(mag_x, mag_y);
  125 + //GenerateFBO(400,200);
  126 + //Update();
  127 + }
  128 +
  129 + void
  130 + attachSpider(GLuint id)
  131 + {
  132 + texID = id;
  133 + GenerateFBO(400,200);
114 134 Update();
115 135 }
116 136  
... ... @@ -124,6 +144,7 @@ class gl_spider : public virtual gl_texture&lt;T&gt;
124 144 ((Y.cross(direction)).cross(direction)).norm());
125 145 ver = stim::rect<float>(magnitude, position, direction.norm(),
126 146 hor.n());
  147 + UpdateBuffer();
127 148 }
128 149  
129 150 vec<float>
... ... @@ -184,6 +205,12 @@ class gl_spider : public virtual gl_texture&lt;T&gt;
184 205 magnitude[0] = x;
185 206 magnitude[1] = y;
186 207 }
  208 +
  209 + GLuint
  210 + getFB()
  211 + {
  212 + return fboID;
  213 + }
187 214  
188 215 void
189 216 Step()
... ... @@ -196,6 +223,189 @@ class gl_spider : public virtual gl_texture&lt;T&gt;
196 223 << std::endl;
197 224  
198 225 }
  226 +
  227 + void
  228 + UpdateBuffer()
  229 + {
  230 + stim::vec<float>p1;
  231 + stim::vec<float>p2;
  232 + stim::vec<float>p3;
  233 + stim::vec<float>p4;
  234 + glBindFramebuffer(GL_FRAMEBUFFER, fboID);
  235 + glFramebufferTexture2D(
  236 + GL_FRAMEBUFFER,
  237 + GL_COLOR_ATTACHMENT0,
  238 + GL_TEXTURE_2D,
  239 + texbufferID,
  240 + 0);
  241 + glBindFramebuffer(GL_FRAMEBUFFER, fboID);
  242 + GLenum DrawBuffers[1] = {GL_COLOR_ATTACHMENT0};
  243 + glDrawBuffers(1, DrawBuffers);
  244 + glBindTexture(GL_TEXTURE_2D, texbufferID);
  245 + glClearColor(0,0,0,0);
  246 + glClear(GL_COLOR_BUFFER_BIT);
  247 + glMatrixMode(GL_PROJECTION);
  248 + glLoadIdentity();
  249 + glMatrixMode(GL_MODELVIEW);
  250 + glLoadIdentity();
  251 + glViewport(0,0,400,200);
  252 + gluOrtho2D(0.0,2.0,0.0,2.0);
  253 + glEnable(GL_TEXTURE_3D);
  254 + glBindTexture(GL_TEXTURE_3D, texID);
  255 + p1 = hor.p(1,1);
  256 + p2 = hor.p(1,0);
  257 + p3 = hor.p(0,0);
  258 + p4 = hor.p(0,1);
  259 + glBegin(GL_QUADS);
  260 + glTexCoord3f(
  261 + p1[0],
  262 + p1[1],
  263 + p1[2]
  264 + );
  265 + glVertex2f(0.0,0.0);
  266 + glTexCoord3f(
  267 + p2[0],
  268 + p2[1],
  269 + p2[2]
  270 + );
  271 + glVertex2f(1.0, 0.0);
  272 + glTexCoord3f(
  273 + p3[0],
  274 + p3[1],
  275 + p3[2]
  276 + );
  277 + glVertex2f(1.0, 2.0);
  278 + glTexCoord3f(
  279 + p4[0],
  280 + p4[1],
  281 + p4[2]
  282 + );
  283 + glVertex2f(0.0, 2.0);
  284 + glEnd();
  285 + p1 = ver.p(1,1);
  286 + p2 = ver.p(1,0);
  287 + p3 = ver.p(0,0);
  288 + p4 = ver.p(0,1);
  289 + glBegin(GL_QUADS);
  290 + glTexCoord3f(
  291 + p1[0],
  292 + p1[1],
  293 + p1[2]
  294 + );
  295 + glVertex2f(1.0, 0.0);
  296 + glTexCoord3f(
  297 + p2[0],
  298 + p2[1],
  299 + p2[2]
  300 + );
  301 + glVertex2f(2.0, 0.0);
  302 + glTexCoord3f(
  303 + p3[0],
  304 + p3[1],
  305 + p3[2]
  306 + );
  307 + glVertex2f(2.0, 2.0);
  308 + glTexCoord3f(
  309 + p4[0],
  310 + p4[1],
  311 + p4[2]
  312 + );
  313 + glVertex2f(1.0, 2.0);
  314 + glEnd();
  315 + glBindTexture(GL_TEXTURE_3D, 0);
  316 + glDisable(GL_TEXTURE_3D);
  317 + glBindFramebuffer(GL_FRAMEBUFFER,0);
  318 + glBindTexture(GL_TEXTURE_2D, 0);
  319 + }
  320 +
  321 +
  322 + void
  323 + GenerateFBO(unsigned int width, unsigned int height)
  324 + {
  325 + glGenFramebuffers(1, &fboID);
  326 + glBindFramebuffer(GL_FRAMEBUFFER, fboID);
  327 + int numChannels = 1;
  328 + unsigned char* texels = new unsigned char[width * height * numChannels];
  329 + glGenTextures(1, &texbufferID);
  330 + glBindTexture(GL_TEXTURE_2D, texbufferID);
  331 + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  332 + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
  333 + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  334 + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  335 + glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE,
  336 + width, height, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, texels);
  337 + delete[] texels;
  338 + glBindFramebuffer(GL_FRAMEBUFFER, 0);
  339 + }
  340 +
  341 +
  342 + void
  343 + initCuda()
  344 + {
  345 + /* cudaDeviceProp prop;
  346 + int device;
  347 + memset( &prop, 0, sizeof(cudaDeviceProp) );
  348 + prop.major = 1;
  349 + prop.minor = 0;
  350 + HANDLE_ERROR( cudaChooseDevice (&device, &prop ) );
  351 + HANDLE_ERROR( cudaGetDeviceProperties(&prop, device));
  352 + printf(" device number: %d\n", device);
  353 + printf(" device name: %s\n", prop.name);
  354 + printf(" device maxTexture3D: %d %d %d\n", prop.maxTexture3D[0] ,prop.maxTexture3D[0], prop.maxTexture3D[2]) ;
  355 + HANDLE_ERROR( cudaGLSetGLDevice (device)); */
  356 + stim::cudaSetDevice();
  357 +/* HANDLE_ERROR(
  358 + cudaGraphicsMapResources(1, &resource, 0)
  359 + );
  360 + HANDLE_ERROR(
  361 + cudaGraphicsResourceGetMappedPointer(
  362 + &devPtr,
  363 + size,
  364 + resource));
  365 + HANDLE_ERROR(
  366 + cudaGraphicsSubResourceGetMappedArray(
  367 + &c_Array,
  368 + resource,
  369 + 0,0)
  370 + );
  371 + HANDLE_ERROR(
  372 + cudaBindTextureToArray(fboID, c_Array)
  373 + );
  374 + HANDLE_ERROR(
  375 + cudaGraphicsUnmapResources(1, &resource, 0)
  376 + );
  377 + //need to move the constants to video memory.
  378 +*/
  379 + }
  380 +
  381 + void
  382 + createResource()
  383 + {
  384 + HANDLE_ERROR(
  385 + cudaGraphicsGLRegisterImage(
  386 + &resource,
  387 + fboID,
  388 + GL_TEXTURE_2D,
  389 + CU_GRAPHICS_REGISTER_FLAGS_NONE)
  390 + );
  391 + }
  392 +
  393 + void
  394 + destroyResource()
  395 + {
  396 + HANDLE_ERROR(
  397 + cudaGraphicsUnregisterResource(resource)
  398 + );
  399 + }
  400 +
  401 + float
  402 + getCost()
  403 + {
  404 + createResource();
  405 + float cost = get_cost(resource);
  406 + destroyResource();
  407 + return cost;
  408 + }
199 409 };
200 410 }
201 411 #endif
... ...