Blame view

cuda/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>
  
a17a1d23   Pavel Govyadinov   fixed more stuff,...
10
  //#include <cudaHandleError.h>
7006df5f   David Mayerich   reformat of direc...
11
  #include "cuda_gl_interop.h"
a17a1d23   Pavel Govyadinov   fixed more stuff,...
12
  #include "../gl/error.h"
7006df5f   David Mayerich   reformat of direc...
13
  
a17a1d23   Pavel Govyadinov   fixed more stuff,...
14
15
  namespace stim
  {
7006df5f   David Mayerich   reformat of direc...
16
  
a17a1d23   Pavel Govyadinov   fixed more stuff,...
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));
  }
  
a17a1d23   Pavel Govyadinov   fixed more stuff,...
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));
  }
  
a17a1d23   Pavel Govyadinov   fixed more stuff,...
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;
  }
a17a1d23   Pavel Govyadinov   fixed more stuff,...
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));
  }
  
a17a1d23   Pavel Govyadinov   fixed more stuff,...
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));
  }
a17a1d23   Pavel Govyadinov   fixed more stuff,...
78
  }
7006df5f   David Mayerich   reformat of direc...
79
  #endif