revision 1240:190df8a791ca
summary |
tree |
shortlog |
changelog |
graph |
changeset |
raw | bz2 | zip | gz changeset | 1240:190df8a791ca |
parent | 1239:be3121267597 |
child | 1241:74f8e11ab4b8 |
child | 1242:67909902ede9 |
author | nkeynes |
date | Tue Feb 28 17:25:26 2012 +1000 (12 years ago) |
Implement display output for the GLES2 case (no fixed function
rendering)
rendering)
1.1 --- a/src/drivers/video_gl.c Sat Feb 25 21:30:49 2012 +10001.2 +++ b/src/drivers/video_gl.c Tue Feb 28 17:25:26 2012 +10001.3 @@ -21,6 +21,7 @@1.4 #include "display.h"1.5 #include "pvr2/pvr2.h"1.6 #include "pvr2/glutil.h"1.7 +#include "pvr2/shaders.h"1.8 #include "drivers/video_gl.h"1.10 /* FIXME: Need to actually handle this case */1.11 @@ -32,7 +33,7 @@1.12 struct video_vertex {1.13 float x,y;1.14 float u,v;1.15 - float r,g,b;1.16 + float r,g,b,a;1.17 };1.19 static struct video_box_t {1.20 @@ -98,7 +99,7 @@1.21 /**1.22 * Setup the gl context for writes to the display output.1.23 */1.24 -void gl_framebuffer_setup()1.25 +static void gl_framebuffer_setup()1.26 {1.27 glViewport( 0, 0, video_width, video_height );1.28 glLoadMatrixf(video_box.viewMatrix);1.29 @@ -112,10 +113,28 @@1.30 glEnableClientState( GL_TEXTURE_COORD_ARRAY );1.31 }1.33 +static void gl_framebuffer_cleanup()1.34 +{1.35 + glDisableClientState( GL_VERTEX_ARRAY );1.36 + glDisableClientState( GL_COLOR_ARRAY );1.37 + glDisableClientState( GL_TEXTURE_COORD_ARRAY );1.38 +}1.39 #else1.40 -void gl_framebuffer_setup()1.41 +static void gl_framebuffer_setup()1.42 {1.43 - /* TODO */1.44 + glViewport( 0, 0, video_width, video_height );1.45 + glBlendFunc( GL_ONE, GL_ZERO );1.46 + glsl_use_basic_shader();1.47 + glsl_set_basic_shader_view_matrix(video_box.viewMatrix);1.48 + glsl_set_basic_shader_in_vertex_pointer(&video_box.gap1[0].x, sizeof(struct video_vertex));1.49 + glsl_set_basic_shader_in_colour_pointer(&video_box.gap1[0].r, sizeof(struct video_vertex));1.50 + glsl_set_basic_shader_in_texcoord_pointer(&video_box.gap1[0].u, sizeof(struct video_vertex));1.51 + glsl_set_basic_shader_primary_texture(0);1.52 +}1.53 +1.54 +static void gl_framebuffer_cleanup()1.55 +{1.56 + glsl_clear_shader();1.57 }1.58 #endif1.60 @@ -154,6 +173,9 @@1.62 void gl_texture_window( int width, int height, int tex_id, gboolean inverted )1.63 {1.64 + /* Set video box tex alpha to 1 */1.65 + video_box.video_view[0].a = video_box.video_view[1].a = video_box.video_view[2].a = video_box.video_view[3].a = 1;1.66 +1.67 /* Reset display parameters */1.68 gl_framebuffer_setup();1.69 glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);1.70 @@ -165,6 +187,7 @@1.71 glDrawArrays(GL_TRIANGLE_STRIP, inverted ? 12 : 8, 4);1.72 glDisable(GL_TEXTURE_2D);1.73 glFlush();1.74 + gl_framebuffer_cleanup();1.75 }1.77 gboolean gl_load_frame_buffer( frame_buffer_t frame, int tex_id )1.78 @@ -188,6 +211,7 @@1.79 video_box.video_view[0].r = ((float)(((colour >> 16) & 0xFF) + 1)) / 256.0;1.80 video_box.video_view[0].g = ((float)(((colour >> 8) & 0xFF) + 1)) / 256.0;1.81 video_box.video_view[0].b = ((float)((colour & 0xFF) + 1)) / 256.0;1.82 + video_box.video_view[0].a = 0;1.83 memcpy( &video_box.video_view[1].r, &video_box.video_view[0].r, sizeof(float)*3 );1.84 memcpy( &video_box.video_view[2].r, &video_box.video_view[0].r, sizeof(float)*3 );1.85 memcpy( &video_box.video_view[3].r, &video_box.video_view[0].r, sizeof(float)*3 );1.86 @@ -198,6 +222,7 @@1.87 glDrawArrays(GL_TRIANGLE_STRIP, 4, 4);1.88 glDrawArrays(GL_TRIANGLE_STRIP, 8, 4);1.89 glFlush();1.90 + gl_framebuffer_cleanup();1.91 }1.93 /**
2.1 --- a/src/pvr2/gl_sl.c Sat Feb 25 21:30:49 2012 +10002.2 +++ b/src/pvr2/gl_sl.c Tue Feb 28 17:25:26 2012 +10002.3 @@ -168,9 +168,11 @@2.4 #define glsl_set_uniform_sampler1D(id,v) glUniform1iARB(id,v)2.5 #define glsl_set_uniform_sampler2D(id,v) glUniform1iARB(id,v)2.6 #define glsl_set_uniform_float(id,v) glUniform1fARB(id,v)2.7 +#define glsl_set_uniform_vec2(id,v) glUniform2fvARB(id,1,v)2.8 #define glsl_set_uniform_vec3(id,v) glUniform3fvARB(id,1,v)2.9 #define glsl_set_uniform_vec4(id,v) glUniform4fvARB(id,1,v)2.10 #define glsl_set_uniform_mat4(id,v) glUniformMatrix4fvARB(id,1,GL_FALSE,v)2.11 +#define glsl_set_attrib_vec2(id,stride,v) glVertexAttribPointerARB(id, 2, GL_FLOAT, GL_FALSE, stride, v)2.12 #define glsl_set_attrib_vec3(id,stride,v) glVertexAttribPointerARB(id, 3, GL_FLOAT, GL_FALSE, stride, v)2.13 #define glsl_set_attrib_vec4(id,stride,v) glVertexAttribPointerARB(id, 4, GL_FLOAT, GL_FALSE, stride, v)2.14 #define glsl_enable_attrib(id) glEnableVertexAttribArrayARB(id)2.15 @@ -296,9 +298,11 @@2.16 #define glsl_set_uniform_sampler1D(id,v) glUniform1i(id,v)2.17 #define glsl_set_uniform_sampler2D(id,v) glUniform1i(id,v)2.18 #define glsl_set_uniform_float(id,v) glUniform1f(id,v)2.19 +#define glsl_set_uniform_vec2(id,v) glUniform2fv(id,1,v)2.20 #define glsl_set_uniform_vec3(id,v) glUniform3fv(id,1,v)2.21 #define glsl_set_uniform_vec4(id,v) glUniform4fv(id,1,v)2.22 #define glsl_set_uniform_mat4(id,v) glUniformMatrix4fv(id,1,GL_FALSE,v)2.23 +#define glsl_set_attrib_vec2(id,stride,v) glVertexAttribPointer(id, 2, GL_FLOAT, GL_FALSE, stride, v)2.24 #define glsl_set_attrib_vec3(id,stride,v) glVertexAttribPointer(id, 3, GL_FLOAT, GL_FALSE, stride, v)2.25 #define glsl_set_attrib_vec4(id,stride,v) glVertexAttribPointer(id, 4, GL_FLOAT, GL_FALSE, stride, v)2.26 #define glsl_enable_attrib(id) glEnableVertexAttribArray(id)2.27 @@ -356,9 +360,11 @@2.28 #define glsl_set_uniform_sampler1D(id,v)2.29 #define glsl_set_uniform_sampler2D(id,v)2.30 #define glsl_set_uniform_float(id,v)2.31 +#define glsl_set_uniform_vec2(id,v)2.32 #define glsl_set_uniform_vec3(id,v)2.33 #define glsl_set_uniform_vec4(id,v)2.34 #define glsl_set_uniform_mat4(id,v)2.35 +#define glsl_set_attrib_vec2(id,stride,v)2.36 #define glsl_set_attrib_vec3(id,stride,v)2.37 #define glsl_set_attrib_vec4(id,stride,v)2.38 #define glsl_enable_attrib(id)
3.1 --- a/src/pvr2/glrender.c Sat Feb 25 21:30:49 2012 +10003.2 +++ b/src/pvr2/glrender.c Tue Feb 28 17:25:26 2012 +10003.3 @@ -137,7 +137,7 @@3.4 }3.5 #endif3.7 -#ifdef HAVE_OPENGL_FIXEDFUNC3.8 +#ifndef HAVE_OPENGL_FIXEDFUNC3.9 /* Setup defaults for perspective correction + matrices */3.10 glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);3.11 glMatrixMode(GL_MODELVIEW);
4.1 --- a/src/pvr2/scene.c Sat Feb 25 21:30:49 2012 +10004.2 +++ b/src/pvr2/scene.c Tue Feb 28 17:25:26 2012 +10004.3 @@ -552,6 +552,11 @@4.4 memcpy( &pvr2_scene.vertex_array[pvr2_scene.vertex_index], quad, sizeof(struct vertex_struct)*2 );4.5 memcpy( &pvr2_scene.vertex_array[pvr2_scene.vertex_index+2], &quad[3], sizeof(struct vertex_struct) );4.6 memcpy( &pvr2_scene.vertex_array[pvr2_scene.vertex_index+3], &quad[2], sizeof(struct vertex_struct) );4.7 + if( !POLY1_GOURAUD_SHADED(context[0]) ) {4.8 + memcpy( &pvr2_scene.vertex_array[pvr2_scene.vertex_index].rgba, &pvr2_scene.vertex_array[pvr2_scene.vertex_index+3].rgba, sizeof(float)*8 );4.9 + memcpy( &pvr2_scene.vertex_array[pvr2_scene.vertex_index+1].rgba, &pvr2_scene.vertex_array[pvr2_scene.vertex_index+3].rgba, sizeof(float)*8 );4.10 + }4.11 +4.12 pvr2_scene.vertex_index += 4;4.14 if( is_modified ) {4.15 @@ -568,6 +573,10 @@4.16 memcpy( &pvr2_scene.vertex_array[pvr2_scene.vertex_index], quad, sizeof(struct vertex_struct)*2 );4.17 memcpy( &pvr2_scene.vertex_array[pvr2_scene.vertex_index+2], &quad[3], sizeof(struct vertex_struct) );4.18 memcpy( &pvr2_scene.vertex_array[pvr2_scene.vertex_index+3], &quad[2], sizeof(struct vertex_struct) );4.19 + if( !POLY1_GOURAUD_SHADED(context[0]) ) {4.20 + memcpy( &pvr2_scene.vertex_array[pvr2_scene.vertex_index].rgba, &pvr2_scene.vertex_array[pvr2_scene.vertex_index+3].rgba, sizeof(float)*8 );4.21 + memcpy( &pvr2_scene.vertex_array[pvr2_scene.vertex_index+1].rgba, &pvr2_scene.vertex_array[pvr2_scene.vertex_index+3].rgba, sizeof(float)*8 );4.22 + }4.23 } else {4.24 scene_add_cheap_shadow_vertexes( &pvr2_scene.vertex_array[poly->vertex_index],4.25 &pvr2_scene.vertex_array[poly->mod_vertex_index], poly->vertex_count );
5.1 --- a/src/pvr2/shaders.glsl Sat Feb 25 21:30:49 2012 +10005.2 +++ b/src/pvr2/shaders.glsl Tue Feb 28 17:25:26 2012 +10005.3 @@ -63,7 +63,7 @@5.4 * float gl_FragDepth;5.6 */5.7 -5.8 +#include "../config.h"5.10 #vertex DEFAULT_VERTEX_SHADER5.11 uniform mat4 view_matrix;5.12 @@ -130,3 +130,36 @@5.13 }5.15 #program pvr2_shader = DEFAULT_VERTEX_SHADER DEFAULT_FRAGMENT_SHADER5.16 +5.17 +#ifndef HAVE_OPENGL_FIXEDFUNC5.18 +/* In this case we also need a basic shader to actually display the output */5.19 +#vertex BASIC_VERTEX_SHADER5.20 +uniform mat4 view_matrix;5.21 +attribute vec2 in_vertex;5.22 +attribute vec4 in_colour;5.23 +attribute vec2 in_texcoord; /* uv = coord, z = palette, w = mode */5.24 +5.25 +varying vec4 frag_colour;5.26 +varying vec2 frag_texcoord;5.27 +void main()5.28 +{5.29 + gl_Position = view_matrix * vec4(in_vertex.x,in_vertex.y,0,1);5.30 + frag_colour = in_colour;5.31 + frag_texcoord = in_texcoord;5.32 +}5.33 +5.34 +#fragment BASIC_FRAGMENT_SHADER5.35 +5.36 +uniform sampler2D primary_texture;5.37 +varying vec4 frag_colour;5.38 +varying vec2 frag_texcoord;5.39 +5.40 +void main()5.41 +{5.42 + vec4 tex = texture2D( primary_texture, frag_texcoord.xy );5.43 + gl_FragColor.rgb = mix( frag_colour.rgb, tex.rgb, frag_colour.a );5.44 + gl_FragDepth = gl_FragCoord.z;5.45 +}5.46 +5.47 +#program basic_shader = BASIC_VERTEX_SHADER BASIC_FRAGMENT_SHADER5.48 +#endif
6.1 --- a/src/tools/genglsl.c Sat Feb 25 21:30:49 2012 +10006.2 +++ b/src/tools/genglsl.c Tue Feb 28 17:25:26 2012 +10006.3 @@ -382,6 +382,7 @@6.4 } else {6.5 fprintf( f, "void glsl_set_%s_%s_pointer(%s ptr, GLint stride); /* attribute %s %s */ \n", program->name, var->name, getCType(var->type,var->uniform), var->type, var->name);6.6 if( strcmp(var->type,"vec4") == 0 ) { /* Special case */6.7 + fprintf( f, "void glsl_set_%s_%s_vec2_pointer(%s ptr, GLint stride); /* attribute %s %s */ \n", program->name, var->name, getCType(var->type,var->uniform), var->type, var->name);6.8 fprintf( f, "void glsl_set_%s_%s_vec3_pointer(%s ptr, GLint stride); /* attribute %s %s */ \n", program->name, var->name, getCType(var->type,var->uniform), var->type, var->name);6.9 }6.10 }6.11 @@ -472,6 +473,8 @@6.12 if( strcmp(var->type,"vec4") == 0 ) { /* Special case to load vec3 arrays into a vec4 */6.13 fprintf( f, "void glsl_set_%s_%s_vec3_pointer(%s ptr, GLsizei stride){ /* attribute %s %s */ \n", program->name, var->name, getCType(var->type,var->uniform), var->type, var->name);6.14 fprintf( f, " glsl_set_attrib_vec3(var_%s_%s_loc,stride, ptr);\n}\n", program->name, var->name );6.15 + fprintf( f, "void glsl_set_%s_%s_vec2_pointer(%s ptr, GLsizei stride){ /* attribute %s %s */ \n", program->name, var->name, getCType(var->type,var->uniform), var->type, var->name);6.16 + fprintf( f, " glsl_set_attrib_vec2(var_%s_%s_loc,stride, ptr);\n}\n", program->name, var->name );6.17 }6.18 }6.19 }
.