fbotest1.c revision 32001f49
1/*
2 * Test GL_EXT_framebuffer_object
3 *
4 * Brian Paul
5 * 7 Feb 2005
6 */
7
8
9#include <assert.h>
10#include <stdio.h>
11#include <stdlib.h>
12#include <math.h>
13#include <GL/glew.h>
14#include "glut_wrap.h"
15
16static int Win;
17static int Width = 400, Height = 400;
18static GLuint MyFB, MyRB;
19
20
21static void
22CheckError(int line)
23{
24   GLenum err = glGetError();
25   if (err) {
26      printf("GL Error 0x%x at line %d\n", (int) err, line);
27   }
28}
29
30
31static void
32Display( void )
33{
34   GLubyte *buffer = malloc(Width * Height * 4);
35   GLenum status;
36
37   /* draw to user framebuffer */
38   glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, MyFB);
39   glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT);
40   glReadBuffer(GL_COLOR_ATTACHMENT0_EXT);
41
42   status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
43   if (status != GL_FRAMEBUFFER_COMPLETE_EXT) {
44      printf("Framebuffer incomplete!!!\n");
45   }
46
47   glClearColor(0.5, 0.5, 1.0, 0.0);
48   glClear( GL_COLOR_BUFFER_BIT );
49
50   glBegin(GL_POLYGON);
51   glColor3f(1, 0, 0);
52   glVertex2f(-1, -1);
53   glColor3f(0, 1, 0);
54   glVertex2f(1, -1);
55   glColor3f(0, 0, 1);
56   glVertex2f(0, 1);
57   glEnd();
58
59   /* read from user framebuffer */
60   glReadPixels(0, 0, Width, Height, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
61
62   /* draw to window */
63   glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
64   glWindowPos2iARB(0, 0);
65   glDrawPixels(Width, Height, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
66
67   free(buffer);
68   glutSwapBuffers();
69   CheckError(__LINE__);
70}
71
72
73static void
74Reshape( int width, int height )
75{
76#if 0
77   float ar = (float) width / (float) height;
78#endif
79   glViewport( 0, 0, width, height );
80   glMatrixMode( GL_PROJECTION );
81   glLoadIdentity();
82#if 0
83   glFrustum( -ar, ar, -1.0, 1.0, 5.0, 25.0 );
84#else
85   glOrtho(-1.0, 1.0, -1.0, 1.0, 5.0, 25.0 );
86#endif
87   glMatrixMode( GL_MODELVIEW );
88   glLoadIdentity();
89   glTranslatef( 0.0, 0.0, -15.0 );
90   Width = width;
91   Height = height;
92   glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_RGB, Width, Height);
93}
94
95
96static void
97CleanUp(void)
98{
99   glDeleteFramebuffersEXT(1, &MyFB);
100   glDeleteRenderbuffersEXT(1, &MyRB);
101   assert(!glIsFramebufferEXT(MyFB));
102   assert(!glIsRenderbufferEXT(MyRB));
103   glutDestroyWindow(Win);
104   exit(0);
105}
106
107
108static void
109Key( unsigned char key, int x, int y )
110{
111   (void) x;
112   (void) y;
113   switch (key) {
114      case 27:
115         CleanUp();
116         break;
117   }
118   glutPostRedisplay();
119}
120
121
122static void
123Init( void )
124{
125   GLboolean ARB_fbo = glutExtensionSupported("GL_ARB_framebuffer_object");
126   GLint i;
127
128   if (!glutExtensionSupported("GL_EXT_framebuffer_object")) {
129      printf("GL_EXT_framebuffer_object not found!\n");
130      exit(0);
131   }
132   printf("GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER));
133
134   glGenFramebuffersEXT(1, &MyFB);
135   assert(MyFB);
136   assert(!glIsFramebufferEXT(MyFB));
137   if (!ARB_fbo) {
138      glDeleteFramebuffersEXT(1, &MyFB);
139      assert(!glIsFramebufferEXT(MyFB));
140   }
141   /* Note, continue to use MyFB below */
142
143   glGenRenderbuffersEXT(1, &MyRB);
144   assert(MyRB);
145   assert(!glIsRenderbufferEXT(MyRB));
146   if (!ARB_fbo) {
147      glDeleteRenderbuffersEXT(1, &MyRB);
148      assert(!glIsRenderbufferEXT(MyRB));
149      MyRB = 42; /* an arbitrary ID */
150   }
151
152   glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, MyFB);
153   assert(glIsFramebufferEXT(MyFB));
154   glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, MyRB);
155   assert(glIsRenderbufferEXT(MyRB));
156
157   glGetIntegerv(GL_RENDERBUFFER_BINDING_EXT, &i);
158   assert(i == MyRB);
159
160   glGetIntegerv(GL_FRAMEBUFFER_BINDING_EXT, &i);
161   assert(i == MyFB);
162
163   CheckError(__LINE__);
164   glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,
165                                GL_RENDERBUFFER_EXT, MyRB);
166
167   glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_RGB, Width, Height);
168
169   CheckError(__LINE__);
170
171   {
172      GLint r, g, b, a;
173      glGetRenderbufferParameterivEXT(GL_RENDERBUFFER_EXT,
174                                      GL_RENDERBUFFER_RED_SIZE_EXT, &r);
175      glGetRenderbufferParameterivEXT(GL_RENDERBUFFER_EXT,
176                                      GL_RENDERBUFFER_GREEN_SIZE_EXT, &g);
177      glGetRenderbufferParameterivEXT(GL_RENDERBUFFER_EXT,
178                                      GL_RENDERBUFFER_BLUE_SIZE_EXT, &b);
179      glGetRenderbufferParameterivEXT(GL_RENDERBUFFER_EXT,
180                                      GL_RENDERBUFFER_ALPHA_SIZE_EXT, &a);
181      CheckError(__LINE__);
182      printf("renderbuffer RGBA sizes = %d %d %d %d\n", r, g, b, a);
183
184      glGetIntegerv(GL_RED_BITS, &r);
185      glGetIntegerv(GL_GREEN_BITS, &g);
186      glGetIntegerv(GL_BLUE_BITS, &b);
187      glGetIntegerv(GL_ALPHA_BITS, &a);
188      printf("Visual RGBA sizes = %d %d %d %d\n", r, g, b, a);
189   }
190
191   /* restore to default */
192   glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
193   CheckError(__LINE__);
194}
195
196
197int
198main( int argc, char *argv[] )
199{
200   glutInit( &argc, argv );
201   glutInitWindowPosition( 0, 0 );
202   glutInitWindowSize(Width, Height);
203   glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE );
204   Win = glutCreateWindow(argv[0]);
205   glewInit();
206   glutReshapeFunc( Reshape );
207   glutKeyboardFunc( Key );
208   glutDisplayFunc( Display );
209   Init();
210   glutMainLoop();
211   return 0;
212}
213