// This is where we create the OpenGL PBOs, FBOs, and texture resources void initGLResources() { // create pixel buffer object glGenBuffersARB(1, &pbo); glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, pbo); glBufferDataARB(GL_PIXEL_UNPACK_BUFFER_ARB, width*height*sizeof(GLubyte)*4, h_img, GL_STREAM_DRAW_ARB); glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, 0); // DEPRECATED: cutilSafeCall(cudaGLRegisterBufferObject(pbo)); cutilSafeCall(cudaGraphicsGLRegisterBuffer(&cuda_pbo_resource, pbo, cudaGraphicsMapFlagsWriteDiscard)); // create texture for display glGenTextures(1, &texid); glBindTexture(GL_TEXTURE_2D, texid); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glBindTexture(GL_TEXTURE_2D, 0); // load shader program shader = compileASMShader(GL_FRAGMENT_PROGRAM_ARB, shader_code); if (g_FrameBufferObject) { delete g_FrameBufferObject; g_FrameBufferObject = NULL; } if (g_bFBODisplay) { g_FrameBufferObject = new CFrameBufferObject(width, height, 32, true, GL_TEXTURE_2D); } }
//////////////////////////////////////////////////////////////////////////////// //! Initialize OpenGL //////////////////////////////////////////////////////////////////////////////// CUTBoolean initGL(int *argc, char **argv) { // Create GL context glutInit(argc, argv); glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH); glutInitWindowSize(window_width, window_height); glutCreateWindow("CUDA Marching Cubes"); // initialize necessary OpenGL extensions glewInit(); if (! glewIsSupported("GL_VERSION_2_0 " )) { fprintf(stderr, "ERROR: Support for necessary OpenGL extensions missing."); fflush(stderr); return CUTFalse; } // default initialization glClearColor(0.1, 0.2, 0.3, 1.0); glEnable(GL_DEPTH_TEST); // good old-fashioned fixed function lighting float black[] = { 0.0, 0.0, 0.0, 1.0 }; float white[] = { 1.0, 1.0, 1.0, 1.0 }; float ambient[] = { 0.1, 0.1, 0.1, 1.0 }; float diffuse[] = { 0.9, 0.9, 0.9, 1.0 }; float lightPos[] = { 0.0, 0.0, 1.0, 0.0 }; glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, ambient); glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, diffuse); glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, black); glLightfv(GL_LIGHT0, GL_AMBIENT, white); glLightfv(GL_LIGHT0, GL_DIFFUSE, white); glLightfv(GL_LIGHT0, GL_SPECULAR, white); glLightfv(GL_LIGHT0, GL_POSITION, lightPos); glLightModelfv(GL_LIGHT_MODEL_AMBIENT, black); glEnable(GL_LIGHT0); glEnable(GL_NORMALIZE); // load shader program gl_Shader = compileASMShader(GL_FRAGMENT_PROGRAM_ARB, shader_code); if (g_FrameBufferObject) { delete g_FrameBufferObject; g_FrameBufferObject = NULL; } if (g_bFBODisplay) { g_FrameBufferObject = new CFrameBufferObject(window_width, window_height, 32, true, GL_TEXTURE_2D); } glutReportErrors(); return CUTTrue; }
void initOpenGLBuffers() { printf("Creating GL texture...\n"); glEnable(GL_TEXTURE_2D); glGenTextures(1, &gl_Tex); glBindTexture(GL_TEXTURE_2D, gl_Tex); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, imageW, imageH, 0, GL_RGBA, GL_UNSIGNED_BYTE, h_Src); printf("Texture created.\n"); printf("Creating PBO...\n"); glGenBuffers(1, &gl_PBO); glBindBuffer(GL_PIXEL_UNPACK_BUFFER_ARB, gl_PBO); glBufferData(GL_PIXEL_UNPACK_BUFFER_ARB, imageW * imageH * 4, h_Src, GL_STREAM_COPY); //While a PBO is registered to CUDA, it can't be used //as the destination for OpenGL drawing calls. //But in our particular case OpenGL is only used //to display the content of the PBO, specified by CUDA kernels, //so we need to register/unregister it only once. // DEPRECATED: checkCudaErrors(cudaGLRegisterBufferObject(gl_PBO) ); checkCudaErrors(cudaGraphicsGLRegisterBuffer(&cuda_pbo_resource, gl_PBO, cudaGraphicsMapFlagsWriteDiscard)); GLenum gl_error = glGetError(); if (gl_error != GL_NO_ERROR) { #if defined(WIN32) || defined(_WIN32) || defined(WIN64) || defined(_WIN64) char tmpStr[512]; // NOTE: "%s(%i) : " allows Visual Studio to directly jump to the file at the right line // when the user double clicks on the error line in the Output pane. Like any compile error. sprintf_s(tmpStr, 255, "\n%s(%i) : GL Error : %s\n\n", __FILE__, __LINE__, gluErrorString(gl_error)); OutputDebugString(tmpStr); #endif fprintf(stderr, "GL Error in file '%s' in line %d :\n", __FILE__, __LINE__); fprintf(stderr, "%s\n", gluErrorString(gl_error)); exit(EXIT_FAILURE); } printf("PBO created.\n"); // load shader program shader = compileASMShader(GL_FRAGMENT_PROGRAM_ARB, shader_code); }
void initOpenGLBuffers() { printf("Creating GL texture...\n"); glEnable(GL_TEXTURE_2D); glGenTextures(1, &gl_Tex); glBindTexture(GL_TEXTURE_2D, gl_Tex); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, imageW, imageH, 0, GL_RGBA, GL_UNSIGNED_BYTE, h_Src); printf("Texture created.\n"); printf("Creating PBO...\n"); glGenBuffers(1, &gl_PBO); glBindBuffer(GL_PIXEL_UNPACK_BUFFER_ARB, gl_PBO); glBufferData(GL_PIXEL_UNPACK_BUFFER_ARB, imageW * imageH * 4, h_Src, GL_STREAM_COPY); //While a PBO is registered to CUDA, it can't be used //as the destination for OpenGL drawing calls. //But in our particular case OpenGL is only used //to display the content of the PBO, specified by CUDA kernels, //so we need to register/unregister it only once. // DEPRECATED: cutilSafeCall( cudaGLRegisterBufferObject(gl_PBO) ); cutilSafeCall(cudaGraphicsGLRegisterBuffer(&cuda_pbo_resource, gl_PBO, cudaGraphicsMapFlagsWriteDiscard)); CUT_CHECK_ERROR_GL(); printf("PBO created.\n"); // load shader program shader = compileASMShader(GL_FRAGMENT_PROGRAM_ARB, shader_code); if (g_FrameBufferObject) { delete g_FrameBufferObject; g_FrameBufferObject = NULL; } if (g_bFBODisplay) { g_FrameBufferObject = new CFrameBufferObject(imageW, imageH, 32, false, GL_TEXTURE_2D); } }
// This is where we create the OpenGL PBOs, FBOs, and texture resources void initGLResources() { // create pixel buffer object glGenBuffersARB(1, &pbo); glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, pbo); glBufferDataARB(GL_PIXEL_UNPACK_BUFFER_ARB, width*height*sizeof(GLubyte)*4, h_img, GL_STREAM_DRAW_ARB); glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, 0); checkCudaErrors(cudaGraphicsGLRegisterBuffer(&cuda_pbo_resource, pbo, cudaGraphicsMapFlagsWriteDiscard)); // create texture for display glGenTextures(1, &texid); glBindTexture(GL_TEXTURE_2D, texid); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glBindTexture(GL_TEXTURE_2D, 0); // load shader program shader = compileASMShader(GL_FRAGMENT_PROGRAM_ARB, shader_code); }
void initialize(int argc, char **argv) { printf("[%s] (OpenGL Mode)\n", sSDKsample); // First initialize OpenGL context, so we can properly set the GL for CUDA. // This is necessary in order to achieve optimal performance with OpenGL/CUDA interop. initGL(&argc, argv); int devID; cudaDeviceProp deviceProps; if (checkCmdLineFlag(argc, (const char **)argv, "device")) { devID = gpuGLDeviceInit(argc, (const char **)argv); if (devID < 0) { printf("exiting...\n"); exit(EXIT_SUCCESS); } } else { devID = gpuGetMaxGflopsDeviceId(); cudaGLSetGLDevice(devID); } // get number of SMs on this GPU checkCudaErrors(cudaGetDeviceProperties(&deviceProps, devID)); printf("CUDA device [%s] has %d Multi-Processors\n", deviceProps.name, deviceProps.multiProcessorCount); // Create the timer (for fps measurement) sdkCreateTimer(&timer); // load image from disk loadImageData(argc, argv); printf("\n" "\tControls\n" "\t=/- : Zoom in/out\n" "\tb : Run Benchmark g_FilterMode\n" "\tc : Draw Bicubic Spline Curve\n" "\t[esc] - Quit\n\n" "\tPress number keys to change filtering g_FilterMode:\n\n" "\t1 : nearest filtering\n" "\t2 : bilinear filtering\n" "\t3 : bicubic filtering\n" "\t4 : fast bicubic filtering\n" "\t5 : Catmull-Rom filtering\n\n" ); initGLBuffers(); #if USE_BUFFER_TEX fprog = compileASMShader(GL_FRAGMENT_PROGRAM_ARB, shaderCode); if (!fprog) { exit(EXIT_SUCCESS); } #endif }