mirror of https://github.com/mpv-player/mpv
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.
This commit is contained in:
parent
4495044947
commit
5db162231e
|
@ -181,6 +181,8 @@ typedef struct d3d_priv {
|
||||||
int max_texture_width; /**< from the device capabilities */
|
int max_texture_width; /**< from the device capabilities */
|
||||||
int max_texture_height; /**< from the device capabilities */
|
int max_texture_height; /**< from the device capabilities */
|
||||||
|
|
||||||
|
D3DFORMAT osd_fmt_table[SUBBITMAP_COUNT];
|
||||||
|
|
||||||
D3DMATRIX d3d_colormatrix;
|
D3DMATRIX d3d_colormatrix;
|
||||||
struct mp_csp_equalizer video_eq;
|
struct mp_csp_equalizer video_eq;
|
||||||
|
|
||||||
|
@ -219,15 +221,6 @@ static const struct fmt_entry fmt_table[] = {
|
||||||
{0},
|
{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 update_colorspace(d3d_priv *priv);
|
||||||
static void d3d_clear_video_textures(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)
|
if (priv->opt_force_power_of_2)
|
||||||
priv->device_caps_power2_only = 1;
|
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"
|
MP_VERBOSE(priv, "device_caps_power2_only %d, device_caps_square_only %d\n"
|
||||||
"device_texture_sys %d\n"
|
"device_texture_sys %d\n"
|
||||||
"max_texture_width %d, max_texture_height %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,
|
static bool upload_osd(d3d_priv *priv, struct osdpart *osd,
|
||||||
struct sub_bitmaps *imgs)
|
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->w_max = priv->max_texture_width;
|
||||||
osd->packer->h_max = priv->max_texture_height;
|
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)
|
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;
|
return NULL;
|
||||||
|
|
||||||
struct osdpart *osd = priv->osd[imgs->render_index];
|
struct osdpart *osd = priv->osd[imgs->render_index];
|
||||||
|
@ -1717,6 +1731,10 @@ static void draw_osd(struct vo *vo)
|
||||||
if (!priv->d3d_device)
|
if (!priv->d3d_device)
|
||||||
return;
|
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,
|
osd_draw(vo->osd, priv->osd_res, priv->osd_pts, 0, osd_fmt_supported,
|
||||||
draw_osd_cb, priv);
|
draw_osd_cb, priv);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue