vlc | branch: master | Laurent Aimar <[email protected]> | Sun May 29 16:46:54 2011 +0200| [bee6b903b21eda692cb4fe96ce4fb24fd0de3099] | committer: Laurent Aimar
Used glProgramLocalParameter4fvARB to transmit yuv->rgb coefficients. It seems that some intel drivers did not like the syntax used to embed the coefficients directly into the source code. Also, it is more flexible and will allow runtime changes. > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=bee6b903b21eda692cb4fe96ce4fb24fd0de3099 --- modules/video_output/opengl.c | 37 ++++++++++++++++++++++--------------- 1 files changed, 22 insertions(+), 15 deletions(-) diff --git a/modules/video_output/opengl.c b/modules/video_output/opengl.c index 2cb17b6..345d8a8 100644 --- a/modules/video_output/opengl.c +++ b/modules/video_output/opengl.c @@ -95,12 +95,15 @@ struct vout_display_opengl_t { picture_pool_t *pool; GLuint program; + int local_count; + GLfloat local_value[16][4]; /* fragment_program */ void (*GenProgramsARB)(GLsizei, GLuint *); void (*BindProgramARB)(GLenum, GLuint); void (*ProgramStringARB)(GLenum, GLenum, GLsizei, const GLvoid *); void (*DeleteProgramsARB)(GLsizei, const GLuint *); + void (*ProgramLocalParameter4fvARB)(GLenum, GLuint, const GLfloat *); /* multitexture */ void (*ActiveTextureARB)(GLenum); @@ -138,11 +141,13 @@ vout_display_opengl_t *vout_display_opengl_New(video_format_t *fmt, vgl->BindProgramARB = (void (*)(GLenum, GLuint))vlc_gl_GetProcAddress(vgl->gl, "glBindProgramARB"); vgl->ProgramStringARB = (void (*)(GLenum, GLenum, GLsizei, const GLvoid *))vlc_gl_GetProcAddress(vgl->gl, "glProgramStringARB"); vgl->DeleteProgramsARB = (void (*)(GLsizei, const GLuint *))vlc_gl_GetProcAddress(vgl->gl, "glDeleteProgramsARB"); + vgl->ProgramLocalParameter4fvARB = (void (*)(GLenum, GLuint, const GLfloat *))vlc_gl_GetProcAddress(vgl->gl, "glProgramLocalParameter4fvARB"); supports_fp = vgl->GenProgramsARB && vgl->BindProgramARB && vgl->ProgramStringARB && - vgl->DeleteProgramsARB; + vgl->DeleteProgramsARB && + vgl->ProgramLocalParameter4fvARB; } bool supports_multitexture = false; if (strstr(extensions, "GL_ARB_multitexture")) { @@ -244,6 +249,7 @@ vout_display_opengl_t *vout_display_opengl_New(video_format_t *fmt, /* Build fragment program if needed */ vgl->program = 0; + vgl->local_count = 0; if (supports_fp) { char *code = NULL; @@ -275,26 +281,24 @@ vout_display_opengl_t *vout_display_opengl_New(video_format_t *fmt, "TEX src.%c, fragment.texcoord[1], texture[1], 2D;" "TEX src.%c, fragment.texcoord[2], texture[2], 2D;" - "PARAM muly = { %f, %f, %f };" - "PARAM mulu = { %f, %f, %f };" - "PARAM mulv = { %f, %f, %f };" - "PARAM offset = { %f, %f, %f };" + "PARAM coefficient[4] = { program.local[0..3] };" "TEMP tmp;" - "MAD tmp.rgb, src.xxxx, muly, offset;" - "MAD tmp.rgb, src.yyyy, mulu, tmp;" - "MAD result.color.rgb, src.zzzz, mulv, tmp;" + "MAD tmp.rgb, src.xxxx, coefficient[0], coefficient[3];" + "MAD tmp.rgb, src.yyyy, coefficient[1], tmp;" + "MAD result.color.rgb, src.zzzz, coefficient[2], tmp;" "END"; bool swap_uv = vgl->fmt.i_chroma == VLC_CODEC_YV12 || vgl->fmt.i_chroma == VLC_CODEC_YV9; if (asprintf(&code, template_yuv, swap_uv ? 'z' : 'y', - swap_uv ? 'y' : 'z', - matrix[0][0], matrix[1][0], matrix[2][0], - matrix[0][1], matrix[1][1], matrix[2][1], - matrix[0][2], matrix[1][2], matrix[2][2], - matrix[0][3], matrix[1][3], matrix[2][3]) < 0) + swap_uv ? 'y' : 'z') < 0) code = NULL; + + for (int i = 0; i < 4; i++) + for (int j = 0; j < 4; j++) + vgl->local_value[vgl->local_count + i][j] = j < 3 ? matrix[j][i] : 0.0; + vgl->local_count += 4; } if (code) { vgl->GenProgramsARB(1, &vgl->program); @@ -567,10 +571,13 @@ int vout_display_opengl_Display(vout_display_opengl_t *vgl, glClear(GL_COLOR_BUFFER_BIT); - if (vgl->program) + if (vgl->program) { glEnable(GL_FRAGMENT_PROGRAM_ARB); - else + for (int i = 0; i < vgl->local_count; i++) + vgl->ProgramLocalParameter4fvARB(GL_FRAGMENT_PROGRAM_ARB, i, vgl->local_value[i]); + } else { glEnable(vgl->tex_target); + } #if USE_OPENGL_ES static const GLfloat vertexCoord[] = { _______________________________________________ vlc-commits mailing list [email protected] http://mailman.videolan.org/listinfo/vlc-commits
