Medical Imaging Interaction Toolkit  2016.11.0
Medical Imaging Interaction Toolkit
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