Medical Imaging Interaction Toolkit  2016.11.0
Medical Imaging Interaction Toolkit
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
mitkGPGPU.cpp
Go to the documentation of this file.
1 /*===================================================================
2 
3 The Medical Imaging Interaction Toolkit (MITK)
4 
5 Copyright (c) German Cancer Research Center,
6 Division of Medical and Biological Informatics.
7 All rights reserved.
8 
9 This software is distributed WITHOUT ANY WARRANTY; without
10 even the implied warranty of MERCHANTABILITY or FITNESS FOR
11 A PARTICULAR PURPOSE.
12 
13 See LICENSE.txt or http://www.mitk.org for details.
14 
15 ===================================================================*/
16 
17 // Qt includes need to be placed before class header include, due to defines
18 #include <QApplication>
19 #include <QWidget>
20 
21 #include "mitkGPGPU.h"
22 
23 #include <iostream>
24 
25 #define GPGPU_INFO MITK_INFO("mitk.gpgpu")
26 #define GPGPU_ERROR MITK_ERROR("mitk.gpgpu")
27 #define GPGPU_CHECKGLERR MITK_ERROR(glGetError() != GL_NO_ERROR)("mitk.gpgpu") << "GL ERROR @ "
28 
29 #define OPERATING_TEXTURE GL_TEXTURE15
30 
32 {
33  switch (format)
34  {
36  return GL_LUMINANCE_FLOAT32_ATI;
38  return GL_LUMINANCE_ALPHA_FLOAT32_ATI;
40  return GL_RGBA32F_ARB;
42  return GL_RGBA8;
43  }
44  return 0;
45 }
46 
48 {
49  switch (format)
50  {
52  return GL_LUMINANCE;
54  return GL_LUMINANCE_ALPHA;
56  return GL_RGBA;
58  return GL_RGBA;
59  }
60  return 0;
61 }
62 
64 {
65  switch (format)
66  {
68  return GL_FLOAT;
70  return GL_FLOAT;
72  return GL_FLOAT;
74  return GL_UNSIGNED_BYTE;
75  }
76  return 0;
77 }
78 
80 {
81  return myWidth;
82 }
84 {
85  return myHeight;
86 }
88 {
89  return myDepth;
90 }
91 
92 mitk::GPGPU::Texture::Texture(mitk::GPGPU::TextureFormat format, int width, int height, int depth)
93 {
94  if (depth == 0)
95  glTarget = GL_TEXTURE_2D;
96  else
97  glTarget = GL_TEXTURE_3D;
98 
99  myFormat = format;
100  myWidth = width;
101  myHeight = height;
102  myDepth = depth;
103 
104  GLuint handle;
105 
106  glGenTextures(1, &handle);
107  glTextureHandle = handle;
108  glActiveTexture(OPERATING_TEXTURE);
109  glBindTexture(glTarget, glTextureHandle);
110 
111  GPGPU_CHECKGLERR << "allocating texture handle";
112 
113  if (glTarget == GL_TEXTURE_2D)
114  {
115  glTexImage2D(GL_TEXTURE_2D,
116  0,
118  width,
119  height,
120  0,
121  GL_RGBA,
122  GL_UNSIGNED_BYTE,
123  nullptr);
124  // glGenerateMipmap(GL_TEXTURE_2D);
125 
126  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
127  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
128 
129  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
130  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
131  }
132  else
133  {
134  glTexImage3D(GL_TEXTURE_3D,
135  0,
137  width,
138  height,
139  depth,
140  0,
141  GL_RGBA,
142  GL_UNSIGNED_BYTE,
143  nullptr);
144  // glGenerateMipmap(GL_TEXTURE_3D);
145 
146  glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
147  glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
148  glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
149 
150  glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
151  glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
152  }
153 
154  GPGPU_CHECKGLERR << "declaring texture format&dimensions";
155 
156  glGenFramebuffers(1, &handle);
157  glFBOHandle = handle;
158 
159  GPGPU_CHECKGLERR << "allocating framebuffer object";
160 }
161 
163 {
164  GLuint handle;
165 
166  handle = glFBOHandle;
167  glDeleteFramebuffers(1, &handle);
168  GPGPU_CHECKGLERR << "deleting framebufferobject";
169 
170  handle = glTextureHandle;
171  glDeleteTextures(1, &handle);
172  GPGPU_CHECKGLERR << "deleting texture handle";
173 }
174 
176 {
177  glActiveTexture(GL_TEXTURE0 + unit);
178  glBindTexture(glTarget, glTextureHandle);
179 
180  GPGPU_CHECKGLERR << "binding texture to unit";
181 }
182 
184 {
185  static GLenum buffers[5][4] = {
186  {GL_NONE, GL_NONE, GL_NONE, GL_NONE},
187  {GL_COLOR_ATTACHMENT0, GL_NONE, GL_NONE, GL_NONE},
188  {GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_NONE, GL_NONE},
189  {GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2, GL_NONE},
190  {GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2, GL_COLOR_ATTACHMENT3},
191  };
192 
193  glBindFramebuffer(GL_FRAMEBUFFER, glFBOHandle);
194  glDrawBuffers(4, buffers[1]);
195  glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, glTarget, glTextureHandle, 0);
196 
197  GPGPU_CHECKGLERR << "associating texture to framebufferobject";
198 
199  int error = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
200  switch (error)
201  {
202  case GL_FRAMEBUFFER_COMPLETE_EXT:
203  break;
204  case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT:
205  GPGPU_ERROR << "Incomplete attachment\n";
206  break;
207  case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT:
208  GPGPU_ERROR << "Missing attachment\n";
209  break;
210  case GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT:
211  GPGPU_ERROR << "Incomplete dimensions\n";
212  break;
213  case GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT:
214  GPGPU_ERROR << "Incomplete formats\n";
215  break;
216  case GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT:
217  GPGPU_ERROR << "Incomplete draw buffer\n";
218  break;
219  case GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT:
220  GPGPU_ERROR << "Incomplete read buffer\n";
221  break;
222  case GL_FRAMEBUFFER_UNSUPPORTED_EXT:
223  GPGPU_ERROR << "Framebufferobjects unsupported\n";
224  break;
225  default:
226  GPGPU_ERROR << "unknown framebuffer status\n";
227  break;
228  }
229 
230  glViewport(0, 0, myWidth, myHeight);
231 
232  GPGPU_CHECKGLERR << "setting viewport";
233 }
234 
235 void mitk::GPGPU::Texture::Upload(TextureFormat inputformat, const void *src)
236 {
237  glActiveTexture(OPERATING_TEXTURE);
238  glBindTexture(glTarget, glTextureHandle);
239 
240  if (glTarget == GL_TEXTURE_2D)
241  {
242  glTexSubImage2D(GL_TEXTURE_2D,
243  0,
244  0,
245  0,
246  myWidth,
247  myHeight,
248  convertTextureFormatToFormatGL(inputformat),
249  convertTextureFormatToTypeGL(inputformat),
250  src);
251  }
252  else
253  {
254  glTexSubImage3D(GL_TEXTURE_3D,
255  0,
256  0,
257  0,
258  0,
259  myWidth,
260  myHeight,
261  myDepth,
262  convertTextureFormatToFormatGL(inputformat),
263  convertTextureFormatToTypeGL(inputformat),
264  src);
265  }
266 
267  GPGPU_CHECKGLERR << "texture upload to gpu";
268 }
269 
270 void mitk::GPGPU::Texture::Download(TextureFormat inputformat, void *dst)
271 {
272  glActiveTexture(OPERATING_TEXTURE);
273  glBindTexture(glTarget, glTextureHandle);
274 
275  if (glTarget == GL_TEXTURE_2D)
276  {
277  glGetTexImage(
278  GL_TEXTURE_2D, 0, convertTextureFormatToFormatGL(inputformat), convertTextureFormatToTypeGL(inputformat), dst);
279  GPGPU_CHECKGLERR << "texture download to cpu";
280  }
281  else
282  {
283  }
284 }
285 
286 static char stubVertexShader[] = "void main() { gl_Position = vec4( 2*gl_Vertex.xy-1,0,1 ); }\n";
287 
289 {
290  // std::cout << "compiling shader:\n" << source << std::endl;
291 
292  glHandleVertex = glCreateShader(GL_VERTEX_SHADER);
293  glHandleFragment = glCreateShader(GL_FRAGMENT_SHADER);
294  glHandleProgram = glCreateProgram();
295 
296  GLchar *src[2];
297 
298  src[0] = stubVertexShader;
299  src[1] = nullptr;
300 
301  glShaderSource(glHandleVertex, 1, (const GLchar **)src, nullptr);
302 
303  src[0] = source;
304  src[1] = nullptr;
305 
306  glShaderSource(glHandleFragment, 1, (const GLchar **)src, nullptr);
307 
308  bool failed = false;
309 
310  GLint _sv, _sf, _sl;
311 
312  glCompileShader(glHandleVertex);
313  GPGPU_CHECKGLERR << "compiling vertex shader";
314  glGetShaderiv(glHandleVertex, GL_COMPILE_STATUS, &_sv);
315  if (!_sv)
316  {
317  GPGPU_ERROR << "vertex shader compilation failed\n";
318  failed = true;
319  }
320 
321  glCompileShader(glHandleFragment);
322  GPGPU_CHECKGLERR << "compiling fragment shader";
323  glGetShaderiv(glHandleFragment, GL_COMPILE_STATUS, &_sf);
324  if (!_sf)
325  {
326  GPGPU_ERROR << "fragment shader compilation failed\n";
327  failed = true;
328  }
329 
330  glAttachShader(glHandleProgram, glHandleVertex);
331  glAttachShader(glHandleProgram, glHandleFragment);
332  glLinkProgram(glHandleProgram);
333  GPGPU_CHECKGLERR << "linking shader program";
334  glGetProgramiv(glHandleProgram, GL_LINK_STATUS, &_sl);
335  if (!_sl)
336  {
337  GPGPU_ERROR << "shader linkage failed\n";
338  failed = true;
339  }
340 
341  if (failed)
342  {
343  int infologLength = 0;
344  int charsWritten = 0;
345  char *infoLog;
346 
347  glGetProgramiv(glHandleProgram, GL_INFO_LOG_LENGTH, &infologLength);
348 
349  if (infologLength > 0)
350  {
351  infoLog = (char *)malloc(infologLength);
352  glGetProgramInfoLog(glHandleProgram, infologLength, &charsWritten, infoLog);
353  GPGPU_ERROR << "SHADER CREATION FAILED INFOLOG:\n" << infoLog;
354  free(infoLog);
355  }
356  }
357 }
358 
360 {
361  glDeleteProgram(glHandleProgram);
362  glDeleteShader(glHandleVertex);
363  glDeleteShader(glHandleFragment);
364 }
365 
367 {
368  glUseProgram(glHandleProgram);
369  GPGPU_CHECKGLERR << "activating shader";
370 }
371 
372 int mitk::GPGPU::Shader::GetUniformLocation(char *name)
373 {
374  return glGetUniformLocation(glHandleProgram, name);
375 }
376 
377 void mitk::GPGPU::Shader::SetUniform(char *name, int i0)
378 {
379  glUniform1i(GetUniformLocation(name), i0);
380 
381  GPGPU_CHECKGLERR << "setting uniform";
382 }
383 
384 void mitk::GPGPU::Shader::SetUniform(char *name, int i0, int i1)
385 {
386  GLint i[2];
387  i[0] = i0;
388  i[1] = i1;
389  glUniform2iv(GetUniformLocation(name), 1, i);
390  GPGPU_CHECKGLERR << "setting uniform";
391 }
392 
393 void mitk::GPGPU::Shader::SetUniform(char *name, int i0, int i1, int i2)
394 {
395  GLint i[3];
396  i[0] = i0;
397  i[1] = i1;
398  i[2] = i2;
399  glUniform3iv(GetUniformLocation(name), 1, i);
400  GPGPU_CHECKGLERR << "setting uniform";
401 }
402 
403 void mitk::GPGPU::Shader::SetUniform(char *name, int i0, int i1, int i2, int i3)
404 {
405  GLint i[4];
406  i[0] = i0;
407  i[1] = i1;
408  i[2] = i2;
409  i[3] = i3;
410  glUniform4iv(GetUniformLocation(name), 1, i);
411  GPGPU_CHECKGLERR << "setting uniform";
412 }
413 
414 void mitk::GPGPU::Shader::SetUniform(char *name, float i0)
415 {
416  GLint location = GetUniformLocation(name);
417  glUniform1f(location, i0);
418  GPGPU_CHECKGLERR << "setting uniform";
419 }
420 
421 void mitk::GPGPU::Shader::SetUniform(char *name, float i0, float i1)
422 {
423  GLfloat i[2];
424  i[0] = i0;
425  i[1] = i1;
426  glUniform2fv(GetUniformLocation(name), 1, i);
427  GPGPU_CHECKGLERR << "setting uniform";
428 }
429 
430 void mitk::GPGPU::Shader::SetUniform(char *name, float i0, float i1, float i2)
431 {
432  GLfloat i[3];
433  i[0] = i0;
434  i[1] = i1;
435  i[2] = i2;
436  glUniform3fv(GetUniformLocation(name), 1, i);
437  GPGPU_CHECKGLERR << "setting uniform";
438 }
439 
440 void mitk::GPGPU::Shader::SetUniform(char *name, float i0, float i1, float i2, float i3)
441 {
442  GLfloat i[4];
443  i[0] = i0;
444  i[1] = i1;
445  i[2] = i2;
446  i[3] = i3;
447  glUniform4fv(GetUniformLocation(name), 1, i);
448  GPGPU_CHECKGLERR << "setting uniform";
449 }
450 
451 #ifdef _WIN32
452 LRESULT CALLBACK MainWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
453 {
454  switch (msg)
455  {
456  case WM_CLOSE:
457  DestroyWindow(hwnd);
458  break;
459  case WM_DESTROY:
460  PostQuitMessage(0);
461  break;
462  default:
463  return DefWindowProc(hwnd, msg, wParam, lParam);
464  }
465  return 0;
466 }
467 #endif
468 
470 {
471 #ifdef _WIN32
472  /*
473 WNDCLASSEX wcx;
474 
475 // Fill in the window class structure with parameters
476 // that describe the main window.
477 
478 wcx.cbSize = sizeof(wcx); // size of structure
479 wcx.style = CS_HREDRAW |
480 CS_VREDRAW; // redraw if size changes
481 wcx.lpfnWndProc = MainWndProc; // points to window procedure
482 wcx.cbClsExtra = 0; // no extra class memory
483 wcx.cbWndExtra = 0; // no extra window memory
484 wcx.hInstance = GetModuleHandle(NULL); // handle to inst ance
485 wcx.hIcon = LoadIcon(NULL,
486 IDI_APPLICATION); // predefined app. icon
487 wcx.hCursor = LoadCursor(NULL,
488 IDC_ARROW); // predefined arrow
489 wcx.hbrBackground = NULL; // white background brush
490 wcx.lpszMenuName = (LPCSTR) "MainMenu"; // name of menu resource
491 wcx.lpszClassName = (LPCSTR) "MainWClass"; // name of window class
492 wcx.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
493 
494 // Register the window class.
495 
496 if(!RegisterClassEx(&wcx))
497 std::cout << "failed registering window class\n";
498 
499 HWND desktopWindow=CreateWindowEx(
500 WS_EX_CLIENTEDGE,
501 (LPCSTR)"MainWClass",
502 (LPCSTR)"Anatomy of a Window",
503 WS_OVERLAPPEDWINDOW,
504 CW_USEDEFAULT, CW_USEDEFAULT, 240, 120,
505 NULL,
506 NULL,
507 GetModuleHandle(NULL),
508 NULL);
509 windowHandle = desktopWindow;
510 ShowWindow(desktopWindow, SW_RESTORE);
511 
512 if(desktopWindow==0)
513 std::cout << "failed creating window\n";
514  */
515 
516  HWND desktopWindow = (HWND)QApplication::topLevelWidgets().at(0)->winId();
517 
518  windowsContext = GetDC(desktopWindow);
519 
520  if (windowsContext == 0)
521  std::cout << "failed getting window device context\n";
522 
523  static PIXELFORMATDESCRIPTOR pfd = // pfd Tells Windows How We Want Things To Be
524  {
525  sizeof(PIXELFORMATDESCRIPTOR), // Size Of This Pixel Format Descriptor
526  1, // Version Number
527  PFD_DRAW_TO_WINDOW | // Format Must Support Window
528  PFD_SUPPORT_OPENGL | // Format Must Support OpenGL
529  PFD_DOUBLEBUFFER |
530  PFD_SWAP_EXCHANGE, // Must Support Double Buffering
531  PFD_TYPE_RGBA, // Request An RGBA Format
532  24, // Select Our Color Depth
533  0,
534  0,
535  0,
536  0,
537  0,
538  0, // Color Bits Ignored if(openGLContext==0)
539  0, // No Alpha Buffer
540  0, // Shift Bit Ignored
541  0, // No Accumulation Buffer
542  0,
543  0,
544  0,
545  0, // Accumulation Bits Ignored
546  0, // 16Bit Z-Buffer (Depth Buffer)
547  0, // No Stencil Buffer
548  0, // No Auxiliary Buffer
549  PFD_MAIN_PLANE, // Main Drawing Layer
550  0, // Reserved
551  0,
552  0,
553  0 // Layer Masks Ignored
554  };
555 
556  // Sonstiges einstellen
557  int iFormat = ChoosePixelFormat(windowsContext, &pfd);
558  SetPixelFormat(windowsContext, iFormat, &pfd);
559 
560  openGLContext = wglCreateContext(windowsContext);
561 
562  int errw = GetLastError();
563 
564  if (openGLContext == 0)
565  std::cout << "failed creating openGL context " << errw << "\n";
566 
567 #else
568 
569  X_display = XOpenDisplay(nullptr);
570 
571  GPGPU_ERROR(!X_display) << "cant open X display";
572 
573  GLX_drawable = QApplication::topLevelWidgets().at(0)->winId();
574 
575  GPGPU_ERROR(!GLX_drawable) << "cant get toplevel widget from QT";
576 
577  static int visAttributes[] = {GLX_RGBA, GLX_RED_SIZE, 1, GLX_GREEN_SIZE, 1, GLX_BLUE_SIZE, 1, GLX_DOUBLEBUFFER, None};
578 
579  XVisualInfo *visinfo = glXChooseVisual(X_display, 0, visAttributes);
580 
581  GPGPU_ERROR(!visinfo) << "Unable to choose specified visual!";
582 
583  openGLContext = glXCreateContext(X_display, visinfo, nullptr, true);
584 
585  if (visinfo)
586  XFree(visinfo);
587 
588  GPGPU_ERROR(!openGLContext) << "cant create GLX context";
589 
590 #endif
591 
592  Activate();
593 
594  GPGPU_INFO << "initializing glew";
595 
596  int err = glewInit();
597 
598  GPGPU_CHECKGLERR << "initializing glew";
599  GPGPU_ERROR(GLEW_OK != err) << "glewInit() fails with " << err << " as text: " << glewGetErrorString(err);
600 
601  glMatrixMode(GL_PROJECTION);
602  glLoadIdentity();
603  glOrtho(0, 1, 0, 1, -1, 1);
604  glMatrixMode(GL_MODELVIEW);
605  glLoadIdentity();
606 
607  GPGPU_CHECKGLERR << "intializing projection&modelview matrix";
608 
609  glDisable(GL_CULL_FACE);
610  glShadeModel(GL_SMOOTH); // Enable Smooth Shading
611  glClearColor(0.0f, 0.0f, 0.0f, 0.0f); // Black Background
612  glClearDepth(1.0f); // Depth Buffer Setup
613  glDisable(GL_DEPTH_TEST); // Enables Depth Testing
614  glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Really Nice Perspective Calculations
615  glHint(GL_TEXTURE_COMPRESSION_HINT, GL_NICEST);
616  glDepthMask(false);
617 
618  GPGPU_CHECKGLERR << "setting up openGL context";
619 }
620 
622 {
623 #ifdef _WIN32
624 
625  wglDeleteContext(openGLContext);
626 
627 #else
628 
629  if (openGLContext)
630  glXDestroyContext(X_display, openGLContext);
631 
632  if (X_display)
633  XCloseDisplay(X_display);
634 
635 #endif
636 }
637 
639 {
640 #ifdef _WIN32
641  wglMakeCurrent(windowsContext, openGLContext);
642 #else
643  glXMakeCurrent(X_display, GLX_drawable, openGLContext);
644 #endif
645 
646  GPGPU_CHECKGLERR << "activating openGL context";
647 }
648 
650 {
651 }
652 
654 {
655  glBegin(GL_TRIANGLE_STRIP);
656  glVertex2f(0, 0);
657  glVertex2f(0, 1);
658  glVertex2f(1, 0);
659  glVertex2f(1, 1);
660  glEnd();
661 
662  GPGPU_CHECKGLERR << "running a shader";
663 }
664 
665 void mitk::GPGPU::Run(float start, float end)
666 {
667  glBegin(GL_TRIANGLE_STRIP);
668  glVertex2f(0, start);
669  glVertex2f(0, end);
670  glVertex2f(1, start);
671  glVertex2f(1, end);
672  glEnd();
673 
674  GPGPU_CHECKGLERR << "running a shader";
675 }
static char stubVertexShader[]
Definition: mitkGPGPU.cpp:286
void Upload(mitk::GPGPU::TextureFormat inputformat, const void *src)
Definition: mitkGPGPU.cpp:235
#define GPGPU_CHECKGLERR
Definition: mitkGPGPU.cpp:27
void Activate()
Definition: mitkGPGPU.cpp:638
void Deactivate()
Definition: mitkGPGPU.cpp:649
static GLint convertTextureFormatToTypeGL(mitk::GPGPU::TextureFormat format)
Definition: mitkGPGPU.cpp:63
Texture(mitk::GPGPU::TextureFormat format, int width, int height, int depth=0)
Definition: mitkGPGPU.cpp:92
void SetUniform(char *name, int i0)
Definition: mitkGPGPU.cpp:377
static GLint convertTextureFormatToInternalFormatGL(mitk::GPGPU::TextureFormat format)
Definition: mitkGPGPU.cpp:31
Shader(char *source)
Definition: mitkGPGPU.cpp:288
void Download(mitk::GPGPU::TextureFormat inputformat, void *dst)
Definition: mitkGPGPU.cpp:270
static GLint convertTextureFormatToFormatGL(mitk::GPGPU::TextureFormat format)
Definition: mitkGPGPU.cpp:47
#define OPERATING_TEXTURE
Definition: mitkGPGPU.cpp:29
void ActivateAsSource(int unit)
Definition: mitkGPGPU.cpp:175
#define GPGPU_INFO
Definition: mitkGPGPU.cpp:25
void ActivateAsDestination()
Definition: mitkGPGPU.cpp:183
void Run()
Definition: mitkGPGPU.cpp:653
#define GPGPU_ERROR
Definition: mitkGPGPU.cpp:26