when draw YUV frame use opengl 2.0 and shader on nexus one,but the
function glTexImage2D is too slow ,cost 40-60 ms
who can fix it ? the key codes:
int CreateSimpleTexture2D()
{
int err, i;
for (i=0; i<3;i++)
{
glGenTextures(1, &userData.textureId[i]);
if (err = glGetError()) {
// NSLog(@"Error: Could not generate
texture: %d", err);
__android_log_print(ANDROID_LOG_ERROR,“CreateSimpleTexture2D”,“Error:
Could not generate texture: %d”, err);
return 0;
}
glBindTexture(GL_TEXTURE_2D, userData.textureId[i]);
if (err = glGetError()) {
// NSLog(@"Error: Could not bind texture: %d", err);
__android_log_print(ANDROID_LOG_ERROR,“CreateSimpleTexture2D”,“Error:
Could not bind texture: %d”, err);
return 0;
}
}
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
if (err = glGetError()) {
//NSLog(@"Error: Could not set texture
minimization filter: %d", err);
__android_log_print(ANDROID_LOG_ERROR,“CreateSimpleTexture2D”,“Error:
Could not set texture minimization filter: %d”, err);
return 0;
}
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
if (err = glGetError()) {
// NSLog(@"Error: Could not set texture
magnification filter: %d", err);
__android_log_print(ANDROID_LOG_ERROR,“CreateSimpleTexture2D”,“Error:
Could not set texture magnification filter: %d”, err);
return 0;
}
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,
GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,
GL_CLAMP_TO_EDGE);
glGenerateMipmap(GL_TEXTURE_2D);
return 1;
}
---------------------------------------render frame
glViewport ( 0, 0, g_WindowsWidth, g_WindowsHeight );
checkGlError("glViewport");
//glDrawBuffer(GL_COLOR_ATTACHMENT0);
// Clear the color buffer
glClear ( GL_COLOR_BUFFER_BIT );
checkGlError("glClear");
// Use the program object
glUseProgram ( userData.programObject );
checkGlError("glUseProgram");
// Load the vertex position
glVertexAttribPointer ( userData.positionLoc, 3, GL_FLOAT,
GL_FALSE, 5
-
sizeof(GLfloat), vVertices );
// Load the texture coordinate
glVertexAttribPointer ( userData.texCoordLoc, 2, GL_FLOAT,
GL_FALSE, 5 -
sizeof(GLfloat), &vVertices[3] );
glEnableVertexAttribArray ( userData.positionLoc ); glEnableVertexAttribArray ( userData.texCoordLoc ); long long ttttttt=av_gettime(); // Bind the texture glActiveTexture ( GL_TEXTURE1 ); glBindTexture ( GL_TEXTURE_2D, userData.textureId[1] ); glUniform1i ( userData.samplerLocU, 1); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,
GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,
GL_CLAMP_TO_EDGE);
//glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
//glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
//glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
//glPixelStorei(GL_UNPACK_ALIGNMENT,1);
glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, width/2,
height/2, 0,
GL_LUMINANCE, GL_UNSIGNED_BYTE, pict->data[1]);
checkGlError(“glTexImage2D…pict->data[1]”);
//glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, width0.5,
height0.5, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, pict->data[1]);
// Bind the texture
glActiveTexture ( GL_TEXTURE2 );
glBindTexture ( GL_TEXTURE_2D, userData.textureId[2] );
glUniform1i ( userData.samplerLocV, 2);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,
GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,
GL_CLAMP_TO_EDGE);
//glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
//glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
//glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
//glPixelStorei(GL_UNPACK_ALIGNMENT,1);
glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE,width/2, height/2, 0,
GL_LUMINANCE, GL_UNSIGNED_BYTE, pict->data[2]);
checkGlError("glTexImage2D....pict->data[2]");
// Set the sampler texture unit to 0
glActiveTexture ( GL_TEXTURE0 );
glBindTexture ( GL_TEXTURE_2D, userData.textureId[0] );
glUniform1i ( userData.samplerLocY, 0);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,
GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,
GL_CLAMP_TO_EDGE);
//glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
//glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
//glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
//glPixelStorei(GL_UNPACK_ALIGNMENT,1);
glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, width, height, 0,
GL_LUMINANCE, GL_UNSIGNED_BYTE, pict->data[0]);
__android_log_print(ANDROID_LOG_ERROR,“GPU”,"%lld",(av_gettime()-ttttttt)/1000);
checkGlError(“glTexImage2D…pict->data[0]”);
glDrawElements ( GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, indices );