summaryrefslogtreecommitdiffstats
path: root/video/out/vo_direct3d.c
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2014-11-27 19:54:24 +0100
committerwm4 <wm4@nowhere>2014-11-27 20:05:29 +0100
commit5db162231eae43a970d09b99c50fa89186f45343 (patch)
tree617cb9d44e9e8ebeed5728b6a2e6aaf048b41355 /video/out/vo_direct3d.c
parent44950449473cd786aa08324a20b2e8c8d413d965 (diff)
downloadmpv-5db162231eae43a970d09b99c50fa89186f45343.tar.bz2
mpv-5db162231eae43a970d09b99c50fa89186f45343.tar.xz
vo_direct3d: check whether D3DFMT_A8 is available
I suspect this is what is happening in github issue #1265 (at least partially). If D3DFMT_A8 is not available, fall back to RGBA. This is less efficient in general, so we normally want to avoid it.
Diffstat (limited to 'video/out/vo_direct3d.c')
-rw-r--r--video/out/vo_direct3d.c40
1 files changed, 29 insertions, 11 deletions
diff --git a/video/out/vo_direct3d.c b/video/out/vo_direct3d.c
index cecb4be6a8..52ec690cf3 100644
--- a/video/out/vo_direct3d.c
+++ b/video/out/vo_direct3d.c
@@ -181,6 +181,8 @@ typedef struct d3d_priv {
int max_texture_width; /**< from the device capabilities */
int max_texture_height; /**< from the device capabilities */
+ D3DFORMAT osd_fmt_table[SUBBITMAP_COUNT];
+
D3DMATRIX d3d_colormatrix;
struct mp_csp_equalizer video_eq;
@@ -219,15 +221,6 @@ static const struct fmt_entry fmt_table[] = {
{0},
};
-static const D3DFORMAT osd_fmt_table[SUBBITMAP_COUNT] = {
- [SUBBITMAP_LIBASS] = D3DFMT_A8,
- [SUBBITMAP_RGBA] = D3DFMT_A8R8G8B8,
-};
-static const bool osd_fmt_supported[SUBBITMAP_COUNT] = {
- [SUBBITMAP_LIBASS] = true,
- [SUBBITMAP_RGBA] = true,
-};
-
static void update_colorspace(d3d_priv *priv);
static void d3d_clear_video_textures(d3d_priv *priv);
@@ -658,6 +651,27 @@ static bool init_d3d(d3d_priv *priv)
if (priv->opt_force_power_of_2)
priv->device_caps_power2_only = 1;
+ priv->osd_fmt_table[SUBBITMAP_LIBASS] = D3DFMT_A8;
+ priv->osd_fmt_table[SUBBITMAP_RGBA] = D3DFMT_A8R8G8B8;
+
+ for (int n = 0; n < MP_ARRAY_SIZE(priv->osd_fmt_table); n++) {
+ int fmt = priv->osd_fmt_table[n];
+ if (fmt && FAILED(IDirect3D9_CheckDeviceFormat(priv->d3d_handle,
+ D3DADAPTER_DEFAULT,
+ DEVTYPE,
+ priv->desktop_fmt,
+ D3DUSAGE_DYNAMIC | D3DUSAGE_QUERY_FILTER,
+ D3DRTYPE_TEXTURE,
+ fmt)))
+ {
+ MP_VERBOSE(priv, "OSD format %#x not supported.\n", fmt);
+ priv->osd_fmt_table[n] = 0;
+ }
+ }
+
+ if (!priv->osd_fmt_table[SUBBITMAP_RGBA])
+ MP_WARN(priv, "GPU too old - no OSD support.\n");
+
MP_VERBOSE(priv, "device_caps_power2_only %d, device_caps_square_only %d\n"
"device_texture_sys %d\n"
"max_texture_width %d, max_texture_height %d\n",
@@ -1536,7 +1550,7 @@ error_exit:
static bool upload_osd(d3d_priv *priv, struct osdpart *osd,
struct sub_bitmaps *imgs)
{
- D3DFORMAT fmt = osd_fmt_table[imgs->format];
+ D3DFORMAT fmt = priv->osd_fmt_table[imgs->format];
osd->packer->w_max = priv->max_texture_width;
osd->packer->h_max = priv->max_texture_height;
@@ -1596,7 +1610,7 @@ static bool upload_osd(d3d_priv *priv, struct osdpart *osd,
static struct osdpart *generate_osd(d3d_priv *priv, struct sub_bitmaps *imgs)
{
- if (imgs->num_parts == 0 || !osd_fmt_table[imgs->format])
+ if (imgs->num_parts == 0 || !priv->osd_fmt_table[imgs->format])
return NULL;
struct osdpart *osd = priv->osd[imgs->render_index];
@@ -1717,6 +1731,10 @@ static void draw_osd(struct vo *vo)
if (!priv->d3d_device)
return;
+ bool osd_fmt_supported[SUBBITMAP_COUNT];
+ for (int n = 0; n < SUBBITMAP_COUNT; n++)
+ osd_fmt_supported[n] = !!priv->osd_fmt_table[n];
+
osd_draw(vo->osd, priv->osd_res, priv->osd_pts, 0, osd_fmt_supported,
draw_osd_cb, priv);
}