Blame view

stim/cuda/cudatools/glbind.h 2.19 KB
7006df5f   David Mayerich   reformat of direc...
1
2
3
4
5
6
7
8
9
  #ifndef RTS_GL_BIND_H
  #define RTS_GL_BIND_H
  
  #include <GL/glew.h>
  #include <GL/gl.h>
  
  #include <stdio.h>
  #include <cstring>
  
32c433c7   Pavel Govyadinov   recovered the maj...
10
  //#include <cudaHandleError.h>
7006df5f   David Mayerich   reformat of direc...
11
  #include "cuda_gl_interop.h"
7d1d153a   Pavel Govyadinov   fixed the include...
12
  #include <stim/gl/error.h>
7006df5f   David Mayerich   reformat of direc...
13
  
32c433c7   Pavel Govyadinov   recovered the maj...
14
15
  namespace stim
  {
7006df5f   David Mayerich   reformat of direc...
16
  
32c433c7   Pavel Govyadinov   recovered the maj...
17
  static void InitGLEW()
7006df5f   David Mayerich   reformat of direc...
18
19
20
21
22
23
24
25
26
27
28
  {
  	//Initialize the GLEW toolkit
  
  	GLenum err = glewInit();
  	if(GLEW_OK != err)
  	{
  		printf("Error starting GLEW.");
  	}
  	fprintf(stdout, "Status: Using GLEW %s\n", glewGetString(GLEW_VERSION));
  }
  
32c433c7   Pavel Govyadinov   recovered the maj...
29
  static void cudaSetDevice(int major = 1, int minor = 3)
7006df5f   David Mayerich   reformat of direc...
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
  {
  	cudaDeviceProp prop;
  	int dev;
  
  	//find a CUDA device that can handle an offscreen buffer
  	int num_gpu;
  	HANDLE_ERROR(cudaGetDeviceCount(&num_gpu));
  	printf("Number of CUDA devices detected: %d\n", num_gpu);
  	memset(&prop, 0, sizeof(cudaDeviceProp));
  	prop.major=major;
  	prop.minor=minor;
  	HANDLE_ERROR(cudaChooseDevice(&dev, &prop));
  	HANDLE_ERROR(cudaGetDeviceProperties(&prop, dev));
  	HANDLE_ERROR(cudaGLSetGLDevice(dev));
  }
  
32c433c7   Pavel Govyadinov   recovered the maj...
46
  static void* cudaMapResource(cudaGraphicsResource* cudaBufferResource)
7006df5f   David Mayerich   reformat of direc...
47
48
49
50
51
52
53
54
  {
  	//this function takes a predefined CUDA resource and maps it to a pointer
  	void* buffer;
  	HANDLE_ERROR(cudaGraphicsMapResources(1, &cudaBufferResource, NULL));
  	size_t size;
  	HANDLE_ERROR(cudaGraphicsResourceGetMappedPointer( (void**)&buffer, &size, cudaBufferResource));
  	return buffer;
  }
32c433c7   Pavel Govyadinov   recovered the maj...
55
  static void cudaUnmapResource(cudaGraphicsResource* resource)
7006df5f   David Mayerich   reformat of direc...
56
57
58
59
60
  {
  	//this function unmaps the CUDA resource so it can be used by OpenGL
  	HANDLE_ERROR(cudaGraphicsUnmapResources(1, &resource, NULL));
  }
  
32c433c7   Pavel Govyadinov   recovered the maj...
61
  static void cudaCreateRenderBuffer(GLuint &glBufferName, cudaGraphicsResource* &cudaBufferResource, int resX, int resY)
7006df5f   David Mayerich   reformat of direc...
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
  {
  	//delete the previous buffer name and resource
  	if(cudaBufferResource != 0)
  		HANDLE_ERROR(cudaGraphicsUnregisterResource(cudaBufferResource));
  	if(glBufferName != 0)
  		glDeleteBuffers(1, &glBufferName);
  
  	//generate an OpenGL offscreen buffer
  	glGenBuffers(1, &glBufferName);
  
  	//bind the buffer - directs all calls to this buffer
  	glBindBuffer(GL_PIXEL_UNPACK_BUFFER, glBufferName);
  	glBufferData(GL_PIXEL_UNPACK_BUFFER, resX * resY * sizeof(uchar3), NULL, GL_DYNAMIC_DRAW_ARB);
  	CHECK_OPENGL_ERROR
  	HANDLE_ERROR(cudaGraphicsGLRegisterBuffer(&cudaBufferResource, glBufferName, cudaGraphicsMapFlagsNone));
  }
32c433c7   Pavel Govyadinov   recovered the maj...
78
  }
7006df5f   David Mayerich   reformat of direc...
79
  #endif