2012-10-03 18:25:41 +02:00
|
|
|
/*
|
2015-04-13 09:36:54 +02:00
|
|
|
* This file is part of mpv.
|
2012-10-03 18:25:41 +02:00
|
|
|
*
|
2016-01-19 18:36:34 +01:00
|
|
|
* mpv is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
|
|
* License as published by the Free Software Foundation; either
|
|
|
|
* version 2.1 of the License, or (at your option) any later version.
|
2012-10-03 18:25:41 +02:00
|
|
|
*
|
2015-04-13 09:36:54 +02:00
|
|
|
* mpv is distributed in the hope that it will be useful,
|
2012-10-03 18:25:41 +02:00
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
2016-01-19 18:36:34 +01:00
|
|
|
* GNU Lesser General Public License for more details.
|
2015-06-08 22:13:00 +02:00
|
|
|
*
|
2016-01-19 18:36:34 +01:00
|
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
|
|
* License along with mpv. If not, see <http://www.gnu.org/licenses/>.
|
2012-10-03 18:25:41 +02:00
|
|
|
*/
|
|
|
|
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <assert.h>
|
sub, vo_opengl: use packed sub-bitmaps directly if available
The previous few commits changed sd_lavc.c's output to packed RGB sub-
images. In particular, this means all sub-bitmaps are part of a larger,
single bitmap. Change the vo_opengl OSD code such that it can make use
of this, and upload the pre-packed image, instead of packing and copying
them again.
This complicates the upload code a bit (4 code paths due to messy PBO
handling). The plan is to make sub-bitmaps always packed, but some more
work is required to reach this point. The plan is to pack libass images
as well. Since this implies a copy, this will make it easy to refcount
the result.
(This is all targeted towards vo_opengl. Other VOs, vo_xv, vo_x11, and
vo_wayland in particular, will become less efficient. Although at least
vo_vdpau and vo_direct3d could be switched to the new method as well.)
2016-06-17 23:11:05 +02:00
|
|
|
#include <limits.h>
|
|
|
|
|
2012-10-03 18:25:41 +02:00
|
|
|
#include <libavutil/common.h>
|
|
|
|
|
2016-05-12 20:08:49 +02:00
|
|
|
#include "formats.h"
|
2015-08-29 04:12:56 +02:00
|
|
|
#include "utils.h"
|
|
|
|
#include "osd.h"
|
2012-10-03 18:25:41 +02:00
|
|
|
|
vo_opengl: fix alpha values written to the framebuffer
When blending OSD and subtitles onto the video, we write bogus alpha
values. This doesn't normally matter, because these values are normally
unused and discarded. But at least on Wayland, the alpha values are used
by the compositor and leads to transparent windows even with opaque
video on places where the OSD happens to use transparency.
(Also see github issue #338.)
Until now, the alpha basically contained garbage. The source factor
GL_SRC_ALPHA meant that alpha was multiplied with itself. Use GL_ONE
instead (which is why we have to use glBlendFuncSeparate()). This should
give correct results, even with video that has alpha. (Or at least it's
something close to correct, I haven't thought too hard how the
compositor will blend it, and in fact I couldn't manage to test it.)
If glBlendFuncSeparate() is not available, fall back to glBlendFunc(),
which does the same as the code did before this commit. Technically, we
support GL 1.1, but glBlendFuncSeparate is 1.4, and I guess we should
try not to crash if vo_opengl_old runs on a system with GL 1.1 drivers
only.
2013-11-10 03:14:13 +01:00
|
|
|
// glBlendFuncSeparate() arguments
|
|
|
|
static const int blend_factors[SUBBITMAP_COUNT][4] = {
|
|
|
|
[SUBBITMAP_LIBASS] = {GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA,
|
|
|
|
GL_ONE, GL_ONE_MINUS_SRC_ALPHA},
|
|
|
|
[SUBBITMAP_RGBA] = {GL_ONE, GL_ONE_MINUS_SRC_ALPHA,
|
|
|
|
GL_ONE, GL_ONE_MINUS_SRC_ALPHA},
|
2012-10-03 18:25:41 +02:00
|
|
|
};
|
|
|
|
|
2015-01-29 18:29:28 +01:00
|
|
|
struct vertex {
|
|
|
|
float position[2];
|
|
|
|
float texcoord[2];
|
vo_opengl: refactor shader generation (part 1)
The basic idea is to use dynamically generated shaders instead of a
single monolithic file + a ton of ifdefs. Instead of having to setup
every aspect of it separately (like compiling shaders, setting uniforms,
perfoming the actual rendering steps, the GLSL parts), we generate the
GLSL on the fly, and perform the rendering at the same time. The GLSL
is regenerated every frame, but the actual compiled OpenGL-level shaders
are cached, which makes it fast again. Almost all logic can be in a
single place.
The new code is significantly more flexible, which allows us to improve
the code clarity, performance and add more features easily.
This commit is incomplete. It drops almost all previous code, and
readds only the most important things (some of them actually buggy).
The next commit will complete it - it's separate to preserve authorship
information.
2015-03-12 21:57:54 +01:00
|
|
|
uint8_t ass_color[4];
|
2015-01-29 18:29:28 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
static const struct gl_vao_entry vertex_vao[] = {
|
vo_opengl: refactor shader generation (part 1)
The basic idea is to use dynamically generated shaders instead of a
single monolithic file + a ton of ifdefs. Instead of having to setup
every aspect of it separately (like compiling shaders, setting uniforms,
perfoming the actual rendering steps, the GLSL parts), we generate the
GLSL on the fly, and perform the rendering at the same time. The GLSL
is regenerated every frame, but the actual compiled OpenGL-level shaders
are cached, which makes it fast again. Almost all logic can be in a
single place.
The new code is significantly more flexible, which allows us to improve
the code clarity, performance and add more features easily.
This commit is incomplete. It drops almost all previous code, and
readds only the most important things (some of them actually buggy).
The next commit will complete it - it's separate to preserve authorship
information.
2015-03-12 21:57:54 +01:00
|
|
|
{"position", 2, GL_FLOAT, false, offsetof(struct vertex, position)},
|
|
|
|
{"texcoord" , 2, GL_FLOAT, false, offsetof(struct vertex, texcoord)},
|
|
|
|
{"ass_color", 4, GL_UNSIGNED_BYTE, true, offsetof(struct vertex, ass_color)},
|
2015-01-29 18:29:28 +01:00
|
|
|
{0}
|
|
|
|
};
|
|
|
|
|
vo_opengl: refactor shader generation (part 1)
The basic idea is to use dynamically generated shaders instead of a
single monolithic file + a ton of ifdefs. Instead of having to setup
every aspect of it separately (like compiling shaders, setting uniforms,
perfoming the actual rendering steps, the GLSL parts), we generate the
GLSL on the fly, and perform the rendering at the same time. The GLSL
is regenerated every frame, but the actual compiled OpenGL-level shaders
are cached, which makes it fast again. Almost all logic can be in a
single place.
The new code is significantly more flexible, which allows us to improve
the code clarity, performance and add more features easily.
This commit is incomplete. It drops almost all previous code, and
readds only the most important things (some of them actually buggy).
The next commit will complete it - it's separate to preserve authorship
information.
2015-03-12 21:57:54 +01:00
|
|
|
struct mpgl_osd_part {
|
|
|
|
enum sub_bitmap_format format;
|
2015-03-18 12:33:14 +01:00
|
|
|
int change_id;
|
vo_opengl: refactor shader generation (part 1)
The basic idea is to use dynamically generated shaders instead of a
single monolithic file + a ton of ifdefs. Instead of having to setup
every aspect of it separately (like compiling shaders, setting uniforms,
perfoming the actual rendering steps, the GLSL parts), we generate the
GLSL on the fly, and perform the rendering at the same time. The GLSL
is regenerated every frame, but the actual compiled OpenGL-level shaders
are cached, which makes it fast again. Almost all logic can be in a
single place.
The new code is significantly more flexible, which allows us to improve
the code clarity, performance and add more features easily.
This commit is incomplete. It drops almost all previous code, and
readds only the most important things (some of them actually buggy).
The next commit will complete it - it's separate to preserve authorship
information.
2015-03-12 21:57:54 +01:00
|
|
|
GLuint texture;
|
|
|
|
int w, h;
|
2016-07-03 16:00:51 +02:00
|
|
|
struct gl_pbo_upload pbo;
|
vo_opengl: refactor shader generation (part 1)
The basic idea is to use dynamically generated shaders instead of a
single monolithic file + a ton of ifdefs. Instead of having to setup
every aspect of it separately (like compiling shaders, setting uniforms,
perfoming the actual rendering steps, the GLSL parts), we generate the
GLSL on the fly, and perform the rendering at the same time. The GLSL
is regenerated every frame, but the actual compiled OpenGL-level shaders
are cached, which makes it fast again. Almost all logic can be in a
single place.
The new code is significantly more flexible, which allows us to improve
the code clarity, performance and add more features easily.
This commit is incomplete. It drops almost all previous code, and
readds only the most important things (some of them actually buggy).
The next commit will complete it - it's separate to preserve authorship
information.
2015-03-12 21:57:54 +01:00
|
|
|
int num_subparts;
|
2015-08-18 22:59:22 +02:00
|
|
|
int prev_num_subparts;
|
vo_opengl: refactor shader generation (part 1)
The basic idea is to use dynamically generated shaders instead of a
single monolithic file + a ton of ifdefs. Instead of having to setup
every aspect of it separately (like compiling shaders, setting uniforms,
perfoming the actual rendering steps, the GLSL parts), we generate the
GLSL on the fly, and perform the rendering at the same time. The GLSL
is regenerated every frame, but the actual compiled OpenGL-level shaders
are cached, which makes it fast again. Almost all logic can be in a
single place.
The new code is significantly more flexible, which allows us to improve
the code clarity, performance and add more features easily.
This commit is incomplete. It drops almost all previous code, and
readds only the most important things (some of them actually buggy).
The next commit will complete it - it's separate to preserve authorship
information.
2015-03-12 21:57:54 +01:00
|
|
|
struct sub_bitmap *subparts;
|
|
|
|
struct vertex *vertices;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct mpgl_osd {
|
|
|
|
struct mp_log *log;
|
|
|
|
struct osd_state *osd;
|
|
|
|
GL *gl;
|
|
|
|
bool use_pbo;
|
|
|
|
struct mpgl_osd_part *parts[MAX_OSD_PARTS];
|
2016-05-12 20:08:49 +02:00
|
|
|
const struct gl_format *fmt_table[SUBBITMAP_COUNT];
|
vo_opengl: refactor shader generation (part 1)
The basic idea is to use dynamically generated shaders instead of a
single monolithic file + a ton of ifdefs. Instead of having to setup
every aspect of it separately (like compiling shaders, setting uniforms,
perfoming the actual rendering steps, the GLSL parts), we generate the
GLSL on the fly, and perform the rendering at the same time. The GLSL
is regenerated every frame, but the actual compiled OpenGL-level shaders
are cached, which makes it fast again. Almost all logic can be in a
single place.
The new code is significantly more flexible, which allows us to improve
the code clarity, performance and add more features easily.
This commit is incomplete. It drops almost all previous code, and
readds only the most important things (some of them actually buggy).
The next commit will complete it - it's separate to preserve authorship
information.
2015-03-12 21:57:54 +01:00
|
|
|
bool formats[SUBBITMAP_COUNT];
|
|
|
|
struct gl_vao vao;
|
2015-08-18 22:59:22 +02:00
|
|
|
int64_t change_counter;
|
vo_opengl: refactor shader generation (part 1)
The basic idea is to use dynamically generated shaders instead of a
single monolithic file + a ton of ifdefs. Instead of having to setup
every aspect of it separately (like compiling shaders, setting uniforms,
perfoming the actual rendering steps, the GLSL parts), we generate the
GLSL on the fly, and perform the rendering at the same time. The GLSL
is regenerated every frame, but the actual compiled OpenGL-level shaders
are cached, which makes it fast again. Almost all logic can be in a
single place.
The new code is significantly more flexible, which allows us to improve
the code clarity, performance and add more features easily.
This commit is incomplete. It drops almost all previous code, and
readds only the most important things (some of them actually buggy).
The next commit will complete it - it's separate to preserve authorship
information.
2015-03-12 21:57:54 +01:00
|
|
|
// temporary
|
|
|
|
int stereo_mode;
|
2016-03-21 22:23:41 +01:00
|
|
|
struct mp_osd_res osd_res;
|
vo_opengl: refactor shader generation (part 1)
The basic idea is to use dynamically generated shaders instead of a
single monolithic file + a ton of ifdefs. Instead of having to setup
every aspect of it separately (like compiling shaders, setting uniforms,
perfoming the actual rendering steps, the GLSL parts), we generate the
GLSL on the fly, and perform the rendering at the same time. The GLSL
is regenerated every frame, but the actual compiled OpenGL-level shaders
are cached, which makes it fast again. Almost all logic can be in a
single place.
The new code is significantly more flexible, which allows us to improve
the code clarity, performance and add more features easily.
This commit is incomplete. It drops almost all previous code, and
readds only the most important things (some of them actually buggy).
The next commit will complete it - it's separate to preserve authorship
information.
2015-03-12 21:57:54 +01:00
|
|
|
void *scratch;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct mpgl_osd *mpgl_osd_init(GL *gl, struct mp_log *log, struct osd_state *osd)
|
2012-10-03 18:25:41 +02:00
|
|
|
{
|
|
|
|
struct mpgl_osd *ctx = talloc_ptrtype(NULL, ctx);
|
|
|
|
*ctx = (struct mpgl_osd) {
|
2013-09-12 01:33:33 +02:00
|
|
|
.log = log,
|
2014-06-15 20:46:57 +02:00
|
|
|
.osd = osd,
|
2012-10-03 18:25:41 +02:00
|
|
|
.gl = gl,
|
|
|
|
.scratch = talloc_zero_size(ctx, 1),
|
|
|
|
};
|
|
|
|
|
2016-05-12 20:08:49 +02:00
|
|
|
ctx->fmt_table[SUBBITMAP_LIBASS] = gl_find_unorm_format(gl, 1, 1);
|
|
|
|
ctx->fmt_table[SUBBITMAP_RGBA] = gl_find_unorm_format(gl, 1, 4);
|
2014-12-16 18:55:02 +01:00
|
|
|
|
2016-07-01 19:47:31 +02:00
|
|
|
for (int n = 0; n < MAX_OSD_PARTS; n++)
|
|
|
|
ctx->parts[n] = talloc_zero(ctx, struct mpgl_osd_part);
|
2012-10-03 18:25:41 +02:00
|
|
|
|
VO, sub: refactor
Remove VFCTRL_DRAW_OSD, VFCAP_EOSD_FILTER, VFCAP_EOSD_RGBA, VFCAP_EOSD,
VOCTRL_DRAW_EOSD, VOCTRL_GET_EOSD_RES, VOCTRL_QUERY_EOSD_FORMAT.
Remove draw_osd_with_eosd(), which rendered the OSD by calling
VOCTRL_DRAW_EOSD. Change VOs to call osd_draw() directly, which takes
a callback as argument. (This basically works like the old OSD API,
except multiple OSD bitmap formats are supported and caching is
possible.)
Remove all mentions of "eosd". It's simply "osd" now.
Make OSD size per-OSD-object, as they can be different when using
vf_sub. Include display_par/video_par in resolution change detection.
Fix the issue with margin borders in vo_corevideo.
2012-10-19 19:25:18 +02:00
|
|
|
for (int n = 0; n < SUBBITMAP_COUNT; n++)
|
2016-05-12 20:08:49 +02:00
|
|
|
ctx->formats[n] = !!ctx->fmt_table[n];
|
VO, sub: refactor
Remove VFCTRL_DRAW_OSD, VFCAP_EOSD_FILTER, VFCAP_EOSD_RGBA, VFCAP_EOSD,
VOCTRL_DRAW_EOSD, VOCTRL_GET_EOSD_RES, VOCTRL_QUERY_EOSD_FORMAT.
Remove draw_osd_with_eosd(), which rendered the OSD by calling
VOCTRL_DRAW_EOSD. Change VOs to call osd_draw() directly, which takes
a callback as argument. (This basically works like the old OSD API,
except multiple OSD bitmap formats are supported and caching is
possible.)
Remove all mentions of "eosd". It's simply "osd" now.
Make OSD size per-OSD-object, as they can be different when using
vf_sub. Include display_par/video_par in resolution change detection.
Fix the issue with margin borders in vo_corevideo.
2012-10-19 19:25:18 +02:00
|
|
|
|
2015-01-29 18:29:28 +01:00
|
|
|
gl_vao_init(&ctx->vao, gl, sizeof(struct vertex), vertex_vao);
|
|
|
|
|
2012-10-03 18:25:41 +02:00
|
|
|
return ctx;
|
|
|
|
}
|
|
|
|
|
|
|
|
void mpgl_osd_destroy(struct mpgl_osd *ctx)
|
|
|
|
{
|
2014-06-15 20:46:57 +02:00
|
|
|
if (!ctx)
|
|
|
|
return;
|
|
|
|
|
2012-10-03 18:25:41 +02:00
|
|
|
GL *gl = ctx->gl;
|
|
|
|
|
2015-01-29 18:29:28 +01:00
|
|
|
gl_vao_uninit(&ctx->vao);
|
|
|
|
|
2012-10-03 18:25:41 +02:00
|
|
|
for (int n = 0; n < MAX_OSD_PARTS; n++) {
|
|
|
|
struct mpgl_osd_part *p = ctx->parts[n];
|
|
|
|
gl->DeleteTextures(1, &p->texture);
|
2016-07-03 16:00:51 +02:00
|
|
|
gl_pbo_upload_uninit(&p->pbo);
|
2012-10-03 18:25:41 +02:00
|
|
|
}
|
|
|
|
talloc_free(ctx);
|
|
|
|
}
|
|
|
|
|
vo_opengl: refactor shader generation (part 1)
The basic idea is to use dynamically generated shaders instead of a
single monolithic file + a ton of ifdefs. Instead of having to setup
every aspect of it separately (like compiling shaders, setting uniforms,
perfoming the actual rendering steps, the GLSL parts), we generate the
GLSL on the fly, and perform the rendering at the same time. The GLSL
is regenerated every frame, but the actual compiled OpenGL-level shaders
are cached, which makes it fast again. Almost all logic can be in a
single place.
The new code is significantly more flexible, which allows us to improve
the code clarity, performance and add more features easily.
This commit is incomplete. It drops almost all previous code, and
readds only the most important things (some of them actually buggy).
The next commit will complete it - it's separate to preserve authorship
information.
2015-03-12 21:57:54 +01:00
|
|
|
void mpgl_osd_set_options(struct mpgl_osd *ctx, bool pbo)
|
|
|
|
{
|
|
|
|
ctx->use_pbo = pbo;
|
|
|
|
}
|
|
|
|
|
sub, vo_opengl: use packed sub-bitmaps directly if available
The previous few commits changed sd_lavc.c's output to packed RGB sub-
images. In particular, this means all sub-bitmaps are part of a larger,
single bitmap. Change the vo_opengl OSD code such that it can make use
of this, and upload the pre-packed image, instead of packing and copying
them again.
This complicates the upload code a bit (4 code paths due to messy PBO
handling). The plan is to make sub-bitmaps always packed, but some more
work is required to reach this point. The plan is to pack libass images
as well. Since this implies a copy, this will make it easy to refcount
the result.
(This is all targeted towards vo_opengl. Other VOs, vo_xv, vo_x11, and
vo_wayland in particular, will become less efficient. Although at least
vo_vdpau and vo_direct3d could be switched to the new method as well.)
2016-06-17 23:11:05 +02:00
|
|
|
static int next_pow2(int v)
|
|
|
|
{
|
|
|
|
for (int x = 0; x < 30; x++) {
|
|
|
|
if ((1 << x) >= v)
|
|
|
|
return 1 << x;
|
|
|
|
}
|
|
|
|
return INT_MAX;
|
|
|
|
}
|
|
|
|
|
2012-10-03 18:25:41 +02:00
|
|
|
static bool upload_osd(struct mpgl_osd *ctx, struct mpgl_osd_part *osd,
|
|
|
|
struct sub_bitmaps *imgs)
|
|
|
|
{
|
|
|
|
GL *gl = ctx->gl;
|
2016-07-03 17:33:59 +02:00
|
|
|
bool ok = false;
|
2012-10-03 18:25:41 +02:00
|
|
|
|
2016-07-01 19:47:31 +02:00
|
|
|
assert(imgs->packed);
|
|
|
|
|
|
|
|
int req_w = next_pow2(imgs->packed_w);
|
|
|
|
int req_h = next_pow2(imgs->packed_h);
|
sub, vo_opengl: use packed sub-bitmaps directly if available
The previous few commits changed sd_lavc.c's output to packed RGB sub-
images. In particular, this means all sub-bitmaps are part of a larger,
single bitmap. Change the vo_opengl OSD code such that it can make use
of this, and upload the pre-packed image, instead of packing and copying
them again.
This complicates the upload code a bit (4 code paths due to messy PBO
handling). The plan is to make sub-bitmaps always packed, but some more
work is required to reach this point. The plan is to pack libass images
as well. Since this implies a copy, this will make it easy to refcount
the result.
(This is all targeted towards vo_opengl. Other VOs, vo_xv, vo_x11, and
vo_wayland in particular, will become less efficient. Although at least
vo_vdpau and vo_direct3d could be switched to the new method as well.)
2016-06-17 23:11:05 +02:00
|
|
|
|
2016-05-12 20:08:49 +02:00
|
|
|
const struct gl_format *fmt = ctx->fmt_table[imgs->format];
|
|
|
|
assert(fmt);
|
2012-10-03 18:25:41 +02:00
|
|
|
|
|
|
|
if (!osd->texture)
|
|
|
|
gl->GenTextures(1, &osd->texture);
|
|
|
|
|
|
|
|
gl->BindTexture(GL_TEXTURE_2D, osd->texture);
|
|
|
|
|
sub, vo_opengl: use packed sub-bitmaps directly if available
The previous few commits changed sd_lavc.c's output to packed RGB sub-
images. In particular, this means all sub-bitmaps are part of a larger,
single bitmap. Change the vo_opengl OSD code such that it can make use
of this, and upload the pre-packed image, instead of packing and copying
them again.
This complicates the upload code a bit (4 code paths due to messy PBO
handling). The plan is to make sub-bitmaps always packed, but some more
work is required to reach this point. The plan is to pack libass images
as well. Since this implies a copy, this will make it easy to refcount
the result.
(This is all targeted towards vo_opengl. Other VOs, vo_xv, vo_x11, and
vo_wayland in particular, will become less efficient. Although at least
vo_vdpau and vo_direct3d could be switched to the new method as well.)
2016-06-17 23:11:05 +02:00
|
|
|
if (req_w > osd->w || req_h > osd->h || osd->format != imgs->format) {
|
2012-10-03 18:25:41 +02:00
|
|
|
osd->format = imgs->format;
|
sub, vo_opengl: use packed sub-bitmaps directly if available
The previous few commits changed sd_lavc.c's output to packed RGB sub-
images. In particular, this means all sub-bitmaps are part of a larger,
single bitmap. Change the vo_opengl OSD code such that it can make use
of this, and upload the pre-packed image, instead of packing and copying
them again.
This complicates the upload code a bit (4 code paths due to messy PBO
handling). The plan is to make sub-bitmaps always packed, but some more
work is required to reach this point. The plan is to pack libass images
as well. Since this implies a copy, this will make it easy to refcount
the result.
(This is all targeted towards vo_opengl. Other VOs, vo_xv, vo_x11, and
vo_wayland in particular, will become less efficient. Although at least
vo_vdpau and vo_direct3d could be switched to the new method as well.)
2016-06-17 23:11:05 +02:00
|
|
|
osd->w = FFMAX(32, req_w);
|
|
|
|
osd->h = FFMAX(32, req_h);
|
2012-10-03 18:25:41 +02:00
|
|
|
|
2016-07-03 17:33:59 +02:00
|
|
|
MP_VERBOSE(ctx, "Reallocating OSD texture to %dx%d.\n", osd->w, osd->h);
|
|
|
|
|
|
|
|
GLint max_wh;
|
|
|
|
gl->GetIntegerv(GL_MAX_TEXTURE_SIZE, &max_wh);
|
|
|
|
|
|
|
|
if (osd->w > max_wh || osd->h > max_wh) {
|
|
|
|
MP_ERR(ctx, "OSD bitmaps do not fit on a surface with the maximum "
|
|
|
|
"supported size %dx%d.\n", max_wh, max_wh);
|
|
|
|
goto done;
|
|
|
|
}
|
|
|
|
|
2016-05-12 20:08:49 +02:00
|
|
|
gl->TexImage2D(GL_TEXTURE_2D, 0, fmt->internal_format, osd->w, osd->h,
|
|
|
|
0, fmt->format, fmt->type, NULL);
|
2012-10-03 18:25:41 +02:00
|
|
|
|
|
|
|
gl->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
|
|
|
gl->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
|
|
|
gl->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
|
|
|
gl->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
|
|
|
}
|
|
|
|
|
2016-07-03 16:00:51 +02:00
|
|
|
gl_pbo_upload_tex(&osd->pbo, gl, ctx->use_pbo, GL_TEXTURE_2D, fmt->format,
|
|
|
|
fmt->type, osd->w, osd->h, imgs->packed->planes[0],
|
|
|
|
imgs->packed->stride[0], 0, 0,
|
|
|
|
imgs->packed_w, imgs->packed_h);
|
2016-07-03 17:33:59 +02:00
|
|
|
ok = true;
|
2012-10-03 18:25:41 +02:00
|
|
|
|
2016-07-03 17:33:59 +02:00
|
|
|
done:
|
2012-10-03 18:25:41 +02:00
|
|
|
gl->BindTexture(GL_TEXTURE_2D, 0);
|
2016-07-03 17:33:59 +02:00
|
|
|
return ok;
|
2012-10-03 18:25:41 +02:00
|
|
|
}
|
|
|
|
|
vo_opengl: refactor shader generation (part 1)
The basic idea is to use dynamically generated shaders instead of a
single monolithic file + a ton of ifdefs. Instead of having to setup
every aspect of it separately (like compiling shaders, setting uniforms,
perfoming the actual rendering steps, the GLSL parts), we generate the
GLSL on the fly, and perform the rendering at the same time. The GLSL
is regenerated every frame, but the actual compiled OpenGL-level shaders
are cached, which makes it fast again. Almost all logic can be in a
single place.
The new code is significantly more flexible, which allows us to improve
the code clarity, performance and add more features easily.
This commit is incomplete. It drops almost all previous code, and
readds only the most important things (some of them actually buggy).
The next commit will complete it - it's separate to preserve authorship
information.
2015-03-12 21:57:54 +01:00
|
|
|
static void gen_osd_cb(void *pctx, struct sub_bitmaps *imgs)
|
2012-10-03 18:25:41 +02:00
|
|
|
{
|
vo_opengl: refactor shader generation (part 1)
The basic idea is to use dynamically generated shaders instead of a
single monolithic file + a ton of ifdefs. Instead of having to setup
every aspect of it separately (like compiling shaders, setting uniforms,
perfoming the actual rendering steps, the GLSL parts), we generate the
GLSL on the fly, and perform the rendering at the same time. The GLSL
is regenerated every frame, but the actual compiled OpenGL-level shaders
are cached, which makes it fast again. Almost all logic can be in a
single place.
The new code is significantly more flexible, which allows us to improve
the code clarity, performance and add more features easily.
This commit is incomplete. It drops almost all previous code, and
readds only the most important things (some of them actually buggy).
The next commit will complete it - it's separate to preserve authorship
information.
2015-03-12 21:57:54 +01:00
|
|
|
struct mpgl_osd *ctx = pctx;
|
|
|
|
|
VO, sub: refactor
Remove VFCTRL_DRAW_OSD, VFCAP_EOSD_FILTER, VFCAP_EOSD_RGBA, VFCAP_EOSD,
VOCTRL_DRAW_EOSD, VOCTRL_GET_EOSD_RES, VOCTRL_QUERY_EOSD_FORMAT.
Remove draw_osd_with_eosd(), which rendered the OSD by calling
VOCTRL_DRAW_EOSD. Change VOs to call osd_draw() directly, which takes
a callback as argument. (This basically works like the old OSD API,
except multiple OSD bitmap formats are supported and caching is
possible.)
Remove all mentions of "eosd". It's simply "osd" now.
Make OSD size per-OSD-object, as they can be different when using
vf_sub. Include display_par/video_par in resolution change detection.
Fix the issue with margin borders in vo_corevideo.
2012-10-19 19:25:18 +02:00
|
|
|
if (imgs->num_parts == 0 || !ctx->formats[imgs->format])
|
vo_opengl: refactor shader generation (part 1)
The basic idea is to use dynamically generated shaders instead of a
single monolithic file + a ton of ifdefs. Instead of having to setup
every aspect of it separately (like compiling shaders, setting uniforms,
perfoming the actual rendering steps, the GLSL parts), we generate the
GLSL on the fly, and perform the rendering at the same time. The GLSL
is regenerated every frame, but the actual compiled OpenGL-level shaders
are cached, which makes it fast again. Almost all logic can be in a
single place.
The new code is significantly more flexible, which allows us to improve
the code clarity, performance and add more features easily.
This commit is incomplete. It drops almost all previous code, and
readds only the most important things (some of them actually buggy).
The next commit will complete it - it's separate to preserve authorship
information.
2015-03-12 21:57:54 +01:00
|
|
|
return;
|
2012-10-03 18:25:41 +02:00
|
|
|
|
|
|
|
struct mpgl_osd_part *osd = ctx->parts[imgs->render_index];
|
|
|
|
|
sub, vo_opengl: use packed sub-bitmaps directly if available
The previous few commits changed sd_lavc.c's output to packed RGB sub-
images. In particular, this means all sub-bitmaps are part of a larger,
single bitmap. Change the vo_opengl OSD code such that it can make use
of this, and upload the pre-packed image, instead of packing and copying
them again.
This complicates the upload code a bit (4 code paths due to messy PBO
handling). The plan is to make sub-bitmaps always packed, but some more
work is required to reach this point. The plan is to pack libass images
as well. Since this implies a copy, this will make it easy to refcount
the result.
(This is all targeted towards vo_opengl. Other VOs, vo_xv, vo_x11, and
vo_wayland in particular, will become less efficient. Although at least
vo_vdpau and vo_direct3d could be switched to the new method as well.)
2016-06-17 23:11:05 +02:00
|
|
|
bool ok = true;
|
2015-03-18 12:33:14 +01:00
|
|
|
if (imgs->change_id != osd->change_id) {
|
|
|
|
if (!upload_osd(ctx, osd, imgs))
|
sub, vo_opengl: use packed sub-bitmaps directly if available
The previous few commits changed sd_lavc.c's output to packed RGB sub-
images. In particular, this means all sub-bitmaps are part of a larger,
single bitmap. Change the vo_opengl OSD code such that it can make use
of this, and upload the pre-packed image, instead of packing and copying
them again.
This complicates the upload code a bit (4 code paths due to messy PBO
handling). The plan is to make sub-bitmaps always packed, but some more
work is required to reach this point. The plan is to pack libass images
as well. Since this implies a copy, this will make it easy to refcount
the result.
(This is all targeted towards vo_opengl. Other VOs, vo_xv, vo_x11, and
vo_wayland in particular, will become less efficient. Although at least
vo_vdpau and vo_direct3d could be switched to the new method as well.)
2016-06-17 23:11:05 +02:00
|
|
|
ok = false;
|
2012-10-03 18:25:41 +02:00
|
|
|
|
2015-03-18 12:33:14 +01:00
|
|
|
osd->change_id = imgs->change_id;
|
2015-08-18 22:59:22 +02:00
|
|
|
ctx->change_counter += 1;
|
2012-10-03 18:25:41 +02:00
|
|
|
}
|
sub, vo_opengl: use packed sub-bitmaps directly if available
The previous few commits changed sd_lavc.c's output to packed RGB sub-
images. In particular, this means all sub-bitmaps are part of a larger,
single bitmap. Change the vo_opengl OSD code such that it can make use
of this, and upload the pre-packed image, instead of packing and copying
them again.
This complicates the upload code a bit (4 code paths due to messy PBO
handling). The plan is to make sub-bitmaps always packed, but some more
work is required to reach this point. The plan is to pack libass images
as well. Since this implies a copy, this will make it easy to refcount
the result.
(This is all targeted towards vo_opengl. Other VOs, vo_xv, vo_x11, and
vo_wayland in particular, will become less efficient. Although at least
vo_vdpau and vo_direct3d could be switched to the new method as well.)
2016-06-17 23:11:05 +02:00
|
|
|
osd->num_subparts = ok ? imgs->num_parts : 0;
|
2012-10-03 18:25:41 +02:00
|
|
|
|
vo_opengl: refactor shader generation (part 1)
The basic idea is to use dynamically generated shaders instead of a
single monolithic file + a ton of ifdefs. Instead of having to setup
every aspect of it separately (like compiling shaders, setting uniforms,
perfoming the actual rendering steps, the GLSL parts), we generate the
GLSL on the fly, and perform the rendering at the same time. The GLSL
is regenerated every frame, but the actual compiled OpenGL-level shaders
are cached, which makes it fast again. Almost all logic can be in a
single place.
The new code is significantly more flexible, which allows us to improve
the code clarity, performance and add more features easily.
This commit is incomplete. It drops almost all previous code, and
readds only the most important things (some of them actually buggy).
The next commit will complete it - it's separate to preserve authorship
information.
2015-03-12 21:57:54 +01:00
|
|
|
MP_TARRAY_GROW(osd, osd->subparts, osd->num_subparts);
|
|
|
|
memcpy(osd->subparts, imgs->parts,
|
|
|
|
osd->num_subparts * sizeof(osd->subparts[0]));
|
2012-10-03 18:25:41 +02:00
|
|
|
}
|
|
|
|
|
2015-03-13 21:14:18 +01:00
|
|
|
static void write_quad(struct vertex *va, struct gl_transform t,
|
2015-01-29 18:29:28 +01:00
|
|
|
float x0, float y0, float x1, float y1,
|
|
|
|
float tx0, float ty0, float tx1, float ty1,
|
2015-01-30 14:02:09 +01:00
|
|
|
float tex_w, float tex_h, const uint8_t color[4])
|
2012-10-03 18:25:41 +02:00
|
|
|
{
|
2015-03-13 21:14:18 +01:00
|
|
|
gl_transform_vec(t, &x0, &y0);
|
|
|
|
gl_transform_vec(t, &x1, &y1);
|
vo_opengl: refactor shader generation (part 1)
The basic idea is to use dynamically generated shaders instead of a
single monolithic file + a ton of ifdefs. Instead of having to setup
every aspect of it separately (like compiling shaders, setting uniforms,
perfoming the actual rendering steps, the GLSL parts), we generate the
GLSL on the fly, and perform the rendering at the same time. The GLSL
is regenerated every frame, but the actual compiled OpenGL-level shaders
are cached, which makes it fast again. Almost all logic can be in a
single place.
The new code is significantly more flexible, which allows us to improve
the code clarity, performance and add more features easily.
This commit is incomplete. It drops almost all previous code, and
readds only the most important things (some of them actually buggy).
The next commit will complete it - it's separate to preserve authorship
information.
2015-03-12 21:57:54 +01:00
|
|
|
|
2015-01-29 18:29:28 +01:00
|
|
|
#define COLOR_INIT {color[0], color[1], color[2], color[3]}
|
vo_opengl: refactor shader generation (part 1)
The basic idea is to use dynamically generated shaders instead of a
single monolithic file + a ton of ifdefs. Instead of having to setup
every aspect of it separately (like compiling shaders, setting uniforms,
perfoming the actual rendering steps, the GLSL parts), we generate the
GLSL on the fly, and perform the rendering at the same time. The GLSL
is regenerated every frame, but the actual compiled OpenGL-level shaders
are cached, which makes it fast again. Almost all logic can be in a
single place.
The new code is significantly more flexible, which allows us to improve
the code clarity, performance and add more features easily.
This commit is incomplete. It drops almost all previous code, and
readds only the most important things (some of them actually buggy).
The next commit will complete it - it's separate to preserve authorship
information.
2015-03-12 21:57:54 +01:00
|
|
|
va[0] = (struct vertex){ {x0, y0}, {tx0 / tex_w, ty0 / tex_h}, COLOR_INIT };
|
|
|
|
va[1] = (struct vertex){ {x0, y1}, {tx0 / tex_w, ty1 / tex_h}, COLOR_INIT };
|
|
|
|
va[2] = (struct vertex){ {x1, y0}, {tx1 / tex_w, ty0 / tex_h}, COLOR_INIT };
|
|
|
|
va[3] = (struct vertex){ {x1, y1}, {tx1 / tex_w, ty1 / tex_h}, COLOR_INIT };
|
2015-01-29 18:29:28 +01:00
|
|
|
va[4] = va[2];
|
|
|
|
va[5] = va[1];
|
|
|
|
#undef COLOR_INIT
|
|
|
|
}
|
|
|
|
|
2015-03-13 21:14:18 +01:00
|
|
|
static int generate_verts(struct mpgl_osd_part *part, struct gl_transform t)
|
2015-01-29 18:29:28 +01:00
|
|
|
{
|
vo_opengl: refactor shader generation (part 1)
The basic idea is to use dynamically generated shaders instead of a
single monolithic file + a ton of ifdefs. Instead of having to setup
every aspect of it separately (like compiling shaders, setting uniforms,
perfoming the actual rendering steps, the GLSL parts), we generate the
GLSL on the fly, and perform the rendering at the same time. The GLSL
is regenerated every frame, but the actual compiled OpenGL-level shaders
are cached, which makes it fast again. Almost all logic can be in a
single place.
The new code is significantly more flexible, which allows us to improve
the code clarity, performance and add more features easily.
This commit is incomplete. It drops almost all previous code, and
readds only the most important things (some of them actually buggy).
The next commit will complete it - it's separate to preserve authorship
information.
2015-03-12 21:57:54 +01:00
|
|
|
int num_vertices = part->num_subparts * 6;
|
|
|
|
MP_TARRAY_GROW(part, part->vertices, num_vertices);
|
2012-10-03 18:25:41 +02:00
|
|
|
|
vo_opengl: refactor shader generation (part 1)
The basic idea is to use dynamically generated shaders instead of a
single monolithic file + a ton of ifdefs. Instead of having to setup
every aspect of it separately (like compiling shaders, setting uniforms,
perfoming the actual rendering steps, the GLSL parts), we generate the
GLSL on the fly, and perform the rendering at the same time. The GLSL
is regenerated every frame, but the actual compiled OpenGL-level shaders
are cached, which makes it fast again. Almost all logic can be in a
single place.
The new code is significantly more flexible, which allows us to improve
the code clarity, performance and add more features easily.
This commit is incomplete. It drops almost all previous code, and
readds only the most important things (some of them actually buggy).
The next commit will complete it - it's separate to preserve authorship
information.
2015-03-12 21:57:54 +01:00
|
|
|
for (int n = 0; n < part->num_subparts; n++) {
|
|
|
|
struct sub_bitmap *b = &part->subparts[n];
|
|
|
|
struct vertex *va = part->vertices;
|
2015-01-29 18:29:28 +01:00
|
|
|
|
vo_opengl: refactor shader generation (part 1)
The basic idea is to use dynamically generated shaders instead of a
single monolithic file + a ton of ifdefs. Instead of having to setup
every aspect of it separately (like compiling shaders, setting uniforms,
perfoming the actual rendering steps, the GLSL parts), we generate the
GLSL on the fly, and perform the rendering at the same time. The GLSL
is regenerated every frame, but the actual compiled OpenGL-level shaders
are cached, which makes it fast again. Almost all logic can be in a
single place.
The new code is significantly more flexible, which allows us to improve
the code clarity, performance and add more features easily.
This commit is incomplete. It drops almost all previous code, and
readds only the most important things (some of them actually buggy).
The next commit will complete it - it's separate to preserve authorship
information.
2015-03-12 21:57:54 +01:00
|
|
|
// NOTE: the blend color is used with SUBBITMAP_LIBASS only, so it
|
|
|
|
// doesn't matter that we upload garbage for the other formats
|
|
|
|
uint32_t c = b->libass.color;
|
|
|
|
uint8_t color[4] = { c >> 24, (c >> 16) & 0xff,
|
|
|
|
(c >> 8) & 0xff, 255 - (c & 0xff) };
|
2015-01-29 18:29:28 +01:00
|
|
|
|
2015-03-13 21:14:18 +01:00
|
|
|
write_quad(&va[n * 6], t,
|
vo_opengl: refactor shader generation (part 1)
The basic idea is to use dynamically generated shaders instead of a
single monolithic file + a ton of ifdefs. Instead of having to setup
every aspect of it separately (like compiling shaders, setting uniforms,
perfoming the actual rendering steps, the GLSL parts), we generate the
GLSL on the fly, and perform the rendering at the same time. The GLSL
is regenerated every frame, but the actual compiled OpenGL-level shaders
are cached, which makes it fast again. Almost all logic can be in a
single place.
The new code is significantly more flexible, which allows us to improve
the code clarity, performance and add more features easily.
This commit is incomplete. It drops almost all previous code, and
readds only the most important things (some of them actually buggy).
The next commit will complete it - it's separate to preserve authorship
information.
2015-03-12 21:57:54 +01:00
|
|
|
b->x, b->y, b->x + b->dw, b->y + b->dh,
|
sub, vo_opengl: use packed sub-bitmaps directly if available
The previous few commits changed sd_lavc.c's output to packed RGB sub-
images. In particular, this means all sub-bitmaps are part of a larger,
single bitmap. Change the vo_opengl OSD code such that it can make use
of this, and upload the pre-packed image, instead of packing and copying
them again.
This complicates the upload code a bit (4 code paths due to messy PBO
handling). The plan is to make sub-bitmaps always packed, but some more
work is required to reach this point. The plan is to pack libass images
as well. Since this implies a copy, this will make it easy to refcount
the result.
(This is all targeted towards vo_opengl. Other VOs, vo_xv, vo_x11, and
vo_wayland in particular, will become less efficient. Although at least
vo_vdpau and vo_direct3d could be switched to the new method as well.)
2016-06-17 23:11:05 +02:00
|
|
|
b->src_x, b->src_y, b->src_x + b->w, b->src_y + b->h,
|
vo_opengl: refactor shader generation (part 1)
The basic idea is to use dynamically generated shaders instead of a
single monolithic file + a ton of ifdefs. Instead of having to setup
every aspect of it separately (like compiling shaders, setting uniforms,
perfoming the actual rendering steps, the GLSL parts), we generate the
GLSL on the fly, and perform the rendering at the same time. The GLSL
is regenerated every frame, but the actual compiled OpenGL-level shaders
are cached, which makes it fast again. Almost all logic can be in a
single place.
The new code is significantly more flexible, which allows us to improve
the code clarity, performance and add more features easily.
This commit is incomplete. It drops almost all previous code, and
readds only the most important things (some of them actually buggy).
The next commit will complete it - it's separate to preserve authorship
information.
2015-03-12 21:57:54 +01:00
|
|
|
part->w, part->h, color);
|
|
|
|
}
|
2015-01-29 18:29:28 +01:00
|
|
|
|
vo_opengl: refactor shader generation (part 1)
The basic idea is to use dynamically generated shaders instead of a
single monolithic file + a ton of ifdefs. Instead of having to setup
every aspect of it separately (like compiling shaders, setting uniforms,
perfoming the actual rendering steps, the GLSL parts), we generate the
GLSL on the fly, and perform the rendering at the same time. The GLSL
is regenerated every frame, but the actual compiled OpenGL-level shaders
are cached, which makes it fast again. Almost all logic can be in a
single place.
The new code is significantly more flexible, which allows us to improve
the code clarity, performance and add more features easily.
This commit is incomplete. It drops almost all previous code, and
readds only the most important things (some of them actually buggy).
The next commit will complete it - it's separate to preserve authorship
information.
2015-03-12 21:57:54 +01:00
|
|
|
return num_vertices;
|
|
|
|
}
|
2015-01-29 18:29:28 +01:00
|
|
|
|
2015-03-13 21:14:18 +01:00
|
|
|
static void draw_part(struct mpgl_osd *ctx, int index, struct gl_transform t)
|
vo_opengl: refactor shader generation (part 1)
The basic idea is to use dynamically generated shaders instead of a
single monolithic file + a ton of ifdefs. Instead of having to setup
every aspect of it separately (like compiling shaders, setting uniforms,
perfoming the actual rendering steps, the GLSL parts), we generate the
GLSL on the fly, and perform the rendering at the same time. The GLSL
is regenerated every frame, but the actual compiled OpenGL-level shaders
are cached, which makes it fast again. Almost all logic can be in a
single place.
The new code is significantly more flexible, which allows us to improve
the code clarity, performance and add more features easily.
This commit is incomplete. It drops almost all previous code, and
readds only the most important things (some of them actually buggy).
The next commit will complete it - it's separate to preserve authorship
information.
2015-03-12 21:57:54 +01:00
|
|
|
{
|
|
|
|
GL *gl = ctx->gl;
|
|
|
|
struct mpgl_osd_part *part = ctx->parts[index];
|
|
|
|
|
2015-03-13 21:14:18 +01:00
|
|
|
int num_vertices = generate_verts(part, t);
|
vo_opengl: refactor shader generation (part 1)
The basic idea is to use dynamically generated shaders instead of a
single monolithic file + a ton of ifdefs. Instead of having to setup
every aspect of it separately (like compiling shaders, setting uniforms,
perfoming the actual rendering steps, the GLSL parts), we generate the
GLSL on the fly, and perform the rendering at the same time. The GLSL
is regenerated every frame, but the actual compiled OpenGL-level shaders
are cached, which makes it fast again. Almost all logic can be in a
single place.
The new code is significantly more flexible, which allows us to improve
the code clarity, performance and add more features easily.
This commit is incomplete. It drops almost all previous code, and
readds only the most important things (some of them actually buggy).
The next commit will complete it - it's separate to preserve authorship
information.
2015-03-12 21:57:54 +01:00
|
|
|
if (!num_vertices)
|
|
|
|
return;
|
vo_opengl: fix alpha values written to the framebuffer
When blending OSD and subtitles onto the video, we write bogus alpha
values. This doesn't normally matter, because these values are normally
unused and discarded. But at least on Wayland, the alpha values are used
by the compositor and leads to transparent windows even with opaque
video on places where the OSD happens to use transparency.
(Also see github issue #338.)
Until now, the alpha basically contained garbage. The source factor
GL_SRC_ALPHA meant that alpha was multiplied with itself. Use GL_ONE
instead (which is why we have to use glBlendFuncSeparate()). This should
give correct results, even with video that has alpha. (Or at least it's
something close to correct, I haven't thought too hard how the
compositor will blend it, and in fact I couldn't manage to test it.)
If glBlendFuncSeparate() is not available, fall back to glBlendFunc(),
which does the same as the code did before this commit. Technically, we
support GL 1.1, but glBlendFuncSeparate is 1.4, and I guess we should
try not to crash if vo_opengl_old runs on a system with GL 1.1 drivers
only.
2013-11-10 03:14:13 +01:00
|
|
|
|
vo_opengl: refactor shader generation (part 1)
The basic idea is to use dynamically generated shaders instead of a
single monolithic file + a ton of ifdefs. Instead of having to setup
every aspect of it separately (like compiling shaders, setting uniforms,
perfoming the actual rendering steps, the GLSL parts), we generate the
GLSL on the fly, and perform the rendering at the same time. The GLSL
is regenerated every frame, but the actual compiled OpenGL-level shaders
are cached, which makes it fast again. Almost all logic can be in a
single place.
The new code is significantly more flexible, which allows us to improve
the code clarity, performance and add more features easily.
This commit is incomplete. It drops almost all previous code, and
readds only the most important things (some of them actually buggy).
The next commit will complete it - it's separate to preserve authorship
information.
2015-03-12 21:57:54 +01:00
|
|
|
gl->Enable(GL_BLEND);
|
2015-01-29 18:29:28 +01:00
|
|
|
gl->BindTexture(GL_TEXTURE_2D, part->texture);
|
|
|
|
|
|
|
|
const int *factors = &blend_factors[part->format][0];
|
2015-01-21 20:32:42 +01:00
|
|
|
gl->BlendFuncSeparate(factors[0], factors[1], factors[2], factors[3]);
|
2015-01-29 18:29:28 +01:00
|
|
|
|
vo_opengl: refactor shader generation (part 1)
The basic idea is to use dynamically generated shaders instead of a
single monolithic file + a ton of ifdefs. Instead of having to setup
every aspect of it separately (like compiling shaders, setting uniforms,
perfoming the actual rendering steps, the GLSL parts), we generate the
GLSL on the fly, and perform the rendering at the same time. The GLSL
is regenerated every frame, but the actual compiled OpenGL-level shaders
are cached, which makes it fast again. Almost all logic can be in a
single place.
The new code is significantly more flexible, which allows us to improve
the code clarity, performance and add more features easily.
This commit is incomplete. It drops almost all previous code, and
readds only the most important things (some of them actually buggy).
The next commit will complete it - it's separate to preserve authorship
information.
2015-03-12 21:57:54 +01:00
|
|
|
gl_vao_draw_data(&ctx->vao, GL_TRIANGLES, part->vertices, num_vertices);
|
2015-01-29 18:29:28 +01:00
|
|
|
|
|
|
|
gl->BindTexture(GL_TEXTURE_2D, 0);
|
vo_opengl: refactor shader generation (part 1)
The basic idea is to use dynamically generated shaders instead of a
single monolithic file + a ton of ifdefs. Instead of having to setup
every aspect of it separately (like compiling shaders, setting uniforms,
perfoming the actual rendering steps, the GLSL parts), we generate the
GLSL on the fly, and perform the rendering at the same time. The GLSL
is regenerated every frame, but the actual compiled OpenGL-level shaders
are cached, which makes it fast again. Almost all logic can be in a
single place.
The new code is significantly more flexible, which allows us to improve
the code clarity, performance and add more features easily.
This commit is incomplete. It drops almost all previous code, and
readds only the most important things (some of them actually buggy).
The next commit will complete it - it's separate to preserve authorship
information.
2015-03-12 21:57:54 +01:00
|
|
|
gl->Disable(GL_BLEND);
|
2015-01-29 18:29:28 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
// number of screen divisions per axis (x=0, y=1) for the current 3D mode
|
|
|
|
static void get_3d_side_by_side(int stereo_mode, int div[2])
|
|
|
|
{
|
|
|
|
div[0] = div[1] = 1;
|
|
|
|
switch (stereo_mode) {
|
|
|
|
case MP_STEREO3D_SBS2L:
|
|
|
|
case MP_STEREO3D_SBS2R: div[0] = 2; break;
|
|
|
|
case MP_STEREO3D_AB2R:
|
|
|
|
case MP_STEREO3D_AB2L: div[1] = 2; break;
|
|
|
|
}
|
2012-10-03 18:25:41 +02:00
|
|
|
}
|
|
|
|
|
vo_opengl: refactor shader generation (part 1)
The basic idea is to use dynamically generated shaders instead of a
single monolithic file + a ton of ifdefs. Instead of having to setup
every aspect of it separately (like compiling shaders, setting uniforms,
perfoming the actual rendering steps, the GLSL parts), we generate the
GLSL on the fly, and perform the rendering at the same time. The GLSL
is regenerated every frame, but the actual compiled OpenGL-level shaders
are cached, which makes it fast again. Almost all logic can be in a
single place.
The new code is significantly more flexible, which allows us to improve
the code clarity, performance and add more features easily.
This commit is incomplete. It drops almost all previous code, and
readds only the most important things (some of them actually buggy).
The next commit will complete it - it's separate to preserve authorship
information.
2015-03-12 21:57:54 +01:00
|
|
|
void mpgl_osd_draw_part(struct mpgl_osd *ctx, int vp_w, int vp_h, int index)
|
2012-10-03 18:25:41 +02:00
|
|
|
{
|
2015-01-29 18:29:28 +01:00
|
|
|
int div[2];
|
vo_opengl: refactor shader generation (part 1)
The basic idea is to use dynamically generated shaders instead of a
single monolithic file + a ton of ifdefs. Instead of having to setup
every aspect of it separately (like compiling shaders, setting uniforms,
perfoming the actual rendering steps, the GLSL parts), we generate the
GLSL on the fly, and perform the rendering at the same time. The GLSL
is regenerated every frame, but the actual compiled OpenGL-level shaders
are cached, which makes it fast again. Almost all logic can be in a
single place.
The new code is significantly more flexible, which allows us to improve
the code clarity, performance and add more features easily.
This commit is incomplete. It drops almost all previous code, and
readds only the most important things (some of them actually buggy).
The next commit will complete it - it's separate to preserve authorship
information.
2015-03-12 21:57:54 +01:00
|
|
|
get_3d_side_by_side(ctx->stereo_mode, div);
|
2015-01-29 18:29:28 +01:00
|
|
|
|
2015-03-16 20:10:48 +01:00
|
|
|
ctx->gl->Viewport(0, 0, vp_w, abs(vp_h));
|
|
|
|
|
2015-01-29 18:29:28 +01:00
|
|
|
for (int x = 0; x < div[0]; x++) {
|
|
|
|
for (int y = 0; y < div[1]; y++) {
|
2015-03-13 21:14:18 +01:00
|
|
|
struct gl_transform t;
|
|
|
|
gl_transform_ortho(&t, 0, vp_w, 0, vp_h);
|
vo_opengl: refactor shader generation (part 1)
The basic idea is to use dynamically generated shaders instead of a
single monolithic file + a ton of ifdefs. Instead of having to setup
every aspect of it separately (like compiling shaders, setting uniforms,
perfoming the actual rendering steps, the GLSL parts), we generate the
GLSL on the fly, and perform the rendering at the same time. The GLSL
is regenerated every frame, but the actual compiled OpenGL-level shaders
are cached, which makes it fast again. Almost all logic can be in a
single place.
The new code is significantly more flexible, which allows us to improve
the code clarity, performance and add more features easily.
This commit is incomplete. It drops almost all previous code, and
readds only the most important things (some of them actually buggy).
The next commit will complete it - it's separate to preserve authorship
information.
2015-03-12 21:57:54 +01:00
|
|
|
|
2016-03-21 22:23:41 +01:00
|
|
|
float a_x = ctx->osd_res.w * x;
|
|
|
|
float a_y = ctx->osd_res.h * y;
|
2015-03-13 21:14:18 +01:00
|
|
|
t.t[0] += a_x * t.m[0][0] + a_y * t.m[1][0];
|
|
|
|
t.t[1] += a_x * t.m[0][1] + a_y * t.m[1][1];
|
vo_opengl: refactor shader generation (part 1)
The basic idea is to use dynamically generated shaders instead of a
single monolithic file + a ton of ifdefs. Instead of having to setup
every aspect of it separately (like compiling shaders, setting uniforms,
perfoming the actual rendering steps, the GLSL parts), we generate the
GLSL on the fly, and perform the rendering at the same time. The GLSL
is regenerated every frame, but the actual compiled OpenGL-level shaders
are cached, which makes it fast again. Almost all logic can be in a
single place.
The new code is significantly more flexible, which allows us to improve
the code clarity, performance and add more features easily.
This commit is incomplete. It drops almost all previous code, and
readds only the most important things (some of them actually buggy).
The next commit will complete it - it's separate to preserve authorship
information.
2015-03-12 21:57:54 +01:00
|
|
|
|
2015-03-13 21:14:18 +01:00
|
|
|
draw_part(ctx, index, t);
|
2015-01-29 18:29:28 +01:00
|
|
|
}
|
|
|
|
}
|
vo_opengl: refactor shader generation (part 1)
The basic idea is to use dynamically generated shaders instead of a
single monolithic file + a ton of ifdefs. Instead of having to setup
every aspect of it separately (like compiling shaders, setting uniforms,
perfoming the actual rendering steps, the GLSL parts), we generate the
GLSL on the fly, and perform the rendering at the same time. The GLSL
is regenerated every frame, but the actual compiled OpenGL-level shaders
are cached, which makes it fast again. Almost all logic can be in a
single place.
The new code is significantly more flexible, which allows us to improve
the code clarity, performance and add more features easily.
This commit is incomplete. It drops almost all previous code, and
readds only the most important things (some of them actually buggy).
The next commit will complete it - it's separate to preserve authorship
information.
2015-03-12 21:57:54 +01:00
|
|
|
}
|
2015-01-29 18:29:28 +01:00
|
|
|
|
vo_opengl: refactor shader generation (part 1)
The basic idea is to use dynamically generated shaders instead of a
single monolithic file + a ton of ifdefs. Instead of having to setup
every aspect of it separately (like compiling shaders, setting uniforms,
perfoming the actual rendering steps, the GLSL parts), we generate the
GLSL on the fly, and perform the rendering at the same time. The GLSL
is regenerated every frame, but the actual compiled OpenGL-level shaders
are cached, which makes it fast again. Almost all logic can be in a
single place.
The new code is significantly more flexible, which allows us to improve
the code clarity, performance and add more features easily.
This commit is incomplete. It drops almost all previous code, and
readds only the most important things (some of them actually buggy).
The next commit will complete it - it's separate to preserve authorship
information.
2015-03-12 21:57:54 +01:00
|
|
|
enum sub_bitmap_format mpgl_osd_get_part_format(struct mpgl_osd *ctx, int index)
|
|
|
|
{
|
|
|
|
assert(index >= 0 && index < MAX_OSD_PARTS);
|
|
|
|
return ctx->parts[index]->format;
|
|
|
|
}
|
|
|
|
|
|
|
|
struct gl_vao *mpgl_osd_get_vao(struct mpgl_osd *ctx)
|
|
|
|
{
|
|
|
|
return &ctx->vao;
|
|
|
|
}
|
|
|
|
|
2016-03-21 22:23:41 +01:00
|
|
|
static void set_res(struct mpgl_osd *ctx, struct mp_osd_res res, int stereo_mode)
|
|
|
|
{
|
|
|
|
int div[2];
|
|
|
|
get_3d_side_by_side(stereo_mode, div);
|
|
|
|
|
|
|
|
res.w /= div[0];
|
|
|
|
res.h /= div[1];
|
|
|
|
ctx->osd_res = res;
|
|
|
|
}
|
|
|
|
|
vo_opengl: refactor shader generation (part 1)
The basic idea is to use dynamically generated shaders instead of a
single monolithic file + a ton of ifdefs. Instead of having to setup
every aspect of it separately (like compiling shaders, setting uniforms,
perfoming the actual rendering steps, the GLSL parts), we generate the
GLSL on the fly, and perform the rendering at the same time. The GLSL
is regenerated every frame, but the actual compiled OpenGL-level shaders
are cached, which makes it fast again. Almost all logic can be in a
single place.
The new code is significantly more flexible, which allows us to improve
the code clarity, performance and add more features easily.
This commit is incomplete. It drops almost all previous code, and
readds only the most important things (some of them actually buggy).
The next commit will complete it - it's separate to preserve authorship
information.
2015-03-12 21:57:54 +01:00
|
|
|
void mpgl_osd_generate(struct mpgl_osd *ctx, struct mp_osd_res res, double pts,
|
2015-03-23 02:42:19 +01:00
|
|
|
int stereo_mode, int draw_flags)
|
vo_opengl: refactor shader generation (part 1)
The basic idea is to use dynamically generated shaders instead of a
single monolithic file + a ton of ifdefs. Instead of having to setup
every aspect of it separately (like compiling shaders, setting uniforms,
perfoming the actual rendering steps, the GLSL parts), we generate the
GLSL on the fly, and perform the rendering at the same time. The GLSL
is regenerated every frame, but the actual compiled OpenGL-level shaders
are cached, which makes it fast again. Almost all logic can be in a
single place.
The new code is significantly more flexible, which allows us to improve
the code clarity, performance and add more features easily.
This commit is incomplete. It drops almost all previous code, and
readds only the most important things (some of them actually buggy).
The next commit will complete it - it's separate to preserve authorship
information.
2015-03-12 21:57:54 +01:00
|
|
|
{
|
|
|
|
for (int n = 0; n < MAX_OSD_PARTS; n++)
|
|
|
|
ctx->parts[n]->num_subparts = 0;
|
|
|
|
|
2016-03-21 22:23:41 +01:00
|
|
|
set_res(ctx, res, stereo_mode);
|
vo_opengl: refactor shader generation (part 1)
The basic idea is to use dynamically generated shaders instead of a
single monolithic file + a ton of ifdefs. Instead of having to setup
every aspect of it separately (like compiling shaders, setting uniforms,
perfoming the actual rendering steps, the GLSL parts), we generate the
GLSL on the fly, and perform the rendering at the same time. The GLSL
is regenerated every frame, but the actual compiled OpenGL-level shaders
are cached, which makes it fast again. Almost all logic can be in a
single place.
The new code is significantly more flexible, which allows us to improve
the code clarity, performance and add more features easily.
This commit is incomplete. It drops almost all previous code, and
readds only the most important things (some of them actually buggy).
The next commit will complete it - it's separate to preserve authorship
information.
2015-03-12 21:57:54 +01:00
|
|
|
|
2016-03-21 22:23:41 +01:00
|
|
|
osd_draw(ctx->osd, ctx->osd_res, pts, draw_flags, ctx->formats, gen_osd_cb, ctx);
|
vo_opengl: refactor shader generation (part 1)
The basic idea is to use dynamically generated shaders instead of a
single monolithic file + a ton of ifdefs. Instead of having to setup
every aspect of it separately (like compiling shaders, setting uniforms,
perfoming the actual rendering steps, the GLSL parts), we generate the
GLSL on the fly, and perform the rendering at the same time. The GLSL
is regenerated every frame, but the actual compiled OpenGL-level shaders
are cached, which makes it fast again. Almost all logic can be in a
single place.
The new code is significantly more flexible, which allows us to improve
the code clarity, performance and add more features easily.
This commit is incomplete. It drops almost all previous code, and
readds only the most important things (some of them actually buggy).
The next commit will complete it - it's separate to preserve authorship
information.
2015-03-12 21:57:54 +01:00
|
|
|
ctx->stereo_mode = stereo_mode;
|
2015-08-18 22:59:22 +02:00
|
|
|
|
|
|
|
// Parts going away does not necessarily result in gen_osd_cb() being called
|
|
|
|
// (not even with num_parts==0), so check this separately.
|
|
|
|
for (int n = 0; n < MAX_OSD_PARTS; n++) {
|
|
|
|
struct mpgl_osd_part *part = ctx->parts[n];
|
|
|
|
if (part->num_subparts != part->prev_num_subparts)
|
|
|
|
ctx->change_counter += 1;
|
|
|
|
part->prev_num_subparts = part->num_subparts;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-03-21 22:23:41 +01:00
|
|
|
// See osd_resize() for remarks. This function is an optional optimization too.
|
|
|
|
void mpgl_osd_resize(struct mpgl_osd *ctx, struct mp_osd_res res, int stereo_mode)
|
|
|
|
{
|
|
|
|
set_res(ctx, res, stereo_mode);
|
|
|
|
osd_resize(ctx->osd, ctx->osd_res);
|
|
|
|
}
|
|
|
|
|
2015-08-18 22:59:22 +02:00
|
|
|
int64_t mpgl_get_change_counter(struct mpgl_osd *ctx)
|
|
|
|
{
|
|
|
|
return ctx->change_counter;
|
2012-10-03 18:25:41 +02:00
|
|
|
}
|