summaryrefslogtreecommitdiffstats
path: root/libvo/vo_gl.c
diff options
context:
space:
mode:
Diffstat (limited to 'libvo/vo_gl.c')
-rw-r--r--libvo/vo_gl.c31
1 files changed, 29 insertions, 2 deletions
diff --git a/libvo/vo_gl.c b/libvo/vo_gl.c
index 291a2a3b8a..93dfa6f923 100644
--- a/libvo/vo_gl.c
+++ b/libvo/vo_gl.c
@@ -16,6 +16,7 @@
#ifdef HAVE_NEW_GUI
#include "gui/interface.h"
#endif
+#include "fastmemcpy.h"
#include "libass/ass.h"
#include "libass/ass_mp.h"
@@ -80,6 +81,8 @@ static uint32_t image_width;
static uint32_t image_height;
static uint32_t image_format;
static int many_fmts;
+static int ati_hack;
+static int force_pbo;
static int use_glFinish;
static int swap_interval;
static GLenum gl_target;
@@ -672,6 +675,8 @@ static uint32_t get_image(mp_image_t *mpi) {
if (!gl_buffer)
GenBuffers(1, &gl_buffer);
BindBuffer(GL_PIXEL_UNPACK_BUFFER, gl_buffer);
+ if (ati_hack)
+ mpi->width = (mpi->width + 63) & ~63;
mpi->stride[0] = mpi->width * mpi->bpp / 8;
if (mpi->stride[0] * mpi->height > gl_buffersize) {
BufferData(GL_PIXEL_UNPACK_BUFFER, mpi->stride[0] * mpi->height,
@@ -704,10 +709,24 @@ static uint32_t get_image(mp_image_t *mpi) {
static uint32_t draw_image(mp_image_t *mpi) {
int slice = slice_height;
- int stride[3] = {mpi->stride[0], mpi->stride[1], mpi->stride[2]};
- unsigned char *planes[3] = {mpi->planes[0], mpi->planes[1], mpi->planes[2]};
+ int stride[3];
+ unsigned char *planes[3];
+ mp_image_t mpi2 = *mpi;
if (mpi->flags & MP_IMGFLAG_DRAW_CALLBACK)
return VO_TRUE;
+ mpi2.flags = 0; mpi2.type = MP_IMGTYPE_TEMP;
+ mpi2.width = mpi2.w; mpi2.height = mpi2.h;
+ if (force_pbo && !(mpi->flags & MP_IMGFLAG_DIRECT) && !gl_bufferptr && get_image(&mpi2) == VO_TRUE) {
+ int bpp = mpi->imgfmt == IMGFMT_YV12 ? 1 : mpi->bpp;
+ memcpy_pic(mpi2.planes[0], mpi->planes[0], mpi->w * bpp, mpi->h, mpi2.stride[0], mpi->stride[0]);
+ if (mpi->imgfmt == IMGFMT_YV12) {
+ memcpy_pic(mpi2.planes[1], mpi->planes[1], mpi->w >> 1, mpi->h >> 1, mpi2.stride[1], mpi->stride[1]);
+ memcpy_pic(mpi2.planes[2], mpi->planes[2], mpi->w >> 1, mpi->h >> 1, mpi2.stride[2], mpi->stride[2]);
+ }
+ mpi = &mpi2;
+ }
+ stride[0] = mpi->stride[0]; stride[1] = mpi->stride[1]; stride[2] = mpi->stride[2];
+ planes[0] = mpi->planes[0]; planes[1] = mpi->planes[1]; planes[2] = mpi->planes[2];
mpi_flipped = (stride[0] < 0);
if (mpi->flags & MP_IMGFLAG_DIRECT) {
intptr_t base = (intptr_t)planes[0];
@@ -789,6 +808,8 @@ static opt_t subopts[] = {
{"yuv", OPT_ARG_INT, &use_yuv, (opt_test_f)int_non_neg},
{"lscale", OPT_ARG_INT, &lscale, (opt_test_f)int_non_neg},
{"cscale", OPT_ARG_INT, &cscale, (opt_test_f)int_non_neg},
+ {"ati-hack", OPT_ARG_BOOL, &ati_hack, NULL},
+ {"force-pbo", OPT_ARG_BOOL, &force_pbo, NULL},
{"glfinish", OPT_ARG_BOOL, &use_glFinish, NULL},
{"swapinterval", OPT_ARG_INT, &swap_interval,NULL},
{"customprog", OPT_ARG_MSTRZ,&custom_prog, NULL},
@@ -811,6 +832,8 @@ static int preinit(const char *arg)
cscale = 0;
use_rectangle = 0;
use_glFinish = 0;
+ ati_hack = 0;
+ force_pbo = 0;
swap_interval = 1;
slice_height = 0;
custom_prog = NULL;
@@ -835,6 +858,10 @@ static int preinit(const char *arg)
" 0: use power-of-two textures\n"
" 1: use texture_rectangle\n"
" 2: use texture_non_power_of_two\n"
+ " ati-hack\n"
+ " Workaround ATI bug with PBOs\n"
+ " force-pbo\n"
+ " Force use of PBO even if this involves an extra memcpy\n"
" glfinish\n"
" Call glFinish() before swapping buffers\n"
" swapinterval=<n>\n"