[327/906] fix init FBO's texture attachment on ES 2.0

This commit is contained in:
Julien 2009-04-10 20:42:59 +02:00 committed by Matthew Waters
parent bb0781a389
commit bf0b1fa1ab

View file

@ -236,11 +236,9 @@ gst_gl_display_init (GstGLDisplay * display, GstGLDisplayClass * klass)
"uniform sampler2DRect Ytex, UVtex;\n"
#else
"precision mediump float;\n"
"varying vec2 v_texCoord;\n"
"uniform sampler2D Ytex, UVtex;\n"
"varying vec2 v_texCoord;\n" "uniform sampler2D Ytex, UVtex;\n"
#endif
"void main(void) {\n"
" float fx, fy, y, u, v, r, g, b;\n"
"void main(void) {\n" " float fx, fy, y, u, v, r, g, b;\n"
#ifndef OPENGL_ES2
" fx = gl_TexCoord[0].x;\n"
" fy = gl_TexCoord[0].y;\n"
@ -259,9 +257,7 @@ gst_gl_display_init (GstGLDisplay * display, GstGLDisplayClass * klass)
" v=v-0.5;\n"
" r = y+1.5958*v;\n"
" g = y-0.39173*u-0.81290*v;\n"
" b = y+2.017*u;\n"
" gl_FragColor = vec4(r, g, b, 1.0);\n"
"}\n";
" b = y+2.017*u;\n" " gl_FragColor = vec4(r, g, b, 1.0);\n" "}\n";
//ATI: "*0.5", ""
//normal: "", "*0.5"
@ -271,11 +267,9 @@ gst_gl_display_init (GstGLDisplay * display, GstGLDisplayClass * klass)
"uniform sampler2DRect Ytex,Utex,Vtex;\n"
#else
"precision mediump float;\n"
"varying vec2 v_texCoord;\n"
"uniform sampler2D Ytex,Utex,Vtex;\n"
"varying vec2 v_texCoord;\n" "uniform sampler2D Ytex,Utex,Vtex;\n"
#endif
"void main(void) {\n"
" float r,g,b,y,u,v;\n"
"void main(void) {\n" " float r,g,b,y,u,v;\n"
#ifndef OPENGL_ES2
" vec2 nxy = gl_TexCoord[0].xy;\n"
" y=texture2DRect(Ytex,nxy%s).r;\n"
@ -284,17 +278,14 @@ gst_gl_display_init (GstGLDisplay * display, GstGLDisplayClass * klass)
#else
" vec2 nxy = v_texCoord.xy;\n"
" y=texture2D(Ytex,nxy).r;\n"
" u=texture2D(Utex,nxy).r;\n"
" v=texture2D(Vtex,nxy).r;\n"
" u=texture2D(Utex,nxy).r;\n" " v=texture2D(Vtex,nxy).r;\n"
#endif
" y=1.1643*(y-0.0625);\n"
" u=u-0.5;\n"
" v=v-0.5;\n"
" r=y+1.5958*v;\n"
" g=y-0.39173*u-0.81290*v;\n"
" b=y+2.017*u;\n"
" gl_FragColor=vec4(r,g,b,1.0);\n"
"}\n";
" b=y+2.017*u;\n" " gl_FragColor=vec4(r,g,b,1.0);\n" "}\n";
display->text_shader_upload_AYUV =
#ifndef OPENGL_ES2
@ -302,30 +293,24 @@ gst_gl_display_init (GstGLDisplay * display, GstGLDisplayClass * klass)
"uniform sampler2DRect tex;\n"
#else
"precision mediump float;\n"
"varying vec2 v_texCoord;\n"
"uniform sampler2D tex;\n"
"varying vec2 v_texCoord;\n" "uniform sampler2D tex;\n"
#endif
"void main(void) {\n"
" float r,g,b,y,u,v;\n"
"void main(void) {\n" " float r,g,b,y,u,v;\n"
#ifndef OPENGL_ES2
" vec2 nxy=gl_TexCoord[0].xy;\n"
" y=texture2DRect(tex,nxy).r;\n"
" u=texture2DRect(tex,nxy).g;\n"
" v=texture2DRect(tex,nxy).b;\n"
" u=texture2DRect(tex,nxy).g;\n" " v=texture2DRect(tex,nxy).b;\n"
#else
" vec2 nxy = v_texCoord.xy;\n"
" y=texture2D(tex,nxy).g;\n"
" u=texture2D(tex,nxy).b;\n"
" v=texture2D(tex,nxy).a;\n"
" u=texture2D(tex,nxy).b;\n" " v=texture2D(tex,nxy).a;\n"
#endif
" y=1.1643*(y-0.0625);\n"
" u=u-0.5;\n"
" v=v-0.5;\n"
" r=y+1.5958*v;\n"
" g=y-0.39173*u-0.81290*v;\n"
" b=y+2.017*u;\n"
" gl_FragColor=vec4(r,g,b,1.0);\n"
"}\n";
" b=y+2.017*u;\n" " gl_FragColor=vec4(r,g,b,1.0);\n" "}\n";
//YUY2:y2,u,y1,v
//UYVY:v,y1,u,y2
@ -335,11 +320,9 @@ gst_gl_display_init (GstGLDisplay * display, GstGLDisplayClass * klass)
"uniform sampler2DRect tex;\n"
#else
"precision mediump float;\n"
"varying vec2 v_texCoord;\n"
"uniform sampler2D tex;\n"
"varying vec2 v_texCoord;\n" "uniform sampler2D tex;\n"
#endif
"void main(void) {\n"
" float fx,fy,r,g,b,r2,g2,b2,y1,y2,u,v;\n"
"void main(void) {\n" " float fx,fy,r,g,b,r2,g2,b2,y1,y2,u,v;\n"
#ifndef OPENGL_ES2
" fx = gl_TexCoord[0].x;\n"
" fy = gl_TexCoord[0].y;\n"
@ -365,10 +348,7 @@ gst_gl_display_init (GstGLDisplay * display, GstGLDisplayClass * klass)
" v=0.439271*r - 0.367833*g - 0.071438*b ;\n"
" y1=0.858885*y1 + 0.0625;\n"
" y2=0.858885*y2 + 0.0625;\n"
" u=u + 0.5;\n"
" v=v + 0.5;\n"
" gl_FragColor=vec4(%s);\n"
"}\n";
" u=u + 0.5;\n" " v=v + 0.5;\n" " gl_FragColor=vec4(%s);\n" "}\n";
//no OpenGL ES 2.0 support because for now it's not possible
//to attach multiple textures to a frame buffer object
@ -394,8 +374,7 @@ gst_gl_display_init (GstGLDisplay * display, GstGLDisplayClass * klass)
" v=v + 0.5;\n"
" gl_FragData[0] = vec4(y, 0.0, 0.0, 1.0);\n"
" gl_FragData[1] = vec4(u, 0.0, 0.0, 1.0);\n"
" gl_FragData[2] = vec4(v, 0.0, 0.0, 1.0);\n"
"}\n";
" gl_FragData[2] = vec4(v, 0.0, 0.0, 1.0);\n" "}\n";
display->text_shader_download_AYUV =
#ifndef OPENGL_ES2
@ -403,28 +382,22 @@ gst_gl_display_init (GstGLDisplay * display, GstGLDisplayClass * klass)
"uniform sampler2DRect tex;\n"
#else
"precision mediump float;\n"
"varying vec2 v_texCoord;\n"
"uniform sampler2D tex;\n"
"varying vec2 v_texCoord;\n" "uniform sampler2D tex;\n"
#endif
"void main(void) {\n"
" float r,g,b,y,u,v;\n"
"void main(void) {\n" " float r,g,b,y,u,v;\n"
#ifndef OPENGL_ES2
" vec2 nxy=gl_TexCoord[0].xy;\n"
" r=texture2DRect(tex,nxy).r;\n"
" g=texture2DRect(tex,nxy).g;\n"
" b=texture2DRect(tex,nxy).b;\n"
" g=texture2DRect(tex,nxy).g;\n" " b=texture2DRect(tex,nxy).b;\n"
#else
" vec2 nxy=v_texCoord.xy;\n"
" r=texture2D(tex,nxy).r;\n"
" g=texture2D(tex,nxy).g;\n"
" b=texture2D(tex,nxy).b;\n"
" g=texture2D(tex,nxy).g;\n" " b=texture2D(tex,nxy).b;\n"
#endif
" y=0.299011*r + 0.586987*g + 0.114001*b;\n"
" u=-0.148246*r -0.29102*g + 0.439266*b;\n"
" v=0.439271*r - 0.367833*g - 0.071438*b ;\n"
" y=0.858885*y + 0.0625;\n"
" u=u + 0.5;\n"
" v=v + 0.5;\n"
" y=0.858885*y + 0.0625;\n" " u=u + 0.5;\n" " v=v + 0.5;\n"
#ifndef OPENGL_ES2
" gl_FragColor=vec4(y,u,v,1.0);\n"
#else
@ -440,8 +413,7 @@ gst_gl_display_init (GstGLDisplay * display, GstGLDisplayClass * klass)
"void main() \n"
"{ \n"
" gl_Position = a_position; \n"
" v_texCoord = a_texCoord; \n"
"} \n";
" v_texCoord = a_texCoord; \n" "} \n";
display->redisplay_fragment_shader_str =
"precision mediump float; \n"
@ -459,8 +431,7 @@ gst_gl_display_init (GstGLDisplay * display, GstGLDisplayClass * klass)
"void main() \n"
"{ \n"
" gl_Position = a_position; \n"
" v_texCoord = a_texCoord; \n"
"} \n";
" v_texCoord = a_texCoord; \n" "} \n";
display->text_vertex_shader_download =
"attribute vec4 a_position; \n"
@ -469,8 +440,7 @@ gst_gl_display_init (GstGLDisplay * display, GstGLDisplayClass * klass)
"void main() \n"
"{ \n"
" gl_Position = a_position; \n"
" v_texCoord = a_texCoord; \n"
"} \n";
" v_texCoord = a_texCoord; \n" "} \n";
display->text_fragment_shader_download_RGB =
"precision mediump float; \n"
@ -742,7 +712,6 @@ gst_gl_display_thread_destroy_context (GstGLDisplay * display)
glDeleteTextures (1, &display->upload_intex_v);
display->upload_intex_v = 0;
}
#ifdef OPENGL_ES2
if (display->redisplay_shader) {
g_object_unref (G_OBJECT (display->redisplay_shader));
@ -894,11 +863,11 @@ gst_gl_display_thread_init_upload (GstGLDisplay * display)
display->shader_upload_YUY2 = NULL;
} else {
display->shader_upload_attr_position_loc =
gst_gl_shader_get_attribute_location (display->shader_upload_YUY2,
"a_position");
gst_gl_shader_get_attribute_location
(display->shader_upload_YUY2, "a_position");
display->shader_upload_attr_texture_loc =
gst_gl_shader_get_attribute_location (display->shader_upload_YUY2,
"a_texCoord");
gst_gl_shader_get_attribute_location
(display->shader_upload_YUY2, "a_texCoord");
}
#endif
}
@ -939,11 +908,11 @@ gst_gl_display_thread_init_upload (GstGLDisplay * display)
display->shader_upload_UYVY = NULL;
} else {
display->shader_upload_attr_position_loc =
gst_gl_shader_get_attribute_location (display->shader_upload_UYVY,
"a_position");
gst_gl_shader_get_attribute_location
(display->shader_upload_UYVY, "a_position");
display->shader_upload_attr_texture_loc =
gst_gl_shader_get_attribute_location (display->shader_upload_UYVY,
"a_texCoord");
gst_gl_shader_get_attribute_location
(display->shader_upload_UYVY, "a_texCoord");
}
#endif
}
@ -989,11 +958,11 @@ gst_gl_display_thread_init_upload (GstGLDisplay * display)
display->shader_upload_I420_YV12 = NULL;
} else {
display->shader_upload_attr_position_loc =
gst_gl_shader_get_attribute_location (display->shader_upload_I420_YV12,
"a_position");
gst_gl_shader_get_attribute_location
(display->shader_upload_I420_YV12, "a_position");
display->shader_upload_attr_texture_loc =
gst_gl_shader_get_attribute_location (display->shader_upload_I420_YV12,
"a_texCoord");
gst_gl_shader_get_attribute_location
(display->shader_upload_I420_YV12, "a_texCoord");
}
#endif
}
@ -1027,11 +996,11 @@ gst_gl_display_thread_init_upload (GstGLDisplay * display)
display->shader_upload_AYUV = NULL;
} else {
display->shader_upload_attr_position_loc =
gst_gl_shader_get_attribute_location (display->shader_upload_AYUV,
"a_position");
gst_gl_shader_get_attribute_location
(display->shader_upload_AYUV, "a_position");
display->shader_upload_attr_texture_loc =
gst_gl_shader_get_attribute_location (display->shader_upload_AYUV,
"a_texCoord");
gst_gl_shader_get_attribute_location
(display->shader_upload_AYUV, "a_texCoord");
}
#endif
}
@ -1392,11 +1361,11 @@ gst_gl_display_thread_init_download (GstGLDisplay * display)
display->shader_download_YUY2 = NULL;
} else {
display->shader_download_attr_position_loc =
gst_gl_shader_get_attribute_location (display->shader_download_YUY2,
"a_position");
gst_gl_shader_get_attribute_location
(display->shader_download_YUY2, "a_position");
display->shader_download_attr_texture_loc =
gst_gl_shader_get_attribute_location (display->shader_download_YUY2,
"a_texCoord");
gst_gl_shader_get_attribute_location
(display->shader_download_YUY2, "a_texCoord");
}
#endif
}
@ -1433,11 +1402,11 @@ gst_gl_display_thread_init_download (GstGLDisplay * display)
display->shader_download_UYVY = NULL;
} else {
display->shader_download_attr_position_loc =
gst_gl_shader_get_attribute_location (display->shader_download_UYVY,
"a_position");
gst_gl_shader_get_attribute_location
(display->shader_download_UYVY, "a_position");
display->shader_download_attr_texture_loc =
gst_gl_shader_get_attribute_location (display->shader_download_UYVY,
"a_texCoord");
gst_gl_shader_get_attribute_location
(display->shader_download_UYVY, "a_texCoord");
}
#endif
@ -1483,11 +1452,11 @@ gst_gl_display_thread_init_download (GstGLDisplay * display)
display->shader_download_AYUV = NULL;
} else {
display->shader_download_attr_position_loc =
gst_gl_shader_get_attribute_location (display->shader_download_AYUV,
"a_position");
gst_gl_shader_get_attribute_location
(display->shader_download_AYUV, "a_position");
display->shader_download_attr_texture_loc =
gst_gl_shader_get_attribute_location (display->shader_download_AYUV,
"a_texCoord");
gst_gl_shader_get_attribute_location
(display->shader_download_AYUV, "a_texCoord");
}
#endif
break;
@ -1570,6 +1539,12 @@ gst_gl_display_thread_gen_fbo (GstGLDisplay * display)
glTexImage2D (GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA8,
display->gen_fbo_width, display->gen_fbo_height, 0, GL_RGBA,
GL_UNSIGNED_BYTE, NULL);
glTexParameteri (GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri (GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri (GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_S,
GL_CLAMP_TO_EDGE);
glTexParameteri (GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_T,
GL_CLAMP_TO_EDGE);
//attach the texture to the FBO to renderer to
glFramebufferTexture2DEXT (GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,
@ -1658,7 +1633,8 @@ gst_gl_display_thread_use_fbo (GstGLDisplay * display)
glPopMatrix ();
glPopAttrib ();
#else
glViewport(viewport_dim[0], viewport_dim[1], viewport_dim[2], viewport_dim[3]);
glViewport (viewport_dim[0], viewport_dim[1], viewport_dim[2],
viewport_dim[3]);
#endif
glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, 0);
@ -1831,15 +1807,15 @@ gst_gl_display_on_draw (GstGLDisplay * display)
#else //OPENGL_ES2
const GLfloat vVertices [] =
{1.0f, 1.0f, 0.0f,
const GLfloat vVertices[] = { 1.0f, 1.0f, 0.0f,
1.0f, 0.0f,
-1.0f, 1.0f, 0.0f,
0.0f, 0.0f,
-1.0f, -1.0f, 0.0f,
0.0f, 1.0f,
1.0f, -1.0f, 0.0f,
1.0f, 1.0f};
1.0f, 1.0f
};
GLushort indices[] = { 0, 1, 2, 0, 2, 3 };
@ -2046,7 +2022,19 @@ gst_gl_display_check_framebuffer_status (void)
break;
case GL_FRAMEBUFFER_UNSUPPORTED_EXT:
GST_ERROR ("GL_FRAMEBUFFER_UNSUPPORTED_EXT");
GST_ERROR ("GL_FRAMEBUFFER_UNSUPPORTED");
break;
case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT:
GST_ERROR ("GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT");
break;
case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT:
GST_ERROR ("GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT");
break;
case GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT:
GST_ERROR ("GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS");
break;
default:
@ -2420,6 +2408,14 @@ gst_gl_display_thread_init_upload_fbo (GstGLDisplay * display)
glTexImage2D (GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA8,
display->upload_width, display->upload_height, 0, GL_RGBA,
GL_UNSIGNED_BYTE, NULL);
glTexParameteri (GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER,
GL_LINEAR);
glTexParameteri (GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER,
GL_LINEAR);
glTexParameteri (GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_S,
GL_CLAMP_TO_EDGE);
glTexParameteri (GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_T,
GL_CLAMP_TO_EDGE);
//attach the texture to the FBO to renderer to
glFramebufferTexture2DEXT (GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,
@ -2699,15 +2695,15 @@ gst_gl_display_thread_do_upload_draw (GstGLDisplay * display)
#ifdef OPENGL_ES2
GLint viewport_dim[4];
const GLfloat vVertices [] =
{1.0f, -1.0f, 0.0f,
const GLfloat vVertices[] = { 1.0f, -1.0f, 0.0f,
1.0f, 0.0f,
-1.0f, -1.0f, 0.0f,
0.0f, .0f,
-1.0f, 1.0f, 0.0f,
0.0f, 1.0f,
1.0f, 1.0f, 0.0f,
1.0f, 1.0f};
1.0f, 1.0f
};
GLushort indices[] = { 0, 1, 2, 0, 2, 3 };
#endif
@ -2999,7 +2995,8 @@ gst_gl_display_thread_do_upload_draw (GstGLDisplay * display)
glPopMatrix ();
glPopAttrib ();
#else
glViewport(viewport_dim[0], viewport_dim[1], viewport_dim[2], viewport_dim[3]);
glViewport (viewport_dim[0], viewport_dim[1], viewport_dim[2],
viewport_dim[3]);
#endif
glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, 0);
@ -3022,15 +3019,15 @@ gst_gl_display_thread_do_download_draw_rgb (GstGLDisplay * display)
gint width = display->ouput_texture_width;
gint height = display->ouput_texture_height;
const GLfloat vVertices [] =
{1.0f, -1.0f, 0.0f,
const GLfloat vVertices[] = { 1.0f, -1.0f, 0.0f,
1.0f, 0.0f,
-1.0f, -1.0f, 0.0f,
0.0f, 0.0f,
-1.0f, 1.0f, 0.0f,
0.0f, 1.0f,
1.0f, 1.0f, 0.0f,
1.0f, 1.0f};
1.0f, 1.0f
};
GLushort indices[] = { 0, 1, 2, 0, 2, 3 };
@ -3070,8 +3067,7 @@ gst_gl_display_thread_do_download_draw_rgb (GstGLDisplay * display)
glGetTexImage (GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA,
GL_UNSIGNED_BYTE, data);
#else
glReadPixels (0, 0, width, height, GL_RGBA,
GL_UNSIGNED_BYTE, data);
glReadPixels (0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, data);
#endif
break;
case GST_VIDEO_FORMAT_BGRx:
@ -3088,8 +3084,7 @@ gst_gl_display_thread_do_download_draw_rgb (GstGLDisplay * display)
glGetTexImage (GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGB,
GL_UNSIGNED_BYTE, data);
#else
glReadPixels (0, 0, width, height, GL_RGB,
GL_UNSIGNED_BYTE, data);
glReadPixels (0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE, data);
#endif
break;
case GST_VIDEO_FORMAT_BGR:
@ -3116,15 +3111,15 @@ gst_gl_display_thread_do_download_draw_yuv (GstGLDisplay * display)
#ifdef OPENGL_ES2
GLint viewport_dim[4];
const GLfloat vVertices [] =
{1.0f, -1.0f, 0.0f,
const GLfloat vVertices[] = { 1.0f, -1.0f, 0.0f,
1.0f, 0.0f,
-1.0f, -1.0f, 0.0f,
0.0f, .0f,
-1.0f, 1.0f, 0.0f,
0.0f, 1.0f,
1.0f, 1.0f, 0.0f,
1.0f, 1.0f};
1.0f, 1.0f
};
GLushort indices[] = { 0, 1, 2, 0, 2, 3 };
#endif
@ -3286,7 +3281,8 @@ gst_gl_display_thread_do_download_draw_yuv (GstGLDisplay * display)
glPopMatrix ();
glPopAttrib ();
#else
glViewport(viewport_dim[0], viewport_dim[1], viewport_dim[2], viewport_dim[3]);
glViewport (viewport_dim[0], viewport_dim[1], viewport_dim[2],
viewport_dim[3]);
#endif
glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, 0);