From 9d065b41e8a467667c469f07a7defc063190d5b5 Mon Sep 17 00:00:00 2001 From: reimar Date: Mon, 24 Nov 2008 11:04:50 +0000 Subject: More hacks around ATI driver problems, 8.11 ignores UNPACK_BUFFER pointer offsets. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@28021 b3059339-0415-0410-9bf9-f77b7e298cf2 --- libvo/vo_gl.c | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) (limited to 'libvo/vo_gl.c') diff --git a/libvo/vo_gl.c b/libvo/vo_gl.c index a75379b9e0..00bb676c3b 100644 --- a/libvo/vo_gl.c +++ b/libvo/vo_gl.c @@ -91,8 +91,11 @@ static GLint gl_texfmt; static GLenum gl_format; static GLenum gl_type; static GLuint gl_buffer; +static GLuint gl_buffer_uv[2]; static int gl_buffersize; +static int gl_buffersize_uv; static void *gl_bufferptr; +static void *gl_bufferptr_uv[2]; static GLuint fragprog; static GLuint default_texs[22]; static char *custom_prog; @@ -381,6 +384,10 @@ static void uninitGl(void) { DeleteBuffers(1, &gl_buffer); gl_buffer = 0; gl_buffersize = 0; gl_bufferptr = NULL; + if (DeleteBuffers && gl_buffer_uv[0]) + DeleteBuffers(2, gl_buffer_uv); + gl_buffer_uv[0] = gl_buffer_uv[1] = 0; gl_buffersize_uv = 0; + gl_bufferptr_uv[0] = gl_bufferptr_uv[1] = 0; err_shown = 0; } @@ -713,6 +720,27 @@ static uint32_t get_image(mp_image_t *mpi) { mpi->stride[1] = mpi->width >> 1; mpi->planes[2] = mpi->planes[1] + mpi->stride[1] * (mpi->height >> 1); mpi->stride[2] = mpi->width >> 1; + if (ati_hack) { + mpi->flags &= ~MP_IMGFLAG_COMMON_PLANE; + if (!gl_buffer_uv[0]) GenBuffers(2, gl_buffer_uv); + if (mpi->stride[1] * mpi->height > gl_buffersize_uv) { + BindBuffer(GL_PIXEL_UNPACK_BUFFER, gl_buffer_uv[0]); + BufferData(GL_PIXEL_UNPACK_BUFFER, mpi->stride[1] * mpi->height, + NULL, GL_DYNAMIC_DRAW); + BindBuffer(GL_PIXEL_UNPACK_BUFFER, gl_buffer_uv[1]); + BufferData(GL_PIXEL_UNPACK_BUFFER, mpi->stride[1] * mpi->height, + NULL, GL_DYNAMIC_DRAW); + gl_buffersize_uv = mpi->stride[1] * mpi->height; + } + if (!gl_bufferptr_uv[0]) { + BindBuffer(GL_PIXEL_UNPACK_BUFFER, gl_buffer_uv[0]); + gl_bufferptr_uv[0] = MapBuffer(GL_PIXEL_UNPACK_BUFFER, GL_WRITE_ONLY); + BindBuffer(GL_PIXEL_UNPACK_BUFFER, gl_buffer_uv[1]); + gl_bufferptr_uv[1] = MapBuffer(GL_PIXEL_UNPACK_BUFFER, GL_WRITE_ONLY); + } + mpi->planes[1] = gl_bufferptr_uv[0]; + mpi->planes[2] = gl_bufferptr_uv[1]; + } } mpi->flags |= MP_IMGFLAG_DIRECT; return VO_TRUE; @@ -752,13 +780,25 @@ static uint32_t draw_image(mp_image_t *mpi) { UnmapBuffer(GL_PIXEL_UNPACK_BUFFER); gl_bufferptr = NULL; slice = 0; // always "upload" full texture + if (!(mpi->flags & MP_IMGFLAG_COMMON_PLANE)) + planes[0] = planes[1] = planes[2] = NULL; } glUploadTex(gl_target, gl_format, gl_type, planes[0], stride[0], mpi->x, mpi->y, w, h, slice); if (mpi->imgfmt == IMGFMT_YV12) { + if ((mpi->flags & MP_IMGFLAG_DIRECT) && !(mpi->flags & MP_IMGFLAG_COMMON_PLANE)) { + BindBuffer(GL_PIXEL_UNPACK_BUFFER, gl_buffer_uv[0]); + UnmapBuffer(GL_PIXEL_UNPACK_BUFFER); + gl_bufferptr_uv[0] = NULL; + } ActiveTexture(GL_TEXTURE1); glUploadTex(gl_target, gl_format, gl_type, planes[1], stride[1], mpi->x / 2, mpi->y / 2, w / 2, h / 2, slice); + if ((mpi->flags & MP_IMGFLAG_DIRECT) && !(mpi->flags & MP_IMGFLAG_COMMON_PLANE)) { + BindBuffer(GL_PIXEL_UNPACK_BUFFER, gl_buffer_uv[1]); + UnmapBuffer(GL_PIXEL_UNPACK_BUFFER); + gl_bufferptr_uv[1] = NULL; + } ActiveTexture(GL_TEXTURE2); glUploadTex(gl_target, gl_format, gl_type, planes[2], stride[2], mpi->x / 2, mpi->y / 2, w / 2, h / 2, slice); -- cgit v1.2.3 From 16a685b00cd92f76d51f4b86f6f54e7f124cad87 Mon Sep 17 00:00:00 2001 From: reimar Date: Tue, 25 Nov 2008 18:24:23 +0000 Subject: 100l, OSD alpha textures were cleared to the wrong value. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@28036 b3059339-0415-0410-9bf9-f77b7e298cf2 --- libvo/vo_gl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'libvo/vo_gl.c') diff --git a/libvo/vo_gl.c b/libvo/vo_gl.c index 00bb676c3b..b783a5b9b7 100644 --- a/libvo/vo_gl.c +++ b/libvo/vo_gl.c @@ -544,7 +544,7 @@ static void create_osd_texture(int x0, int y0, int w, int h, #ifndef FAST_OSD glGenTextures(1, &osdatex[osdtexCnt]); BindTexture(gl_target, osdatex[osdtexCnt]); - glCreateClearTex(gl_target, GL_ALPHA, GL_ALPHA, GL_UNSIGNED_BYTE, scale_type, sx, sy, 255); + glCreateClearTex(gl_target, GL_ALPHA, GL_ALPHA, GL_UNSIGNED_BYTE, scale_type, sx, sy, 0); { int i; char *tmp = malloc(stride * h); -- cgit v1.2.3