diff options
Diffstat (limited to 'video/out/vo_direct3d.c')
-rw-r--r-- | video/out/vo_direct3d.c | 81 |
1 files changed, 5 insertions, 76 deletions
diff --git a/video/out/vo_direct3d.c b/video/out/vo_direct3d.c index 6b9ca7e32b..0b9317f22e 100644 --- a/video/out/vo_direct3d.c +++ b/video/out/vo_direct3d.c @@ -45,13 +45,9 @@ // shaders generated by fxc.exe from d3d_shader_yuv.hlsl #include "d3d_shader_yuv.h" -#include "d3d_shader_yuv_2ch.h" -// TODO: beg someone to add this (there is already IMGFMT_Y8) -#define IMGFMT_A8Y8 MAKEFOURCC('A', '8', 'Y', '8') - -#define IMGFMT_IS_Y(x) ((x) == IMGFMT_Y8 || (x) == IMGFMT_Y16 || (x) == IMGFMT_A8Y8) +#define IMGFMT_IS_Y(x) ((x) == IMGFMT_Y8 || (x) == IMGFMT_Y16) #define IMGFMT_Y_DEPTH(x) ((x) == IMGFMT_Y8 ? 8 : 16) #define DEVTYPE D3DDEVTYPE_HAL @@ -130,7 +126,6 @@ typedef struct d3d_priv { int opt_texture_memory; int opt_swap_discard; int opt_exact_backbuffer; - int opt_16bit_textures; struct vo *vo; @@ -149,7 +144,6 @@ typedef struct d3d_priv { StretchRect */ bool use_shaders; /**< use shader for YUV color conversion (or possibly for RGB video equalizers) */ - bool use_2ch_hack; /**< 2 byte YUV formats use 2 channel hack */ int plane_count; struct texplane planes[3]; @@ -185,7 +179,6 @@ typedef struct d3d_priv { int max_texture_height; /**< from the device capabilities */ D3DMATRIX d3d_colormatrix; - float d3d_depth_vector[4]; struct mp_csp_details colorspace; struct mp_csp_equalizer video_eq; @@ -219,7 +212,6 @@ static const struct fmt_entry fmt_table[] = { // grayscale (can be considered both packed and planar) {IMGFMT_Y8, D3DFMT_L8}, {IMGFMT_Y16, D3DFMT_L16}, - {IMGFMT_A8Y8, D3DFMT_A8L8}, {0}, }; @@ -921,9 +913,6 @@ static uint32_t d3d_draw_frame(d3d_priv *priv) IDirect3DDevice9_SetPixelShaderConstantF(priv->d3d_device, 0, &priv->d3d_colormatrix._11, 4); - IDirect3DDevice9_SetPixelShaderConstantF(priv->d3d_device, 5, - priv->d3d_depth_vector, - 1); } IDirect3DDevice9_SetFVF(priv->d3d_device, D3DFVF_VIDEO_VERTEX); @@ -1042,13 +1031,7 @@ static D3DFORMAT check_shader_conversion(d3d_priv *priv, uint32_t fmt) bool is_8bit = component_bits == 8; if (!is_8bit && priv->opt_only_8bit) return 0; - int texfmt = IMGFMT_Y8; - if (!is_8bit) { - if (priv->opt_16bit_textures) - texfmt = IMGFMT_Y16; - else - texfmt = IMGFMT_A8Y8; - } + int texfmt = is_8bit ? IMGFMT_Y8 : IMGFMT_Y16; return check_format(priv, texfmt, true); } @@ -1084,7 +1067,6 @@ static bool init_rendering_mode(d3d_priv *priv, uint32_t fmt, bool initialize) priv->use_shaders = false; priv->use_textures = false; - priv->use_2ch_hack = false; priv->movie_src_fmt = 0; priv->pixel_shader_data = NULL; priv->plane_count = 0; @@ -1127,14 +1109,7 @@ static bool init_rendering_mode(d3d_priv *priv, uint32_t fmt, bool initialize) if (n > 0) planes[n].clearval = get_chroma_clear_val(desc.plane_bits); } - if (shader_d3dfmt != D3DFMT_A8L8) { - priv->pixel_shader_data = d3d_shader_yuv; - } else { - mp_msg(MSGT_VO, MSGL_WARN, "<vo_direct3d>Using YUV 2ch hack.\n"); - - priv->pixel_shader_data = d3d_shader_yuv_2ch; - priv->use_2ch_hack = true; - } + priv->pixel_shader_data = d3d_shader_yuv; } for (n = 0; n < priv->plane_count; n++) { @@ -1178,30 +1153,6 @@ static int query_format(struct vo *vo, uint32_t movie_fmt) * * ****************************************************************************/ -static void get_2ch_depth_multiplier(int depth, float *out_f1, float *out_f2) { - // How to get these values: - // The suffix i8 and i16 is for values with 8/16 bit fixed point numbers. - // The suffix f is for float, ideally in the range 0.0-1.0. - // c_i8 is a two component vector, sampled from a two channel texture. - // (c_i8.x is the low byte, c_i8.y is the high byte) - // r_f is the resulting color scalar value. - // - // c_i8 = c_f * (2^8-1) - // r_i16 = c_i8.x + c_i8.y * 2^8 - // r_f = r_i16 / (2^16-1) - // = c_f.x * (2^8-1) / (2^16-1) + c_f.y * (2^8-1) * 2^8 / (2^16-1) - // = c_f.x * ((2^8-1) / (2^16-1)) + c_f.y * (2^8 * ((2^8-1) / (2^16-1))) - // out = ((2^8-1) / (2^16-1), 2^8 * ((2^8-1) / (2^16-1))) - // The result color is r_f = dot(c_f, out). - // Same goes for other bit depth, such as 10 bit. Assuming (2^depth-1) is - // the maximum possible value at that depth, you have to scale the value - // r_i16 with it, the factor (2^16-1) in the formula above has to be - // replaced with (2^depth-1). - float factor = (float)((1 << 8) - 1) / (float)((1 << depth) - 1); - *out_f1 = factor; - *out_f2 = 256.0 * factor; -} - static void update_colorspace(d3d_priv *priv) { float coeff[3][4]; @@ -1209,19 +1160,8 @@ static void update_colorspace(d3d_priv *priv) mp_csp_copy_equalizer_values(&csp, &priv->video_eq); if (priv->use_shaders) { - if (!priv->use_2ch_hack) { - csp.input_bits = priv->planes[0].bits_per_pixel; - csp.texture_bits = (csp.input_bits + 7) & ~7; - } else { - float f1, f2; - get_2ch_depth_multiplier(priv->planes[0].bits_per_pixel, &f1, &f2); - priv->d3d_depth_vector[0] = f1; - priv->d3d_depth_vector[1] = f2; - priv->d3d_depth_vector[2] = priv->d3d_depth_vector[3] = 0; - // no change - csp.input_bits = 8; - csp.texture_bits = 8; - } + csp.input_bits = priv->planes[0].bits_per_pixel; + csp.texture_bits = (csp.input_bits + 7) & ~7; mp_get_yuv2rgb_coeffs(&csp, coeff); for (int row = 0; row < 3; row++) { @@ -1274,14 +1214,6 @@ const char *options_help_text = "-vo direct3d command line help:\n" " Might be slower too, as it must (?) clear every frame.\n" " exact-backbuffer\n" " Always resize the backbuffer to window size.\n" -" no16bit-textures\n" -" Don't use textures with a 16 bit color channel for YUV formats that\n" -" use more than 8 bits per component. Instead, use D3DFMT_A8L8 textures\n" -" and compute the values sampled from the 2 channels back into one.\n" -" Might be slower, since the shader becomes slightly more complicated.\n" -" Might work better, if your drivers either don't support D3DFMT_L16,\n" -" or if either the texture unit or the shaders don't operate in at least\n" -" 16 bit precision.\n" ""; /** @brief libvo Callback: Preinitialize the video card. @@ -1299,8 +1231,6 @@ static int preinit_internal(struct vo *vo, const char *arg, bool allow_shaders) *priv = (d3d_priv) { .vo = vo, - .opt_16bit_textures = true, - .colorspace = MP_CSP_DETAILS_DEFAULTS, .video_eq = { MP_CSP_EQ_CAPS_COLORMATRIX }, }; @@ -1329,7 +1259,6 @@ static int preinit_internal(struct vo *vo, const char *arg, bool allow_shaders) {"texture-memory", OPT_ARG_INT, &priv->opt_texture_memory}, {"swap-discard", OPT_ARG_BOOL, &priv->opt_swap_discard}, {"exact-backbuffer", OPT_ARG_BOOL, &priv->opt_exact_backbuffer}, - {"16bit-textures", OPT_ARG_BOOL, &priv->opt_16bit_textures}, {NULL} }; if (subopt_parse(arg, subopts) != 0) { |