merge of glsl-compiler-1 branch
[mesa.git] / progs / tests / fbotest2.c
1 /*
2 * Test GL_EXT_framebuffer_object
3 *
4 * Brian Paul
5 * 19 Mar 2006
6 */
7
8
9 #define GL_GLEXT_PROTOTYPES
10 #include <assert.h>
11 #include <stdio.h>
12 #include <stdlib.h>
13 #include <math.h>
14 #include <GL/glut.h>
15
16 static int Win = 0;
17 static int Width = 400, Height = 400;
18 static GLuint MyFB, ColorRb, DepthRb;
19 static GLboolean Animate = GL_TRUE;
20 static GLfloat Rotation = 0.0;
21
22
23 static void
24 CheckError(int line)
25 {
26 GLenum err = glGetError();
27 if (err) {
28 printf("fbotest2: GL Error 0x%x at line %d\n", (int) err, line);
29 }
30 }
31
32
33 static void
34 Display( void )
35 {
36 GLubyte *buffer = malloc(Width * Height * 4);
37 GLenum status;
38
39 CheckError(__LINE__);
40
41 /* draw to user framebuffer */
42 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, MyFB);
43 glDrawBuffer(GL_COLOR_ATTACHMENT1_EXT);
44 glReadBuffer(GL_COLOR_ATTACHMENT1_EXT);
45
46 status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
47 if (status != GL_FRAMEBUFFER_COMPLETE_EXT) {
48 printf("fbotest2: Error: Framebuffer is incomplete!!!\n");
49 }
50
51 CheckError(__LINE__);
52
53 glClearColor(0.5, 0.5, 1.0, 0.0);
54 glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
55
56 glEnable(GL_DEPTH_TEST);
57 glEnable(GL_LIGHTING);
58 glEnable(GL_LIGHT0);
59
60 glPushMatrix();
61 glRotatef(30.0, 1, 0, 0);
62 glRotatef(Rotation, 0, 1, 0);
63 glutSolidTeapot(2.0);
64 glPopMatrix();
65
66 /* read from user framebuffer */
67 glReadPixels(0, 0, Width, Height, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
68
69 /* draw to window */
70 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
71 glWindowPos2iARB(0, 0);
72 glDrawPixels(Width, Height, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
73
74 free(buffer);
75 glutSwapBuffers();
76 CheckError(__LINE__);
77 }
78
79
80 static void
81 Reshape( int width, int height )
82 {
83 float ar = (float) width / (float) height;
84
85 glViewport( 0, 0, width, height );
86 glMatrixMode( GL_PROJECTION );
87 glLoadIdentity();
88 glFrustum( -ar, ar, -1.0, 1.0, 5.0, 25.0 );
89
90 glMatrixMode( GL_MODELVIEW );
91 glLoadIdentity();
92 glTranslatef( 0.0, 0.0, -15.0 );
93
94 glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, ColorRb);
95 glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_RGB, width, height);
96 glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, DepthRb);
97 glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT,
98 width, height);
99
100 Width = width;
101 Height = height;
102 }
103
104
105 static void
106 CleanUp(void)
107 {
108 glDeleteFramebuffersEXT(1, &MyFB);
109 glDeleteRenderbuffersEXT(1, &ColorRb);
110 glDeleteRenderbuffersEXT(1, &DepthRb);
111 assert(!glIsFramebufferEXT(MyFB));
112 assert(!glIsRenderbufferEXT(ColorRb));
113 assert(!glIsRenderbufferEXT(DepthRb));
114 glutDestroyWindow(Win);
115 exit(0);
116 }
117
118
119 static void
120 Idle(void)
121 {
122 Rotation = glutGet(GLUT_ELAPSED_TIME) * 0.1;
123 glutPostRedisplay();
124 }
125
126
127 static void
128 Key( unsigned char key, int x, int y )
129 {
130 (void) x;
131 (void) y;
132 switch (key) {
133 case 'a':
134 Animate = !Animate;
135 if (Animate)
136 glutIdleFunc(Idle);
137 else
138 glutIdleFunc(NULL);
139 break;
140 case 27:
141 CleanUp();
142 break;
143 }
144 glutPostRedisplay();
145 }
146
147
148 static void
149 Init( void )
150 {
151 if (!glutExtensionSupported("GL_EXT_framebuffer_object")) {
152 printf("fbotest2: GL_EXT_framebuffer_object not found!\n");
153 exit(0);
154 }
155 printf("fbotest2: GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER));
156
157 glGenFramebuffersEXT(1, &MyFB);
158 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, MyFB);
159 assert(glIsFramebufferEXT(MyFB));
160
161 /* set color buffer */
162 glGenRenderbuffersEXT(1, &ColorRb);
163 glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, ColorRb);
164 assert(glIsRenderbufferEXT(ColorRb));
165 glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT1_EXT,
166 GL_RENDERBUFFER_EXT, ColorRb);
167 glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_RGB, Width, Height);
168
169 /* setup depth buffer */
170 glGenRenderbuffersEXT(1, &DepthRb);
171 glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, DepthRb);
172 assert(glIsRenderbufferEXT(DepthRb));
173 glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT,
174 GL_RENDERBUFFER_EXT, DepthRb);
175 glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, Width, Height);
176
177 CheckError(__LINE__);
178
179 /* restore to default */
180 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
181 CheckError(__LINE__);
182 }
183
184
185 int
186 main( int argc, char *argv[] )
187 {
188 glutInit( &argc, argv );
189 glutInitWindowPosition( 0, 0 );
190 glutInitWindowSize(Width, Height);
191 glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE );
192 Win = glutCreateWindow(argv[0]);
193 glutReshapeFunc( Reshape );
194 glutKeyboardFunc( Key );
195 glutDisplayFunc( Display );
196 if (Animate)
197 glutIdleFunc(Idle);
198 Init();
199 glutMainLoop();
200 return 0;
201 }